11package wallet
22
33import (
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+
1922type 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.
4346func (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
13653func (d * decoder ) ExitCodeInfo (exitCode tvm.ExitCode ) (string , error ) {
0 commit comments