% Explorer > EQCcLAW537KnRg_aSPrnQJoyYjOZkzqYp6FVmRUvN1crSazV

Contract

AddressEQCcLAW537KnRg_aSPrnQJoyYjOZkzqYp6FVmRUvN1crSazV
ChainBasic Workchain
Contract Type👍 Verfied source
Contract Code Hash8VPtLdZXDeM324IW8o1SdCfGyG5zA0/QuuTAFKDCC98=

verifier.ton.org verification

View code

Source 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_}