tonlib_core/message/nft/
ownership_assigned.rs

1use num_bigint::BigUint;
2
3use super::NFT_OWNERSHIP_ASSIGNED;
4use crate::cell::{ArcCell, Cell, CellBuilder, EitherCellLayout, EMPTY_ARC_CELL};
5use crate::message::{HasOpcode, TonMessage, TonMessageError, WithForwardPayload};
6use crate::TonAddress;
7
8/// Creates a body for nft ownership assigned  according to TL-B schema:
9///
10/// ```raw
11/// ownership_assigned#0x05138d91
12///   query_id:uint64
13///   prev_owner:MsgAddress
14///   forward_payload:(Either Cell ^Cell)
15/// = InternalMsgBody;
16/// ```
17#[derive(Clone, Debug, PartialEq)]
18pub struct NftOwnershipAssignedMessage {
19    /// arbitrary request number.
20    pub query_id: u64,
21    /// address of the previous owner of the NFT item.
22    pub prev_owner: TonAddress,
23    ///  optional custom data that should be sent to the destination address.
24    pub forward_payload: ArcCell,
25
26    pub forward_payload_layout: EitherCellLayout,
27}
28
29impl NftOwnershipAssignedMessage {
30    pub fn new(prev_owner: &TonAddress) -> Self {
31        NftOwnershipAssignedMessage {
32            query_id: 0,
33            prev_owner: prev_owner.clone(),
34            forward_payload: EMPTY_ARC_CELL.clone(),
35            forward_payload_layout: EitherCellLayout::Native,
36        }
37    }
38}
39
40impl TonMessage for NftOwnershipAssignedMessage {
41    fn build(&self) -> Result<Cell, TonMessageError> {
42        let mut builder = CellBuilder::new();
43        builder.store_u32(32, Self::opcode())?;
44        builder.store_u64(64, self.query_id)?;
45        builder.store_address(&self.prev_owner)?;
46        builder
47            .store_either_cell_or_cell_ref(&self.forward_payload, self.forward_payload_layout)?;
48        Ok(builder.build()?)
49    }
50
51    fn parse(cell: &Cell) -> Result<Self, TonMessageError> {
52        let mut parser = cell.parser();
53
54        let opcode: u32 = parser.load_u32(32)?;
55        let query_id = parser.load_u64(64)?;
56        let prev_owner = parser.load_address()?;
57        let forward_payload = parser.load_either_cell_or_cell_ref()?;
58        parser.ensure_empty()?;
59
60        let result = NftOwnershipAssignedMessage {
61            query_id,
62            prev_owner,
63            forward_payload,
64            forward_payload_layout: EitherCellLayout::Native,
65        };
66        result.verify_opcode(opcode)?;
67        Ok(result)
68    }
69}
70
71impl WithForwardPayload for NftOwnershipAssignedMessage {
72    fn set_forward_payload(&mut self, forward_payload: ArcCell, _forward_ton_amount: BigUint) {
73        self.forward_payload = forward_payload;
74    }
75}
76
77impl HasOpcode for NftOwnershipAssignedMessage {
78    fn set_query_id(&mut self, query_id: u64) {
79        self.query_id = query_id;
80    }
81
82    fn query_id(&self) -> u64 {
83        self.query_id
84    }
85
86    fn opcode() -> u32 {
87        NFT_OWNERSHIP_ASSIGNED
88    }
89}