Contract con_tau_bridge_v2


Contract Code


  
1 import currency
2
3 nonces = Hash(default_value=0)
4 proofs = Hash()
5 metadata = Hash()
6
7 token_address = Variable()
8 token_decimals = Variable()
9 bridge_address = Variable()
10
11 HEX_BYTES = 64
12
13
14 def left_pad(s):
15 while len(s) < HEX_BYTES:
16 s = f"0{s}"
17
18 if len(s) > HEX_BYTES:
19 s = s[:HEX_BYTES]
20
21 return s
22
23
24 def unpack_uint256(uint, decimals):
25 i = int(uint, 16)
26 reduced_i = i / (10 ** decimals)
27 return reduced_i
28
29
30 def pack_amount(amount, decimals):
31 i = int(amount * (10 ** decimals))
32 h = hex(i)[2:]
33 return left_pad(h)
34
35
36 def pack_eth_address(address):
37 assert address.startswith("0x"), "Invalid Ethereum prefix"
38 a = address[2:]
39 assert len(a) == 40, "Invalid address length"
40
41 int(a, 16) # Throws error if not hex string
42
43 return left_pad(a)
44
45
46 def pack_int(i):
47 i = int(i)
48 h = hex(i)[2:]
49 return left_pad(h)
50
51
52 @construct
53 def seed():
54 metadata["operator"] = ctx.caller
55
56
57 # LST002
58 @export
59 def change_metadata(key: str, value: Any):
60 assert ctx.caller == metadata["operator"], "Only operator can set metadata!"
61 metadata[key] = value
62
63
64 @export
65 def set_token(eth_contract: str, decimals: int):
66 assert ctx.caller == metadata["operator"], "Only the operator can call!"
67 token_address.set(eth_contract)
68 token_decimals.set(decimals)
69
70
71 @export
72 def set_bridge(eth_contract: str):
73 assert ctx.caller == metadata["operator"], "Only the operator can call!"
74 bridge_address.set(eth_contract)
75
76
77 @export
78 def deposit(amount: float, ethereum_address: str):
79 assert token_address.get() is not None, "token_address variable not set"
80
81 currency.transfer_from(amount=amount, to=ctx.this, main_account=ctx.caller)
82
83 packed_token = pack_eth_address(token_address.get())
84 packed_amount = pack_amount(amount, token_decimals.get())
85 packed_nonce = pack_int(nonces[ethereum_address] + 1)
86 packed_address = pack_eth_address(ethereum_address)
87 packed_bridge = pack_eth_address(bridge_address.get())
88
89 nonces[ethereum_address] += 1
90
91 abi = packed_token + packed_amount + packed_nonce + packed_address + packed_bridge
92
93 return abi
94
95
96 @export
97 def withdraw(amount: float, to: str):
98 assert ctx.caller == metadata["operator"], "Only the operator can call!"
99 assert token_address.get() is not None, "token_address variable not set"
100 currency.transfer(amount=amount, to=to)
101
102
103 @export
104 def post_proof(hashed_abi: str, signed_abi: str):
105 assert ctx.caller == metadata["operator"], "Only operator can call!"
106 assert token_address.get() is not None, "token_address variable not set"
107 proofs[hashed_abi] = signed_abi
108
109
110 @export
111 def proofs(hashed_abi: str):
112 return proofs[hashed_abi]

Byte Code

