Skip to content

Commit 50e266e

Browse files
committed
dont mix parsing jetton and tip3 tokens
1 parent 0912b4f commit 50e266e

File tree

4 files changed

+84
-19
lines changed

4 files changed

+84
-19
lines changed

nekoton-contracts/src/old_tip3/token_wallet_contract.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,14 @@ pub fn burn_by_owner() -> &'static ton_abi::Function {
169169
}
170170
}
171171

172+
pub fn stub() -> &'static ton_abi::Function {
173+
declare_function! {
174+
name: "stub",
175+
inputs: Vec::new(),
176+
outputs: Vec::new(),
177+
}
178+
}
179+
172180
#[derive(Debug, Clone, UnpackAbiPlain, KnownParamTypePlain)]
173181
pub struct BurnByRootInputs {
174182
#[abi(with = "uint128_number")]

nekoton-contracts/src/tip3_1/token_wallet_contract.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,25 @@ pub fn accept_mint() -> &'static ton_abi::Function {
165165
}
166166
}
167167

168+
#[derive(Debug, Clone, KnownParamTypePlain, UnpackAbiPlain)]
169+
pub struct InternalTransferInputs {
170+
#[abi(uint64)]
171+
pub query_id: u64,
172+
#[abi(grams)]
173+
pub amount: ton_block::Grams,
174+
#[abi(address)]
175+
pub from: ton_block::MsgAddressInt,
176+
}
177+
178+
pub fn internal_transfer() -> &'static ton_abi::Function {
179+
declare_function! {
180+
function_id: 0x178d4519,
181+
name: "internalTransfer",
182+
inputs: InternalTransferInputs::param_type(),
183+
outputs: Vec::new(),
184+
}
185+
}
186+
168187
pub mod burnable {
169188
use super::*;
170189

src/core/parsing.rs

Lines changed: 56 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,20 @@ pub fn parse_token_transaction(
673673
TokenSwapBack::try_from((InputMessage(inputs), version))
674674
.map(TokenWalletTransaction::SwapBack)
675675
.ok()
676+
} else if function_id == functions.internal_transfer.input_id {
677+
let inputs = functions
678+
.internal_transfer
679+
.decode_input(body, true, true)
680+
.ok()?;
681+
682+
JettonIncomingTransfer::try_from(InputMessage(inputs))
683+
.map(|x| {
684+
TokenWalletTransaction::IncomingTransfer(TokenIncomingTransfer {
685+
tokens: x.tokens,
686+
sender_address: x.from,
687+
})
688+
})
689+
.ok()
676690
} else {
677691
None
678692
}
@@ -682,8 +696,8 @@ pub fn parse_jetton_transaction(
682696
tx: &ton_block::Transaction,
683697
description: &ton_block::TransactionDescrOrdinary,
684698
) -> Option<JettonWalletTransaction> {
685-
const STANDART_JETTON_CELLS: usize = 0;
686-
const STANDART_JETTON_BURN_CELLS: usize = 1;
699+
const STANDARD_JETTON_CELLS: usize = 0;
700+
const STANDARD_JETTON_BURN_CELLS: usize = 1;
687701
const MINTLESS_JETTON_CELLS: usize = 2;
688702

689703
if description.aborted {
@@ -702,7 +716,7 @@ pub fn parse_jetton_transaction(
702716
let cell = body.reference_opt(1)?;
703717
SliceData::load_cell(cell).ok()?
704718
}
705-
STANDART_JETTON_CELLS | STANDART_JETTON_BURN_CELLS => body,
719+
STANDARD_JETTON_CELLS | STANDARD_JETTON_BURN_CELLS => body,
706720
_ => return None,
707721
}
708722
};
@@ -821,6 +835,8 @@ struct TokenWalletFunctions {
821835
// Incoming
822836
accept_transfer: &'static ton_abi::Function,
823837
// Incoming
838+
internal_transfer: &'static ton_abi::Function,
839+
// Incoming
824840
burn: &'static ton_abi::Function,
825841
// Outgoing
826842
accept_burn: &'static ton_abi::Function,
@@ -837,6 +853,7 @@ impl TokenWalletFunctions {
837853
transfer: old_tip3::token_wallet_contract::transfer_to_recipient(),
838854
transfer_to_wallet: old_tip3::token_wallet_contract::transfer(),
839855
accept_transfer: old_tip3::token_wallet_contract::internal_transfer(),
856+
internal_transfer: old_tip3::token_wallet_contract::stub(),
840857
burn: old_tip3::token_wallet_contract::burn_by_owner(),
841858
accept_burn: old_tip3::root_token_contract::tokens_burned(),
842859
})
@@ -850,6 +867,7 @@ impl TokenWalletFunctions {
850867
transfer: tip3_1::token_wallet_contract::transfer(),
851868
transfer_to_wallet: tip3_1::token_wallet_contract::transfer_to_wallet(),
852869
accept_transfer: tip3_1::token_wallet_contract::accept_transfer(),
870+
internal_transfer: tip3_1::token_wallet_contract::internal_transfer(),
853871
burn: tip3_1::token_wallet_contract::burnable::burn(),
854872
accept_burn: tip3_1::root_token_contract::accept_burn(),
855873
})
@@ -887,6 +905,19 @@ impl TryFrom<(InputMessage, TokenWalletVersion)> for TokenSwapBack {
887905
}
888906
}
889907

