Contract
| Address | EQCcLAW537KnRg_aSPrnQJoyYjOZkzqYp6FVmRUvN1crSazV |
| Chain | Basic Workchain |
| Contract Type | 👍 Verfied source |
| Contract Code Hash | 8VPtLdZXDeM324IW8o1SdCfGyG5zA0/QuuTAFKDCC98= |
verifier.ton.org verification
View codeSource Code
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 workchain() asm "0 PUSHINT";
() force_chain(slice addr) impure {
(int wc, _) = parse_std_addr(addr);
throw_unless(333, wc == workchain());
}
builder store_coins(builder b, int x) asm "STVARUINT16";
(slice, int) load_coins(slice s) asm( -> 1 0) "LDVARUINT16";
int equal_slices (slice a, slice b) asm "SDEQ";
int builder_null?(builder b) asm "ISNULL";
builder store_builder(builder to, builder from) asm "STBR";
cell pack_jetton_wallet_data(int balance, slice owner_address, slice jetton_master_address, cell jetton_wallet_code) inline {
return begin_cell()
.store_coins(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));
}
;; Jettons minter smart contract
;; storage scheme
;; storage#_ total_supply:Coins admin_address:MsgAddress content:^Cell jetton_wallet_code:^Cell = Storage;
(int, slice, cell, cell) load_data() inline {
slice ds = get_data().begin_parse();
return (
ds~load_coins(), ;; 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_coins(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, cell master_msg) 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_coins(amount)
.store_uint(4 + 2 + 1, 1 + 4 + 4 + 64 + 32 + 1 + 1 + 1)
.store_ref(state_init)
.store_ref(master_msg);
send_raw_message(msg.end_cell(), 1); ;; pay transfer fees separately, revert on errors
}
() recv_internal(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::mint()) {
throw_unless(73, equal_slices(sender_address, admin_address));
slice to_address = in_msg_body~load_msg_addr();
int amount = in_msg_body~load_coins();
cell master_msg = in_msg_body~load_ref();
slice master_msg_cs = master_msg.begin_parse();
master_msg_cs~skip_bits(32 + 64); ;; op + query_id
int jetton_amount = master_msg_cs~load_coins();
mint_tokens(to_address, jetton_wallet_code, amount, master_msg);
save_data(total_supply + jetton_amount, admin_address, content, jetton_wallet_code);
return ();
}
if (op == op::burn_notification()) {
int jetton_amount = in_msg_body~load_coins();
slice from_address = in_msg_body~load_msg_addr();
throw_unless(74,
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);
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_coins(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 ();
}
if (op == 3) { ;; change admin
throw_unless(73, equal_slices(sender_address, admin_address));
slice new_admin_address = in_msg_body~load_msg_addr();
save_data(total_supply, new_admin_address, content, jetton_wallet_code);
return ();
}
if (op == 4) { ;; change content, delete this for immutable tokens
throw_unless(73, equal_slices(sender_address, admin_address));
save_data(total_supply, admin_address, in_msg_body~load_ref(), jetton_wallet_code);
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 {
(int total_supply, slice admin_address, cell content, cell jetton_wallet_code) = load_data();
return calculate_user_jetton_wallet_address(owner_address, my_address(), jetton_wallet_code);
}
_ supported_interfaces() method_id {
;; see https://github.com/ton-foundation/specs/blob/main/specs/wtf-0001.md
return (
123515602279859691144772641439386770278, ;; org.ton.introspection.v0
219360898373884516143141541105899042493 ;; org.ton.jetton.minter.v0
);
}Disassembled Code
SETCP0
(:methods
recv_internal:
s2 POP
s1 PUSH
SEMPTY
<{
2DROP
}> PUSHCONT
IFJMP
CTOS
4 LDU
s0 s1 XCHG
1 PUSHINT
AND
<{
2DROP
}> PUSHCONT
IFJMP
LDMSGADDR
s0 POP
s0 s1 XCHG
32 LDU
64 LDU
c4 PUSH
CTOS
LDGRAMS
LDMSGADDR
LDREF
LDREF
s0 POP
21 PUSHINT
s7 s-1 PUXC
EQUAL
<{
s5 POP
s5 POP
s5 s5 XCPU
SDEQ
73 THROWIFNOT
s0 s1 XCHG
LDMSGADDR
LDGRAMS
LDREF
s0 POP
s0 PUSH
CTOS
96 PUSHINT
SDSKIPFIRST
LDGRAMS
s0 POP
s5 PUSH
s3 s4 XCHG
s4 s2 XCHG2
8 CALLDICT
ADD
3 1 BLKSWAP
NEWC
s0 s4 XCHG2
STGRAMS
ROT
STSLICER
STREF
STREF
ENDC
c4 POP
}> PUSHCONT
IFJMP
2078119902 PUSHINT
s7 s-1 PUXC
EQUAL
<{
s6 POP
s0 s3 XCHG
LDGRAMS
LDMSGADDR
MYADDR
2 0 8 XC2PU
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 s8 XCHG2
SDEQ
74 THROWIFNOT
s1 s2 XCHG
SUB
s0 s3 XCHG
s2 s4 XCHG2
NEWC
s0 s4 XCHG2
STGRAMS
ROT
STSLICER
STREF
STREF
ENDC
c4 POP
s0 s1 XCHG
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
s5 POP
s5 PUSH
3 EQINT
<{
s5 POP
s1 s5 XCHG
SDEQ
73 THROWIFNOT
LDMSGADDR
s0 POP
ROTREV
NEWC
s0 s4 XCHG2
STGRAMS
ROT
STSLICER
STREF
STREF
ENDC
c4 POP
}> IFJMPREF
s0 POP
s0 s4 XCHG
4 EQINT
<{
s4 s3 XCPU
SDEQ
73 THROWIFNOT
LDREF
s0 POP
s0 s1 XCHG
NEWC
s0 s4 XCHG2
STGRAMS
ROT
STSLICER
STREF
STREF
ENDC
c4 POP
}> IFJMPREF
5 BLKDROP
16 PUSHPOW2DEC
THROWANY
8:
MYADDR
s4 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
7 PUSHINT
24 PUSHINT
NEWC
6 STU
ROT
STSLICER
s0 s4 XCHG2
STGRAMS
s1 s3 XCHG
108 STU
s1 s2 XCHG
STREF
STREF
ENDC
1 PUSHINT
SENDRAWMSG
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
219360898373884516143141541105899042493 PUSHINT
) 19 DICTPUSHCONST
DICTIGETJMPZ
11 THROWARG
Serialized Code
te6cckECDQEAAhoAART/APSkE/S88sgLAQIBYgIDAgLMBAUCAWoGBwPv2ZEOOASK3waGmBgLjYSK3wfSAYAOmP6Z/2omh9AH0gamoYQAqpOF1HGBqaqKrjgvlwJID9IH0AahgQaEAwa5D9ABgSiBooIXgEUCqQZCgCfQEsZ4tmZmT2qnBBCD3uy+8pOF1xgRqS4AHxgRgCYAJxgS+Cwgf5eECAkKAJPfwUIgG4KhAJqgoB5CgCfQEsZ4sA54tmZJFkZYCJegB6AGWAZJB8gDg6ZGWBZQPl/+ToO8AMZGWCrGeLKAJ9AQnltYlmZmS4/YBAIBWAsMAE23ejBOC52Hq6WVz2PQnYc6yVCjbNBOFKDr6bj+h+MMtSo6kDLO17AA/jYD+gD6QPgoVBIIcFQgE1QUA8hQBPoCWM8WAc8WzMkiyMsBEvQA9ADLAMn5AHB0yMsCygfL/8nQUAjHBfLgShKhA1AkyFAE+gJYzxbMzMntVAH6QDAg1wsBwwCOH4IQ1TJ223CAEMjLBVADzxYi+gISy2rLH8s/yYBC+wCRW+IAMDUVxwXy4En6QDBZyFAE+gJYzxbMzMntVAAuUUPHBfLgSdQwAchQBPoCWM8WzMzJ7VQAfa289qJofQB9IGpqGDYY/BQAuCoQCaoKAeQoAn0BLGeLAOeLZmSRZGWAiXoAegBlgGT8gDg6ZGWBZQPl/+ToQAAfrxb2omh9AH0gamoYP6qQQJvZrJY=Serialized Data
te6cckECFgEAA8kAAlOIrHIwQoZU8sgBGKu+5Nb5Xw5QnLOSAqTVj2SvbvF1N/vTeT0siTNto/EBAgCGAWlwZnM6Ly9iYWZ5YmVpYXBqNmszZGVmdXhmYWRpNDJidWhnbTJkMzNueHZqc2xyaG90NXV5YXlwN3d5b3llZHg1eQEU/wD0pBP0vPLICwMCAWIEBQICzAYHAgEgCAkCAdQKCwIBSAwNABu/2BdqJofQB9IH0gahhABNvd6ME4LnYerpZXPY9CdhzrJUKNs0E4Rj/6lCwlPnRNJxYZrUrrfUALsIMcAkl8E4AHQ0wMBcbCVE18D8Avg+kD6QDH6ADFx1yH6ADH6ADAC0x+CEA+KfqVSILqVMTRZ8AjgghAXjUUZUiC6ljFERAPwCeA1ghBZXwe8upNZ8ArgXwSED/LwgABE+kQwcLry4U2ACASAODwIBIBARAfUA9M/+gD6QCHwAe1E0PoA+kD6QNQwUTahUirHBfLiwSjC//LiwlQ0QnBUIBNUFAPIUAT6AljPFgHPFszJIsjLARL0APQAywDJIPkAcHTIywLKB8v/ydAE+kD0BDH6AHeAGMjLBVAIzxZw+gIXy2sTzIIQF41FGcjLHxmASA/c7UTQ+gD6QPpA1DAI0z/6AFFRoAX6QPpAU1vHBVRzbXBUIBNUFAPIUAT6AljPFgHPFszJIsjLARL0APQAywDJ+QBwdMjLAsoHy//J0FANxwUcsfLiwwr6AFGooYIImJaAggiYloAStgihggiYloCgGKEn4w8l1wsBwwAjgExQVANs7UTQ+gD6QPpA1DAH0z/6APpAMFFRoVJJxwXy4sEnwv/y4sKCCJiWgKoAFqAWvPLiw4IQe92X3sjLHxXLP1AD+gIizxYBzxbJcYAYyMsFJM8WcPoCy2rMyYBA+wBAE8hQBPoCWM8WAc8WzMntVIACDIAg1yHtRND6APpA+kDUMATTH4IQF41FGVIguoIQe92X3hO6ErHy4sXTPzH6ADAToFAjyFAE+gJYzxYBzxbMye1UgAJrLP1AH+gIizxZQBs8WJfoCUAPPFslQBcwjkXKRceJQCKgToIIImJaAqgCCCJiWgKCgFLzy4sUEyYBA+wAQI8hQBPoCWM8WAc8WzMntVABwUnmgGKGCEHNi0JzIyx9SMMs/WPoCUAfPFlAHzxbJcYAQyMsFJM8WUAb6AhXLahTMyXH7ABAkECMADhBJEDg3XwQAdsIAsI4hghDVMnbbcIAQyMsFUAjPFlAE+gIWy2oSyx8Syz/JcvsAkzVsIeIDyFAE+gJYzxYBzxbMye1Uc+eapw==Code Cells
x{FF00F4A413F4BCF2C80B}
x{62_}
x{CC}
x{D9910E38048ADF068698180B8D848ADF07D201800E98FE99FF6A2687D007D206A6A18400AA9385D47181A9AA8AAE382F9702480FD207D006A18106840306B90FD001812881A28217804502A906428027D012C678B666664F6AA7041083DEECBEF29385D71811A92E001F1811802600271812F82C207F9784_}
x{3603FA00FA40F82854120870542013541403C85004FA0258CF1601CF16CCC922C8CB0112F400F400CB00C9F9007074C8CB02CA07CBFFC9D05008C705F2E04A12A1035024C85004FA0258CF16CCCCC9ED5401FA403020D70B01C3008E1F8210D53276DB708010C8CB055003CF1622FA0212CB6ACB1FCB3FC98042FB00915BE2}
x{3515C705F2E049FA403059C85004FA0258CF16CCCCC9ED54}
x{5143C705F2E049D43001C85004FA0258CF16CCCCC9ED54}
x{DFC142201B82A1009AA0A01E428027D012C678B00E78B666491646580897A007A00658064907C80383A6465816503E5FFE4E83BC00C646582AC678B28027D0109E5B589666664B8FD804_}
x{6A_}
x{5}
x{ADBCF6A2687D007D206A6A183618FC1400B82A1009AA0A01E428027D012C678B00E78B666491646580897A007A00658064FC80383A6465816503E5FFE4E84_}
x{AF16F6A2687D007D206A6A183FAA904_}
x{B77A304E0B9D87ABA595CF63D09D873AC950A36CD04E14A0EBE9B8FE87E30CB52A3A9032CED7B_}Data Cells
x{88AC7230428654F2C80118ABBEE4D6F95F0E509CB39202A4D58F64AF6EF17537FBD3793D2C89336DA3F1_}
x{01697066733A2F2F6261667962656961706A366B336465667578666164693432627568676D326433336E78766A736C72686F743575796179703777796F796564783579}
x{FF00F4A413F4BCF2C80B}
x{62_}
x{CC}
x{D4_}
x{0831C02497C138007434C0C05C6C2544D7C0FC02F83E903E900C7E800C5C75C87E800C7E800C00B4C7E08403E29FA954882EA54C4D167C0238208405E3514654882EA58C511100FC02780D60841657C1EF2EA4D67C02B817C12103FCBC2_}
x{3E910C1C2EBCB8536_}
x{4}
x{2_}
x{00F4CFFE803E90087C007B51343E803E903E90350C144DA8548AB1C17CB8B04A30BFFCB8B0950D109C150804D50500F214013E809633C58073C5B33248B232C044BD003D0032C032483E401C1D3232C0B281F2FFF274013E903D010C7E801DE0063232C1540233C59C3E8085F2DAC4F3208405E351467232C7C66_}
x{CB3F5007FA0222CF165006CF1625FA025003CF16C95005CC2391729171E25008A813A08208989680AA008208989680A0A014BCF2E2C504C98040FB001023C85004FA0258CF1601CF16CCC9ED54}
x{3B51343E803E903E90350C0234CFFE80145468017E903E9014D6F1C1551CDB5C150804D50500F214013E809633C58073C5B33248B232C044BD003D0032C0327E401C1D3232C0B281F2FFF274140371C1472C7CB8B0C2BE80146A2860822625A020822625A004AD822860822625A028062849F8C3C975C2C070C008E_}
x{5279A018A182107362D09CC8CB1F5230CB3F58FA025007CF165007CF16C9718010C8CB0524CF165006FA0215CB6A14CCC971FB0010241023}
x{10491038375F04}
x{C200B08E218210D53276DB708010C8CB055008CF165004FA0216CB6A12CB1F12CB3FC972FB0093356C21E203C85004FA0258CF1601CF16CCC9ED54}
x{2_}
x{3B51343E803E903E90350C01F4CFFE803E900C145468549271C17CB8B049F0BFFCB8B0A0822625A02A8005A805AF3CB8B0E0841EF765F7B232C7C572CFD400FE8088B3C58073C5B25C60063232C14933C59C3E80B2DAB33260103EC01004F214013E809633C58073C5B3327B552_}
x{200835C87B51343E803E903E90350C0134C7E08405E3514654882EA0841EF765F784EE84AC7CB8B174CFCC7E800C04E81408F214013E809633C58073C5B3327B552_}
x{2_}
x{BFD8176A2687D007D207D206A184_}
x{BDDE8C1382E761EAE96573D8F42761CEB25428DB34138463FFA942C253E744D271619AD4AEB7D4_}