z4a_on_recv_packet_filetest.gno
11.32 Kb · 311 lines
1// PKGPATH: gno.land/r/aib/main
2package main
3
4import (
5 "encoding/base64"
6 "encoding/hex"
7 "time"
8
9 tmtesting "gno.land/p/aib/ibc/lightclient/tendermint/testing"
10 "gno.land/p/aib/ibc/types"
11 "gno.land/p/aib/ics23"
12 "gno.land/p/nt/testutils/v0"
13 "gno.land/r/aib/ibc/apps/transfer"
14 "gno.land/r/aib/ibc/core"
15)
16
17// OnRecvPacket: success with native coins
18func main(cur realm) {
19 var (
20 chainID = "chain-id-2"
21 trustedHeight = types.NewHeight(2, 2)
22 clientState = tmtesting.NewClientState(chainID, trustedHeight)
23 // NOTE this apphash was provided by the gen-proof command below.
24 apphash, _ = hex.DecodeString("18ccfc84ab4c908313fab9bc9382046e13c76fd02043f1d63b84f3cbd7f03e86")
25 trustedValset = tmtesting.GenValset()
26 consensusState = tmtesting.GenConsensusState(time.Now(), apphash, trustedValset.Hash())
27 counterpartyID = "07-tendermint-42"
28 )
29 clientID := core.CreateClient(cross(cur), clientState, consensusState)
30 core.RegisterCounterparty(cross(cur), clientID, [][]byte{[]byte("iavlStoreKey"), []byte("prefix2")}, counterpartyID)
31
32 receiver := testutils.TestAddress("receiver")
33 payload := transfer.NewFungibleTokenPacketData("uphoton", "100", "atone1user", receiver.String(), "")
34 payloadBz := payload.ProtoMarshal()
35 // NOTE this base64 value is used in payload.value in the gen-proof command below.
36 println("Payload proto:", base64.StdEncoding.EncodeToString(payloadBz))
37
38 // Generate the proof of existence of the packet commitment for the
39 // counterparty chain.
40 specs := ics23.IavlSpec()
41 // NOTE code generated by:
42 // go run -C ./cmd/gen-proof . 'prefix2' '07-tendermint-42' 'packet' '{"sequence":1,"source_client":"07-tendermint-42","destination_client":"07-tendermint-1","timeout_timestamp":1234571490,"payloads":[{"source_port":"transfer","destination_port":"transfer","encoding":"application/x-protobuf", "value":"Cgd1cGhvdG9uEgMxMDAaCmF0b25lMXVzZXIiKGcxd2Zqa3hldGZ3ZWpoeWg2bHRhMDQ3aDZsdGEwNDdoNmxsbTgyeWw=","version":"ics20-1"}]}'
43 proof := []ics23.CommitmentProof{
44
45 // iavl proof
46 ics23.CommitmentProof_Exist{
47 Exist: &ics23.ExistenceProof{
48 Key: []byte("\x70\x72\x65\x66\x69\x78\x32\x30\x37\x2d\x74\x65\x6e\x64\x65\x72\x6d\x69\x6e\x74\x2d\x34\x32\x01\x00\x00\x00\x00\x00\x00\x00\x01"),
49 Value: []byte("\x88\x03\x13\x78\xc6\xf5\x14\xf4\x8a\x0c\x5b\x83\xc9\x1c\xcc\x68\xc5\x81\x97\xc8\x9e\xf7\x19\x3e\xa0\xd4\x65\x47\x54\x59\x83\x58"),
50 Leaf: &ics23.LeafOp{
51 Hash: specs.LeafSpec.Hash,
52 PrehashKey: specs.LeafSpec.PrehashKey,
53 PrehashValue: specs.LeafSpec.PrehashValue,
54 Length: specs.LeafSpec.Length,
55 Prefix: []byte("\x00\x02\x02"),
56 },
57 Path: []*ics23.InnerOp{
58 {
59 Hash: specs.InnerSpec.Hash,
60 Prefix: []byte("\x02\x04\x02\x20\x35\xf8\xea\x80\x53\x90\xe0\x84\x85\x4f\x39\x9b\x42\xcc\xde\xae\xa3\x3a\x1d\xed\xc1\x15\x63\x8a\xc4\x8d\x06\x00\x63\x7d\xba\x1f\x20"),
61 Suffix: []byte(""),
62 },
63 {
64 Hash: specs.InnerSpec.Hash,
65 Prefix: []byte("\x04\x08\x02\x20"),
66 Suffix: []byte("\x20\x79\x8e\x2c\xaa\x96\xfd\xfb\xa3\x76\xdd\xeb\x47\x99\x99\x54\xd2\xf4\x7e\x65\x16\x22\x64\xb0\x53\x6a\xb5\xdf\xf7\xfc\x0a\x2e\x07"),
67 },
68 {
69 Hash: specs.InnerSpec.Hash,
70 Prefix: []byte("\x06\x0c\x02\x20\x9a\xf3\x7d\xd5\x95\xa0\x19\x08\x03\xb5\xe0\x5a\xae\xf4\x2a\xe3\xfa\xd4\x99\xe4\xfb\xe3\x7f\x7c\xd3\x1c\xad\xff\x22\xa9\xee\x74\x20"),
71 Suffix: []byte(""),
72 },
73 },
74 },
75 },
76
77 // rootmulti proof
78 ics23.CommitmentProof_Exist{
79 Exist: &ics23.ExistenceProof{
80 Key: []byte("\x69\x61\x76\x6c\x53\x74\x6f\x72\x65\x4b\x65\x79"),
81 Value: []byte("\x7d\xcc\x4a\xcc\x76\xa1\xf0\x23\x45\x9a\x76\xff\xc8\x27\x0f\x1a\xde\x8c\x5a\x03\xd9\x29\x94\xa4\xed\x59\x52\xd4\x26\x63\x81\x3c"),
82 Leaf: &ics23.LeafOp{
83 Hash: specs.LeafSpec.Hash,
84 PrehashKey: specs.LeafSpec.PrehashKey,
85 PrehashValue: specs.LeafSpec.PrehashValue,
86 Length: specs.LeafSpec.Length,
87 Prefix: []byte("\x00"),
88 },
89 Path: []*ics23.InnerOp{},
90 },
91 },
92 }
93
94 recvPacket := types.MsgRecvPacket{
95 Packet: types.Packet{
96 Sequence: 1,
97 SourceClient: counterpartyID,
98 DestinationClient: clientID,
99 TimeoutTimestamp: uint64(time.Now().Add(time.Hour).Unix()),
100 Payloads: []types.Payload{{
101 SourcePort: transfer.PortID,
102 DestinationPort: transfer.PortID,
103 Encoding: transfer.EncodingProtobuf,
104 Value: payloadBz,
105 Version: transfer.V1,
106 }},
107 },
108 ProofCommitment: proof,
109 ProofHeight: trustedHeight,
110 }
111 // ibc/CAEF9CA8CE6C302D73A831A49E34E59149D3A9AD96CCEBDFBF62F6D5710D92D8
112 voucherDenom := transfer.NewDenom("uphoton", transfer.NewHop(transfer.PortID, clientID)).IBCDenom()
113 println("\nreceiver voucher balance before RecvPacket:", transfer.VoucherBalanceOf(voucherDenom, receiver))
114
115 res := core.RecvPacket(cross(cur), recvPacket)
116
117 println("\nack res:", res)
118 println("\nreceiver voucher balance after RecvPacket:", transfer.VoucherBalanceOf(voucherDenom, receiver))
119 println("\n----------- assert render /denoms")
120 println(transfer.Render("denoms"))
121 println("\n----------- assert render /denoms/" + voucherDenom)
122 println(transfer.Render("denoms/" + voucherDenom))
123 println("\n----------- assert render voucher")
124 println(transfer.Render("voucher/" + voucherDenom))
125 println("\n----------- assert render voucher balance")
126 println(transfer.Render("voucher/" + voucherDenom + "/balance/" + receiver.String()))
127 println("\n----------- assert render vouchers")
128 println(transfer.Render("vouchers"))
129}
130
131// Output:
132// Payload proto: Cgd1cGhvdG9uEgMxMDAaCmF0b25lMXVzZXIiKGcxd2Zqa3hldGZ3ZWpoeWg2bHRhMDQ3aDZsdGEwNDdoNmxsbTgyeWw=
133//
134// receiver voucher balance before RecvPacket: 0
135//
136// ack res: (2 gno.land/p/aib/ibc/types.ResponseResultType)
137//
138// receiver voucher balance after RecvPacket: 100
139//
140// ----------- assert render /denoms
141// {"items":[{"base":"uphoton","path":"transfer/07-tendermint-1/uphoton","denom":"ibc/CAEF9CA8CE6C302D73A831A49E34E59149D3A9AD96CCEBDFBF62F6D5710D92D8"}],"page":1,"total":1}
142//
143// ----------- assert render /denoms/ibc/CAEF9CA8CE6C302D73A831A49E34E59149D3A9AD96CCEBDFBF62F6D5710D92D8
144// {"base":"uphoton","path":"transfer/07-tendermint-1/uphoton","denom":"ibc/CAEF9CA8CE6C302D73A831A49E34E59149D3A9AD96CCEBDFBF62F6D5710D92D8"}
145//
146// ----------- assert render voucher
147// {"denom":"ibc/CAEF9CA8CE6C302D73A831A49E34E59149D3A9AD96CCEBDFBF62F6D5710D92D8","grc20reg_key":"gno.land/r/aib/ibc/apps/transfer.CAEF9CA8CE6C302D73A831A49E34E59149D3A9AD96CCEBDFBF62F6D5710D92D8","name":"uphoton","symbol":"CAEF9CA8CE6","decimals":0,"total_supply":100}
148//
149// ----------- assert render voucher balance
150// {"denom":"ibc/CAEF9CA8CE6C302D73A831A49E34E59149D3A9AD96CCEBDFBF62F6D5710D92D8","address":"g1wfjkxetfwejhyh6lta047h6lta047h6llm82yl","balance":100}
151//
152// ----------- assert render vouchers
153// {"items":[{"denom":"ibc/CAEF9CA8CE6C302D73A831A49E34E59149D3A9AD96CCEBDFBF62F6D5710D92D8","grc20reg_key":"gno.land/r/aib/ibc/apps/transfer.CAEF9CA8CE6C302D73A831A49E34E59149D3A9AD96CCEBDFBF62F6D5710D92D8","name":"uphoton","symbol":"CAEF9CA8CE6","decimals":0,"total_supply":100}],"page":1,"total":1}
154
155// Events:
156// [
157// {
158// "type": "create_client",
159// "attrs": [
160// {
161// "key": "client_id",
162// "value": "07-tendermint-1"
163// },
164// {
165// "key": "client_type",
166// "value": "07-tendermint"
167// },
168// {
169// "key": "consensus_heights",
170// "value": "2/2"
171// }
172// ],
173// "pkg_path": "gno.land/r/aib/ibc/core"
174// },
175// {
176// "type": "recv_packet",
177// "attrs": [
178// {
179// "key": "packet_source_client",
180// "value": "07-tendermint-42"
181// },
182// {
183// "key": "packet_dest_client",
184// "value": "07-tendermint-1"
185// },
186// {
187// "key": "packet_sequence",
188// "value": "1"
189// },
190// {
191// "key": "packet_timeout_timestamp",
192// "value": "1234571490"
193// },
194// {
195// "key": "encoded_packet_hex",
196// "value": "0801121030372d74656e6465726d696e742d34321a0f30372d74656e6465726d696e742d3120e2a1d8cc042a7b0a087472616e7366657212087472616e736665721a0769637332302d3122166170706c69636174696f6e2f782d70726f746f6275662a440a077570686f746f6e12033130301a0a61746f6e6531757365722228673177666a6b7865746677656a687968366c746130343768366c746130343768366c6c6d3832796c"
197// }
198// ],
199// "pkg_path": "gno.land/r/aib/ibc/core"
200// },
201// {
202// "type": "denomination",
203// "attrs": [
204// {
205// "key": "denom_hash",
206// "value": "CAEF9CA8CE6C302D73A831A49E34E59149D3A9AD96CCEBDFBF62F6D5710D92D8"
207// },
208// {
209// "key": "denom",
210// "value": "{\"base\":\"uphoton\",\"path\":\"transfer/07-tendermint-1/uphoton\",\"denom\":\"ibc/CAEF9CA8CE6C302D73A831A49E34E59149D3A9AD96CCEBDFBF62F6D5710D92D8\"}"
211// }
212// ],
213// "pkg_path": "gno.land/r/aib/ibc/apps/transfer"
214// },
215// {
216// "type": "register",
217// "attrs": [
218// {
219// "key": "pkgpath",
220// "value": "gno.land/r/aib/ibc/apps/transfer"
221// },
222// {
223// "key": "slug",
224// "value": "CAEF9CA8CE6C302D73A831A49E34E59149D3A9AD96CCEBDFBF62F6D5710D92D8"
225// }
226// ],
227// "pkg_path": "gno.land/r/demo/defi/grc20reg"
228// },
229// {
230// "type": "Transfer",
231// "attrs": [
232// {
233// "key": "token",
234// "value": "gno.land/r/aib/ibc/apps/transfer.CAEF9CA8CE6"
235// },
236// {
237// "key": "from",
238// "value": ""
239// },
240// {
241// "key": "to",
242// "value": "g1wfjkxetfwejhyh6lta047h6lta047h6llm82yl"
243// },
244// {
245// "key": "value",
246// "value": "100"
247// }
248// ],
249// "pkg_path": "gno.land/p/demo/tokens/grc20"
250// },
251// {
252// "type": "fungible_token_packet",
253// "attrs": [
254// {
255// "key": "sender",
256// "value": "atone1user"
257// },
258// {
259// "key": "receiver",
260// "value": "g1wfjkxetfwejhyh6lta047h6lta047h6llm82yl"
261// },
262// {
263// "key": "denom",
264// "value": "transfer/07-tendermint-1/uphoton"
265// },
266// {
267// "key": "amount",
268// "value": "100"
269// },
270// {
271// "key": "memo",
272// "value": ""
273// },
274// {
275// "key": "success",
276// "value": "true"
277// }
278// ],
279// "pkg_path": "gno.land/r/aib/ibc/apps/transfer"
280// },
281// {
282// "type": "write_acknowledgement",
283// "attrs": [
284// {
285// "key": "packet_source_client",
286// "value": "07-tendermint-42"
287// },
288// {
289// "key": "packet_dest_client",
290// "value": "07-tendermint-1"
291// },
292// {
293// "key": "packet_sequence",
294// "value": "1"
295// },
296// {
297// "key": "packet_timeout_timestamp",
298// "value": "1234571490"
299// },
300// {
301// "key": "encoded_packet_hex",
302// "value": "0801121030372d74656e6465726d696e742d34321a0f30372d74656e6465726d696e742d3120e2a1d8cc042a7b0a087472616e7366657212087472616e736665721a0769637332302d3122166170706c69636174696f6e2f782d70726f746f6275662a440a077570686f746f6e12033130301a0a61746f6e6531757365722228673177666a6b7865746677656a687968366c746130343768366c746130343768366c6c6d3832796c"
303// },
304// {
305// "key": "encoded_acknowledgement_hex",
306// "value": "0a117b22726573756c74223a2241513d3d227d"
307// }
308// ],
309// "pkg_path": "gno.land/r/aib/ibc/core"
310// }
311// ]