e30000000000000000000000000500000040000000732e010000640064016c005a00650164006402640364048d035a0265016402640564068d025a0365016402640764068d025a0465056402640864068d025a0665056402640964068d025a0765056402640a64068d025a08640b5a09640c640d84005a0a640e640f84005a0b6410641184005a0c6412641384005a0d6414641584005a0e6416641784005a0f6510640283016511651264189c026419641a840483015a1365106402830165116514641b9c02641c641d840483015a156510640283016511641e9c01641f6420840483015a166510640283016517651164219c0264226423840483015a186510640283016517651164249c0264256426840483015a196510640283016511651164279c0264286429840483015a1a6510640283016511642a9c01642b6405840483015a1b64015300292ce9000000004eda11636f6e5f7461755f6272696467655f7632da066e6f6e6365732903da0d64656661756c745f76616c7565da08636f6e7472616374da046e616d65da0670726f6f6673290272050000007206000000da086d65746164617461da0d746f6b656e5f61646472657373da0e746f6b656e5f646563696d616c73da0e6272696467655f61646472657373e9400000006301000000000000000100000003000000430000007338000000781a74007c00830174016b00721a64017c009b009d027d007102570074007c00830174016b0472347c0064007401850219007d007c00530029024eda01302902da036c656eda094845585f42595445532901da0173a9007211000000da00da0a5f5f6c6566745f7061640d000000730a00000000010e010e010c010c017213000000630200000000000000040000000300000043000000731a00000074007c00640183027d027c0264027c0113001b007d037c03530029034ee910000000e90a0000002901da03696e742904da0475696e74da08646563696d616c73da0169da09726564756365645f69721100000072110000007212000000da105f5f756e7061636b5f75696e7432353615000000730600000000010a010c01721b000000630200000000000000040000000400000043000000732800000074007c0064017c011300140083017d0274017c02830164026400850219007d0374027c038301530029034e7215000000e90200000029037216000000da0368657872130000002904da06616d6f756e7472180000007219000000da0168721100000072110000007212000000da0d5f5f7061636b5f616d6f756e741b0000007306000000000110011001722000000063010000000000000002000000030000004300000073440000007c006a0064018301731274016402830182017c0064036400850219007d0174027c01830164046b027332740164058301820174037c0164068302010074047c018301530029074eda0230787a17496e76616c696420457468657265756d20707265666978721c000000e9280000007a16496e76616c69642061646472657373206c656e67746872140000002905da0a73746172747377697468da0e417373657274696f6e4572726f72720e000000721600000072130000002902da0761646472657373da0161721100000072110000007212000000da125f5f7061636b5f6574685f6164647265737321000000730a000000000112010c0114010a017227000000630100000000000000020000000300000043000000732000000074007c0083017d0074017c00830164016400850219007d0174027c018301530029024e721c00000029037216000000721d000000721300000029027219000000721f000000721100000072110000007212000000da0a5f5f7061636b5f696e742900000073060000000001080110017228000000630000000000000000000000000300000043000000730e00000074006a01740264013c006400530029024eda086f70657261746f722903da03637478da0663616c6c6572da0a5f5f6d657461646174617211000000721100000072110000007212000000da045f5f5f5f2f00000073020000000001722d0000002902da036b6579da0576616c7565630200000000000000020000000300000043000000732200000074006a017402640119006b02731674036402830182017c0174027c003c006400530029034e72290000007a1f4f6e6c79206f70657261746f722063616e20736574206d65746164617461212904722a000000722b000000722c00000072240000002902722e000000722f000000721100000072110000007212000000da0f6368616e67655f6d6574616461746133000000730600000000021001060172300000002902da0c6574685f636f6e74726163747218000000630200000000000000020000000300000043000000732e00000074006a017402640119006b027316740364028301820174046a057c008301010074066a057c01830101006400530029034e72290000007a1b4f6e6c7920746865206f70657261746f722063616e2063616c6c212907722a000000722b000000722c0000007224000000da0f5f5f746f6b656e5f61646472657373da03736574da105f5f746f6b656e5f646563696d616c73290272310000007218000000721100000072110000007212000000da097365745f746f6b656e3a0000007306000000000216010a01723500000029017231000000630100000000000000010000000300000043000000732400000074006a017402640119006b027316740364028301820174046a057c00830101006400530029034e72290000007a1b4f6e6c7920746865206f70657261746f722063616e2063616c6c212906722a000000722b000000722c0000007224000000da105f5f6272696467655f61646472657373723300000029017231000000721100000072110000007212000000da0a7365745f6272696467654100000073040000000002160172370000002902721e000000da10657468657265756d5f61646472657373630200000000000000080000000500000043000000738e00000074006a01830064006b097314740264018301820174036a047c0074056a0674056a0764028d030100740874006a01830083017d0274097c00740a6a01830083027d03740b740c7c0119006403170083017d0474087c0183017d057408740d6a01830083017d06740c7c01050019006403370003003c007c027c0317007c0417007c0517007c0617007d077c07530029044e7a1e746f6b656e5f61646472657373207661726961626c65206e6f74207365742903721e000000da02746fda0c6d61696e5f6163636f756e74e901000000290e7232000000da036765747224000000da0863757272656e6379da0d7472616e736665725f66726f6d722a000000da0474686973722b0000007227000000722000000072340000007228000000da085f5f6e6f6e63657372360000002908721e0000007238000000da0c7061636b65645f746f6b656eda0d7061636b65645f616d6f756e74da0c7061636b65645f6e6f6e6365da0e7061636b65645f61646472657373da0d7061636b65645f627269646765da03616269721100000072110000007212000000da076465706f7369744700000073160000000002140114010c010e01100108010c0110010e01060172470000002902721e0000007239000000630200000000000000020000000400000043000000733c00000074006a017402640119006b027316740364028301820174046a05830064006b09732a740364038301820174066a077c007c0164048d0201006400530029054e72290000007a1b4f6e6c7920746865206f70657261746f722063616e2063616c6c217a1e746f6b656e5f61646472657373207661726961626c65206e6f74207365742902721e00000072390000002908722a000000722b000000722c00000072240000007232000000723c000000723d000000da087472616e736665722902721e0000007239000000721100000072110000007212000000da08776974686472617756000000730600000000021601140172490000002902da0a6861736865645f616269da0a7369676e65645f616269630200000000000000020000000300000043000000733600000074006a017402640119006b027316740364028301820174046a05830064006b09732a74036403830182017c0174067c003c006400530029044e72290000007a174f6e6c79206f70657261746f722063616e2063616c6c217a1e746f6b656e5f61646472657373207661726961626c65206e6f74207365742907722a000000722b000000722c00000072240000007232000000723c000000da085f5f70726f6f66732902724a000000724b000000721100000072110000007212000000da0a706f73745f70726f6f665d0000007306000000000216011401724d0000002901724a000000630100000000000000010000000200000043000000730800000074007c001900530029014e2901724c0000002901724a00000072110000007211000000721200000072070000006400000073020000000002291c723d000000da04486173687240000000724c000000722c000000da085661726961626c65723200000072340000007236000000720f0000007213000000721b000000722000000072270000007228000000722d000000da085f5f6578706f7274da03737472da03416e797230000000721600000072350000007237000000da05666c6f617472470000007249000000724d00000072070000007211000000721100000072110000007212000000da083c6d6f64756c653e01000000733600000008010e010c010c010c010c020c0204030808080608060808080608040601120606011206060110050601120e06011206060112060601