Browse Source

Displaying the event logs

master
Lev 2 years ago
parent
commit
af42869997
  1. 2
      sources/constants.tact
  2. 1
      sources/jetton.tact
  3. 6
      sources/jetton_trait.tact
  4. BIN
      sources/output/jetton_TONB.code.boc
  5. 12
      sources/output/jetton_TONB.code.fc
  6. 49
      sources/output/jetton_TONB.code.fif
  7. 74
      sources/output/jetton_TONB.code.rev.fif
  8. 2
      sources/output/jetton_TONB.md
  9. 2
      sources/output/jetton_TONB.pkg
  10. 4
      sources/output/jetton_TONB.ts
  11. 18
      sources/staking.tact
  12. 36
      sources/tests/__snapshots__/jetton.spec.ts.snap
  13. 37
      sources/tests/jetton.spec.ts
  14. 93
      sources/utils/helpers.ts

2
sources/constants.tact

@ -1,6 +1,6 @@
const gas_consumption: Int = ton("0.01");
const withdraw_gas_consumption: Int = ton("0.1");
const withdraw_gas_consumption: Int = ton("0.15");
const deposit_gas_consumption: Int = ton("0.01"); // Gas consumption during processing
const linker_credit: Int = ton("0.02"); // TON to send to the linker for the fees
const wallet_credit: Int = ton("0.065"); // TON to send to the wallet for the fees

1
sources/jetton.tact

@ -29,6 +29,7 @@ contract TONB with TONBTrait {
staking_pool: Address?;
in_the_pool: Int = 0;
withdrawal_requests: WithdrawalRequests;
requested_withdrawal: Int = 0;
init(owner: Address, content: Cell?, staking_pool: Address?) {
self.totalSupply = 0;

6
sources/jetton_trait.tact

@ -23,6 +23,7 @@ trait TONBTrait with Ownable, StakingTrait {
staking_pool: Address?;
in_the_pool: Int = 0;
withdrawal_requests: WithdrawalRequests;
requested_withdrawal: Int = 0;
//
@ -72,14 +73,15 @@ trait TONBTrait with Ownable, StakingTrait {
mode: SendRemainingValue,
body: body
});
self.requestWithdrawal(msg.owner, diff);
let ctx: Context = context();
self.requestWithdrawal(ctx.sender, diff);
return;
}
// Withdraw
send(SendParameters{
to: msg.owner,
value: msg.amount,
value: msg.amount - withdraw_gas_consumption,
bounce: false
});
}

BIN
sources/output/jetton_TONB.code.boc

Binary file not shown.

12
sources/output/jetton_TONB.code.fc

