Contract con_bsc_native_tokens_bridge_to_bsc_v1


Contract Code


  
1 I = importlib
2
3 # Enforceable interface
4 token_interface = [
5 I.Func("transfer", args=("amount", "to")),
6 I.Func("mint", args=("amount", "to")),
7 I.Func("approve", args=("amount", "to")),
8 I.Func("transfer_from", args=("amount", "to", "main_account")),
9 ]
10
11 supported_tokens = Hash()
12 bridge_address = Variable()
13 nonces = Hash(default_value=0)
14 proofs = Hash()
15 metadata = Hash()
16
17
18 def left_pad(s: str):
19 while len(s) < 64:
20 s = f"0{s}"
21
22 if len(s) > 64:
23 s = s[:64]
24
25 return s
26
27
28 def unpack_uint256(uint: str, decimals: int):
29 i = int(uint, 16)
30 reduced_i = i / (10 ** decimals)
31 return reduced_i
32
33
34 def pack_amount(amount: float, decimals: int):
35 i = int(amount * (10 ** decimals))
36 h = hex(i)[2:]
37 return left_pad(h)
38
39
40 def pack_eth_address(address: str):
41 assert address.startswith("0x"), "Invalid Ethereum prefix"
42 a = address[2:]
43
44 assert len(a) == 40, "Invalid address length"
45
46 int(a, 16) # Throws error if not hex string
47
48 return left_pad(a)
49
50
51 def pack_int(i: int):
52 i = int(i)
53 h = hex(i)[2:]
54 return left_pad(h)
55
56
57 @construct
58 def seed():
59 metadata["operator"] = ctx.caller
60
61 def assert_operator():
62 assert ctx.caller == metadata["operator"], "Only the operator can call!"
63
64 def assert_token_is_supported(ethereum_contract: str):
65 assert supported_tokens[ethereum_contract], "Token Not Supported"
66
67 def assert_valid_token_interface(token: Any):
68 assert I.enforce_interface(token, token_interface), "Invalid Token Interface!"
69
70 def assert_token_decimals_are_int(decimals: Any):
71 assert isinstance(decimals, int), "Decimal Not Type Integer"
72
73 # LST002
74 @export
75 def change_metadata(key: str, value: Any):
76 assert_operator()
77 metadata[key] = value
78
79 @export
80 def set_bridge(ethereum_contract: str):
81 assert_operator()
82 bridge_address.set(ethereum_contract)
83
84 @export
85 def add_token(ethereum_contract: str, lamden_contract: str, decimals: int):
86 assert_operator()
87
88 assert not supported_tokens[ethereum_contract], "Token already supported"
89
90 token = I.import_module(lamden_contract)
91 assert_valid_token_interface(token)
92
93 supported_tokens[ethereum_contract] = lamden_contract
94 supported_tokens[ethereum_contract, "decimals"] = decimals
95
96 @export
97 def remove_token(ethereum_contract: str):
98 assert_operator()
99 supported_tokens[ethereum_contract] = False
100
101 @export
102 def post_proof(hashed_abi: str, signed_abi: str):
103 assert_operator()
104 proofs[hashed_abi] = signed_abi
105
106 @export
107 def proofs(hashed_abi: str):
108 return proofs[hashed_abi]
109
110 @export
111 def set_nonce(ethereum_address: str, nonce: int):
112 assert_operator()
113 nonces[ethereum_address] = nonce
114
115 @export
116 def mint(ethereum_contract: str, amount: str, lamden_wallet: str):
117 assert_operator()
118 assert_token_is_supported(ethereum_contract)
119
120 decimals = supported_tokens[ethereum_contract, "decimals"]
121 assert_token_decimals_are_int(decimals)
122
123 unpacked_amount = unpack_uint256(amount, decimals)
124
125 token = I.import_module(supported_tokens[ethereum_contract])
126 assert_valid_token_interface(token)
127
128 token.mint(amount=unpacked_amount, to=lamden_wallet)
129
130
131 @export
132 def burn(ethereum_contract: str, ethereum_address: str, amount: float):
133 assert_token_is_supported(ethereum_contract)
134
135 token = I.import_module(supported_tokens[ethereum_contract])
136 assert_valid_token_interface(token)
137
138 decimals = supported_tokens[ethereum_contract, "decimals"]
139 assert_token_decimals_are_int(decimals)
140
141 token.transfer_from(amount=amount, to=ctx.this, main_account=ctx.caller)
142
143 packed_token = pack_eth_address(ethereum_contract)
144 packed_amount = pack_amount(amount, decimals)
145 packed_nonce = pack_int(nonces[ethereum_address] + 1)
146 packed_address = pack_eth_address(ethereum_address)
147 packed_bridge = pack_eth_address(bridge_address.get())
148
149 nonces[ethereum_address] += 1
150
151 abi = packed_token + packed_amount + packed_nonce + packed_address + packed_bridge
152
153 return abi

Byte Code