908+
impl TryFrom<InputMessage> for JettonIncomingTransfer {
909+
type Error = UnpackerError;
910+
911+
fn try_from(value: InputMessage) -> Result<Self, Self::Error> {
912+
let input: tip3_1::token_wallet_contract::InternalTransferInputs = value.0.unpack()?;
913+
914+
Ok(Self {
915+
tokens: BigUint::from(input.amount.as_u128()),
916+
from: input.from,
917+
})
918+
}
919+
}
920+
890921
struct Accept {
891922
tokens: BigUint,
892923
}
@@ -1266,4 +1297,26 @@ mod tests {
12661297
);
12671298
}
12681299
}
1300+
1301+
#[test]
1302+
fn test_tip3_jetton_incoming_transfer() {
1303+
let (tx, description) = parse_transaction("te6ccgECDAEAAlgAA7V3f+qdGMi8JjYzPKoZ9Z+bpmydkT1wisdXZ77gk1AFAhAAATx7yfqggC6iE75ppDvdzLmbyOcBCnxe+PDJ76cRgKt2Cy2ZIX6gAAE8e8n6oGaTw/dQADR5NE8IBQQBAhUECQBgwdZYeJGNEQMCAG/Jh6EgTBRYQAAAAAAABAACAAAAA8B4u2hCcp/bPN/dOsHOMIcjI4f1rR546mtVo5GE4BN0QFAVzACcRkopjFAAAAAAAAAAAPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIJyH/HuNcxrNisZ3/ASNUm6oHt2S6OudgNcpDuLoGVKnHwuA9ejj3pxHzny2lpNan1PV91FIMUuTxfTeFZjxPvbkQIB4AgGAQHfBwCvSADv/VOjGReExsZnlUM+s/N0zZOyJ64RWOrs99wSagCgQwAOHyuzYYkse8JXNaFlfA3D8btggzNVZE6THxza4AOKz4684sQGFFhgAAAnj3k/VBLSeH7qQAGxaAHCojMY4mNubPmLxrR8IqPe3s4jRkwozPitECYHybqYEwAd/6p0YyLwmNjM8qhn1n5umbJ2RPXCKx1dnvuCTUAUCFAGDB1kBige6gAAJ495P1QK0nh+6sAJAacXjUUZAAAAAAAAAABDuaygCABw+V2bDElj3hK5rQsr4G4fjdsEGZqrInSY+ObXABxWfQAOHyuzYYkse8JXNaFlfA3D8btggzNVZE6THxza4AOKz4MKAQFACwAA");
1304+
let tip3_transaction =
1305+
parse_token_transaction(&tx, &description, TokenWalletVersion::Tip3).unwrap();
1306+
1307+
if let TokenWalletTransaction::IncomingTransfer(TokenIncomingTransfer {
1308+
tokens,
1309+
sender_address,
1310+
}) = tip3_transaction
1311+
{
1312+
assert_eq!(tokens.to_u128().unwrap(), 1000000000);
1313+
assert_eq!(
1314+
sender_address,
1315+
MsgAddressInt::from_str(
1316+
"0:387caecd8624b1ef095cd68595f0370fc6ed820ccd55913a4c7c736b800e2b3e"
1317+
)
1318+
.unwrap()
1319+
);
1320+
}
1321+
}
12691322
}

src/core/token_wallet/mod.rs

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ impl TokenWallet {
349349
_ => return None,
350350
};
351351

352-
let mut data =
352+
let data =
353353
parse_token_transaction(&transaction.data, &description, version);
354354

355355
if let Some(data) = &data {
@@ -371,21 +371,6 @@ impl TokenWallet {
371371
balance -= tokens.clone().to_bigint().trust_me();
372372
}
373373
}
374-
} else {
375-
let jetton_data =
376-
parse_jetton_transaction(&transaction.data, &description);
377-
378-
if let Some(JettonWalletTransaction::InternalTransfer(transfer)) =
379-
&jetton_data
380-
{
381-
balance += transfer.tokens.clone().to_bigint().trust_me();
382-
data = Some(TokenWalletTransaction::IncomingTransfer(
383-
TokenIncomingTransfer {
384-
tokens: transfer.tokens.clone(),
385-
sender_address: transfer.from.clone(),
386-
},
387-
));
388-
}
389374
}
390375

391376
let transaction =

0 commit comments

Comments
 (0)