1
1
/**
2
2
* ETH -> UNION
3
+ *
4
+ * Execute from CLI with `KEY="0xprivatekey" pnpm dlx vite-node ./path/to/bond.ts`
3
5
*/
4
6
// @ts -ignore
5
7
if ( typeof BigInt . prototype . toJSON !== "function" ) {
@@ -12,7 +14,9 @@ import {
12
14
Batch ,
13
15
Call ,
14
16
TokenOrder ,
17
+ Ucs03 ,
15
18
Ucs05 ,
19
+ Utils ,
16
20
ZkgmClient ,
17
21
ZkgmClientRequest ,
18
22
ZkgmIncomingMessage ,
@@ -25,20 +29,29 @@ import { HexFromJson } from "@unionlabs/sdk/schema/hex"
25
29
import { Effect , Logger , pipe , Schema } from "effect"
26
30
import { http } from "viem"
27
31
import { privateKeyToAccount } from "viem/accounts"
28
- import { mainnet } from "viem/chains"
32
+ import { sepolia } from "viem/chains"
29
33
30
- const ETHEREUM_CHAIN_ID = UniversalChainId . make ( "ethereum.1" )
31
- const UNION_CHAIN_ID = UniversalChainId . make ( "union.union-1" )
34
+ const JsonFromBase64 = Schema . compose (
35
+ Schema . StringFromBase64 ,
36
+ Schema . parseJson ( ) ,
37
+ )
38
+
39
+ const ETHEREUM_CHAIN_ID = UniversalChainId . make ( "ethereum.11155111" )
40
+ const UNION_CHAIN_ID = UniversalChainId . make ( "union.union-testnet-10" )
41
+ const UCS03_MINTER = Ucs05 . EvmDisplay . make ( { address : "0x" } ) // TODO: fix
42
+ const MIN_MINT_AMOUNT = 0n // TODO: fix
43
+ const VIEM_CHAIN = sepolia // TODO: check
44
+ const RPC_URL = "https://rpc.11155111.ethereum.chain.kitchen" // TODO: check
32
45
33
46
const VIEM_ACCOUNT = privateKeyToAccount (
34
47
process . env . KEY as any ,
35
48
)
36
49
37
- const sendWithCall = Effect . gen ( function * ( ) {
50
+ const sendBond = Effect . gen ( function * ( ) {
38
51
const SENDER = Ucs05 . EvmDisplay . make ( {
39
52
address : "0x06627714f3F17a701f7074a12C02847a5D2Ca487" ,
40
53
} )
41
- const ZKGM_ON_CALL_PROXY = Ucs05 . CosmosDisplay . make ( {
54
+ const ON_ZKGM_CALL_PROXY = Ucs05 . CosmosDisplay . make ( {
42
55
address : "union122ny3mep2l7nhtafpwav2y9e5jrslhek76hsjl" ,
43
56
} )
44
57
const ethereumChain = yield * ChainRegistry . byUniversalId ( ETHEREUM_CHAIN_ID )
@@ -48,67 +61,106 @@ const sendWithCall = Effect.gen(function*() {
48
61
source : ethereumChain ,
49
62
destination : unionChain ,
50
63
sender : SENDER ,
51
- receiver : ZKGM_ON_CALL_PROXY ,
52
- baseToken : "au " ,
64
+ receiver : ON_ZKGM_CALL_PROXY ,
65
+ baseToken : "0xba5eD44733953d79717F6269357C77718C8Ba5ed " ,
53
66
baseAmount : 1n ,
54
- quoteToken : "0xba5eD44733953d79717F6269357C77718C8Ba5ed " ,
67
+ quoteToken : "au " ,
55
68
quoteAmount : 1n ,
56
69
kind : "solve" ,
57
70
metadata :
58
71
"0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000014ba5ed44733953d79717f6269357c77718c8ba5ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" ,
59
72
version : 2 ,
60
73
} )
61
74
62
- const bondCall = Call . make ( {
63
- sender : SENDER ,
64
- eureka : false ,
65
- contractAddress : ZKGM_ON_CALL_PROXY ,
66
- contractCalldata : yield * pipe (
67
- {
68
- unbond : {
69
- amount : "30000" ,
70
- recipient : "bbn19lnpcs0pvz9htcvm58jkp6ak55m49x5n63rnfn" ,
71
- recipient_channel_id : null ,
72
- recipient_ibc_channel_id : null ,
73
- } ,
74
- } as const ,
75
- Schema . decode ( HexFromJson ) ,
75
+ const bondCall = yield * pipe (
76
+ {
77
+ mint_to : ON_ZKGM_CALL_PROXY ,
78
+ min_mint_amount : MIN_MINT_AMOUNT ,
79
+ } as const ,
80
+ Schema . encode ( JsonFromBase64 ) ,
81
+ Effect . map ( ( msg ) => ( {
82
+ contract : "Addr" , // TODO: eU-staking-hub (XXX: encoding???)
83
+ msg,
84
+ funds : [ {
85
+ denom : tokenOrder . quoteToken . address ,
86
+ amount : tokenOrder . quoteAmount ,
87
+ } ] ,
88
+ call_action : "call_proxy" ,
89
+ } as const ) ) ,
90
+ Effect . flatMap ( Schema . decode ( HexFromJson ) ) ,
91
+ Effect . map ( ( contractCalldata ) =>
92
+ Call . make ( {
93
+ sender : SENDER ,
94
+ eureka : false ,
95
+ contractAddress : ON_ZKGM_CALL_PROXY ,
96
+ contractCalldata,
97
+ } )
76
98
) ,
77
- } )
99
+ )
78
100
79
- const increaseAllowanceCall = Call . make ( {
80
- sender : SENDER ,
81
- eureka : false ,
82
- contractAddress : ZKGM_ON_CALL_PROXY ,
83
- contractCalldata : yield * pipe (
84
- {
85
- unbond : {
86
- amount : "30000" ,
87
- recipient : "bbn19lnpcs0pvz9htcvm58jkp6ak55m49x5n63rnfn" ,
88
- recipient_channel_id : null ,
89
- recipient_ibc_channel_id : null ,
90
- } ,
91
- } as const ,
92
- Schema . decode ( HexFromJson ) ,
101
+ const increaseAllowanceCall = yield * pipe (
102
+ {
103
+ spender : UCS03_MINTER . address , // XXX: zkgm encoded?
104
+ amount : MIN_MINT_AMOUNT ,
105
+ } as const ,
106
+ Schema . encode ( JsonFromBase64 ) ,
107
+ Effect . map ( ( msg ) => ( {
108
+ contract : "eU" ,
109
+ msg,
110
+ funds : [ ] ,
111
+ call_action : "direct" ,
112
+ } as const ) ) ,
113
+ Effect . flatMap ( Schema . decode ( HexFromJson ) ) ,
114
+ Effect . map ( ( contractCalldata ) =>
115
+ Call . make ( {
116
+ sender : SENDER ,
117
+ eureka : false ,
118
+ contractAddress : ON_ZKGM_CALL_PROXY ,
119
+ contractCalldata,
120
+ } )
93
121
) ,
94
- } )
122
+ )
95
123
96
- const sendCall = Call . make ( {
97
- sender : SENDER ,
98
- eureka : false ,
99
- contractAddress : ZKGM_ON_CALL_PROXY ,
100
- contractCalldata : yield * pipe (
101
- {
102
- unbond : {
103
- amount : "30000" ,
104
- recipient : "bbn19lnpcs0pvz9htcvm58jkp6ak55m49x5n63rnfn" ,
105
- recipient_channel_id : null ,
106
- recipient_ibc_channel_id : null ,
107
- } ,
108
- } as const ,
109
- Schema . decode ( HexFromJson ) ,
124
+ const sendCall = yield * pipe (
125
+ TokenOrder . make ( {
126
+ source : unionChain ,
127
+ destination : ethereumChain ,
128
+ sender : SENDER , // FIXME
129
+ receiver : "0xAddressOnEth" , // FIXME
130
+ baseToken : "eU" ,
131
+ baseAmount : MIN_MINT_AMOUNT ,
132
+ quoteToken : "au" , // FIXME
133
+ quoteAmount : 1n , // FIXME
134
+ kind : "solve" , // FIXME
135
+ metadata :
136
+ "0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000014ba5ed44733953d79717f6269357c77718c8ba5ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" , // FIXME
137
+ version : 2 ,
138
+ } ) ,
139
+ Effect . flatMap ( TokenOrder . encodeV2 ) ,
140
+ Effect . flatMap ( Schema . encode ( Ucs03 . Ucs03WithInstructionFromHex ) ) ,
141
+ Effect . map ( ( instruction ) => ( {
142
+ path : "path to eth" , // TODO
143
+ channel_id : "channel id to eth" , // TODO
144
+ salt : Utils . generateSalt ( "cosmos" ) , // TODO: check rpc type
145
+ instruction,
146
+ } as const ) ) ,
147
+ Schema . encode ( JsonFromBase64 ) ,
148
+ Effect . map ( ( msg ) => ( {
149
+ contract : UCS03_MINTER . address , // TODO: zkgm encoded? use `Ucs05.anyDisplayToZkgm()`
150
+ msg,
151
+ funds : [ ] ,
152
+ call_action : "direct" ,
153
+ } as const ) ) ,
154
+ Effect . flatMap ( Schema . decode ( HexFromJson ) ) ,
155
+ Effect . map ( ( contractCalldata ) =>
156
+ Call . make ( {
157
+ sender : SENDER ,
158
+ eureka : false ,
159
+ contractAddress : ON_ZKGM_CALL_PROXY ,
160
+ contractCalldata,
161
+ } )
110
162
) ,
111
- } )
163
+ )
112
164
113
165
const batch = Batch . make ( [
114
166
tokenOrder ,
@@ -120,8 +172,8 @@ const sendWithCall = Effect.gen(function*() {
120
172
const request = ZkgmClientRequest . make ( {
121
173
source : ethereumChain ,
122
174
destination : unionChain ,
123
- channelId : ChannelId . make ( 1 ) ,
124
- ucs03Address : "0x5fbe74a283f7954f10aa04c2edf55578811aeb03" ,
175
+ channelId : ChannelId . make ( 1 ) , // TODO: check
176
+ ucs03Address : "0x5fbe74a283f7954f10aa04c2edf55578811aeb03" , // TODO: check; it will auto-zkgm encode
125
177
instruction : batch ,
126
178
} )
127
179
@@ -133,17 +185,18 @@ const sendWithCall = Effect.gen(function*() {
133
185
const receipt = yield * response . waitFor (
134
186
ZkgmIncomingMessage . LifecycleEvent . $is ( "EvmTransactionReceiptComplete" ) ,
135
187
)
136
- yield * Effect . log ( "Receipt:" , { receipt } )
188
+
189
+ yield * Effect . log ( "Receipt:" , receipt )
137
190
} ) . pipe (
138
191
Effect . provide ( EvmZkgmClient . layerWithoutWallet ) ,
139
192
Effect . provide ( Evm . WalletClient . Live ( {
140
193
account : VIEM_ACCOUNT ,
141
- chain : mainnet ,
142
- transport : http ( "https://rpc.1.ethereum.chain.kitchen" ) ,
194
+ chain : VIEM_CHAIN ,
195
+ transport : http ( RPC_URL ) ,
143
196
} ) ) ,
144
197
Effect . provide ( Evm . PublicClient . Live ( {
145
- chain : mainnet ,
146
- transport : http ( "https://rpc.1.ethereum.chain.kitchen" ) ,
198
+ chain : VIEM_CHAIN ,
199
+ transport : http ( RPC_URL ) ,
147
200
} ) ) ,
148
201
Effect . provide ( ChainRegistry . Default ) ,
149
202
Effect . provide ( Logger . replace (
@@ -156,6 +209,6 @@ const sendWithCall = Effect.gen(function*() {
156
209
) ) ,
157
210
)
158
211
159
- Effect . runPromise ( sendWithCall )
212
+ Effect . runPromise ( sendBond )
160
213
. then ( console . log )
161
214
. catch ( console . error )
0 commit comments