Skip to content

Commit 4fbc483

Browse files
committed
feat(app): add bond test
Signed-off-by: Eric Hegnes <[email protected]>
1 parent 594766a commit 4fbc483

File tree

1 file changed

+114
-61
lines changed

1 file changed

+114
-61
lines changed

app2/examples/bond.ts

Lines changed: 114 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
/**
22
* ETH -> UNION
3+
*
4+
* Execute from CLI with `KEY="0xprivatekey" pnpm dlx vite-node ./path/to/bond.ts`
35
*/
46
// @ts-ignore
57
if (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"
2529
import { Effect, Logger, pipe, Schema } from "effect"
2630
import { http } from "viem"
2731
import { 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

3346
const 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

Comments
 (0)