// PKGPATH: gno.land/r/aib/main package main import ( "chain" "encoding/hex" "testing" "time" tmtesting "gno.land/p/aib/ibc/lightclient/tendermint/testing" "gno.land/p/aib/ibc/types" "gno.land/p/aib/ics23" "gno.land/r/aib/ibc/apps/testing/grc20test" "gno.land/r/aib/ibc/apps/transfer" "gno.land/r/aib/ibc/core" ) func main(cur realm) { var ( chainID = "chain-id-2" trustedHeight = types.NewHeight(2, 2) clientState = tmtesting.NewClientState(chainID, trustedHeight) apphash, _ = hex.DecodeString("33fead0600f4d6cb62757ae93f837886add19e145a66413e60dfe5ea5c52d039") trustedValset = tmtesting.GenValset() ) clientAConsensusState := tmtesting.GenConsensusState(time.Now(), apphash, trustedValset.Hash()) clientA := core.CreateClient(cross(cur), clientState, clientAConsensusState) core.RegisterCounterparty(cross(cur), clientA, [][]byte{[]byte("iavlStoreKey"), []byte("prefix2")}, "07-tendermint-42") clientBConsensusState := tmtesting.GenConsensusState(time.Now(), apphash, trustedValset.Hash()) clientB := core.CreateClient(cross(cur), clientState, clientBConsensusState) core.RegisterCounterparty(cross(cur), clientB, [][]byte{[]byte("iavlStoreKey"), []byte("prefix3")}, "07-tendermint-43") owner := cur.Previous().Address() grc20test.Mint(cross(cur), owner, 1000) transferAppAddr := chain.PackageAddress("gno.land/r/aib/ibc/apps/transfer") grc20test.Approve(cross(cur), owner, transferAppAddr, 100) grc20regKey := "gno.land/r/aib/ibc/apps/testing/grc20test." + grc20test.Slug alias := transfer.GRC20Alias(grc20regKey) recvVoucher(cur, clientA, "07-tendermint-42", trustedHeight, alias, owner) voucherDenom := transfer.NewDenom(alias, transfer.NewHop(transfer.PortID, clientA)).IBCDenom() println("voucher balance before Transfer:", transfer.VoucherBalanceOf(voucherDenom, owner)) println("GRC20 balance before Transfer:", grc20test.BalanceOf(owner)) testing.SetRealm(testing.NewUserRealm(owner)) transfer.Transfer(cross(cur), clientB, "atone1user", voucherDenom, 100, uint64(time.Now().Add(time.Hour).Unix()), "") println("voucher balance after Transfer:", transfer.VoucherBalanceOf(voucherDenom, owner)) println("GRC20 balance after Transfer:", grc20test.BalanceOf(owner)) } func recvVoucher(cur realm, clientID, counterpartyID string, trustedHeight types.Height, baseDenom string, receiver address) { payload := transfer.NewFungibleTokenPacketData(baseDenom, "100", "atone1user", receiver.String(), "") payloadBz := payload.ProtoMarshal() specs := ics23.IavlSpec() // NOTE code generated by: // 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":"Ci5nbm8ubGFuZDpyOmFpYjppYmM6YXBwczp0ZXN0aW5nOmdyYzIwdGVzdC5URVNUEgMxMDAaCmF0b25lMXVzZXIiKGcxd3ltdTQ3ZHJocjBrdXEyMDk4bTc5Mmx5dGd0ajJueXg3N3lyc20=","version":"ics20-1"}]}' proof := []ics23.CommitmentProof{ // iavl proof ics23.CommitmentProof_Exist{ Exist: &ics23.ExistenceProof{ 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"), Value: []byte("\x08\x75\xdf\x91\xfd\x25\xd3\xd2\x4d\x40\x2b\xa9\x09\x2f\x6d\x5d\xea\xcc\x51\xeb\x90\x15\x62\xa7\xa8\x6d\xb8\x56\xc6\x59\x72\x44"), Leaf: &ics23.LeafOp{ Hash: specs.LeafSpec.Hash, PrehashKey: specs.LeafSpec.PrehashKey, PrehashValue: specs.LeafSpec.PrehashValue, Length: specs.LeafSpec.Length, Prefix: []byte("\x00\x02\x02"), }, Path: []*ics23.InnerOp{ { Hash: specs.InnerSpec.Hash, 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"), Suffix: []byte(""), }, { Hash: specs.InnerSpec.Hash, Prefix: []byte("\x04\x08\x02\x20"), 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"), }, { Hash: specs.InnerSpec.Hash, 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"), Suffix: []byte(""), }, }, }, }, // rootmulti proof ics23.CommitmentProof_Exist{ Exist: &ics23.ExistenceProof{ Key: []byte("\x69\x61\x76\x6c\x53\x74\x6f\x72\x65\x4b\x65\x79"), Value: []byte("\x5f\xd0\xfe\x1e\xf3\xcc\x3f\x2d\x4b\x94\x77\xa6\x04\x51\x4a\x11\xaf\x58\xf8\xa9\x9a\x7a\x73\x90\x74\xf8\xb2\xa3\x21\xad\x08\xee"), Leaf: &ics23.LeafOp{ Hash: specs.LeafSpec.Hash, PrehashKey: specs.LeafSpec.PrehashKey, PrehashValue: specs.LeafSpec.PrehashValue, Length: specs.LeafSpec.Length, Prefix: []byte("\x00"), }, Path: []*ics23.InnerOp{}, }, }, } recvMsg := types.MsgRecvPacket{ Packet: types.Packet{ Sequence: 1, SourceClient: counterpartyID, DestinationClient: clientID, TimeoutTimestamp: uint64(time.Now().Add(time.Hour).Unix()), Payloads: []types.Payload{{ SourcePort: transfer.PortID, DestinationPort: transfer.PortID, Encoding: transfer.EncodingProtobuf, Value: payloadBz, Version: transfer.V1, }}, }, ProofCommitment: proof, ProofHeight: trustedHeight, } core.RecvPacket(cross(cur), recvMsg) } // Error: // send packet failed for payload #0 app "transfer": GRC20 packet must be initiated through transfer.Transfer