@agoric/cosmos 0.35.0-u18.5 → 0.35.0-u19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -60
- package/app/app.go +1 -1
- package/app/upgrade.go +55 -144
- package/git-revision.txt +1 -1
- package/go.mod +82 -71
- package/go.sum +200 -167
- package/package.json +2 -3
- package/types/address_hooks.go +48 -19
- package/types/address_hooks_test.go +7 -4
- package/x/swingset/keeper/keeper.go +3 -7
- package/x/swingset/keeper/keeper_test.go +16 -10
- package/x/swingset/keeper/msg_server.go +1 -1
- package/x/swingset/testing/queue.go +8 -0
- package/x/vibc/keeper/keeper.go +2 -5
- package/x/vibc/keeper/triggers.go +3 -6
- package/x/vibc/types/receiver.go +11 -5
- package/x/vstorage/testing/queue.go +6 -0
- package/x/vtransfer/ibc_middleware.go +5 -1
- package/x/vtransfer/ibc_middleware_test.go +510 -148
- package/x/vtransfer/keeper/keeper.go +190 -27
- package/x/vtransfer/utils_test.go +111 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agoric/cosmos",
|
|
3
|
-
"version": "0.35.0-
|
|
3
|
+
"version": "0.35.0-u19.0",
|
|
4
4
|
"description": "Connect JS to the Cosmos blockchain SDK",
|
|
5
5
|
"parsers": {
|
|
6
6
|
"js": "mjs"
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
"engines": {
|
|
10
10
|
"node": "^18.12 || ^20.9"
|
|
11
11
|
},
|
|
12
|
-
"packageManager": "yarn@1.22.22",
|
|
13
12
|
"scripts": {
|
|
14
13
|
"test": "exit 0",
|
|
15
14
|
"build:all": "make",
|
|
@@ -39,5 +38,5 @@
|
|
|
39
38
|
"typeCoverage": {
|
|
40
39
|
"atLeast": 0
|
|
41
40
|
},
|
|
42
|
-
"gitHead": "
|
|
41
|
+
"gitHead": "29e9704c375a06bb617027093b30d2d25faa6471"
|
|
43
42
|
}
|
package/types/address_hooks.go
CHANGED
|
@@ -14,11 +14,15 @@ import (
|
|
|
14
14
|
)
|
|
15
15
|
|
|
16
16
|
type AddressRole string
|
|
17
|
+
type PacketOrigin string
|
|
17
18
|
|
|
18
19
|
const (
|
|
19
20
|
RoleSender AddressRole = "Sender"
|
|
20
21
|
RoleReceiver AddressRole = "Receiver"
|
|
21
22
|
|
|
23
|
+
PacketSrc PacketOrigin = "src"
|
|
24
|
+
PacketDst PacketOrigin = "dst"
|
|
25
|
+
|
|
22
26
|
AddressHookVersion = 0
|
|
23
27
|
BaseAddressLengthBytes = 2
|
|
24
28
|
)
|
|
@@ -173,17 +177,12 @@ func extractBaseTransferData(transferData transfertypes.FungibleTokenPacketData,
|
|
|
173
177
|
// If newPacket is not nil, it is populated with a new transfer packet whose
|
|
174
178
|
// corresponding Sender or Receiver is replaced with the extracted base address.
|
|
175
179
|
func ExtractBaseAddressFromPacket(cdc codec.Codec, packet ibcexported.PacketI, role AddressRole, newPacket *channeltypes.Packet) (string, error) {
|
|
176
|
-
|
|
177
|
-
if err := cdc.UnmarshalJSON(packet.GetData(), &transferData); err != nil {
|
|
178
|
-
return "", err
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
var newTransferData *transfertypes.FungibleTokenPacketData
|
|
180
|
+
var newDataP *[]byte
|
|
182
181
|
if newPacket != nil {
|
|
183
|
-
// Capture the
|
|
184
|
-
|
|
182
|
+
// Capture the data for the new packet.
|
|
183
|
+
newDataP = new([]byte)
|
|
185
184
|
}
|
|
186
|
-
target, err :=
|
|
185
|
+
target, err := ExtractBaseAddressFromData(cdc, packet.GetData(), role, newDataP)
|
|
187
186
|
if err != nil {
|
|
188
187
|
return target, err
|
|
189
188
|
}
|
|
@@ -193,21 +192,51 @@ func ExtractBaseAddressFromPacket(cdc codec.Codec, packet ibcexported.PacketI, r
|
|
|
193
192
|
}
|
|
194
193
|
|
|
195
194
|
// Create a new packet with the new transfer packet data.
|
|
196
|
-
// Re-serialize the packet data with the base addresses.
|
|
197
|
-
newData, err := cdc.MarshalJSON(newTransferData)
|
|
198
|
-
if err != nil {
|
|
199
|
-
return target, err
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// Create the new packet.
|
|
203
|
-
th := packet.GetTimeoutHeight()
|
|
204
195
|
*newPacket = channeltypes.NewPacket(
|
|
205
|
-
|
|
196
|
+
*newDataP, packet.GetSequence(),
|
|
206
197
|
packet.GetSourcePort(), packet.GetSourceChannel(),
|
|
207
198
|
packet.GetDestPort(), packet.GetDestChannel(),
|
|
208
|
-
clienttypes.
|
|
199
|
+
clienttypes.MustParseHeight(packet.GetTimeoutHeight().String()),
|
|
209
200
|
packet.GetTimeoutTimestamp(),
|
|
210
201
|
)
|
|
211
202
|
|
|
212
203
|
return target, nil
|
|
213
204
|
}
|
|
205
|
+
|
|
206
|
+
// ExtractBaseAddressFromData returns the base address from a transfer packet's data,
|
|
207
|
+
// either Sender (if role is RoleSender) or Receiver (if role is RoleReceiver).
|
|
208
|
+
// Errors in determining the base address are ignored... we then assume the base
|
|
209
|
+
// address is exactly the original address.
|
|
210
|
+
// If newDataP is not nil, it is populated with new transfer packet data whose
|
|
211
|
+
// corresponding Sender or Receiver is replaced with the extracted base address.
|
|
212
|
+
func ExtractBaseAddressFromData(cdc codec.Codec, data []byte, role AddressRole, newDataP *[]byte) (string, error) {
|
|
213
|
+
transferData := transfertypes.FungibleTokenPacketData{}
|
|
214
|
+
|
|
215
|
+
if err := cdc.UnmarshalJSON(data, &transferData); err != nil {
|
|
216
|
+
return "", err
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
var newTransferData *transfertypes.FungibleTokenPacketData
|
|
220
|
+
if newDataP != nil {
|
|
221
|
+
// Capture the transfer data for the new packet data.
|
|
222
|
+
newTransferData = &transfertypes.FungibleTokenPacketData{}
|
|
223
|
+
}
|
|
224
|
+
target, err := extractBaseTransferData(transferData, role, newTransferData)
|
|
225
|
+
if err != nil {
|
|
226
|
+
return target, err
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if newDataP == nil {
|
|
230
|
+
return target, nil
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Reuse the original data if we didn't transform it.
|
|
234
|
+
if transferData == *newTransferData {
|
|
235
|
+
*newDataP = bytes.Clone(data)
|
|
236
|
+
} else {
|
|
237
|
+
// Re-serialize the packet data with the new base address.
|
|
238
|
+
*newDataP = newTransferData.GetBytes()
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return target, nil
|
|
242
|
+
}
|
|
@@ -171,8 +171,7 @@ func TestExtractBaseAddressFromPacket(t *testing.T) {
|
|
|
171
171
|
tc := tc
|
|
172
172
|
t.Run(tc.name, func(t *testing.T) {
|
|
173
173
|
ftPacketData := transfertypes.NewFungibleTokenPacketData("denom", "100", tc.addrs[types.RoleSender].addr, tc.addrs[types.RoleReceiver].addr, "my-favourite-memo")
|
|
174
|
-
packetBz
|
|
175
|
-
require.NoError(t, err)
|
|
174
|
+
packetBz := ftPacketData.GetBytes()
|
|
176
175
|
packet := channeltypes.NewPacket(packetBz, 1234, "my-port", "my-channel", "their-port", "their-channel", clienttypes.NewHeight(133, 445), 10999)
|
|
177
176
|
|
|
178
177
|
for role, addrs := range tc.addrs {
|
|
@@ -184,9 +183,13 @@ func TestExtractBaseAddressFromPacket(t *testing.T) {
|
|
|
184
183
|
require.NoError(t, err)
|
|
185
184
|
require.Equal(t, addrs.baseAddr, baseAddr)
|
|
186
185
|
|
|
187
|
-
|
|
186
|
+
packetBaseAddr0, err := types.ExtractBaseAddressFromData(cdc, packet.GetData(), role, nil)
|
|
188
187
|
require.NoError(t, err)
|
|
189
|
-
require.Equal(t, addrs.baseAddr,
|
|
188
|
+
require.Equal(t, addrs.baseAddr, packetBaseAddr0)
|
|
189
|
+
|
|
190
|
+
packetBaseAddr1, err := types.ExtractBaseAddressFromPacket(cdc, packet, role, nil)
|
|
191
|
+
require.NoError(t, err)
|
|
192
|
+
require.Equal(t, addrs.baseAddr, packetBaseAddr1)
|
|
190
193
|
|
|
191
194
|
var newPacket channeltypes.Packet
|
|
192
195
|
packetBaseAddr2, err := types.ExtractBaseAddressFromPacket(cdc, packet, role, &newPacket)
|
|
@@ -380,7 +380,7 @@ func makeFeeMenu(powerFlagFees []types.PowerFlagFee) map[string]sdk.Coins {
|
|
|
380
380
|
|
|
381
381
|
var privilegedProvisioningCoins sdk.Coins = sdk.NewCoins(sdk.NewInt64Coin("provisionpass", 1))
|
|
382
382
|
|
|
383
|
-
func calculateFees(balances sdk.Coins,
|
|
383
|
+
func calculateFees(balances sdk.Coins, powerFlags []string, powerFlagFees []types.PowerFlagFee) (sdk.Coins, error) {
|
|
384
384
|
fees := sdk.NewCoins()
|
|
385
385
|
|
|
386
386
|
// See if we have the balance needed for privileged provisioning.
|
|
@@ -389,10 +389,6 @@ func calculateFees(balances sdk.Coins, submitter, addr sdk.AccAddress, powerFlag
|
|
|
389
389
|
return fees, nil
|
|
390
390
|
}
|
|
391
391
|
|
|
392
|
-
if !submitter.Equals(addr) {
|
|
393
|
-
return nil, fmt.Errorf("submitter is not the same as target address for fee-based provisioning")
|
|
394
|
-
}
|
|
395
|
-
|
|
396
392
|
if len(powerFlags) == 0 {
|
|
397
393
|
return nil, fmt.Errorf("must specify powerFlags for fee-based provisioning")
|
|
398
394
|
}
|
|
@@ -412,9 +408,9 @@ func calculateFees(balances sdk.Coins, submitter, addr sdk.AccAddress, powerFlag
|
|
|
412
408
|
return fees, nil
|
|
413
409
|
}
|
|
414
410
|
|
|
415
|
-
func (k Keeper) ChargeForProvisioning(ctx sdk.Context, submitter
|
|
411
|
+
func (k Keeper) ChargeForProvisioning(ctx sdk.Context, submitter sdk.AccAddress, powerFlags []string) error {
|
|
416
412
|
balances := k.bankKeeper.GetAllBalances(ctx, submitter)
|
|
417
|
-
fees, err := calculateFees(balances,
|
|
413
|
+
fees, err := calculateFees(balances, powerFlags, k.GetParams(ctx).PowerFlagFees)
|
|
418
414
|
if err != nil {
|
|
419
415
|
return err
|
|
420
416
|
}
|
|
@@ -61,15 +61,6 @@ func Test_calculateFees(t *testing.T) {
|
|
|
61
61
|
},
|
|
62
62
|
want: cns(),
|
|
63
63
|
},
|
|
64
|
-
{
|
|
65
|
-
name: "cannot pay fee to provision third party",
|
|
66
|
-
args: args{
|
|
67
|
-
submitter: submitAddr,
|
|
68
|
-
addr: utilAddr,
|
|
69
|
-
powerFlags: []string{"powerflag1"},
|
|
70
|
-
},
|
|
71
|
-
errMsg: "submitter is not the same as target address for fee-based provisioning",
|
|
72
|
-
},
|
|
73
64
|
{
|
|
74
65
|
name: "need powerflags for fee provisioning",
|
|
75
66
|
args: args{
|
|
@@ -106,6 +97,21 @@ func Test_calculateFees(t *testing.T) {
|
|
|
106
97
|
},
|
|
107
98
|
want: cns(a(1300)),
|
|
108
99
|
},
|
|
100
|
+
{
|
|
101
|
+
name: "can pay fee to provision third party",
|
|
102
|
+
args: args{
|
|
103
|
+
submitter: submitAddr,
|
|
104
|
+
addr: utilAddr,
|
|
105
|
+
powerFlags: []string{"power1"},
|
|
106
|
+
powerFlagFees: []types.PowerFlagFee{
|
|
107
|
+
{
|
|
108
|
+
PowerFlag: "power1",
|
|
109
|
+
Fee: cns(a(1000)),
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
want: cns(a(1000)),
|
|
114
|
+
},
|
|
109
115
|
{
|
|
110
116
|
name: "later menu entries do not override",
|
|
111
117
|
args: args{
|
|
@@ -173,7 +179,7 @@ func Test_calculateFees(t *testing.T) {
|
|
|
173
179
|
}
|
|
174
180
|
for _, tt := range tests {
|
|
175
181
|
t.Run(tt.name, func(t *testing.T) {
|
|
176
|
-
got, err := calculateFees(tt.args.balances, tt.args.
|
|
182
|
+
got, err := calculateFees(tt.args.balances, tt.args.powerFlags, tt.args.powerFlagFees)
|
|
177
183
|
var errMsg string
|
|
178
184
|
if err != nil {
|
|
179
185
|
errMsg = err.Error()
|
|
@@ -158,7 +158,7 @@ func (keeper msgServer) provisionIfNeeded(ctx sdk.Context, owner sdk.AccAddress)
|
|
|
158
158
|
func (keeper msgServer) Provision(goCtx context.Context, msg *types.MsgProvision) (*types.MsgProvisionResponse, error) {
|
|
159
159
|
ctx := sdk.UnwrapSDKContext(goCtx)
|
|
160
160
|
|
|
161
|
-
err := keeper.ChargeForProvisioning(ctx, msg.Submitter, msg.
|
|
161
|
+
err := keeper.ChargeForProvisioning(ctx, msg.Submitter, msg.PowerFlags)
|
|
162
162
|
if err != nil {
|
|
163
163
|
return nil, err
|
|
164
164
|
}
|
|
@@ -15,3 +15,11 @@ func GetActionQueueRecords(t *testing.T, ctx sdk.Context, swingsetKeeper keeper.
|
|
|
15
15
|
actionQueueName := keeper.StoragePathActionQueue
|
|
16
16
|
return vstoragetesting.GetQueueItems(ctx, vstorageKeeper, actionQueueName)
|
|
17
17
|
}
|
|
18
|
+
|
|
19
|
+
// ResetActionQueue resets the action queue.
|
|
20
|
+
// This is a testing utility function.
|
|
21
|
+
func ResetActionQueue(t *testing.T, ctx sdk.Context, swingsetKeeper keeper.Keeper) error {
|
|
22
|
+
vstorageKeeper := keeper.GetVstorageKeeper(t, swingsetKeeper)
|
|
23
|
+
actionQueueName := keeper.StoragePathActionQueue
|
|
24
|
+
return vstoragetesting.ResetQueue(ctx, vstorageKeeper, actionQueueName)
|
|
25
|
+
}
|
package/x/vibc/keeper/keeper.go
CHANGED
|
@@ -113,10 +113,7 @@ func (k Keeper) ReceiveChanOpenInit(ctx sdk.Context, order channeltypes.Order, c
|
|
|
113
113
|
func (k Keeper) ReceiveSendPacket(ctx sdk.Context, packet ibcexported.PacketI) (uint64, error) {
|
|
114
114
|
sourcePort := packet.GetSourcePort()
|
|
115
115
|
sourceChannel := packet.GetSourceChannel()
|
|
116
|
-
timeoutHeight := packet.GetTimeoutHeight()
|
|
117
|
-
timeoutRevisionNumber := timeoutHeight.GetRevisionNumber()
|
|
118
|
-
timeoutRevisionHeight := timeoutHeight.GetRevisionHeight()
|
|
119
|
-
clientTimeoutHeight := clienttypes.NewHeight(timeoutRevisionNumber, timeoutRevisionHeight)
|
|
116
|
+
timeoutHeight := clienttypes.MustParseHeight(packet.GetTimeoutHeight().String())
|
|
120
117
|
timeoutTimestamp := packet.GetTimeoutTimestamp()
|
|
121
118
|
data := packet.GetData()
|
|
122
119
|
|
|
@@ -125,7 +122,7 @@ func (k Keeper) ReceiveSendPacket(ctx sdk.Context, packet ibcexported.PacketI) (
|
|
|
125
122
|
if !ok {
|
|
126
123
|
return 0, sdkioerrors.Wrapf(channeltypes.ErrChannelCapabilityNotFound, "could not retrieve channel capability at: %s", capName)
|
|
127
124
|
}
|
|
128
|
-
return k.SendPacket(ctx, chanCap, sourcePort, sourceChannel,
|
|
125
|
+
return k.SendPacket(ctx, chanCap, sourcePort, sourceChannel, timeoutHeight, timeoutTimestamp, data)
|
|
129
126
|
}
|
|
130
127
|
|
|
131
128
|
// SendPacket defines a wrapper function for the channel Keeper's function
|
|
@@ -12,11 +12,8 @@ import (
|
|
|
12
12
|
)
|
|
13
13
|
|
|
14
14
|
func reifyPacket(packet ibcexported.PacketI) channeltypes.Packet {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
RevisionHeight: height.GetRevisionHeight(),
|
|
18
|
-
RevisionNumber: height.GetRevisionNumber(),
|
|
19
|
-
}
|
|
15
|
+
|
|
16
|
+
timeoutHeight := clienttypes.MustParseHeight(packet.GetTimeoutHeight().String())
|
|
20
17
|
return channeltypes.Packet{
|
|
21
18
|
Sequence: packet.GetSequence(),
|
|
22
19
|
SourcePort: packet.GetSourcePort(),
|
|
@@ -24,7 +21,7 @@ func reifyPacket(packet ibcexported.PacketI) channeltypes.Packet {
|
|
|
24
21
|
DestinationPort: packet.GetDestPort(),
|
|
25
22
|
DestinationChannel: packet.GetDestChannel(),
|
|
26
23
|
Data: packet.GetData(),
|
|
27
|
-
TimeoutHeight:
|
|
24
|
+
TimeoutHeight: timeoutHeight,
|
|
28
25
|
TimeoutTimestamp: packet.GetTimeoutTimestamp(),
|
|
29
26
|
}
|
|
30
27
|
}
|
package/x/vibc/types/receiver.go
CHANGED
|
@@ -15,7 +15,7 @@ import (
|
|
|
15
15
|
|
|
16
16
|
var (
|
|
17
17
|
_ vm.PortHandler = (*Receiver)(nil)
|
|
18
|
-
_ exported.Acknowledgement = (*
|
|
18
|
+
_ exported.Acknowledgement = (*RawAcknowledgement)(nil)
|
|
19
19
|
)
|
|
20
20
|
|
|
21
21
|
type ReceiverImpl interface {
|
|
@@ -71,15 +71,21 @@ func orderToString(order channeltypes.Order) string {
|
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
-
type
|
|
74
|
+
type RawAcknowledgement struct {
|
|
75
75
|
data []byte
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
func (
|
|
78
|
+
func NewRawAcknowledgement(data []byte) RawAcknowledgement {
|
|
79
|
+
return RawAcknowledgement{
|
|
80
|
+
data: data,
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
func (r RawAcknowledgement) Acknowledgement() []byte {
|
|
79
85
|
return r.data
|
|
80
86
|
}
|
|
81
87
|
|
|
82
|
-
func (r
|
|
88
|
+
func (r RawAcknowledgement) Success() bool {
|
|
83
89
|
return true
|
|
84
90
|
}
|
|
85
91
|
|
|
@@ -137,7 +143,7 @@ func (ir Receiver) Receive(cctx context.Context, jsonRequest string) (jsonReply
|
|
|
137
143
|
)
|
|
138
144
|
|
|
139
145
|
case "receiveExecuted":
|
|
140
|
-
ack :=
|
|
146
|
+
ack := RawAcknowledgement{
|
|
141
147
|
data: msg.Ack,
|
|
142
148
|
}
|
|
143
149
|
err = impl.ReceiveWriteAcknowledgement(ctx, msg.Packet, ack)
|
|
@@ -26,3 +26,9 @@ func GetQueueItems(ctx sdk.Context, vstorageKeeper keeper.Keeper, queuePath stri
|
|
|
26
26
|
}
|
|
27
27
|
return values, nil
|
|
28
28
|
}
|
|
29
|
+
|
|
30
|
+
func ResetQueue(ctx sdk.Context, vstorageKeeper keeper.Keeper, queuePath string) error {
|
|
31
|
+
unlimitedCtx := ctx.WithGasMeter(sdk.NewInfiniteGasMeter())
|
|
32
|
+
vstorageKeeper.RemoveEntriesWithPrefix(unlimitedCtx, queuePath)
|
|
33
|
+
return nil
|
|
34
|
+
}
|
|
@@ -160,7 +160,11 @@ func (im IBCMiddleware) WriteAcknowledgement(
|
|
|
160
160
|
packet exported.PacketI,
|
|
161
161
|
ack exported.Acknowledgement,
|
|
162
162
|
) error {
|
|
163
|
-
|
|
163
|
+
syncAck, origPacket := im.vtransferKeeper.InterceptWriteAcknowledgement(ctx, chanCap, packet, ack)
|
|
164
|
+
if syncAck != nil {
|
|
165
|
+
return im.vtransferKeeper.WriteAcknowledgement(ctx, chanCap, origPacket, syncAck)
|
|
166
|
+
}
|
|
167
|
+
return nil
|
|
164
168
|
}
|
|
165
169
|
|
|
166
170
|
///////////////////////////////////
|