Address | EQC4TdkCVwAf_xLoEKefWDsHHLRC-Mq-S1r76r24L_n8e-g8 |
Chain | Basic Workchain |
Contract Type | π Verfied source |
Contract Code Hash | FzP3n0fSSih6OjK52QY4r6xbZ5cKrEIV8TeDIRWSi+o= |
{-
math.func
Extends FunC's arithmetic operations.
-}
int equal_slices (slice a, slice b) asm "SDEQ";
(int) sqrt(int x) inline {
if (x == 0){
return 0;
} else {
if (x <= 3) {
return 1;
} else {
int z = (x + 1) / 2;
int y = x;
while (z < y) {
y = z;
z = (x / z + z) / 2;
}
return y;
}
}
}
(int) avg(int x, int y) inline {
return (x + y) / 2;
}
(int) exp(int x) inline {
return (x >= 0 ? 1 << x : 1 >> (x * -1));
}
(int) log2(int x) inline {
int n = 0;
if (x >= 128.exp()) {
x >>= 128;
n += 128;
}
if (x >= 64.exp()) {
x >>= 64;
n += 64;
}
if (x >= 32.exp()) {
x >>= 32;
n += 32;
}
if (x >= 16.exp()) {
x >>= 16;
n += 16;
}
if (x >= 8.exp()) {
x >>= 8;
n += 8;
}
if (x >= 4.exp()) {
x >>= 4;
n += 4;
}
if (x >= 2.exp()) {
x >>= 2;
n += 2;
}
if (x >= 1.exp()) {
;; x >>= 1;
n += 1;
}
return n;
}
(int) mod (int x, int y) asm "MOD";{-
utils.func
Utility library for FunC.
-}
(slice) get_contract_address(int workchain, cell state_init) inline {
return begin_cell()
.store_uint(4, 3)
.store_int(workchain, 8)
.store_uint(cell_hash(state_init), 256)
.end_cell().begin_parse();
}
(int) to_ton(int amount) inline {
return amount * 1000000000;
}
(int) from_ton(int amount) inline {
return amount / 1000000000;
}
(int) get_workchain(slice address) inline {
(int wc, _) = parse_var_addr(address);
return wc;
}
() force_chain(int workchain, slice address, int error_code) inline {
(int wc) = get_workchain(address);
throw_unless(error_code, wc == workchain);
}
(int) get_query_id() inline {
return now() + mod(cur_lt(), 4294967296);
}
(slice) get_serialized_address(int workchain, int address) inline {
return (begin_cell()
.store_uint(2, 2) ;; Is std address
.store_uint(0, 1) ;; Non-unicast
.store_uint(workchain, 8) ;; Basic workchain
.store_uint(address, 256) ;; Address hash
).end_cell().begin_parse();
}
int workchain() asm "0 PUSHINT";
int op::transfer() asm "0xf8a7ea5 PUSHINT";
int op::transfer_notification() asm "0x7362d09c PUSHINT";
int op::internal_transfer() asm "0x178d4519 PUSHINT";
int op::excesses() asm "0xd53276db PUSHINT";
int op::burn() asm "0x595f07bc PUSHINT";
int op::burn_notification() asm "0x7bdd97de PUSHINT";
;; Minter
int op::mint() asm "21 PUSHINT";
int op::collect_fee() asm "22 PUSHINT";
int op::fee_collected_notification() asm "23 PUSHINT";cell pack_jetton_wallet_data(int balance, slice owner_address, slice jetton_master_address, cell jetton_wallet_code) inline {
return begin_cell()
.store_grams(balance)
.store_slice(owner_address)
.store_slice(jetton_master_address)
.store_ref(jetton_wallet_code)
.end_cell();
}
cell calculate_jetton_wallet_state_init(slice owner_address, slice jetton_master_address, cell jetton_wallet_code) inline {
return begin_cell()
.store_uint(0, 2)
.store_dict(jetton_wallet_code)
.store_dict(pack_jetton_wallet_data(0, owner_address, jetton_master_address, jetton_wallet_code))
.store_uint(0, 1)
.end_cell();
}
slice calculate_jetton_wallet_address(cell state_init) inline {
return begin_cell().store_uint(4, 3)
.store_int(workchain(), 8)
.store_uint(cell_hash(state_init), 256)
.end_cell()
.begin_parse();
}
slice calculate_user_jetton_wallet_address(slice owner_address, slice jetton_master_address, cell jetton_wallet_code) inline {
return calculate_jetton_wallet_address(calculate_jetton_wallet_state_init(owner_address, jetton_master_address, jetton_wallet_code));
}
int get_minimal_reserve() asm "100000000 PUSHINT";
(int, slice, cell, cell) load_data() inline {
slice ds = get_data().begin_parse();
return (
ds~load_grams(), ;; total_supply
ds~load_msg_addr(), ;; admin_address
ds~load_ref(), ;; content
ds~load_ref() ;; jetton_wallet_code
);
}
() save_data(int total_supply, slice admin_address, cell content, cell jetton_wallet_code) impure inline {
set_data(begin_cell()
.store_grams(total_supply)
.store_slice(admin_address)
.store_ref(content)
.store_ref(jetton_wallet_code)
.end_cell()
);
}
() mint_tokens(slice to_address, cell jetton_wallet_code, int amount) impure {
cell state_init = calculate_jetton_wallet_state_init(to_address, my_address(), jetton_wallet_code);
slice to_wallet_address = calculate_jetton_wallet_address(state_init);
var msg = begin_cell()
.store_uint(0x18, 6)
.store_slice(to_wallet_address)
.store_grams(40000000) ;; should be enough to cover fees
.store_uint(4 + 2 + 1, 1 + 4 + 4 + 64 + 32 + 1 + 1 + 1)
.store_ref(state_init)
.store_ref(begin_cell()
.store_uint(op::internal_transfer(), 32)
.store_uint(cur_lt(), 64)
.store_grams(amount)
.end_cell());
send_raw_message(msg.end_cell(), 1);
}
() recv_internal(int balance, int msg_value, cell in_msg_full, slice in_msg_body) impure {
if (in_msg_body.slice_empty?()) { ;; ignore empty messages
return ();
}
slice cs = in_msg_full.begin_parse();
int flags = cs~load_uint(4);
if (flags & 1) { ;; ignore all bounced messages
return ();
}
slice sender_address = cs~load_msg_addr();
int op = in_msg_body~load_uint(32);
int query_id = in_msg_body~load_uint(64);
(int total_supply, slice admin_address, cell content, cell jetton_wallet_code) = load_data();
if (op == op::collect_fee()) {
total_supply += get_minimal_reserve();
throw_unless(74, balance > total_supply);
var msg = begin_cell()
.store_uint(0x18, 6) ;; nobounce - int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool src:MsgAddress -> 011000
.store_slice(admin_address)
.store_grams(balance - total_supply)
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
.store_uint(op::fee_collected_notification(), 32)
.store_uint(query_id, 64);
send_raw_message(msg.end_cell(), 1);
return ();
}
if (op == op::mint()) {
throw_unless(75, msg_value > get_minimal_reserve()); ;; minimum minting amount is 0.1 TON
msg_value -= get_minimal_reserve(); ;; minting fee 0.05
mint_tokens(sender_address, jetton_wallet_code, msg_value);
save_data(total_supply + msg_value, admin_address, content, jetton_wallet_code);
return ();
}
if (op == op::burn_notification()) {
int jetton_amount = in_msg_body~load_grams();
slice from_address = in_msg_body~load_msg_addr();
throw_unless(76,
equal_slices(calculate_user_jetton_wallet_address(from_address, my_address(), jetton_wallet_code), sender_address)
);
save_data(total_supply - jetton_amount, admin_address, content, jetton_wallet_code);
var msg = begin_cell()
.store_uint(0x18, 6) ;; nobounce - int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool src:MsgAddress -> 011000
.store_slice(from_address)
.store_grams(jetton_amount)
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
.store_uint(op::burn_notification(), 32)
.store_uint(query_id, 64);
send_raw_message(msg.end_cell(), 1);
slice response_address = in_msg_body~load_msg_addr();
if (response_address.preload_uint(2) != 0) {
var msg = begin_cell()
.store_uint(0x10, 6) ;; nobounce - int_msg_info$0 ihr_disabled:Bool bounce:Bool bounced:Bool src:MsgAddress -> 011000
.store_slice(response_address)
.store_grams(0)
.store_uint(0, 1 + 4 + 4 + 64 + 32 + 1 + 1)
.store_uint(op::excesses(), 32)
.store_uint(query_id, 64);
send_raw_message(msg.end_cell(), 2 + 64);
}
return ();
}
throw(0xffff);
}
(int, int, slice, cell, cell) get_jetton_data() method_id {
(int total_supply, slice admin_address, cell content, cell jetton_wallet_code) = load_data();
return (total_supply, -1, admin_address, content, jetton_wallet_code);
}
slice get_wallet_address(slice owner_address) method_id {
(_, _, _, cell jetton_wallet_code) = load_data();
return calculate_user_jetton_wallet_address(owner_address, my_address(), jetton_wallet_code);
}
(int) get_fee() method_id {
(int total_supply, slice admin_address, cell content, cell jetton_wallet_code) = load_data();
total_supply += get_minimal_reserve();
[int balance, _] = get_balance();
return balance - total_supply;
}
_ supported_interfaces() method_id {
return (
123515602279859691144772641439386770278, ;; org.ton.introspection.v0
82609559452677550956134866036642686023 ;; org.ton.ft.wton.tonox:v0
);
}
SETCP0
(:methods
recv_internal:
s0 PUSH
SEMPTY
<{
4 BLKDROP
}> PUSHCONT
IFJMP
s0 s1 XCHG
CTOS
4 LDU
s0 s1 XCHG
1 PUSHINT
AND
<{
4 BLKDROP
}> PUSHCONT
IFJMP
LDMSGADDR
s0 POP
s0 s1 XCHG
32 LDU
64 LDU
c4 PUSH
CTOS
LDGRAMS
LDMSGADDR
LDREF
LDREF
s0 POP
22 PUSHINT
s7 s-1 PUXC
EQUAL
<{
2DROP
s2 POP
3 3 BLKDROP2
100000000 PUSHINT
ADD
s3 s0 PUSH2
GREATER
74 THROWIFNOT
23 PUSHINT
0 PUSHINT
24 PUSHINT
NEWC
6 STU
s0 s4 XCHG2
STSLICER
s5 s2 XCHG2
SUB
STGRAMS
107 STU
s1 s2 XCHG
32 STU
64 STU
ENDC
1 PUSHINT
SENDRAWMSG
}> PUSHCONT
IFJMP
s9 POP
21 PUSHINT
s6 s-1 PUXC
EQUAL
<{
3 3 BLKDROP2
100000000 PUSHINT
s5 s-1 PUXC
GREATER
75 THROWIFNOT
100000000 PUSHINT
s1 s5 XCHG
SUB
3 5 3 XCPU2
18 CALLDICT
s0 s2 XCHG
ADD
s2 s3 XCHG2
NEWC
s0 s4 XCHG2
STGRAMS
ROT
STSLICER
STREF
STREF
ENDC
c4 POP
}> IFJMPREF
s7 POP
2078119902 PUSHINT
s1 s5 XCHG
EQUAL
<{
s0 s1 XCHG
LDGRAMS
LDMSGADDR
MYADDR
2 9 -1 PU2XC
0 PUSHINT
0 1 2 XCPUXC
4 0 3 XC2PU
NEWC
s0 s4 XCHG2
STGRAMS
ROT
STSLICER
s0 s1 XCHG
STSLICER
STREF
ENDC
s2 PUSH
NEWC
2 STU
s1 s2 XCHG
STDICT
STDICT
1 STU
ENDC
HASHCU
0 PUSHINT
4 PUSHINT
NEWC
3 STU
8 STI
256 STU
ENDC
CTOS
s0 s7 XCHG2
SDEQ
76 THROWIFNOT
s2 s1 XCPU
SUB
s4 s1 s3 XCHG3
s6 s7 XCHG2
NEWC
s0 s4 XCHG2
STGRAMS
ROT
STSLICER
STREF
STREF
ENDC
c4 POP
2078119902 PUSHINT
0 PUSHINT
24 PUSHINT
NEWC
6 STU
s0 s3 XCHG2
STSLICER
s0 s4 XCHG2
STGRAMS
107 STU
s1 s2 XCHG
32 STU
s2 s-1 PUXC
64 STU
ENDC
1 PUSHINT
SENDRAWMSG
LDMSGADDR
s0 POP
s0 PUSH
2 PLDU
0 NEQINT
<{
3576854235 PUSHINT
0 PUSHINT
16 PUSHINT
NEWC
6 STU
s0 s3 XCHG2
STSLICER
s2 PUSH
STGRAMS
s1 s2 XCHG
107 STU
32 STU
64 STU
ENDC
66 PUSHINT
SENDRAWMSG
}> PUSHCONT
<{
2DROP
}> PUSHCONT
IFELSE
}> IFJMPREF
7 BLKDROP
16 PUSHPOW2DEC
THROWANY
18:
MYADDR
s3 s0 s3 XCHG3
0 PUSHINT
0 1 2 XCPUXC
4 0 3 XC2PU
NEWC
s0 s4 XCHG2
STGRAMS
ROT
STSLICER
s0 s1 XCHG
STSLICER
STREF
ENDC
s2 PUSH
NEWC
2 STU
s1 s2 XCHG
STDICT
STDICT
1 STU
ENDC
s0 PUSH
HASHCU
0 PUSHINT
4 PUSHINT
NEWC
3 STU
8 STI
256 STU
ENDC
CTOS
LTIME
395134233 PUSHINT
NEWC
32 STU
64 STU
s0 s3 XCHG2
STGRAMS
ENDC
7 PUSHINT
24 PUSHINT
NEWC
6 STU
s0 s4 XCHG2
STSLICER
40000000 PUSHINT
STGRAMS
s1 s3 XCHG
108 STU
STREF
STREF
ENDC
1 PUSHINT
SENDRAWMSG
90629:
c4 PUSH
CTOS
LDGRAMS
LDMSGADDR
LDREF
LDREF
s0 POP
3 BLKDROP
100000000 PUSHINT
ADD
BALANCE
2 UNTUPLE
s0 POP
s0 s1 XCHG
SUB
get_wallet_address:
c4 PUSH
CTOS
LDGRAMS
LDMSGADDR
LDREF
LDREF
s0 POP
3 1 BLKDROP2
MYADDR
s0 s1 XCHG
0 PUSHINT
0 1 2 XCPUXC
4 0 3 XC2PU
NEWC
s0 s4 XCHG2
STGRAMS
ROT
STSLICER
s0 s1 XCHG
STSLICER
STREF
ENDC
s2 PUSH
NEWC
2 STU
s1 s2 XCHG
STDICT
STDICT
1 STU
ENDC
HASHCU
0 PUSHINT
4 PUSHINT
NEWC
3 STU
8 STI
256 STU
ENDC
CTOS
get_jetton_data:
c4 PUSH
CTOS
LDGRAMS
LDMSGADDR
LDREF
LDREF
s0 POP
-1 PUSHINT
3 1 BLKSWAP
113617:
123515602279859691144772641439386770278 PUSHINT
82609559452677550956134866036642686023 PUSHINT
) 19 DICTPUSHCONST
DICTIGETJMPZ
11 THROWARG
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
x{FF00F4A413F4BCF2C80B}
x{62_}
x{CB}
x{D0831C02497C138007434C0C05C6C2497C1383E900C0074C7F4CFFB51343E803E9035350C2005949C2EA38B56CC9B0CE084017D78402814CC2F3CB812A005DC20063232C1540133C59414A87E80B2DA84B2C7F2CFF25C7EC0380E600554982EB8C08DE0841EF765F7856EB8C097C1E103FCBC2_}
x{6C33821005F5E1005250BCF2E04B821005F5E10015A1543353F01202A05023C85004FA0258CF16CCCCC9ED54}
x{01FA00FA40F8285462A170542013541403C85004FA0258CF1601CF16CCC922C8CB0112F400F400CB00C9F9007074C8CB02CA07CBFFC9D05007C705F2E04C5121A144135067C85004FA0258CF16CCCCC9ED5482107BDD97DE708018C8CB055003CF165004FA02CB6A12CB1F5220CB3FC971FB00FA403020D70B01C300}
x{8E1F8210D53276DB708010C8CB055003CF1622FA0212CB6ACB1FCB3FC98042FB00915BE2}
x{A17C142181B82A1009AA0A01E428027D012C678B00E78B666491646580897A007A00658064907C80383A6465816503E5FFE4E87C12C1080BC6A28CE4658FE59FA801FD0164BBC00C646582A802678B4105312D007D0109E5B5E66664B8FD804_}
x{2_}
x{BF102F6A2687D007D206A6A182F81C10802FAF080507C13B7911800D0C_}
x{4}
x{5}
x{ADBCF6A2687D007D206A6A183618FC1400B82A1009AA0A01E428027D012C678B00E78B666491646580897A007A00658064FC80383A6465816503E5FFE4E84_}
x{AF16F6A2687D007D206A6A183FAA904_}
x{B77A304E0B9D87ABA595CF63D09D873AC950A36CD04E07C4C0B7B31232600CBC24CA75114488F_}
x{4A0EEBB00801BCA2D6A223AAFD07665A3CB8C22F8FABF900B445D93EB080FBE35C707D2031B1_}
x{0168747470733A2F2F7374617469632E746F6E6F782E65786368616E67652F78746F6E2E6A736F6E}
x{FF00F4A413F4BCF2C80B}
x{62_}
x{CB}
x{D0831C02497C138007434C0C05C6C2544D7C0FC05783E903E900C7E800C5C75C87E800C7E800C00B4C7E08403E29FA954882EA54C4D167C04B8208405E3514654882EA58C4CD00CFC04F80D60841657C1EF2EA4D67C053817C12103FCBC2_}
x{4}
x{5}
x{00F4CFFE803E903B51343E803E903E90350C144DA8548AB1C17CB8B04A30BFFCB8B0950D109C150804D50500F214013E809633C58073C5B33248B232C044BD003D0032C032483E401C1D3232C0B281F2FFF274013E903D010C7E801DE0063232C1540233C59C3E8085F2DAC4F3208405E351467232C7C672CFD401E_}
x{FA0222CF165006CF1625FA025003CF16C95005CC07AA0013A08208989680AA008208989680A0A014BCF2E2C504C98040FB001023C85004FA0258CF1601CF16CCC9ED54}
x{3B51343E803E903E90350C20822625A020822625A02805A841F4CFFE8014CE31C163924C0D4D89B080238AA0822625A01CBEC0A084354C9DB6DC20043232C148F3C594027E808632DA85F2C7C572CFF25C7EC0040D248D4D78806815483214013E809633C58073C5B3327B55383E90151C522_}
x{70542013541403C85004FA0258CF1601CF16CCC922C8CB0112F400F400CB00C9F9007074C8CB02CA07CBFFC9D0500AC705F2E2C308FA40FA00218E365219A01BA182107362D09CC8CB1F5240CB3F23FA02500ACF165007CF16C9718018C8CB0526CF16500BFA021ACB6A19CCC971FB001067935B3637E224D70B01C30028}
x{C200B08E2A820898968072FB028210D53276DB708010C8CB055007CF165009FA0215CB6A17CB1F13CB3FC972FB001493303335E25003A05520C85004FA0258CF1601CF16CCC9ED54}
x{4}
x{3B51343E803E903E90350C01F4CFFE803E900C145468549271C17CB8B049F0BFFCB8B0A0822625A02A8005A805AF3CB8B0E0841EF765F7B232C7C572CFD400FE8088B3C58073C5B25C60043232C14933C59C3E80B2DAB33260103EC01004F214013E809633C58073C5B3327B552_}
x{200835C87B51343E803E903E90350C0134C7E08405E3514654882EA0841EF765F784EE84AC7CB8B174CFCC7E800C04E81408F214013E809633C58073C5B3327B552_}
x{A0F605DA89A1F401F481F481A861_}