@@ -17,7 +17,6 @@ import (
17
17
"github.com/Agoric/agoric-sdk/golang/cosmos/x/vibc"
18
18
vibctypes "github.com/Agoric/agoric-sdk/golang/cosmos/x/vibc/types"
19
19
"github.com/Agoric/agoric-sdk/golang/cosmos/x/vtransfer/types"
20
- transfertypes "github.com/cosmos/ibc-go/v6/modules/apps/transfer/types"
21
20
channeltypes "github.com/cosmos/ibc-go/v6/modules/core/04-channel/types"
22
21
porttypes "github.com/cosmos/ibc-go/v6/modules/core/05-port/types"
23
22
host "github.com/cosmos/ibc-go/v6/modules/core/24-host"
@@ -102,41 +101,17 @@ func (k Keeper) GetReceiverImpl() vibctypes.ReceiverImpl {
102
101
return k
103
102
}
104
103
105
- // Extract the base address from the packet sender (if senderIsLocal) or
106
- // receiver (if !senderIsLocal), since the local ibcModule doesn't understand
107
- // address parameters.
108
- func (k Keeper ) packetWithOnlyBaseAddresses (packet channeltypes.Packet , senderIsLocal bool ) channeltypes.Packet {
109
- transferData := transfertypes.FungibleTokenPacketData {}
110
- if err := k .cdc .UnmarshalJSON (packet .GetData (), & transferData ); err != nil {
111
- return packet
112
- }
113
- if senderIsLocal {
114
- baseSender , err := types .ExtractBaseAddress (transferData .Sender )
115
- if err == nil {
116
- transferData .Sender = baseSender
117
- }
118
- } else {
119
- baseReceiver , err := types .ExtractBaseAddress (transferData .Receiver )
120
- if err == nil {
121
- transferData .Receiver = baseReceiver
122
- }
123
- }
124
-
125
- // Re-serialize the packet data with the base addresses.
126
- data , _ := k .cdc .MarshalJSON (& transferData )
127
-
128
- // Replace the packet's data with the new data.
129
- packet .Data = data
130
- return packet
131
- }
132
-
133
104
// InterceptOnRecvPacket runs the ibcModule and eventually acknowledges a packet.
134
105
// Many error acknowledgments are sent synchronously, but most cases instead return nil
135
106
// to tell the IBC system that acknowledgment is async (i.e., that WriteAcknowledgement
136
107
// will be called later, after the VM has dealt with the packet).
137
108
func (k Keeper ) InterceptOnRecvPacket (ctx sdk.Context , ibcModule porttypes.IBCModule , packet channeltypes.Packet , relayer sdk.AccAddress ) ibcexported.Acknowledgement {
138
- // Pass every (stripped-receiver) inbound to the wrapped IBC module.
139
- strippedPacket := k .packetWithOnlyBaseAddresses (packet , false )
109
+ // Pass every (stripped-receiver) inbound packet to the wrapped IBC module.
110
+ var strippedPacket channeltypes.Packet
111
+ _ , err := types .ExtractBaseTransferPacket (k .cdc , packet , types .RoleReceiver , & strippedPacket )
112
+ if err != nil {
113
+ return channeltypes .NewErrorAcknowledgement (err )
114
+ }
140
115
ack := ibcModule .OnRecvPacket (ctx , strippedPacket , relayer )
141
116
142
117
if ack == nil {
@@ -168,17 +143,20 @@ func (k Keeper) InterceptOnAcknowledgementPacket(
168
143
relayer sdk.AccAddress ,
169
144
) error {
170
145
// Pass every (stripped-sender) acknowledgement to the wrapped IBC module.
171
- strippedPacket := k .packetWithOnlyBaseAddresses (packet , true )
146
+ var strippedPacket channeltypes.Packet
147
+ baseSender , err := types .ExtractBaseTransferPacket (k .cdc , packet , types .RoleSender , & strippedPacket )
148
+ if err != nil {
149
+ return err
150
+ }
172
151
modErr := ibcModule .OnAcknowledgementPacket (ctx , strippedPacket , acknowledgement , relayer )
173
152
174
- // If the sender is not a targeted account, we're done.
175
- sender , _ , err := k .findTransferTargets (ctx , packet )
176
- if err != nil || sender == "" {
153
+ // If the sender is not a watched account, we're done.
154
+ if ! k .targetIsWatched (ctx , baseSender ) {
177
155
return modErr
178
156
}
179
157
180
- // Trigger VM, regardless of errors in the ibcModule.
181
- vmErr := k .vibcKeeper .TriggerOnAcknowledgementPacket (ctx , sender , packet , acknowledgement , relayer )
158
+ // Trigger VM with the original packet , regardless of errors in the ibcModule.
159
+ vmErr := k .vibcKeeper .TriggerOnAcknowledgementPacket (ctx , baseSender , packet , acknowledgement , relayer )
182
160
183
161
// Any error from the VM is trumped by one from the wrapped IBC module.
184
162
if modErr != nil {
@@ -196,17 +174,20 @@ func (k Keeper) InterceptOnTimeoutPacket(
196
174
relayer sdk.AccAddress ,
197
175
) error {
198
176
// Pass every (stripped-sender) timeout to the wrapped IBC module.
199
- strippedPacket := k .packetWithOnlyBaseAddresses (packet , true )
177
+ var strippedPacket channeltypes.Packet
178
+ baseSender , err := types .ExtractBaseTransferPacket (k .cdc , packet , types .RoleSender , & strippedPacket )
179
+ if err != nil {
180
+ return err
181
+ }
200
182
modErr := ibcModule .OnTimeoutPacket (ctx , strippedPacket , relayer )
201
183
202
- // If the sender is not a targeted account, we're done.
203
- sender , _ , err := k .findTransferTargets (ctx , packet )
204
- if err != nil || sender == "" {
184
+ // If the sender is not a watched account, we're done.
185
+ if ! k .targetIsWatched (ctx , baseSender ) {
205
186
return modErr
206
187
}
207
188
208
- // Trigger VM, regardless of errors in the app.
209
- vmErr := k .vibcKeeper .TriggerOnTimeoutPacket (ctx , sender , packet , relayer )
189
+ // Trigger VM with the original packet , regardless of errors in the app.
190
+ vmErr := k .vibcKeeper .TriggerOnTimeoutPacket (ctx , baseSender , packet , relayer )
210
191
211
192
// Any error from the VM is trumped by one from the wrapped IBC module.
212
193
if modErr != nil {
@@ -218,51 +199,29 @@ func (k Keeper) InterceptOnTimeoutPacket(
218
199
// InterceptWriteAcknowledgement checks to see if the packet's receiver is a
219
200
// targeted account, and if so, delegates to the VM.
220
201
func (k Keeper ) InterceptWriteAcknowledgement (ctx sdk.Context , chanCap * capabilitytypes.Capability , packet ibcexported.PacketI , ack ibcexported.Acknowledgement ) error {
221
- _ , receiver , err := k .findTransferTargets (ctx , packet )
222
- if err != nil || receiver == "" {
223
- // We can't parse, but that means just to ack directly.
202
+ // Get the base baseReceiver from the packet, without computing a stripped packet.
203
+ baseReceiver , err := types .ExtractBaseTransferPacket (k .cdc , packet , types .RoleReceiver , nil )
204
+ if err != nil || ! k .targetIsWatched (ctx , baseReceiver ) {
205
+ // We can't parse, or not watching, but that means just to ack directly.
224
206
return k .WriteAcknowledgement (ctx , chanCap , packet , ack )
225
207
}
226
208
227
- // Trigger VM
228
- if err = k .vibcKeeper .TriggerWriteAcknowledgement (ctx , receiver , packet , ack ); err != nil {
209
+ // Trigger VM with the original packet.
210
+ if err = k .vibcKeeper .TriggerWriteAcknowledgement (ctx , baseReceiver , packet , ack ); err != nil {
229
211
errAck := channeltypes .NewErrorAcknowledgement (err )
230
212
return k .WriteAcknowledgement (ctx , chanCap , packet , errAck )
231
213
}
232
214
233
215
return nil
234
216
}
235
217
236
- // findTransferTargets checks if a packet's sender and/or receiver correspond to targeted accounts.
237
- func (k Keeper ) findTransferTargets (ctx sdk.Context , packet ibcexported.PacketI ) (string , string , error ) {
238
- var transferData transfertypes.FungibleTokenPacketData
239
- err := k .cdc .UnmarshalJSON (packet .GetData (), & transferData )
240
- if err != nil {
241
- return "" , "" , err
242
- }
243
-
244
- // Extract the base addresses from the transferData.
245
- senderTarget , err := types .ExtractBaseAddress (transferData .Sender )
246
- if err != nil {
247
- senderTarget = transferData .Sender
248
- }
249
- receiverTarget , err := types .ExtractBaseAddress (transferData .Receiver )
250
- if err != nil {
251
- receiverTarget = transferData .Receiver
252
- }
218
+ // targetIsWatched checks if a target address has been watched by the VM.
219
+ func (k Keeper ) targetIsWatched (ctx sdk.Context , target string ) bool {
253
220
prefixStore := prefix .NewStore (
254
221
ctx .KVStore (k .key ),
255
222
[]byte (watchedAddressStoreKeyPrefix ),
256
223
)
257
- if senderTarget != "" && ! prefixStore .Has ([]byte (senderTarget )) {
258
- // Not a targeted sender.
259
- senderTarget = ""
260
- }
261
- if receiverTarget != "" && ! prefixStore .Has ([]byte (receiverTarget )) {
262
- // Not a targeted receiver.
263
- receiverTarget = ""
264
- }
265
- return senderTarget , receiverTarget , nil
224
+ return prefixStore .Has ([]byte (target ))
266
225
}
267
226
268
227
// GetWatchedAdresses returns the watched addresses from the keeper as a slice
0 commit comments