Skip to content

Commit b67a364

Browse files
committed
Refactor Jetton msg JSON decoder
1 parent 43a31f8 commit b67a364

File tree

2 files changed

+23
-163
lines changed

2 files changed

+23
-163
lines changed

pkg/ton/debug/decoders/jetton/minter/jetton_minter.go

Lines changed: 13 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,27 @@
11
package minter
22

33
import (
4-
"errors"
5-
64
"github.com/xssnick/tonutils-go/address"
7-
"github.com/xssnick/tonutils-go/tlb"
85
"github.com/xssnick/tonutils-go/tvm/cell"
96

107
cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment"
118

129
"github.com/smartcontractkit/chainlink-ton/pkg/bindings/jetton/minter"
1310

1411
"github.com/smartcontractkit/chainlink-ton/pkg/ton/debug/decoders/jetton"
15-
"github.com/smartcontractkit/chainlink-ton/pkg/ton/debug/decoders/jetton/wallet"
1612
"github.com/smartcontractkit/chainlink-ton/pkg/ton/debug/lib"
1713
"github.com/smartcontractkit/chainlink-ton/pkg/ton/tvm"
1814
)
1915

16+
var TLBs = lib.MustNewTLBMap([]interface{}{
17+
minter.MintMessage{},
18+
minter.ChangeAdminMessage{},
19+
minter.ClaimAdminMessage{},
20+
minter.DropAdminMessage{},
21+
minter.ChangeContentMessage{},
22+
minter.UpgradeMessage{},
23+
})
24+
2025
type decoder struct {
2126
payloadDecoders map[cldf.ContractType]lib.ContractDecoder
2227
}
@@ -42,72 +47,10 @@ func (d *decoder) ExternalMessageInfo(msg *cell.Cell) (lib.MessageInfo, error) {
4247

4348
// InternalMessageInfo implements lib.ContractDecoder.
4449
func (d *decoder) InternalMessageInfo(msg *cell.Cell) (lib.MessageInfo, error) {
45-
r := msg.BeginParse()
46-
if r.BitsLeft() == 0 {
47-
return nil, &lib.UnknownMessageError{}
48-
}
49-
opCode, err := r.PreloadUInt(32)
50-
if err != nil {
51-
return nil, err
52-
}
53-
switch opCode {
54-
case minter.OpcodeMinterMint:
55-
var mint minter.MintMessage
56-
err := tlb.LoadFromCell(&mint, r)
57-
if err != nil {
58-
return nil, err
59-
}
60-
if mint.MasterMsg.ForwardPayload == nil {
61-
return lib.NewMessageInfo("Mint", mint)
62-
}
63-
64-
payloadInfo, err := d.tryDecodePayload(mint.MasterMsg.ForwardPayload)
65-
if err != nil {
66-
return nil, err
67-
}
68-
return lib.NewMessageInfo("MintWithPayload", MintMessageDescription{
69-
QueryID: mint.QueryID,
70-
Destination: mint.Destination,
71-
TonAmount: mint.TonAmount,
72-
MasterMsg: wallet.InternalTransferDescription(mint.MasterMsg, payloadInfo),
73-
})
74-
case minter.OpcodeMinterChangeAdmin:
75-
var changeAdmin minter.ChangeAdminMessage
76-
err := tlb.LoadFromCell(&changeAdmin, r)
77-
if err != nil {
78-
return nil, err
79-
}
80-
return lib.NewMessageInfo("ChangeAdmin", changeAdmin)
81-
case minter.OpcodeMinterClaimAdmin:
82-
var changeContent minter.ClaimAdminMessage
83-
err := tlb.LoadFromCell(&changeContent, r)
84-
if err != nil {
85-
return nil, err
86-
}
87-
return lib.NewMessageInfo("ClaimAdmin", changeContent)
88-
// TODO missing messages
89-
}
90-
return jetton.NewDecoder(d.ContractType()).InternalMessageInfo(msg)
91-
}
92-
93-
func (d *decoder) tryDecodePayload(payloadCell *cell.Cell) (lib.MessageInfo, error) {
94-
for _, pd := range d.payloadDecoders {
95-
info, err := pd.InternalMessageInfo(payloadCell)
96-
if err == nil {
97-
return info, nil
98-
}
99-
if e := &(lib.UnknownMessageError{}); !errors.As(err, &e) {
100-
return nil, err
101-
}
102-
}
103-
return nil, &lib.UnknownMessageError{}
104-
}
105-
106-
type MintMessageDescription struct {
107-
QueryID uint64
108-
Destination *address.Address
109-
TonAmount tlb.Coins
110-
MasterMsg wallet.InternalTransferMessageDescription
50+
// TODO: use lib.Wrapper to describe generic payloads
51+
return lib.NewMessageInfoFromCell(d.ContractType(), msg, TLBs)
52+
// TODO: compose with common decoder
53+
// return jetton_common.NewDecoder(d.ContractType()).InternalMessageInfo(msg)
11154
}
11255

11356
func (d *decoder) ExitCodeInfo(exitCode tvm.ExitCode) (string, error) {

pkg/ton/debug/decoders/jetton/wallet/jetton_wallet.go

Lines changed: 10 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package wallet
22

33
import (
4-
"errors"
5-
64
"github.com/xssnick/tonutils-go/address"
7-
"github.com/xssnick/tonutils-go/tlb"
85
"github.com/xssnick/tonutils-go/tvm/cell"
96

107
cldf "github.com/smartcontractkit/chainlink-deployments-framework/deployment"
@@ -16,6 +13,12 @@ import (
1613
"github.com/smartcontractkit/chainlink-ton/pkg/ton/tvm"
1714
)
1815

16+
var TLBs = lib.MustNewTLBMap([]interface{}{
17+
wallet.AskToTransfer{},
18+
wallet.InternalTransferMessage{},
19+
wallet.TransferNotification{},
20+
})
21+
1922
type decoder struct {
2023
payloadDecoders map[cldf.ContractType]lib.ContractDecoder
2124
}
@@ -41,96 +44,10 @@ func (d *decoder) ExternalMessageInfo(msg *cell.Cell) (lib.MessageInfo, error) {
4144

4245
// InternalMessageInfo implements lib.ContractDecoder.
4346
func (d *decoder) InternalMessageInfo(msg *cell.Cell) (lib.MessageInfo, error) {
44-
r := msg.BeginParse()
45-
if r.BitsLeft() == 0 {
46-
return nil, &lib.UnknownMessageError{}
47-
}
48-
opCode, err := r.PreloadUInt(32)
49-
if err != nil {
50-
return nil, err
51-
}
52-
switch opCode {
53-
case wallet.OpcodeWalletTransfer:
54-
var askToTransfer wallet.AskToTransfer
55-
err := tlb.LoadFromCell(&askToTransfer, r)
56-
if err != nil {
57-
return nil, err
58-
}
59-
if askToTransfer.CustomPayload == nil {
60-
return lib.NewMessageInfo("AskToTransfer", askToTransfer)
61-
}
62-
63-
payloadInfo, err := d.tryDecodePayload(askToTransfer.CustomPayload)
64-
if err == nil {
65-
return lib.NewMessageInfo("AskToTransferWithPayload", AskToTransferMessageDescription{
66-
QueryID: askToTransfer.QueryID,
67-
Amount: askToTransfer.Amount,
68-
Destination: askToTransfer.Destination,
69-
ResponseDestination: askToTransfer.ResponseDestination,
70-
CustomPayload: askToTransfer.CustomPayload,
71-
ForwardTonAmount: askToTransfer.ForwardTonAmount,
72-
ForwardPayload: lib.Wrapper{Type: payloadInfo.Name(), Value: payloadInfo.Body()},
73-
})
74-
}
75-
case wallet.OpcodeWalletInternalTransfer:
76-
var internalTransfer wallet.InternalTransferMessage
77-
err := tlb.LoadFromCell(&internalTransfer, r)
78-
if err != nil {
79-
return nil, err
80-
}
81-
if internalTransfer.ForwardPayload == nil {
82-
return lib.NewMessageInfo("InternalTransfer", internalTransfer)
83-
}
84-
85-
payloadInfo, err := d.tryDecodePayload(internalTransfer.ForwardPayload)
86-
if err == nil {
87-
return lib.NewMessageInfo("InternalTransferWithPayload", InternalTransferDescription(internalTransfer, payloadInfo))
88-
}
89-
}
90-
return jetton_common.NewDecoder(d.ContractType()).InternalMessageInfo(msg)
91-
}
92-
93-
func InternalTransferDescription(internalTransfer wallet.InternalTransferMessage, payloadInfo lib.MessageInfo) InternalTransferMessageDescription {
94-
return InternalTransferMessageDescription{
95-
QueryID: internalTransfer.QueryID,
96-
Amount: internalTransfer.Amount,
97-
From: internalTransfer.From,
98-
ResponseAddress: internalTransfer.ResponseAddress,
99-
ForwardTonAmount: internalTransfer.ForwardTonAmount,
100-
ForwardPayload: lib.Wrapper{Type: payloadInfo.Name(), Value: payloadInfo.Body()},
101-
}
102-
}
103-
104-
func (d *decoder) tryDecodePayload(payloadCell *cell.Cell) (lib.MessageInfo, error) {
105-
for _, pd := range d.payloadDecoders {
106-
info, err := pd.InternalMessageInfo(payloadCell)
107-
if err == nil {
108-
return info, nil
109-
}
110-
if e := &(lib.UnknownMessageError{}); !errors.As(err, &e) {
111-
return nil, err
112-
}
113-
}
114-
return nil, &lib.UnknownMessageError{}
115-
}
116-
117-
type AskToTransferMessageDescription struct {
118-
QueryID uint64
119-
Amount tlb.Coins
120-
Destination *address.Address
121-
ResponseDestination *address.Address
122-
CustomPayload *cell.Cell
123-
ForwardTonAmount tlb.Coins
124-
ForwardPayload any
125-
}
126-
127-
type InternalTransferMessageDescription struct {
128-
QueryID uint64
129-
Amount tlb.Coins
130-
From *address.Address
131-
ResponseAddress *address.Address
132-
ForwardTonAmount tlb.Coins
133-
ForwardPayload any
47+
// TODO: use lib.Wrapper to describe generic payloads
48+
return lib.NewMessageInfoFromCell(d.ContractType(), msg, TLBs)
49+
// TODO: compose with common decoder
50+
// return jetton_common.NewDecoder(d.ContractType()).InternalMessageInfo(msg)
13451
}
13552

13653
func (d *decoder) ExitCodeInfo(exitCode tvm.ExitCode) (string, error) {

0 commit comments

Comments
 (0)