Skip to content

Commit

Permalink
test: revise chain info
Browse files Browse the repository at this point in the history
  • Loading branch information
turadg committed Jun 21, 2024
1 parent b029a78 commit 88ee6df
Show file tree
Hide file tree
Showing 3 changed files with 133 additions and 1 deletion.
40 changes: 39 additions & 1 deletion packages/boot/test/bootstrapTests/orchestration.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,12 @@ import { test as anyTest } from '@agoric/zoe/tools/prepare-test-env-ava.js';

import { Fail } from '@agoric/assert';
import { AmountMath } from '@agoric/ertp';
import { documentStorageSchema } from '@agoric/internal/src/storage-test-utils.js';
import type { CosmosValidatorAddress } from '@agoric/orchestration';
import type { start as startStakeIca } from '@agoric/orchestration/src/examples/stakeIca.contract.js';
import type { Instance } from '@agoric/zoe/src/zoeService/utils.js';
import { M, matches } from '@endo/patterns';
import type { TestFn } from 'ava';
import { documentStorageSchema } from '@agoric/internal/src/storage-test-utils.js';
import {
makeWalletFactoryContext,
type WalletFactoryTestContext,
Expand Down Expand Up @@ -231,3 +231,41 @@ test.serial('stakeAtom - smart wallet', async t => {
'delegate fails with invalid validator',
);
});

// XXX rely on .serial to be in sequence, and keep this one last
test.serial('revise chain info', async t => {
const {
buildProposal,
evalProposal,
runUtils: { EV },
} = t.context;

const agoricNames = await EV.vat('bootstrap').consumeItem('agoricNames');

const agoricBefore = await EV(agoricNames).lookup('chain', 'agoric');
t.like(agoricBefore, { chainId: 'agoric-3' });

await t.throwsAsync(EV(agoricNames).lookup('chain', 'hot'), {
message: '"nameKey" not found: "hot"',
});

// Revise chain info in agoricNames with the fixture in this script
await evalProposal(
buildProposal('@agoric/builders/scripts/testing/tweak-chain-info.js'),
);

const hotAfter = await EV(agoricNames).lookup('chain', 'hot');
t.deepEqual(hotAfter, { allegedName: 'Hot New Chain', chainId: 'hot-1' });

const agoricAfter = await EV(agoricNames).lookup('chain', 'agoric');
t.like(agoricAfter, { chainId: 'agoric-4' });

const connection = await EV(agoricNames).lookup(
'chainConnection',
'cosmoshub-4_hot-1',
);
t.like(connection, {
id: 'connection-99',
client_id: '07-tendermint-3',
});
});
53 changes: 53 additions & 0 deletions packages/builders/scripts/testing/tweak-chain-info.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/// <reference types="ses" />
import { makeHelpers } from '@agoric/deploy-script-support';

/** @type {Record<string, import('@agoric/orchestration/src/chain-info.js').ChainInfo>} */
const chainInfo = {
agoric: {
chainId: 'agoric-4',
},
hot: {
allegedName: 'Hot New Chain',
chainId: 'hot-1',
connections: {
'cosmoshub-4': {
id: 'connection-99',
client_id: '07-tendermint-3',
counterparty: {
client_id: '07-tendermint-2',
connection_id: 'connection-1',
prefix: {
key_prefix: '',
},
},
state: 3 /* IBCConnectionState.STATE_OPEN */,
transferChannel: {
portId: 'transfer',
channelId: 'channel-1',
counterPartyChannelId: 'channel-1',
counterPartyPortId: 'transfer',
ordering: 1 /* Order.ORDER_UNORDERED */,
state: 3 /* IBCConnectionState.STATE_OPEN */,
version: 'ics20-1',
},
},
},
},
};

/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */
export const defaultProposalBuilder = async () =>
harden({
sourceSpec: '@agoric/orchestration/src/proposals/revise-chain-info.js',
getManifestCall: [
'getManifestForReviseChains',
{
chainInfo,
},
],
});

export default async (homeP, endowments) => {
const { writeCoreEval } = await makeHelpers(homeP, endowments);
await writeCoreEval('revise-chain-info', defaultProposalBuilder);
};
41 changes: 41 additions & 0 deletions packages/orchestration/src/proposals/revise-chain-info.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { makeTracer } from '@agoric/internal';
import { registerChain } from '../chain-info.js';

const trace = makeTracer('ReviseChainInfo', true);

/** @import {CosmosChainInfo} from '../types.js'; */

// ??? what other keys does the second param ever have?
/**
* @param {BootstrapPowers} powers
* @param {{ options: { chainInfo: Record<string, CosmosChainInfo> } }} opt
*/
export const reviseChainInfo = async (
{ consume: { agoricNamesAdmin } },
{ options: { chainInfo } },
) => {
trace('init-chainInfo');

assert(chainInfo, 'chainInfo is required');

trace(chainInfo);

// Now register the names
for await (const [name, info] of Object.entries(chainInfo)) {
await registerChain(agoricNamesAdmin, name, info, trace);
}
};
harden(reviseChainInfo);

export const getManifestForReviseChains = (_powers, { chainInfo }) => ({
manifest: {
[reviseChainInfo.name]: {
consume: {
agoricNamesAdmin: true,
},
},
},
options: {
chainInfo,
},
});

0 comments on commit 88ee6df

Please sign in to comment.