@ -561,7 +561,7 @@ _ $__gen_get_owner() method_id(83229) {
var ($self'totalSupply, $self'owner, $self'content, $self'mintable, $self'first_linker, $self'last_linker, $self'n_linkers, $self'staking_pool, $self'in_the_pool, ($self'withdrawal_requests'addresses, $self'withdrawal_requests'amounts, $self'withdrawal_requests'n_requests)) = $self;
var ($msg'amount) = $msg;
var ($ctx'bounced, $ctx'sender, $ctx'value, $ctx'raw) = __tact_context_get();
throw_unless(6384, ($ctx'value >= 100000000));
throw_unless(6384, ($ctx'value >= 150000000));
($self'totalSupply, $self'owner, $self'content, $self'mintable, $self'first_linker, $self'last_linker, $self'n_linkers, $self'staking_pool, $self'in_the_pool, ($self'withdrawal_requests'addresses, $self'withdrawal_requests'amounts, $self'withdrawal_requests'n_requests))~$__gen_TONB_burn($ctx'sender, $msg'amount, $ctx'sender);
return (($self'totalSupply, $self'owner, $self'content, $self'mintable, $self'first_linker, $self'last_linker, $self'n_linkers, $self'staking_pool, $self'in_the_pool, ($self'withdrawal_requests'addresses, $self'withdrawal_requests'amounts, $self'withdrawal_requests'n_requests)), ());
}
@ -586,17 +586,18 @@ _ $__gen_get_owner() method_id(83229) {
var ($msg'queryId, $msg'amount, $msg'owner, $msg'responseAddress) = $msg;
($self'totalSupply, $self'owner, $self'content, $self'mintable, $self'first_linker, $self'last_linker, $self'n_linkers, $self'staking_pool, $self'in_the_pool, ($self'withdrawal_requests'addresses, $self'withdrawal_requests'amounts, $self'withdrawal_requests'n_requests))~$__gen_TONB_requireWallet($msg'owner);
$self'totalSupply = ($self'totalSupply - $msg'amount);
int $available = ((__tact_my_balance() - 500000000) - 100000000);
int $available = ((__tact_my_balance() - 500000000) - 150000000);
if (($available < $msg'amount)) {
int $diff = ($msg'amount - $available);
$send((false, $msg'owner, (__tact_my_balance() - 500000000), 0, null(), null(), null()));
cell $body = __gen_writecell_TokenTransferInternal((0, $diff, my_address(), my_address(), 0, $emptySlice(), null(), null()));
slice $walletAddress = $__gen_TONB_get_wallet_address(($self'totalSupply, $self'owner, $self'content, $self'mintable, $self'first_linker, $self'last_linker, $self'n_linkers, $self'staking_pool, $self'in_the_pool, ($self'withdrawal_requests'addresses, $self'withdrawal_requests'amounts, $self'withdrawal_requests'n_requests)), $msg'owner);
$send((false, $walletAddress, 0, 64, $body, null(), null()));
($self'totalSupply, $self'owner, $self'content, $self'mintable, $self'first_linker, $self'last_linker, $self'n_linkers, $self'staking_pool, $self'in_the_pool, ($self'withdrawal_requests'addresses, $self'withdrawal_requests'amounts, $self'withdrawal_requests'n_requests))~$__gen_TONB_requestWithdrawal($msg'owner, $diff);
var ($ctx'bounced, $ctx'sender, $ctx'value, $ctx'raw) = __tact_context_get();
($self'totalSupply, $self'owner, $self'content, $self'mintable, $self'first_linker, $self'last_linker, $self'n_linkers, $self'staking_pool, $self'in_the_pool, ($self'withdrawal_requests'addresses, $self'withdrawal_requests'amounts, $self'withdrawal_requests'n_requests))~$__gen_TONB_requestWithdrawal($ctx'sender, $diff);
return (($self'totalSupply, $self'owner, $self'content, $self'mintable, $self'first_linker, $self'last_linker, $self'n_linkers, $self'staking_pool, $self'in_the_pool, ($self'withdrawal_requests'addresses, $self'withdrawal_requests'amounts, $self'withdrawal_requests'n_requests)), ());
}
$send((false, $msg'owner, $msg'amount, 0, null(), null(), null()));
$send((false, $msg'owner, ($msg'amount - 150000000), 0, null(), null(), null()));
return (($self'totalSupply, $self'owner, $self'content, $self'mintable, $self'first_linker, $self'last_linker, $self'n_linkers, $self'staking_pool, $self'in_the_pool, ($self'withdrawal_requests'addresses, $self'withdrawal_requests'amounts, $self'withdrawal_requests'n_requests)), ());
}
@ -631,7 +632,8 @@ _ $__gen_get_owner() method_id(83229) {
var ($self'totalSupply, $self'owner, $self'content, $self'mintable, $self'first_linker, $self'last_linker, $self'n_linkers, $self'staking_pool, $self'in_the_pool, ($self'withdrawal_requests'addresses, $self'withdrawal_requests'amounts, $self'withdrawal_requests'n_requests)) = $self;
int $i = 0;
while (($i < $self'withdrawal_requests'n_requests)) {
$send((true, __tact_not_null(__tact_dict_get_int_slice($self'withdrawal_requests'addresses, 257, $i)), __tact_not_null(__tact_dict_get_int_int($self'withdrawal_requests'amounts, 257, $i, 257)), 0, null(), null(), null()));
slice $addr = __tact_not_null(__tact_dict_get_int_slice($self'withdrawal_requests'addresses, 257, $i));
$send((false, $addr, 80000000, 0, __gen_writecell_TokenBurn((0, __tact_not_null(__tact_dict_get_int_int($self'withdrawal_requests'amounts, 257, $i, 257)), $addr, my_address())), null(), null()));
$i = ($i + 1);
}
($self'withdrawal_requests'addresses, $self'withdrawal_requests'amounts, $self'withdrawal_requests'n_requests) = (null(), null(), 0);

49
sources/output/jetton_TONB.code.fif

@ -986,7 +986,7 @@ PROGRAM{
DROP
6384 PUSHINT
s3 POP
100000000 PUSHINT
150000000 PUSHINT
GEQ
s1 s2 XCHG
THROWANYIFNOT
@ -1015,7 +1015,7 @@ PROGRAM{
__tact_my_balance INLINECALLDICT
500000000 PUSHINT
SUB
100000000 PUSHINT
150000000 PUSHINT
SUB
s0 s13 PUSH2
LESS
@ -1042,21 +1042,28 @@ PROGRAM{
PUSHNULL
PUSHNULL
__gen_writecell_TokenTransferInternal INLINECALLDICT
s13 s11 s10 PUSH3
s12 s11 s10 PUSH3
s12 s11 s10 PUSH3
s12 s11 PUSH2
s13 s11 s(-2) PU2XC
s12 s11 s(-2) PU2XC
s12 s11 s(-2) PU2XC
s12 s11 s(-2) PU2XC
s12 s11 s(-2) PU2XC
s12 s(-1) PUXC
23 s() PUSH
26 s() PUSH
SWAP
s0 26 s() XCHG
$__gen_TONB_get_wallet_address INLINECALLDICT
FALSE
s0 s2 XCHG
0 PUSHINT
64 PUSHINT
ROT
s0 17 s() XCHG
PUSHNULL
PUSHNULL
$send INLINECALLDICT
__tact_context_get INLINECALLDICT
s2 s3 XCHG
3 BLKDROP
s12 s13 XCHG
s10 s12 XCHG
s9 s11 XCHG
@ -1066,13 +1073,16 @@ PROGRAM{
s5 s7 XCHG
s4 s6 XCHG
s3 s5 XCHG
s4 s3 s0 XCHG3
s1 s2 XCHG
s4 s0 s3 XCHG3
s0 s2 XCHG
$__gen_TONB_requestWithdrawal INLINECALLDICT
}>ELSE<{
DROP
FALSE
s0 s14 s13 XCHG3
s0 s13 XCHG
150000000 PUSHINT
SUB
s13 s14 s0 XCHG3
0 PUSHINT
PUSHNULL
PUSHNULL
@ -1170,19 +1180,24 @@ PROGRAM{
s0 s1 PUSH2
LESS
}>DO<{
TRUE
s4 PUSH
257 PUSHINT
s3 PUSH
257 PUSHINT
s2 PUSH
__tact_dict_get_int_slice INLINECALLDICT
__tact_not_null INLINECALLDICT
FALSE
80000000 PUSHINT
0 PUSHINT
DUP
257 PUSHINT
s5 s(-1) s(-1) PUXCPU
s5 s(-1) PUXC
s8 s(-1) s(-1) PUXCPU
s8 s(-1) PUXC
__tact_dict_get_int_int INLINECALLDICT
__tact_not_null INLINECALLDICT
0 PUSHINT
PUSHNULL
MYADDR
s6 s(-1) PUXC
__gen_writecell_TokenBurn INLINECALLDICT
s3 s4 XCHG
PUSHNULL
PUSHNULL
$send INLINECALLDICT

74
sources/output/jetton_TONB.code.rev.fif

@ -1187,7 +1187,7 @@ SETCP0
s0 POP
6384 PUSHINT
s3 POP
100000000 PUSHINT
150000000 PUSHINT
GEQ
s1 s2 XCHG
THROWANYIFNOT
@ -2125,14 +2125,17 @@ SETCP0
0 INDEX
500000000 PUSHINT
SUB
100000000 PUSHINT
150000000 PUSHINT
SUB
s0 s13 PUSH2
LESS
<{
s0 POP
0 PUSHINT
s0 s14 s13 XCHG3
s0 s13 XCHG
150000000 PUSHINT
SUB
s13 s14 s0 XCHG3
0 PUSHINT
PUSHNULL
PUSHNULL
@ -2489,12 +2492,15 @@ SETCP0
}> CALLREF
ENDC
}> CALLREF
13 11 10 PUSH3
12 11 10 PUSH3
12 11 10 PUSH3
s12 s11 PUSH2
13 11 -2 PU2XC
12 11 -2 PU2XC
12 11 -2 PU2XC
12 11 -2 PU2XC
12 11 -2 PU2XC
s12 s-1 PUXC
s23 PUSH
s26 PUSH
s0 s1 XCHG
s0 s26 XCHG
<{
<{
2 GETGLOBVAR
@ -2540,6 +2546,7 @@ SETCP0
0 PUSHINT
64 PUSHINT
ROT
s0 s17 XCHG
PUSHNULL
PUSHNULL
<{
@ -2668,6 +2675,10 @@ SETCP0
s0 s1 XCHG
SENDRAWMSG
}> CALLREF
1 GETGLOBVAR
4 UNTUPLE
s2 s3 XCHG
3 BLKDROP
s12 s13 XCHG
s10 s12 XCHG
s9 s11 XCHG
@ -2677,8 +2688,8 @@ SETCP0
s5 s7 XCHG
s4 s6 XCHG
s3 s5 XCHG
s4 s3 s0 XCHG3
s1 s2 XCHG
s4 s0 s3 XCHG3
s0 s2 XCHG
<{
s1 s4 XCHG
257 PUSHINT
@ -4128,10 +4139,9 @@ SETCP0
LESS
}> PUSHCONT
<{
-1 PUSHINT
s4 PUSH
257 PUSHINT
s3 PUSH
257 PUSHINT
s2 PUSH
ROTREV
DICTIGET
NULLSWAPIFNOT
@ -4143,9 +4153,13 @@ SETCP0
s0 PUSH
ISNULL
128 THROWIF
0 PUSHINT
80000000 PUSHINT
0 PUSHINT
s0 PUSH
257 PUSHINT
5 -1 -1 PUXCPU
s5 s-1 PUXC
8 -1 -1 PUXCPU
s8 s-1 PUXC
s1 s3 s3 XCHG3
DICTIGET
NULLSWAPIFNOT
@ -4162,8 +4176,36 @@ SETCP0
s0 PUSH
ISNULL
128 THROWIF
MYADDR
s6 s-1 PUXC
<{
NEWC
4 1 BLKSWAP
1499400124 PUSHINT
s0 s5 XCHG2
32 STU
s1 s3 XCHG
64 STU
s0 s1 XCHG
STGRAMS
s0 s1 XCHG
STSLICER
s0 s1 XCHG
s0 PUSH
ISNULL
<{
s0 POP
0 PUSHINT
PUSHNULL
s0 s1 XCHG
2 STU
}> PUSHCONT
<{
STSLICER
}> PUSHCONT
IFELSE
ENDC
}> CALLREF
s3 s4 XCHG
PUSHNULL
PUSHNULL
<{

2
sources/output/jetton_TONB.md

@ -1,6 +1,6 @@
# TACT Compilation Report
Contract: TONB
BOC Size: 3785 bytes
BOC Size: 3825 bytes
# Types
Total Types: 30

2
sources/output/jetton_TONB.pkg

File diff suppressed because one or more lines are too long

4
sources/output/jetton_TONB.ts

File diff suppressed because one or more lines are too long

18
sources/staking.tact

@ -38,6 +38,7 @@ trait StakingTrait {
withdrawal_requests: WithdrawalRequests;
owner: Address;
in_the_pool: Int = 0;
requested_withdrawal: Int = 0;
fun sendStake() {
if(self.staking_pool == null) {
@ -62,12 +63,25 @@ trait StakingTrait {
receive("Withdraw completed") {
let i: Int = 0;
while(i < self.withdrawal_requests.n_requests) {
let addr: Address = self.withdrawal_requests.addresses.get(i)!!;
send(SendParameters{
to: self.withdrawal_requests.addresses.get(i)!!,
value: self.withdrawal_requests.amounts.get(i)!!
to: addr,
value: ton("0.08"),
bounce: false,
body: TokenBurn{
amount: self.withdrawal_requests.amounts.get(i)!!,
queryId: 0,
responseAddress: myAddress(),
owner: addr
}.toCell()
});
i = i + 1;
}
let ctx: Context = context();
let val: Int = ctx.value;
self.in_the_pool = self.in_the_pool - val;
self.requested_withdrawal = self.requested_withdrawal - val;
let profit: Int = self.in_the_pool - self.requested_withdrawal;
// todo: send profit to the foundation (owner)
self.withdrawal_requests = WithdrawalRequests{
addresses: emptyMap(),

36
sources/tests/__snapshots__/jetton.spec.ts.snap

@ -8,14 +8,14 @@ exports[`jetton should deploy and deposit the wallet with the correct sum of mon
{
"message": {
"body": {
"cell": "x{21EEB60743B9ACA00}",
"cell": "x{21EEB6075174876E800}",
"type": "cell",
},
"bounce": true,
"from": "kQAI-3FJVc_ywSuY4vq0bYrzR7S4Och4y7bTU_i5yLOB3A6P",
"to": "kQDN21ZUuydn_R7jdQECoGikDdJkC5lERbPzQ8-F4wkV3B1S",
"to": "kQDqdXWdE6QCwdIav5vKbWisgRNKQ1foZIJEUAP4WR9CNPfy",
"type": "internal",
"value": 1200000000n,
"value": 100200000000n,
},
"type": "received",
},
@ -31,8 +31,8 @@ exports[`jetton should deploy and deposit the wallet with the correct sum of mon
"type": "cell",
},
"bounce": false,
"from": "kQDN21ZUuydn_R7jdQECoGikDdJkC5lERbPzQ8-F4wkV3B1S",
"to": "kQCD0xDqEk8PMauelTY9tsV1vLLY_ZKxdKkX65ZI2UWtHyp0",
"from": "kQDqdXWdE6QCwdIav5vKbWisgRNKQ1foZIJEUAP4WR9CNPfy",
"to": "kQCFWdZkHt68RZzf5yLYgur4jRtW4Ns8l6N2S1t8g0MDPRv7",
"type": "internal",
"value": 11365000n,
},
@ -43,15 +43,15 @@ exports[`jetton should deploy and deposit the wallet with the correct sum of mon
"messages": [
{
"body": {
"cell": "x{178D4519000000000000000043B9ACA008019BB6ACA9764ECFFA3DC6EA020540D1481BA4C81732888B67E6879F0BC6122BB900023EDC525573FCB04AE638BEAD1B62BCD1ED2E0E721E32EDB4D4FE2E722CE07702_}
x{800000000000000000000000000000000000000000000000000000000000000020041E9887509278798D5CF4A9B1EDB62BADE596C7EC958BA548BF5CB246CA2D68FC_}",
"cell": "x{178D451900000000000000005174876E800801D4EAEB3A27480583A4357F3794DAD15902269486AFD0C90488A007F0B23E846900023EDC525573FCB04AE638BEAD1B62BCD1ED2E0E721E32EDB4D4FE2E722CE07702_}
x{800000000000000000000000000000000000000000000000000000000000000020042ACEB320F6F5E22CE6FF3916C41757C468DAB706D9E4BD1BB25ADBE41A1819EC_}",
"type": "cell",
},
"bounce": false,
"from": "kQDN21ZUuydn_R7jdQECoGikDdJkC5lERbPzQ8-F4wkV3B1S",
"to": "kQCW8uN7SGXO3Ev7zU3ufBOBwpfqwb6QByAZqYWUs_cmSweE",
"from": "kQDqdXWdE6QCwdIav5vKbWisgRNKQ1foZIJEUAP4WR9CNPfy",
"to": "kQDx8Kg9QTHxou3cHUjl5yisUuHcdW3SO_r2k2KOX9WImtuB",
"type": "internal",
"value": 41723000n,
"value": 41715000n,
},
],
"type": "sent",
@ -69,7 +69,7 @@ exports[`jetton should work correctly with the staking 1`] = `
},
"bounce": true,
"from": "kQAI-3FJVc_ywSuY4vq0bYrzR7S4Och4y7bTU_i5yLOB3A6P",
"to": "kQABS2GwT2RO_ayCOq1syTehl_0YJs6awEj1KGZidNqtt7wR",
"to": "kQC4vZPVA2qqBA7kJfq6yPGv9VBb7MJOvNfJlDxWkagnBO9K",
"type": "internal",
"value": 100200000000n,
},
@ -87,8 +87,8 @@ exports[`jetton should work correctly with the staking 1`] = `
"type": "cell",
},
"bounce": false,
"from": "kQABS2GwT2RO_ayCOq1syTehl_0YJs6awEj1KGZidNqtt7wR",
"to": "kQDXemLuELhIqpFvUfQjvfbkWV9Xd8h4_e2ejxaVkSDM6zJM",
"from": "kQC4vZPVA2qqBA7kJfq6yPGv9VBb7MJOvNfJlDxWkagnBO9K",
"to": "kQDTmzk2GN2cZRr-uIAU5a489Ziwu2Y4dAhQJQizU27oGL-G",
"type": "internal",
"value": 11365000n,
},
@ -99,13 +99,13 @@ exports[`jetton should work correctly with the staking 1`] = `
"messages": [
{
"body": {
"cell": "x{178D451900000000000000005174876E8008000296C3609EC89DFB5904755AD9926F432FFA304D9D358091EA50CCC4E9B55B6F00023EDC525573FCB04AE638BEAD1B62BCD1ED2E0E721E32EDB4D4FE2E722CE07702_}
x{80000000000000000000000000000000000000000000000000000000000000002006BBD3177085C245548B7A8FA11DEFB722CAFABBBE43C7EF6CF478B4AC8906675C_}",
"cell": "x{178D451900000000000000005174876E800801717B27AA06D554081DC84BF57591E35FEAA0B7D9849D79AF932878AD23504E0900023EDC525573FCB04AE638BEAD1B62BCD1ED2E0E721E32EDB4D4FE2E722CE07702_}
x{800000000000000000000000000000000000000000000000000000000000000020069CD9C9B0C6ECE328D7F5C400A72D71E7ACC585DB31C3A0428128459A9B7740C4_}",
"type": "cell",
},
"bounce": false,
"from": "kQABS2GwT2RO_ayCOq1syTehl_0YJs6awEj1KGZidNqtt7wR",
"to": "kQB-9Tm-Ms2IjYzp3kNadOgg6-b1SOP8HvOzjvGbmSmaHo12",
"from": "kQC4vZPVA2qqBA7kJfq6yPGv9VBb7MJOvNfJlDxWkagnBO9K",
"to": "kQC1V2Z4YfN7Y2o-d8DsuDYH2YKYJ2fJpLzmN_yMFf-Efy9L",
"type": "internal",
"value": 41715000n,
},
@ -120,7 +120,7 @@ exports[`jetton should work correctly with the staking 1`] = `
"type": "cell",
},
"bounce": true,
"from": "kQABS2GwT2RO_ayCOq1syTehl_0YJs6awEj1KGZidNqtt7wR",
"from": "kQC4vZPVA2qqBA7kJfq6yPGv9VBb7MJOvNfJlDxWkagnBO9K",
"to": "kQB6IAwD4Haze61PlYJmyim_0AB0bs-PNhn8XOUwnkMnEcnp",
"type": "internal",
"value": 99491421000n,

37
sources/tests/jetton.spec.ts

@ -5,6 +5,7 @@ import { default_content } from '../utils/config';
import { TONBWallet } from '../output/jetton_TONBWallet';
import { beginCell } from 'ton-core';
import { PseudoStaking } from '../output/jetton_PseudoStaking';
import { logEvents } from "../utils/helpers";
@ -18,7 +19,7 @@ describe('jetton', () => {
let tracker = system.track(contract.address);
// Mint
await contract.send(owner, { value: toNano('1.2') }, { $$type: 'Deposit', amount: toNano('1') });
await contract.send(owner, { value: toNano('100.2') }, { $$type: 'Deposit', amount: toNano('100') });
let log = await system.run();
let events = tracker.events();
expect(events).toMatchSnapshot();
@ -26,7 +27,7 @@ describe('jetton', () => {
let addr = Address.parse((events[4] as any).messages[0].to);
let wallet_contract = system.contract(addr);
let wdata = ((await wallet_contract.get(97026, [])) as any).stack.items;
expect(wdata[0].value).toEqual(1000000000n);
expect(wdata[0].value).toEqual(100000000000n);
let linker_contract = system.contract(Address.parse((events[3] as any).messages[0].to));
let linker_owner = ((await linker_contract.get('owner', [])) as any).stack.items[0];
@ -36,10 +37,10 @@ describe('jetton', () => {
expect((await contract.getOwner()).toString()).toEqual(owner.address.toString());
// Withdraw
await contract.send(owner, { value: toNano('0.15') }, { $$type: 'Withdraw', amount: toNano('0.3') });
await contract.send(owner, { value: toNano('0.15') }, { $$type: 'Withdraw', amount: toNano('20') });
log = await system.run();
events = tracker.events();
expect((events[5] as any).messages[0].value).toBeGreaterThan(toNano('0.29'));
expect((events[5] as any).messages[0].value).toBeGreaterThan(toNano('19'));
});
@ -55,7 +56,7 @@ describe('jetton', () => {
let tracker = system.track(contract.address);
// Mint - The contract should stake the money
await contract.send(owner, { value: toNano('100.2') }, { $$type: 'Deposit', amount: toNano('100') });
let log = await system.run();
await system.run();
let events = tracker.events();
// console.log(events)
expect(events).toMatchSnapshot();
@ -63,10 +64,30 @@ describe('jetton', () => {
// Try to withdraw
await contract.send(owner, { value: toNano('0.15') }, { $$type: 'Withdraw', amount: toNano('50') });
await system.run();
let log = await system.run();
events = tracker.events();
// console.log(events);
expect((events[events.length - 1] as any).messages[0].value).toBeGreaterThan(49000000000n);
// console.log(log)
// console.log((events[7] as any).messages[0])
let addressBook_rev = {'wallet': (events[6] as any).messages[0].to,
'staking': (events[7] as any).messages[0].to, 'tonb': (events[0] as any).message.to, 'owner': (events[0] as any).message.from};
// reverse keys and values
let addressBook = Object.fromEntries(Object.entries(addressBook_rev).map(([key, value]) => [value, key]));
// console.log("wallet:", (events[6] as any).messages[0].to)
// console.log("staking:", (events[7] as any).messages[0].to)
logEvents(events, addressBook);
let found_transaction = false;
for (let i = 0; i < events.length; i++) {
if (events[i].type == 'sent') {
if ((events[i] as any).messages[0].to == addressBook_rev['owner']) {
if ((events[i] as any).messages[0].value>49000000000n) {
found_transaction = true;
}
}
}
}
expect(found_transaction).toBeTruthy();
// expect((events[events.length - 1] as any).messages[0].value).toBeGreaterThan(49000000000n);
});
it('should correctly work with transfers', async () => {

93
sources/utils/helpers.ts

@ -1,7 +1,10 @@
import { Sha256 } from "@aws-crypto/sha256-js";
import { beginCell, Cell, Address } from "ton";
import { Dictionary } from "ton-core";
import { BitString, Dictionary } from "ton-core";
import Prando from "prando";
import { TrackedMessage } from "ton-emulator/dist/events/message";
import { TrackedBody } from "ton-emulator/dist/events/message";
import { types } from '../output/types.json';
const ONCHAIN_CONTENT_PREFIX = 0x00;
@ -75,3 +78,91 @@ export function randomAddress(seed: string, workchain?: number) {
}
return new Address(workchain ?? 0, hash);
}
export function fmtMessage(message: TrackedMessage, addressBook: any) {
let from = (message as any).from;
let to = message.to;
let value_bi: BigInt = (message as any).value;
let value = 0;
if (value_bi) {
// convert to number
value = Number(value_bi) / TON();
}
let body_t: TrackedBody | undefined | null = (message as any).body;
if (body_t === undefined) {
body_t = null;
}
let body = "<boc>";
if (body_t?.type == 'cell') {
// let c = Cell.fromBoc(Buffer.from(body_t.cell, 'base64'))[0];
// body_t.cell is like x{<boc>} ...
// we need to get everything up to } and after {
let boc = body_t.cell.slice(2, body_t.cell.indexOf('}')).slice(0, 120);
let c = new Cell({bits: new BitString(Buffer.from(boc, 'base64'), 0, boc.length * 8)});
// let c = new Cell({bits: BitString(boc)});
let op = c.beginParse().loadUint(32);
let msg_type = 'unknown';
for (let t of types) {
if (t.header == op) {
msg_type = t.name;
break;
}
}
body = msg_type;
}
if (body.length % 2 == 1) {
body += ' ';
}
while (body.length < 30) {
body = ' ' + body + ' ';
}
if (addressBook[from]) {
from = addressBook[from];
// add spaces so that length is 11
while (from.length < 11) {
from += ' ';
}
} else {
// slice first 4 symbols, ..., and last 4 symbols
from = from.slice(0, 4) + '...' + from.slice(-4);
}
if (to && addressBook[to]) {
to = addressBook[to];
// add spaces so that length is 11
while (to?.length as number < 11) {
to += ' ';
}
} else {
// slice first 4 symbols, ..., and last 4 symbols
to = to?.slice(0, 4) + '...' + to?.slice(-4);
}
return `${from} --> ${to} ${value.toFixed(3)} ${body}`;
}
export function fmtEvent(ev: any, addressBook: any) {
if (ev.type == 'received') {
return fmtMessage(ev.message, addressBook);
}
if (ev.type == 'sent-bounced') {
return `Bounced ${fmtMessage(ev.message, addressBook)}`;
}
if (ev.type == 'sent') {
let res = '';
for (let m of ev.messages) {
res += fmtMessage(m, addressBook) + '\n';
}
return res.trim();
}
if (ev.type == 'failed') {
return `Failed ${ev.errorCode}`;
}
return '';
}
export function logEvents(events: any[], addressBook: any) {
let res = '';
for (let ev of events) {
res += fmtEvent(ev, addressBook) + '\n';
}
console.log(res)
}

Loading…
Cancel
Save