e3000000000000000000000000080000004000000073d601000065005a0165016a026400644564038d0265016a026404644664038d0265016a026405644764038d0265016a026406644864038d0267045a03650464086409640a8d025a0565066408640b640a8d025a076504640c6408640d640e8d035a0865046408640f640a8d025a09650464086410640a8d025a0a650b64119c016412641384045a0c650b650d64149c026415641684045a0e650f650d64179c026418641984045a10650b641a9c01641b641c84045a11650d641d9c01641e641f84045a126420642184005a136422642384005a14650b64249c016425642684045a15651664279c016428642984045a176516642a9c01642b642c84045a18651964088301650b6516642d9c02642e642f840483015a1a651964088301650b64249c0164306431840483015a1b651964088301650b650b650d64329c0364336434840483015a1c651964088301650b64249c0164356436840483015a1d651964088301650b650b64379c0264386439840483015a1e651964088301650b643a9c01643b640f840483015a1f651964088301650b650d643c9c02643d643e840483015a20651964088301650b650b650b643f9c0364406404840483015a21651964088301650b650b650f64419c0364426443840483015a22644453002949da087472616e73666572da06616d6f756e74da02746f2901da0461726773da046d696e74da07617070726f7665da0d7472616e736665725f66726f6dda0c6d61696e5f6163636f756e74da26636f6e5f6273635f6e61746976655f746f6b656e735f6272696467655f746f5f6273635f7631da10737570706f727465645f746f6b656e732902da08636f6e7472616374da046e616d65da0e6272696467655f61646472657373e900000000da066e6f6e6365732903da0d64656661756c745f76616c7565720b000000720c000000da0670726f6f6673da086d657461646174612901da01736301000000000000000100000003000000430000007338000000781a74007c00830164016b00721a64027c009b009d027d007102570074007c00830164016b0472347c0064006401850219007d007c00530029034ee940000000da01302901da036c656e29017213000000a9007217000000da00da0a5f5f6c6566745f70616411000000730a00000000010e010e010c010c0172190000002902da0475696e74da08646563696d616c73630200000000000000040000000300000043000000731a00000074007c00640183027d027c0264027c0113001b007d037c03530029034ee910000000e90a0000002901da03696e742904721a000000721b000000da0169da09726564756365645f69721700000072170000007218000000da105f5f756e7061636b5f75696e7432353619000000730600000000010a010c01722100000029027202000000721b000000630200000000000000040000000400000043000000732800000074007c0064017c011300140083017d0274017c02830164026400850219007d0374027c038301530029034e721d000000e9020000002903721e000000da03686578721900000029047202000000721b000000721f000000da0168721700000072170000007218000000da0d5f5f7061636b5f616d6f756e741f000000730600000000011001100172250000002901da076164647265737363010000000000000002000000030000004300000073440000007c006a0064018301731274016402830182017c0064036400850219007d0174027c01830164046b027332740164058301820174037c0164068302010074047c018301530029074eda0230787a17496e76616c696420457468657265756d207072656669787222000000e9280000007a16496e76616c69642061646472657373206c656e677468721c0000002905da0a73746172747377697468da0e417373657274696f6e4572726f727216000000721e000000721900000029027226000000da0161721700000072170000007218000000da125f5f7061636b5f6574685f6164647265737325000000730a000000000112010c0114010a01722c0000002901721f000000630100000000000000020000000300000043000000732000000074007c0083017d0074017c00830164016400850219007d0174027c018301530029024e72220000002903721e000000722300000072190000002902721f0000007224000000721700000072170000007218000000da0a5f5f7061636b5f696e742d0000007306000000000108011001722d000000630000000000000000000000000300000043000000730e00000074006a01740264013c006400530029024eda086f70657261746f722903da03637478da0663616c6c6572da0a5f5f6d657461646174617217000000721700000072170000007218000000da045f5f5f5f33000000730200000000017232000000630000000000000000000000000300000043000000731a00000074006a017402640119006b02731674036402830182016400530029034e722e0000007a1b4f6e6c7920746865206f70657261746f722063616e2063616c6c212904722f00000072300000007231000000722a0000007217000000721700000072170000007218000000da115f5f6173736572745f6f70657261746f72370000007302000000000172330000002901da11657468657265756d5f636f6e7472616374630100000000000000010000000200000043000000731400000074007c001900731074016401830182016400530029024e7a13546f6b656e204e6f7420537570706f727465642902da125f5f737570706f727465645f746f6b656e73722a00000029017234000000721700000072170000007218000000da1b5f5f6173736572745f746f6b656e5f69735f737570706f727465643b0000007302000000000172360000002901da05746f6b656e630100000000000000010000000300000043000000731800000074006a017c0074028302731474036401830182016400530029024e7a18496e76616c696420546f6b656e20496e74657266616365212904da0149da11656e666f7263655f696e74657266616365da0f746f6b656e5f696e74657266616365722a00000029017237000000721700000072170000007218000000da1e5f5f6173736572745f76616c69645f746f6b656e5f696e746572666163653f000000730400000000010e01723b0000002901721b000000630100000000000000010000000300000043000000731600000074007c0074018302731274026401830182016400530029024e7a18446563696d616c204e6f74205479706520496e74656765722903da0a6973696e7374616e6365721e000000722a0000002901721b000000721700000072170000007218000000da1f5f5f6173736572745f746f6b656e5f646563696d616c735f6172655f696e744400000073020000000001723d0000002902da036b6579da0576616c756563020000000000000002000000030000004300000073120000007400830001007c0174017c003c006400530029014e2902723300000072310000002902723e000000723f000000721700000072170000007218000000da0f6368616e67655f6d65746164617461480000007304000000000206017240000000630100000000000000010000000200000043000000731400000074008300010074016a027c00830101006400530029014e29037233000000da105f5f6272696467655f61646472657373da0373657429017234000000721700000072170000007218000000da0a7365745f6272696467654e000000730400000000020601724300000029037234000000da0f6c616d64656e5f636f6e7472616374721b000000630300000000000000040000000400000043000000734200000074008300010074017c0019000c007318740264018301820174036a047c0183017d0374057c03830101007c0174017c003c007c0274017c00640266023c006400530029034e7a17546f6b656e20616c726561647920737570706f72746564721b000000290672330000007235000000722a0000007238000000da0d696d706f72745f6d6f64756c65723b000000290472340000007244000000721b0000007237000000721700000072170000007218000000da096164645f746f6b656e54000000730c0000000002060112010a010801080172460000006301000000000000000100000003000000430000007312000000740083000100640174017c003c006400530029024e4629027233000000723500000029017234000000721700000072170000007218000000da0c72656d6f76655f746f6b656e5e00000073040000000002060172470000002902da0a6861736865645f616269da0a7369676e65645f61626963020000000000000002000000030000004300000073120000007400830001007c0174017c003c006400530029014e29027233000000da085f5f70726f6f6673290272480000007249000000721700000072170000007218000000da0a706f73745f70726f6f6664000000730400000000020601724b00000029017248000000630100000000000000010000000200000043000000730800000074007c001900530029014e2901724a0000002901724800000072170000007217000000721800000072110000006a000000730200000000022902da10657468657265756d5f61646472657373da056e6f6e636563020000000000000002000000030000004300000073120000007400830001007c0174017c003c006400530029014e29027233000000da085f5f6e6f6e6365732902724c000000724d000000721700000072170000007218000000da097365745f6e6f6e63656f000000730400000000020601724f000000290372340000007202000000da0d6c616d64656e5f77616c6c6574630300000000000000060000000400000043000000735400000074008300010074017c008301010074027c006401660219007d0374037c038301010074047c017c0383027d0474056a0674027c00190083017d0574077c05830101007c056a087c047c0264028d0201006400530029034e721b0000002902720200000072030000002909723300000072360000007235000000723d000000722100000072380000007245000000723b00000072050000002906723400000072020000007250000000721b000000da0f756e7061636b65645f616d6f756e74723700000072170000007217000000721800000072050000007500000073100000000002060108010c0108010a010e01080129037234000000724c00000072020000006303000000000000000b000000050000004300000073a400000074007c008301010074016a0274037c00190083017d0374047c038301010074037c006401660219007d0474057c04830101007c036a067c0274076a0874076a0964028d030100740a7c0083017d05740b7c027c0483027d06740c740d7c0119006403170083017d07740a7c0183017d08740a740e6a0f830083017d09740d7c01050019006403370003003c007c057c0617007c0717007c0817007c0917007d0a7c0a530029044e721b0000002903720200000072030000007208000000e90100000029107236000000723800000072450000007235000000723b000000723d0000007207000000722f000000da04746869737230000000722c0000007225000000722d000000724e0000007241000000da03676574290b7234000000724c00000072020000007237000000721b000000da0c7061636b65645f746f6b656eda0d7061636b65645f616d6f756e74da0c7061636b65645f6e6f6e6365da0e7061636b65645f61646472657373da0d7061636b65645f627269646765da03616269721700000072170000007218000000da046275726e81000000731e000000000208010e0108010c010801140108010a01100108010c0110010e010601725b0000004e29027202000000720300000029027202000000720300000029027202000000720300000029037202000000720300000072080000002923da09696d706f72746c69627238000000da0446756e63723a000000da04486173687235000000da085661726961626c657241000000724e000000724a0000007231000000da037374727219000000721e0000007221000000da05666c6f61747225000000722c000000722d000000723200000072330000007236000000da03416e79723b000000723d000000da085f5f6578706f72747240000000724300000072460000007247000000724b0000007211000000724f0000007205000000725b0000007217000000721700000072170000007218000000da083c6d6f64756c653e0100000073520000000401120116010c010401080102010a0104010a0104010801040108030e08100610060e080e06080408040e040e050e04060112050601100506011409060110050601120506011004060112050601140b0601