z1i_on_send_packet_grc20_bypass_filetest.gno
1.88 Kb · 56 lines
1// PKGPATH: gno.land/r/aib/main
2package main
3
4// Regression test: a GRC20 send must be rejected when it does not originate
5// from transfer.Transfer, even when the owner approved the transfer app.
6
7import (
8 "chain"
9 "testing"
10 "time"
11
12 tmtesting "gno.land/p/aib/ibc/lightclient/tendermint/testing"
13 "gno.land/p/aib/ibc/types"
14
15 "gno.land/r/aib/ibc/apps/testing/grc20test"
16 "gno.land/r/aib/ibc/apps/transfer"
17 "gno.land/r/aib/ibc/core"
18)
19
20func main(cur realm) {
21 var (
22 chainID = "chain-id-2"
23 clientState = tmtesting.NewClientState(chainID, types.NewHeight(2, 2))
24 apphash = tmtesting.Hash("apphash")
25 trustedValset = tmtesting.GenValset()
26 consensusState = tmtesting.GenConsensusState(time.Now(), apphash, trustedValset.Hash())
27 )
28 clientID := core.CreateClient(cross(cur), clientState, consensusState)
29 core.RegisterCounterparty(cross(cur), clientID, [][]byte{[]byte("iavlStoreKey"), []byte("prefix2")}, "07-tendermint-2")
30
31 owner := cur.Previous().Address()
32 grc20test.Mint(cross(cur), owner, 1000)
33
34 transferAppAddr := chain.PackageAddress("gno.land/r/aib/ibc/apps/transfer")
35 grc20test.Approve(cross(cur), owner, transferAppAddr, 100)
36
37 grc20regKey := "gno.land/r/aib/ibc/apps/testing/grc20test." + grc20test.Slug
38 payload := transfer.NewFungibleTokenPacketData(transfer.GRC20Alias(grc20regKey), "100", owner.String(), "atone1user", "")
39 packet := types.MsgSendPacket{
40 SourceClient: clientID,
41 TimeoutTimestamp: uint64(time.Now().Add(time.Hour).Unix()),
42 Payloads: []types.Payload{{
43 SourcePort: transfer.PortID,
44 DestinationPort: transfer.PortID,
45 Encoding: transfer.EncodingProtobuf,
46 Value: payload.ProtoMarshal(),
47 Version: transfer.V1,
48 }},
49 }
50
51 testing.SetOriginCaller(owner)
52 core.SendPacket(cross(cur), packet)
53}
54
55// Error:
56// send packet failed for payload #0 app "transfer": GRC20 packet must be initiated through transfer.Transfer