2121package adapter
2222
2323import (
24+ "fmt"
25+
2426 errorsmod "cosmossdk.io/errors"
2527 "cosmossdk.io/log"
28+ sdkmath "cosmossdk.io/math"
2629 "github.com/cosmos/cosmos-sdk/codec"
30+ sdk "github.com/cosmos/cosmos-sdk/types"
2731 transfertypes "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types"
2832
2933 "github.com/noble-assets/orbiter/controller"
@@ -67,16 +71,35 @@ func NewIBCAdapter(cdc codec.Codec, logger log.Logger) (*IBCAdapter, error) {
6771 }, nil
6872}
6973
70- // ParsePayload dispatches the payload parsing to the underlying IBC parser.
71- func (a * IBCAdapter ) ParsePayload (
72- id core.ProtocolID ,
73- payloadBz []byte ,
74- ) (bool , * core.Payload , error ) {
75- return a .parser .ParsePayload (id , payloadBz )
74+ func (a * IBCAdapter ) ParsePacket (packetBz []byte ) (* types.ParsedData , error ) {
75+ packet , err := GetICS20PacketData (packetBz )
76+ if err != nil {
77+ return nil , core .ErrNoOrbiterPacket .Wrap ("data is not ICS20 packet" )
78+ }
79+
80+ if packet .GetReceiver () != core .ModuleAddress .String () {
81+ return nil , core .ErrNoOrbiterPacket .Wrap ("receiver is not Orbiter module" )
82+ }
83+
84+ payload , err := a .parser .ParsePayload ([]byte (packet .GetMemo ()))
85+ if err != nil {
86+ return nil , err
87+ }
88+
89+ amount , ok := sdkmath .NewIntFromString (packet .Amount )
90+ if ! ok {
91+ return nil , fmt .Errorf ("invalid amount: %s" , packet .Amount )
92+ }
93+
94+ return & types.ParsedData {
95+ Coin : sdk .NewCoin (packet .Denom , amount ),
96+ Payload : * payload ,
97+ }, nil
7698}
7799
78100var _ types.PayloadParser = & IBCParser {}
79101
102+ // NOTE: maybe we get rid of the IBC parser and directly use the JSON one.
80103type IBCParser struct {
81104 JSONParser
82105}
@@ -102,34 +125,23 @@ func NewIBCParser(cdc codec.Codec) (*IBCParser, error) {
102125// - bool: whether the payload is intended for the Orbiter module.
103126// - Payload: the parsed payload.
104127// - error: an error, if one occurred during parsing.
105- func (p * IBCParser ) ParsePayload (_ core. ProtocolID , payloadBz []byte ) (bool , * core.Payload , error ) {
106- data , err := p .GetICS20PacketData ( payloadBz )
128+ func (p * IBCParser ) ParsePayload (memoBz []byte ) (* core.Payload , error ) {
129+ payload , err := p .Parse ( string ( memoBz ) )
107130 if err != nil {
108- // Despite the error is not nil, we don't return it. We
109- // want the non fungible token packet data error to be
110- // returned from the ICS20 app.
111- return false , nil , nil //nolint:nilerr
112- }
113-
114- if data .GetReceiver () != core .ModuleAddress .String () {
115- return false , nil , nil
116- }
117-
118- payload , err := p .Parse (data .GetMemo ())
119- if err != nil {
120- return true , nil , err
131+ return nil , err
121132 }
122133
134+ // NOTE: validation should probably be not here.
123135 if err := payload .Validate (); err != nil {
124- return true , payload , err
136+ return payload , err
125137 }
126138
127- return true , payload , nil
139+ return payload , nil
128140}
129141
130- // GetICS20PacketData returns unmarshalled ICS-20 packet data if it is present in the data
131- // as well as a boolean indicating the successful decoding .
132- func ( p * IBCParser ) GetICS20PacketData (data []byte ) (transfertypes.FungibleTokenPacketData , error ) {
142+ // GetICS20PacketData returns the unmarshalled ICS-20 packet data.
143+ // It returns an error if the data cannot be unmarshalled .
144+ func GetICS20PacketData (data []byte ) (transfertypes.FungibleTokenPacketData , error ) {
133145 var ics20Data transfertypes.FungibleTokenPacketData
134146 err := transfertypes .ModuleCdc .UnmarshalJSON (data , & ics20Data )
135147
0 commit comments