@@ -21,7 +21,7 @@ func TestTokenOrderVerifyEscrowBurnsVoucherAndIncreasesChannelBalance(cur realm,
2121
2222 sender := testAddress("v1-sender")
2323 baseToken := "ibc/v1-send"
24- uassert.NoError(t, mintVoucher(cross(cur), baseToken, baseToken, [32]byte{}, sender, u256.NewUint(50)))
24+ uassert.NoError(t, mintVoucher(cross(cur), baseToken, baseToken, [32]byte{}, "", "", 0, sender, u256.NewUint(50)))
2525 order := z.TokenOrderV2{
2626 Sender: []byte(sender),
2727 BaseToken: []byte(baseToken),
@@ -48,7 +48,7 @@ func TestTokenOrderAckMarketMakerEscrowWithVoucherRewardsMarketMaker(cur realm,
4848 baseToken := "ibc/v1-mm-voucher"
4949 channelId := core.ChannelId(8)
5050 amount := u256.NewUint(13)
51- uassert.NoError(t, mintVoucher(cross(cur), baseToken, baseToken, [32]byte{}, sender, u256.NewUint(50)))
51+ uassert.NoError(t, mintVoucher(cross(cur), baseToken, baseToken, [32]byte{}, "", "", 0, sender, u256.NewUint(50)))
5252
5353 order := z.TokenOrderV2{
5454 Sender: []byte(sender),
@@ -135,7 +135,7 @@ func TestTokenOrderExecuteInitializeMintsVoucherAndSuccessAck(cur realm, t *test
135135
136136 metaBytes := mustEncodeTokenMetadata(z.TokenMetadata{
137137 Implementation: []byte("grc20"),
138- Initializer: []byte("init" ),
138+ Initializer: mustEncodeTokenInitializer(z.TokenInitializer{Name: "Gno Token", Symbol: "GNOT", Decimals: 6} ),
139139 })
140140 image := MetadataImage(mustDecodeTokenMetadata(metaBytes))
141141 ibcDenom := PredictWrappedTokenV2(u256.NewUint(7), 5, []byte("ugnot"), image)
@@ -166,6 +166,77 @@ func TestTokenOrderExecuteInitializeMintsVoucherAndSuccessAck(cur realm, t *test
166166 origin, ok := zkgm.GetTokenOrigin(ibcDenom)
167167 uassert.True(t, ok)
168168 uassert.Equal(t, "21474836487", origin.ToString())
169+
170+ v := getVoucher(ibcDenom)
171+ uassert.True(t, v != nil)
172+ uassert.Equal(t, "Gno Token", v.token.GetName())
173+ uassert.Equal(t, "GNOT", v.token.GetSymbol())
174+ uassert.Equal(t, 6, v.token.GetDecimals())
175+ }
176+
177+ func TestTokenOrderExecuteInitializeMalformedInitializerUsesDefaults(cur realm, t *testing.T) {
178+ resetTokenOrderTest(cur)
179+
180+ // Initializer is raw bytes that cannot be decoded as TokenInitializer.
181+ // The protocol must fall back to ibcDenom-derived name/symbol and 0 decimals.
182+ metaBytes := mustEncodeTokenMetadata(z.TokenMetadata{
183+ Implementation: []byte("grc20"),
184+ Initializer: []byte("not-valid-abi"),
185+ })
186+ image := MetadataImage(mustDecodeTokenMetadata(metaBytes))
187+ ibcDenom := PredictWrappedTokenV2(u256.NewUint(3), 4, []byte("ugnot"), image)
188+ order := z.TokenOrderV2{
189+ Sender: []byte("sender"),
190+ Receiver: []byte(testAddress("fallback-receiver")),
191+ BaseToken: []byte("ugnot"),
192+ BaseAmount: u256.NewUint(50),
193+ QuoteToken: []byte(ibcDenom),
194+ QuoteAmount: u256.NewUint(50),
195+ Kind: z.TOKEN_ORDER_KIND_INITIALIZE,
196+ Metadata: metaBytes,
197+ }
198+ packet := core.NewPacket(cross(cur), core.ChannelId(1), core.ChannelId(4), nil, 0, 0)
199+
200+ res, err := (&ZkgmV1{}).executeTokenOrderV2(cur, packet, address(testAddress("fallback-relayer")), u256.NewUint(3), order, false)
201+
202+ uassert.NoError(t, err)
203+ uassert.True(t, res.Status == core.PacketStatusSuccess)
204+
205+ v := getVoucher(ibcDenom)
206+ uassert.True(t, v != nil)
207+ uassert.Equal(t, 0, v.token.GetDecimals())
208+ }
209+
210+ func TestTokenOrderExecuteInitializeEmptyInitializerUsesDefaults(cur realm, t *testing.T) {
211+ resetTokenOrderTest(cur)
212+
213+ // Empty Initializer: decimals must default to 0, symbol derived from ibcDenom.
214+ metaBytes := mustEncodeTokenMetadata(z.TokenMetadata{
215+ Implementation: []byte("grc20"),
216+ Initializer: []byte{},
217+ })
218+ image := MetadataImage(mustDecodeTokenMetadata(metaBytes))
219+ ibcDenom := PredictWrappedTokenV2(u256.NewUint(5), 6, []byte("ugnot"), image)
220+ order := z.TokenOrderV2{
221+ Sender: []byte("sender"),
222+ Receiver: []byte(testAddress("empty-init-receiver")),
223+ BaseToken: []byte("ugnot"),
224+ BaseAmount: u256.NewUint(20),
225+ QuoteToken: []byte(ibcDenom),
226+ QuoteAmount: u256.NewUint(20),
227+ Kind: z.TOKEN_ORDER_KIND_INITIALIZE,
228+ Metadata: metaBytes,
229+ }
230+ packet := core.NewPacket(cross(cur), core.ChannelId(1), core.ChannelId(6), nil, 0, 0)
231+
232+ res, err := (&ZkgmV1{}).executeTokenOrderV2(cur, packet, address(testAddress("empty-init-relayer")), u256.NewUint(5), order, false)
233+
234+ uassert.NoError(t, err)
235+ uassert.True(t, res.Status == core.PacketStatusSuccess)
236+
237+ v := getVoucher(ibcDenom)
238+ uassert.True(t, v != nil)
239+ uassert.Equal(t, 0, v.token.GetDecimals())
169240}
170241
171242func TestTokenOrderExecuteInitializeMintErrorDoesNotSetOrigin(cur realm, t *testing.T) {
@@ -227,7 +298,7 @@ func TestTokenOrderIntentVoucherMarketMakerFillTransfersMakerFunds(cur realm, t
227298 maker := testAddress("v1-intent-maker")
228299 receiver := testAddress("v1-intent-receiver")
229300 quoteToken := "ibc/v1-intent-quote"
230- uassert.NoError(t, mintVoucher(cross(cur), quoteToken, "base", [32]byte{}, maker, u256.NewUint(30)))
301+ uassert.NoError(t, mintVoucher(cross(cur), quoteToken, "base", [32]byte{}, "", "", 0, maker, u256.NewUint(30)))
231302 order := z.TokenOrderV2{
232303 Sender: []byte("sender"),
233304 Receiver: []byte(receiver),
@@ -280,7 +351,7 @@ func TestTokenOrderIntentInsufficientMakerBalanceReturnsOnlyMaker(cur realm, t *
280351 maker := testAddress("v1-intent-poor-maker")
281352 receiver := testAddress("int-poor-rx")
282353 quoteToken := "ibc/v1-intent-poor"
283- uassert.NoError(t, mintVoucher(cross(cur), quoteToken, "base", [32]byte{}, maker, u256.NewUint(3)))
354+ uassert.NoError(t, mintVoucher(cross(cur), quoteToken, "base", [32]byte{}, "", "", 0, maker, u256.NewUint(3)))
284355 order := z.TokenOrderV2{
285356 Receiver: []byte(receiver),
286357 BaseToken: []byte("ugnot"),
@@ -367,6 +438,14 @@ func mustEncodeTokenMetadata(meta z.TokenMetadata) []byte {
367438 return bz
368439}
369440
441+ func mustEncodeTokenInitializer(ti z.TokenInitializer) []byte {
442+ bz, err := z.EncodeTokenInitializer(ti)
443+ if err != nil {
444+ panic(err)
445+ }
446+ return bz
447+ }
448+
370449func mustDecodeTokenMetadata(bz []byte) z.TokenMetadata {
371450 meta, err := z.DecodeTokenMetadata(bz)
372451 if err != nil {
0 commit comments