Skip to content

Commit

Permalink
test(boot): simulate incoming vtransfer bridge events (#10132)
Browse files Browse the repository at this point in the history
closes: #10131

## Description
- adds `runInbound` to `bridgeUtils` in bootstrap test support to simulate an incoming bridge events, like a packet acknowledgement
- updates `send-anywhere` boot test so it's no longer failing
   - leaves contract upgrade aspect of test TODO until #9303

### Security Considerations
n/a

### Scaling Considerations
n/a

### Documentation Considerations
n/a

### Testing Considerations
Addreses a `test.failing` checked in

### Upgrade Considerations
n/a, example contract and test support tools
  • Loading branch information
mergify[bot] authored Sep 25, 2024
2 parents 0cd32a5 + 7508618 commit 7d15388
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 32 deletions.
64 changes: 35 additions & 29 deletions packages/boot/test/orchestration/restart-contracts.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js';
import { TestFn } from 'ava';

import { BridgeId } from '@agoric/internal';
import type { CosmosValidatorAddress } from '@agoric/orchestration';
import { buildVTransferEvent } from '@agoric/orchestration/tools/ibc-mocks.js';
import type { UpdateRecord } from '@agoric/smart-wallet/src/smartWallet.js';
import {
makeWalletFactoryContext,
Expand All @@ -18,14 +20,13 @@ test.before(async t => {
});
test.after.always(t => t.context.shutdown?.());

// FIXME the test needs to be able to send the acknowledgementPacket ack
// so that the transfer vow resolves.
test.serial.failing('send-anywhere', async t => {
// TODO #9303 execute restart-send-anywhere.js proposal
test.serial('send-anywhere', async t => {
const {
walletFactoryDriver,
buildProposal,
evalProposal,
bridgeUtils: { flushInboundQueue },
bridgeUtils: { runInbound },
} = t.context;

const { IST } = t.context.agoricNamesRemotes.brand;
Expand Down Expand Up @@ -57,43 +58,48 @@ test.serial.failing('send-anywhere', async t => {
chainName: 'cosmoshub',
},
});
// no errors and no resolution
const beforeFlush = wallet.getLatestUpdateRecord();
t.like(wallet.getLatestUpdateRecord(), {
updated: 'offerStatus',
status: {
id: 'send-somewhere',
error: undefined,
},
numWantsSatisfied: undefined,
payouts: undefined,
result: undefined,
});

t.is(await flushInboundQueue(), 0);
t.deepEqual(wallet.getLatestUpdateRecord(), beforeFlush);
t.like(
wallet.getCurrentWalletRecord(),
{ liveOffers: [['send-somewhere']] },
'live offer until we simulate the transfer ack',
);

t.log('restart send-anywhere');
await evalProposal(
buildProposal('@agoric/builders/scripts/testing/restart-send-anywhere.js'),
// TODO #9303 Error#1: replay 12: ["checkCall","[Alleged: contractState guest wrapper]","get",["localAccount"],12] vs ["doReturn",11,"[undefined]"] : length: unequal 5 vs 3
// t.log('restart send-anywhere');
// await evalProposal(
// buildProposal('@agoric/builders/scripts/testing/restart-send-anywhere.js'),
// );

t.like(
wallet.getLatestUpdateRecord(),
{
updated: 'balance',
currentAmount: { value: [] },
},
'no offerStatus updates',
);

// simulate ibc/MsgTransfer ack from remote chain, enabling `.transfer()` promise
// to resolve
await runInbound(
BridgeId.VTRANSFER,
buildVTransferEvent({
sourceChannel: 'channel-5',
sequence: '1',
}),
);

const conclusion = wallet.getLatestUpdateRecord();
console.log('conclusion', conclusion);
t.like(conclusion, {
updated: 'offerStatus',
status: {
id: 'send-somewhere',
numWantsSatisfied: 1,
error: undefined,
result: undefined,
},
numWantsSatisfied: undefined,
payouts: undefined,
result: undefined,
});

await flushInboundQueue();

// Nothing interesting to confirm here.
});

const validatorAddress: CosmosValidatorAddress = {
Expand Down
3 changes: 3 additions & 0 deletions packages/boot/tools/supports.ts
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,9 @@ export const makeSwingsetTestKit = async (
console.log('🧻');
return i;
},
async runInbound(bridgeId: BridgeIdValue, msg: unknown) {
await runUtils.queueAndRun(() => inbound(bridgeId, msg), true);
},
};

return {
Expand Down
7 changes: 4 additions & 3 deletions packages/orchestration/tools/ibc-mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import {
ResponseQuery,
} from '@agoric/cosmic-proto/tendermint/abci/types.js';
import { encodeBase64, btoa, atob, decodeBase64 } from '@endo/base64';
import { toRequestQueryJson } from '@agoric/cosmic-proto';
import { type JsonSafe, toRequestQueryJson } from '@agoric/cosmic-proto';
import {
IBCChannelID,
IBCEvent,
Expand Down Expand Up @@ -156,14 +156,15 @@ type BuildVTransferEventParams = {
event?: VTransferIBCEvent['event'];
/* defaults to cosmos1AccAddress. set to `agoric1fakeLCAAddress` to simulate an outgoing transfer event */
sender?: ChainAddress['value'];
/** defaults to agoric1fakeLCAAddress. set to a different value to simulate an outgoing transfer event */
/* defaults to agoric1fakeLCAAddress. set to a different value to simulate an outgoing transfer event */
receiver?: ChainAddress['value'];
target?: ChainAddress['value'];
amount?: bigint;
denom?: string;
destinationChannel?: IBCChannelID;
sourceChannel?: IBCChannelID;
sequence?: PacketSDKType['sequence'];
/* support bigint and string, to facilitate bootstrap testing */
sequence?: PacketSDKType['sequence'] | JsonSafe<PacketSDKType['sequence']>;
};

/**
Expand Down

0 comments on commit 7d15388

Please sign in to comment.