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

Byte Code

e3000000000000000000000000080000004000000073b401000065005a0165016a026400644264038d0265016a026404644364038d0265016a026405644464038d0265016a026406644564038d0267045a03650464086409640a8d025a056504640b6408640c640d8d035a0665046408640e640a8d025a0765046408640f640a8d025a08650964109c016411641284045a0a6509650b64139c026414641584045a0c650d650b64169c026417641884045a0e650964199c01641a641b84045a0f650b641c9c01641d641e84045a10641f642084005a116421642284005a12650964239c016424642584045a13651464269c016427642884045a15651464299c01642a642b84045a1665176408830165096514642c9c02642d642e840483015a1865176408830165096509650b642f9c0364306431840483015a19651764088301650964239c0164326433840483015a1a6517640883016509650964349c0264356436840483015a1b651764088301650964379c016438640e840483015a1c6517640883016509650b64399c02643a643b840483015a1d651764088301650965096509643c9c03643d6404840483015a1e65176408830165096509650d643e9c03643f6440840483015a1f644153002946da087472616e73666572da06616d6f756e74da02746f2901da0461726773da046d696e74da07617070726f7665da0d7472616e736665725f66726f6dda0c6d61696e5f6163636f756e74da26636f6e5f6574685f6e61746976655f746f6b656e735f6272696467655f746f5f6574685f7631da10737570706f727465645f746f6b656e732902da08636f6e7472616374da046e616d65e900000000da066e6f6e6365732903da0d64656661756c745f76616c7565720b000000720c000000da0670726f6f6673da086d657461646174612901da01736301000000000000000100000003000000430000007338000000781a74007c00830164016b00721a64027c009b009d027d007102570074007c00830164016b0472347c0064006401850219007d007c00530029034ee940000000da01302901da036c656e29017212000000a9007216000000da00da0a5f5f6c6566745f7061640f000000730a00000000010e010e010c010c0172180000002902da0475696e74da08646563696d616c73630200000000000000040000000300000043000000731a00000074007c00640183027d027c0264027c0113001b007d037c03530029034ee910000000e90a0000002901da03696e7429047219000000721a000000da0169da09726564756365645f69721600000072160000007217000000da105f5f756e7061636b5f75696e7432353617000000730600000000010a010c01722000000029027202000000721a000000630200000000000000040000000400000043000000732800000074007c0064017c011300140083017d0274017c02830164026400850219007d0374027c038301530029034e721c000000e9020000002903721d000000da03686578721800000029047202000000721a000000721e000000da0168721600000072160000007217000000da0d5f5f7061636b5f616d6f756e741d000000730600000000011001100172240000002901da076164647265737363010000000000000002000000030000004300000073440000007c006a0064018301731274016402830182017c0064036400850219007d0174027c01830164046b027332740164058301820174037c0164068302010074047c018301530029074eda0230787a17496e76616c696420457468657265756d207072656669787221000000e9280000007a16496e76616c69642061646472657373206c656e677468721b0000002905da0a73746172747377697468da0e417373657274696f6e4572726f727215000000721d000000721800000029027225000000da0161721600000072160000007217000000da125f5f7061636b5f6574685f6164647265737323000000730a000000000112010c0114010a01722b0000002901721e000000630100000000000000020000000300000043000000732000000074007c0083017d0074017c00830164016400850219007d0174027c018301530029024e72210000002903721d000000722200000072180000002902721e0000007223000000721600000072160000007217000000da0a5f5f7061636b5f696e742b0000007306000000000108011001722c000000630000000000000000000000000300000043000000730e00000074006a01740264013c006400530029024eda086f70657261746f722903da03637478da0663616c6c6572da0a5f5f6d657461646174617216000000721600000072160000007217000000da045f5f5f5f31000000730200000000017231000000630000000000000000000000000300000043000000731a00000074006a017402640119006b02731674036402830182016400530029034e722d0000007a1b4f6e6c7920746865206f70657261746f722063616e2063616c6c212904722e000000722f000000723000000072290000007216000000721600000072160000007217000000da115f5f6173736572745f6f70657261746f72350000007302000000000172320000002901da11657468657265756d5f636f6e7472616374630100000000000000010000000200000043000000731400000074007c001900731074016401830182016400530029024e7a13546f6b656e204e6f7420537570706f727465642902da125f5f737570706f727465645f746f6b656e73722900000029017233000000721600000072160000007217000000da1b5f5f6173736572745f746f6b656e5f69735f737570706f72746564390000007302000000000172350000002901da05746f6b656e630100000000000000010000000300000043000000731800000074006a017c0074028302731474036401830182016400530029024e7a18496e76616c696420546f6b656e20496e74657266616365212904da0149da11656e666f7263655f696e74657266616365da0f746f6b656e5f696e74657266616365722900000029017236000000721600000072160000007217000000da1e5f5f6173736572745f76616c69645f746f6b656e5f696e746572666163653d000000730400000000010e01723a0000002901721a000000630100000000000000010000000300000043000000731600000074007c0074018302731274026401830182016400530029024e7a18446563696d616c204e6f74205479706520496e74656765722903da0a6973696e7374616e6365721d00000072290000002901721a000000721600000072160000007217000000da1f5f5f6173736572745f746f6b656e5f646563696d616c735f6172655f696e744200000073020000000001723c0000002902da036b6579da0576616c756563020000000000000002000000030000004300000073120000007400830001007c0174017c003c006400530029014e2902723200000072300000002902723d000000723e000000721600000072160000007217000000da0f6368616e67655f6d6574616461746146000000730400000000020601723f00000029037233000000da0f6c616d64656e5f636f6e7472616374721a000000630300000000000000040000000400000043000000734200000074008300010074017c0019000c007318740264018301820174036a047c0183017d0374057c03830101007c0174017c003c007c0274017c00640266023c006400530029034e7a17546f6b656e20616c726561647920737570706f72746564721a00000029067232000000723400000072290000007237000000da0d696d706f72745f6d6f64756c65723a000000290472330000007240000000721a0000007236000000721600000072160000007217000000da096164645f746f6b656e4c000000730c0000000002060112010a010801080172420000006301000000000000000100000003000000430000007312000000740083000100640174017c003c006400530029024e4629027232000000723400000029017233000000721600000072160000007217000000da0c72656d6f76655f746f6b656e5600000073040000000002060172430000002902da0a6861736865645f616269da0a7369676e65645f61626963020000000000000002000000030000004300000073120000007400830001007c0174017c003c006400530029014e29027232000000da085f5f70726f6f6673290272440000007245000000721600000072160000007217000000da0a706f73745f70726f6f665c000000730400000000020601724700000029017244000000630100000000000000010000000200000043000000730800000074007c001900530029014e2901724600000029017244000000721600000072160000007217000000721000000062000000730200000000022902da10657468657265756d5f61646472657373da056e6f6e636563020000000000000002000000030000004300000073120000007400830001007c0174017c003c006400530029014e29027232000000da085f5f6e6f6e636573290272480000007249000000721600000072160000007217000000da097365745f6e6f6e636567000000730400000000020601724b000000290372330000007202000000da0d6c616d64656e5f77616c6c6574630300000000000000060000000400000043000000735400000074008300010074017c008301010074027c006401660219007d0374037c038301010074047c017c0383027d0474056a0674027c00190083017d0574077c05830101007c056a087c047c0264028d0201006400530029034e721a0000002902720200000072030000002909723200000072350000007234000000723c000000722000000072370000007241000000723a0000007205000000290672330000007202000000724c000000721a000000da0f756e7061636b65645f616d6f756e74723600000072160000007216000000721700000072050000006d00000073100000000002060108010c0108010a010e01080129037233000000724800000072020000006303000000000000000a0000000500000043000000739400000074007c008301010074016a0274037c00190083017d0374047c038301010074037c006401660219007d0474057c04830101007c036a067c0274076a0874076a0964028d030100740a7c0083017d05740b7c027c0483027d06740c740d7c0119006403170083017d07740a7c0183017d08740d7c01050019006403370003003c007c057c0617007c0717007c0817007d097c09530029044e721a0000002903720200000072030000007208000000e901000000290e7235000000723700000072410000007234000000723a000000723c0000007207000000722e000000da0474686973722f000000722b0000007224000000722c000000724a000000290a7233000000724800000072020000007236000000721a000000da0c7061636b65645f746f6b656eda0d7061636b65645f616d6f756e74da0c7061636b65645f6e6f6e6365da0e7061636b65645f61646472657373da03616269721600000072160000007217000000da046275726e79000000731a000000000208010e0108010c010801140108010a01100108011001100172550000004e29027202000000720300000029027202000000720300000029027202000000720300000029037202000000720300000072080000002920da09696d706f72746c69627237000000da0446756e637239000000da04486173687234000000724a00000072460000007230000000da037374727218000000721d0000007220000000da05666c6f61747224000000722b000000722c000000723100000072320000007235000000da03416e79723a000000723c000000da085f5f6578706f7274723f0000007242000000724300000072470000007210000000724b000000720500000072550000007216000000721600000072160000007217000000da083c6d6f64756c653e01000000734a0000000401120116010c010401080104010a0104010801040108030e08100610060e080e06080408040e040e050e040601120506011409060110050601120506011004060112050601140b0601