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

Byte Code

e3000000000000000000000000070000004000000073ac01000065005a0165016a026400644164038d0265016a026404644264038d0265016a026405644364038d0267035a0365046407640864098d025a056504640a6407640b640c8d035a0665046407640d64098d025a0765046407640e64098d025a0865096407640f64098d025a0a64105a0b6411641284005a0c6413641484005a0d6415641684005a0e6417641884005a0f6419641a84005a10641b641c84005a11641d641e84005a126513641f9c016420642184045a14651564229c016423642484045a16651564259c016426642784045a176518640783016513651564289c026429642a840483015a196518640783016513641f9c01642b642c840483015a1a65186407830165136513651b642d9c03642e642f840483015a1c6518640783016513641f9c0164306431840483015a1d6518640783016513651364329c0264336434840483015a1e651864078301651364359c016436640d840483015a1f6518640783016513651b64379c0264386439840483015a20651864078301651365216513643a9c03643b643c840483015a22651864078301651365216513643d9c03643e643f840483015a23644053002944da087472616e73666572da06616d6f756e74da02746f2901da0461726773da07617070726f7665da0d7472616e736665725f66726f6dda0c6d61696e5f6163636f756e74da29636f6e5f6c616d64656e5f6e61746976655f746f6b656e735f6272696467655f746f5f6273635f7631da10737570706f727465645f746f6b656e732902da08636f6e7472616374da046e616d65e900000000da066e6f6e6365732903da0d64656661756c745f76616c7565720a000000720b000000da0670726f6f6673da086d65746164617461da0e6272696467655f61646472657373e9400000006301000000000000000100000003000000430000007338000000781a74007c00830174016b00721a64017c009b009d027d007102570074007c00830174016b0472347c0064007401850219007d007c00530029024eda01302902da036c656eda094845585f42595445532901da0173a9007217000000da00da0a5f5f6c6566745f70616412000000730a00000000010e010e010c010c017219000000630200000000000000040000000300000043000000731a00000074007c00640183027d027c0264027c0113001b007d037c03530029034ee910000000e90a0000002901da03696e742904da0475696e74da08646563696d616c73da0169da09726564756365645f69721700000072170000007218000000da105f5f756e7061636b5f75696e743235361a000000730600000000010a010c017221000000630200000000000000040000000400000043000000732800000074007c0064017c011300140083017d0274017c02830164026400850219007d0374027c038301530029034e721b000000e9020000002903721c000000da03686578721900000029047202000000721e000000721f000000da0168721700000072170000007218000000da0d5f5f7061636b5f616d6f756e74200000007306000000000110011001722500000063010000000000000002000000030000004300000073440000007c006a0064018301731274016402830182017c0064036400850219007d0174027c01830164046b027332740164058301820174037c0164068302010074047c018301530029074eda0230787a17496e76616c696420457468657265756d207072656669787222000000e9280000007a16496e76616c69642061646472657373206c656e677468721a0000002905da0a73746172747377697468da0e417373657274696f6e4572726f727214000000721c00000072190000002902da0761646472657373da0161721700000072170000007218000000da125f5f7061636b5f6574685f6164647265737326000000730a000000000112010c0114010a01722c000000630100000000000000020000000300000043000000732000000074007c0083017d0074017c00830164016400850219007d0174027c018301530029024e72220000002903721c000000722300000072190000002902721f0000007224000000721700000072170000007218000000da0a5f5f7061636b5f696e742e0000007306000000000108011001722d000000630000000000000000000000000300000043000000730e00000074006a01740264013c006400530029024eda086f70657261746f722903da03637478da0663616c6c6572da0a5f5f6d657461646174617217000000721700000072170000007218000000da045f5f5f5f34000000730200000000017232000000630000000000000000000000000300000043000000731a00000074006a017402640119006b02731674036402830182016400530029034e722e0000007a1b4f6e6c7920746865206f70657261746f722063616e2063616c6c212904722f0000007230000000723100000072290000007217000000721700000072170000007218000000da115f5f6173736572745f6f70657261746f72380000007302000000000172330000002901da11657468657265756d5f636f6e7472616374630100000000000000010000000200000043000000731400000074007c001900731074016401830182016400530029024e7a13546f6b656e204e6f7420537570706f727465642902da125f5f737570706f727465645f746f6b656e73722900000029017234000000721700000072170000007218000000da1b5f5f6173736572745f746f6b656e5f69735f737570706f727465643c0000007302000000000172360000002901da05746f6b656e630100000000000000010000000300000043000000731800000074006a017c0074028302731474036401830182016400530029024e7a18496e76616c696420546f6b656e20496e74657266616365212904da0149da11656e666f7263655f696e74657266616365da0f746f6b656e5f696e74657266616365722900000029017237000000721700000072170000007218000000da1e5f5f6173736572745f76616c69645f746f6b656e5f696e7465726661636540000000730400000000010e01723b0000002901721e000000630100000000000000010000000300000043000000731600000074007c0074018302731274026401830182016400530029024e7a18446563696d616c204e6f74205479706520496e74656765722903da0a6973696e7374616e6365721c00000072290000002901721e000000721700000072170000007218000000da1f5f5f6173736572745f746f6b656e5f646563696d616c735f6172655f696e744500000073020000000001723d0000002902da036b6579da0576616c756563020000000000000002000000030000004300000073120000007400830001007c0174017c003c006400530029014e2902723300000072310000002902723e000000723f000000721700000072170000007218000000da0f6368616e67655f6d65746164617461490000007304000000000206017240000000630100000000000000010000000200000043000000731400000074008300010074016a027c00830101006400530029014e29037233000000da105f5f6272696467655f61646472657373da0373657429017234000000721700000072170000007218000000da0a7365745f6272696467654f000000730400000000020601724300000029037234000000da0f6c616d64656e5f636f6e7472616374721e000000630300000000000000040000000400000043000000734200000074008300010074017c0019000c007318740264018301820174036a047c0183017d0374057c03830101007c0174017c003c007c0274017c00640266023c006400530029034e7a17546f6b656e20616c726561647920737570706f72746564721e00000029067233000000723500000072290000007238000000da0d696d706f72745f6d6f64756c65723b000000290472340000007244000000721e0000007237000000721700000072170000007218000000da096164645f746f6b656e55000000730c0000000002060112010a010801080172460000006301000000000000000100000003000000430000007312000000740083000100640174017c003c006400530029024e4629027233000000723500000029017234000000721700000072170000007218000000da0c72656d6f76655f746f6b656e5f00000073040000000002060172470000002902da0a6861736865645f616269da0a7369676e65645f61626963020000000000000002000000030000004300000073120000007400830001007c0174017c003c006400530029014e29027233000000da085f5f70726f6f6673290272480000007249000000721700000072170000007218000000da0a706f73745f70726f6f6665000000730400000000020601724b00000029017248000000630100000000000000010000000200000043000000730800000074007c001900530029014e2901724a00000029017248000000721700000072170000007218000000720f0000006b000000730200000000022902da10657468657265756d5f61646472657373da056e6f6e636563020000000000000002000000030000004300000073120000007400830001007c0174017c003c006400530029014e29027233000000da085f5f6e6f6e6365732902724c000000724d000000721700000072170000007218000000da097365745f6e6f6e636570000000730400000000020601724f000000290372340000007202000000724c0000006303000000000000000b000000050000004300000073a600000074007c0064018d01010074016a0274037c00190083017d0374047c038301010074037c006402660219007d0474057c04830101007c036a067c0174076a0874076a0964038d030100740a7c0083017d05740b7c017c0483027d06740c740d7c0219006404170083017d07740a7c0283017d08740a740e6a0f830083017d09740d7c02050019006404370003003c007c057c0617007c0717007c0817007c0917007d0a7c0a530029054e29017234000000721e0000002903720200000072030000007207000000e90100000029107236000000723800000072450000007235000000723b000000723d0000007206000000722f000000da04746869737230000000722c0000007225000000722d000000724e0000007241000000da03676574290b72340000007202000000724c0000007237000000721e000000da0c7061636b65645f746f6b656eda0d7061636b65645f616d6f756e74da0c7061636b65645f6e6f6e6365da0e7061636b65645f61646472657373da0d7061636b65645f627269646765da03616269721700000072170000007218000000da076465706f73697476000000731e00000000020a010e0108010c010801140108010a01100108010c0110010e01060172590000002903723400000072020000007203000000630300000000000000040000000400000043000000733000000074008300010074017c0064018d01010074026a0374047c00190083017d037c036a057c017c0264028d0201006400530029034e29017234000000290272020000007203000000290672330000007236000000723800000072450000007235000000720100000029047234000000720200000072030000007237000000721700000072170000007218000000da087769746864726177890000007308000000000206010a010e01725a0000004e29027202000000720300000029027202000000720300000029037202000000720300000072070000002924da09696d706f72746c69627238000000da0446756e63723a000000da04486173687235000000724e000000724a0000007231000000da085661726961626c6572410000007215000000721900000072210000007225000000722c000000722d00000072320000007233000000da037374727236000000da03416e79723b000000723d000000da085f5f6578706f727472400000007243000000721c00000072460000007247000000724b000000720f000000724f000000da05666c6f61747259000000725a0000007217000000721700000072170000007218000000da083c6d6f64756c653e010000007354000000040110010e010a0102010a0104010a01040108010401080102010a01040308080806080608080806080408040e040e050e0406011205060110050601140906011005060112050601100406011205060114120601