11/**
22 * ETH -> UNION
3+ *
4+ * Execute from CLI with `KEY="0xprivatekey" pnpm dlx vite-node ./path/to/bond.ts`
35 */
46// @ts -ignore
57if ( typeof BigInt . prototype . toJSON !== "function" ) {
@@ -12,7 +14,9 @@ import {
1214 Batch ,
1315 Call ,
1416 TokenOrder ,
17+ Ucs03 ,
1518 Ucs05 ,
19+ Utils ,
1620 ZkgmClient ,
1721 ZkgmClientRequest ,
1822 ZkgmIncomingMessage ,
@@ -25,20 +29,29 @@ import { HexFromJson } from "@unionlabs/sdk/schema/hex"
2529import { Effect , Logger , pipe , Schema } from "effect"
2630import { http } from "viem"
2731import { privateKeyToAccount } from "viem/accounts"
28- import { mainnet } from "viem/chains"
32+ import { sepolia } from "viem/chains"
2933
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
3245
3346const VIEM_ACCOUNT = privateKeyToAccount (
3447 process . env . KEY as any ,
3548)
3649
37- const sendWithCall = Effect . gen ( function * ( ) {
50+ const sendBond = Effect . gen ( function * ( ) {
3851 const SENDER = Ucs05 . EvmDisplay . make ( {
3952 address : "0x06627714f3F17a701f7074a12C02847a5D2Ca487" ,
4053 } )
41- const ZKGM_ON_CALL_PROXY = Ucs05 . CosmosDisplay . make ( {
54+ const ON_ZKGM_CALL_PROXY = Ucs05 . CosmosDisplay . make ( {
4255 address : "union122ny3mep2l7nhtafpwav2y9e5jrslhek76hsjl" ,
4356 } )
4457 const ethereumChain = yield * ChainRegistry . byUniversalId ( ETHEREUM_CHAIN_ID )
@@ -48,67 +61,106 @@ const sendWithCall = Effect.gen(function*() {
4861 source : ethereumChain ,
4962 destination : unionChain ,
5063 sender : SENDER ,
51- receiver : ZKGM_ON_CALL_PROXY ,
52- baseToken : "au " ,
64+ receiver : ON_ZKGM_CALL_PROXY ,
65+ baseToken : "0xba5eD44733953d79717F6269357C77718C8Ba5ed " ,
5366 baseAmount : 1n ,
54- quoteToken : "0xba5eD44733953d79717F6269357C77718C8Ba5ed " ,
67+ quoteToken : "au " ,
5568 quoteAmount : 1n ,
5669 kind : "solve" ,
5770 metadata :
5871 "0x000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000014ba5ed44733953d79717f6269357c77718c8ba5ed0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" ,
5972 version : 2 ,
6073 } )
6174
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+ } )
7698 ) ,
77- } )
99+ )
78100
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+ } )
93121 ) ,
94- } )
122+ )
95123
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+ } )
110162 ) ,
111- } )
163+ )
112164
113165 const batch = Batch . make ( [
114166 tokenOrder ,
@@ -120,8 +172,8 @@ const sendWithCall = Effect.gen(function*() {
120172 const request = ZkgmClientRequest . make ( {
121173 source : ethereumChain ,
122174 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
125177 instruction : batch ,
126178 } )
127179
@@ -133,17 +185,18 @@ const sendWithCall = Effect.gen(function*() {
133185 const receipt = yield * response . waitFor (
134186 ZkgmIncomingMessage . LifecycleEvent . $is ( "EvmTransactionReceiptComplete" ) ,
135187 )
136- yield * Effect . log ( "Receipt:" , { receipt } )
188+
189+ yield * Effect . log ( "Receipt:" , receipt )
137190} ) . pipe (
138191 Effect . provide ( EvmZkgmClient . layerWithoutWallet ) ,
139192 Effect . provide ( Evm . WalletClient . Live ( {
140193 account : VIEM_ACCOUNT ,
141- chain : mainnet ,
142- transport : http ( "https://rpc.1.ethereum.chain.kitchen" ) ,
194+ chain : VIEM_CHAIN ,
195+ transport : http ( RPC_URL ) ,
143196 } ) ) ,
144197 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 ) ,
147200 } ) ) ,
148201 Effect . provide ( ChainRegistry . Default ) ,
149202 Effect . provide ( Logger . replace (
@@ -156,6 +209,6 @@ const sendWithCall = Effect.gen(function*() {
156209 ) ) ,
157210)
158211
159- Effect . runPromise ( sendWithCall )
212+ Effect . runPromise ( sendBond )
160213 . then ( console . log )
161214 . catch ( console . error )
0 commit comments