From e1c35da96da8e12ea79a99aafad6163b3993e238 Mon Sep 17 00:00:00 2001 From: 0xPatrick Date: Mon, 21 Oct 2024 13:48:07 -0400 Subject: [PATCH 01/12] feat: CosmosChainInfo includes `pfmEnabled?: boolean` - in order to determine whether its possible to route a transfer through a particular ibc chain, we must know if they have the PFM module installed --- packages/orchestration/src/cosmos-api.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/orchestration/src/cosmos-api.ts b/packages/orchestration/src/cosmos-api.ts index 83d97c9eef6..298878634b9 100644 --- a/packages/orchestration/src/cosmos-api.ts +++ b/packages/orchestration/src/cosmos-api.ts @@ -97,7 +97,11 @@ export type CosmosChainInfo = Readonly<{ connections?: Record; // chainId or wellKnownName // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 icqEnabled?: boolean; - + /** + * Note: developers must provide this value themselves for `.transfer` to work + * as expected. Please see examples for details. + */ + pfmEnabled?: boolean; /** * cf https://github.com/cosmos/chain-registry/blob/master/chain.schema.json#L117 */ From 52ff70a187df1fadc89ccc506228bc6d0ca48da6 Mon Sep 17 00:00:00 2001 From: 0xPatrick Date: Wed, 13 Nov 2024 17:26:20 -0500 Subject: [PATCH 02/12] feat: chain-capabilities.js constants - adds `IcqEnabled` and `PfmEnabled` constants to support `CosmosChainInfo` - this data is not available via a well-known registry like cosmos/chain-registry, but necessary for the Orchestration API - exports `withChainCapabilities` helper so consumers can include this data with fetched-chain-info.js --- .../orchestration-imports.test.js.md | 1 + .../orchestration-imports.test.js.snap | Bin 3559 -> 3581 bytes packages/orchestration/index.js | 1 + .../orchestration/src/chain-capabilities.js | 60 ++++++++++++++++++ 4 files changed, 62 insertions(+) create mode 100644 packages/orchestration/src/chain-capabilities.js diff --git a/packages/builders/test/snapshots/orchestration-imports.test.js.md b/packages/builders/test/snapshots/orchestration-imports.test.js.md index 56bb4121208..88cab919fe1 100644 --- a/packages/builders/test/snapshots/orchestration-imports.test.js.md +++ b/packages/builders/test/snapshots/orchestration-imports.test.js.md @@ -544,5 +544,6 @@ Generated by [AVA](https://avajs.dev). denomHash: Function denomHash {}, prepareChainHubAdmin: Function prepareChainHubAdmin {}, prepareCosmosInterchainService: Function prepareCosmosInterchainService {}, + withChainCapabilities: Function withChainCapabilities {}, withOrchestration: Function withOrchestration {}, } diff --git a/packages/builders/test/snapshots/orchestration-imports.test.js.snap b/packages/builders/test/snapshots/orchestration-imports.test.js.snap index a35cad38f33f5ec70a5deaaf9901a15251d9b6c7..8a0d66b2c7ad25733d49a6eee706480afe78e471 100644 GIT binary patch literal 3581 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 D7rd>a literal 3559 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 diff --git a/packages/orchestration/index.js b/packages/orchestration/index.js index 9440115c5e6..20eeee0da9d 100644 --- a/packages/orchestration/index.js +++ b/packages/orchestration/index.js @@ -10,3 +10,4 @@ export * from './src/typeGuards.js'; export * from './src/utils/denomHash.js'; export { withOrchestration } from './src/utils/start-helper.js'; +export { withChainCapabilities } from './src/chain-capabilities.js'; diff --git a/packages/orchestration/src/chain-capabilities.js b/packages/orchestration/src/chain-capabilities.js new file mode 100644 index 00000000000..20dfbdc4e07 --- /dev/null +++ b/packages/orchestration/src/chain-capabilities.js @@ -0,0 +1,60 @@ +/** + * @file Contains ChainInfo that not available from a well-known chain registry. + */ + +import { objectMap } from '@endo/patterns'; + +/** @import {CosmosChainInfo, KnownChains} from '@agoric/orchestration'; */ + +/** + * Chains with the async-icq (icq-1) module available. + * + * @satisfies {Partial>} + */ +const IcqEnabled = /** @type {const} */ ({ + omniflixhub: true, + osmosis: true, +}); +harden(IcqEnabled); + +/** + * Chains with the packet-forward-middleware module available. + * + * @satisfies {Partial>} + */ +const PfmEnabled = /** @type {const} */ ({ + agoric: true, + celestia: true, + cosmoshub: true, + juno: true, + neutron: true, + noble: true, + omniflixhub: true, + osmosis: true, + secretnetwork: true, + stargaze: true, + stride: true, + umee: true, +}); +harden(PfmEnabled); + +/** + * @param {Record} chainInfo + * @param {{ + * PfmEnabled: Record; + * IcqEnabled: Record; + * }} [opts] + */ +export const withChainCapabilities = ( + chainInfo, + opts = { + PfmEnabled, + IcqEnabled, + }, +) => { + return objectMap(chainInfo, (info, name) => ({ + ...info, + pfmEnabled: !!opts.PfmEnabled[name], + icqEnabled: !!opts.IcqEnabled[name], + })); +}; From 9eea3fd6da2624fc787336c5d735de5ae7da885d Mon Sep 17 00:00:00 2001 From: 0xPatrick Date: Tue, 29 Oct 2024 11:54:15 -0400 Subject: [PATCH 03/12] fix: yarn codegen script - use `ts-blank-space` since `tsx` is no longer in `node_modules/.bin` - prefer yarn command instead of standalone script --- packages/orchestration/scripts/fetch-chain-info.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/orchestration/scripts/fetch-chain-info.ts b/packages/orchestration/scripts/fetch-chain-info.ts index 9634dfc884e..e304d6993d9 100755 --- a/packages/orchestration/scripts/fetch-chain-info.ts +++ b/packages/orchestration/scripts/fetch-chain-info.ts @@ -1,4 +1,4 @@ -#!/usr/bin/env tsx +#!/usr/bin/env TS_BLANK_SPACE_EMIT=false node --import ts-blank-space/register /** @file Fetch canonical chain info to generate the minimum needed for agoricNames */ import { ChainRegistryClient } from '@chain-registry/client'; import fsp from 'node:fs/promises'; From c1b406c6091881885389b2e11da1ec1122b0924f Mon Sep 17 00:00:00 2001 From: Ikenna Omekam Date: Mon, 11 Nov 2024 17:03:23 -0600 Subject: [PATCH 04/12] add pfmEnabled to shape --- .../orchestration-imports.test.js.md | 3 +++ .../orchestration-imports.test.js.snap | Bin 3581 -> 3589 bytes packages/orchestration/src/typeGuards.js | 1 + 3 files changed, 4 insertions(+) diff --git a/packages/builders/test/snapshots/orchestration-imports.test.js.md b/packages/builders/test/snapshots/orchestration-imports.test.js.md index 88cab919fe1..98f5036fd98 100644 --- a/packages/builders/test/snapshots/orchestration-imports.test.js.md +++ b/packages/builders/test/snapshots/orchestration-imports.test.js.md @@ -143,6 +143,9 @@ Generated by [AVA](https://avajs.dev). icqEnabled: Object @match:kind { payload: 'boolean', }, + pfmEnabled: Object @match:kind { + payload: 'boolean', + }, stakingTokens: Object @match:arrayOf { payload: [ { diff --git a/packages/builders/test/snapshots/orchestration-imports.test.js.snap b/packages/builders/test/snapshots/orchestration-imports.test.js.snap index 8a0d66b2c7ad25733d49a6eee706480afe78e471..bf125767898472199d34606ebef3b0f2cf52c4f9 100644 GIT binary patch literal 3589 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 D7rd>a diff --git a/packages/orchestration/src/typeGuards.js b/packages/orchestration/src/typeGuards.js index bb36b011516..bc3142ce0e0 100644 --- a/packages/orchestration/src/typeGuards.js +++ b/packages/orchestration/src/typeGuards.js @@ -100,6 +100,7 @@ export const CosmosChainInfoShape = M.splitRecord( stakingTokens: M.arrayOf({ denom: M.string() }), // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 icqEnabled: M.boolean(), + pfmEnabled: M.boolean(), }, ); From e72782dcc748b9e6a2879179cccf9866718f4e00 Mon Sep 17 00:00:00 2001 From: 0xPatrick Date: Mon, 25 Nov 2024 19:01:33 -0500 Subject: [PATCH 05/12] feat: registerChainsAndAssets - helper function that takes chainInfo and assetInfo and registers the data in ChainHub --- .../orchestration-imports.test.js.md | 1 + .../orchestration-imports.test.js.snap | Bin 3589 -> 3636 bytes packages/orchestration/index.js | 1 + .../src/utils/chain-hub-helper.js | 53 ++++++++++++++++++ .../test/snapshots/exports.test.ts.md | 2 + .../test/snapshots/exports.test.ts.snap | Bin 613 -> 654 bytes 6 files changed, 57 insertions(+) create mode 100644 packages/orchestration/src/utils/chain-hub-helper.js diff --git a/packages/builders/test/snapshots/orchestration-imports.test.js.md b/packages/builders/test/snapshots/orchestration-imports.test.js.md index 98f5036fd98..e831da4a395 100644 --- a/packages/builders/test/snapshots/orchestration-imports.test.js.md +++ b/packages/builders/test/snapshots/orchestration-imports.test.js.md @@ -547,6 +547,7 @@ Generated by [AVA](https://avajs.dev). denomHash: Function denomHash {}, prepareChainHubAdmin: Function prepareChainHubAdmin {}, prepareCosmosInterchainService: Function prepareCosmosInterchainService {}, + registerChainsAndAssets: Function registerChainsAndAssets {}, withChainCapabilities: Function withChainCapabilities {}, withOrchestration: Function withOrchestration {}, } diff --git a/packages/builders/test/snapshots/orchestration-imports.test.js.snap b/packages/builders/test/snapshots/orchestration-imports.test.js.snap index bf125767898472199d34606ebef3b0f2cf52c4f9..90441888f07938e004013b3a65473804e275fe17 100644 GIT binary patch literal 3636 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 GE&u?xu_<-{ literal 3589 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 brands + * @param {Record | undefined} chainInfo + * @param {Record | undefined} assetInfo + */ +export const registerChainsAndAssets = ( + chainHub, + brands, + chainInfo, + assetInfo, +) => { + if (!chainInfo) { + console.log('No chain info provided, returning early.'); + return; + } + + const conns = {}; + for (const [chainName, allInfo] of Object.entries(chainInfo)) { + const { connections, ...info } = allInfo; + chainHub.registerChain(chainName, info); + conns[info.chainId] = connections; + } + const registeredPairs = new Set(); + for (const [pChainId, connInfos] of Object.entries(conns)) { + for (const [cChainId, connInfo] of Object.entries(connInfos)) { + const pair = [pChainId, cChainId].sort().join(''); + if (!registeredPairs.has(pair)) { + chainHub.registerConnection(pChainId, cChainId, connInfo); + registeredPairs.add(pair); + } + } + } + + if (!assetInfo) { + console.log('No asset info provided, returning early.'); + return; + } + for (const [denom, info] of Object.entries(assetInfo)) { + const infoWithBrand = info.brandKey + ? { ...info, brand: brands[info.brandKey] } + : info; + chainHub.registerAsset(denom, infoWithBrand); + } +}; diff --git a/packages/orchestration/test/snapshots/exports.test.ts.md b/packages/orchestration/test/snapshots/exports.test.ts.md index f4b67ef7a73..be240c69462 100644 --- a/packages/orchestration/test/snapshots/exports.test.ts.md +++ b/packages/orchestration/test/snapshots/exports.test.ts.md @@ -36,5 +36,7 @@ Generated by [AVA](https://avajs.dev). 'denomHash', 'prepareChainHubAdmin', 'prepareCosmosInterchainService', + 'registerChainsAndAssets', + 'withChainCapabilities', 'withOrchestration', ] diff --git a/packages/orchestration/test/snapshots/exports.test.ts.snap b/packages/orchestration/test/snapshots/exports.test.ts.snap index 41d0880b01a0e52d92b73f9695ef982645924ac1..88ddb6e567c6c6fd6c7c9246f62fcd1a929ed326 100644 GIT binary patch literal 654 zcmV;90&)F8RzVvt8!XJwW00000000AR)4OgHK@(R zZm?%oGvg#KQ_{c-P!I}gC@3lEDG?1V4}e4o*@YRhPF$_^e>!t^&e`*WZcio8&DmSB zne7o}QqXB;B+pH%tT{Uuf?NKq_BF%=iXWR~x8DGG2jDY+9{}bUaF+pl3^-=MYX*E` zz;_1xX23=OJP3d!0A2*ZhXD8%0KWp@P6+IVz)=Xi3W4__@FfI(Ui`1ufcrIoYQW2j z=Z`g@$;KOOEYg|}8FNqddL3*UY!hr2O%`B@gt{gG#^64_KWHbIYT3d0Paw)0T+OCjU zf2)_s=oxeVWecRFq@;M0ky7(ctyI-$wYqbwt*yADxikl)+j(KDlUi_arWHTgHPwx2 zxNxnlla!3r>IXVy7PRgbUgwn<`rxijcSqMu2p)}7jPs@&q1w4}>p_emdTiEnDd&rH){W-RHltcj#3 ozYpKpO$V1xGMknt<~i?Xz079h*)6}B1*=T(5BT#U!2$&U06rl)82|tP literal 613 zcmV-r0-F6nRzVCBlq=lrlgP}#9Ldr!8o z1EN9-IxURkrOA~wXXiq2%b(R=#hAt9$L83rw*cM&_zd7XfI0*2FrdQ#$$&Qu_{4y3 z4EV)>Rs`ISfaei#76Bh4;A;f@jDW2ecn|~q7f3^nPtpP7;K#R>Z zSv}F3j~R1cjYb1(0qiE&5?U<68jHc|O}3m2)kxYzA06bpq<=AEE^j7s{FvLnDj<;~ zt&7AwrA%qzQ0(ipb6&_q2u;QWb!xtqilp*T1$o`&Yi(tQ$|S~+y`*NQ)YY|SooejT zfR4B=lnlU}11q~E)$odI&-->Oap{N!moHR#kS+SxNO#)poJ&cAbT=SN{#7rK=`*hR z%TADzlCsH7rb;b4wH~VJY7OT$(w%lsb7>Aqcgu+lC$-|>V%mPPXTptXx^T0rvz(08 z)$8u76VhRsRVTN*BimOaDgHOt;Zh7pr_Q$gk^5R%buTEi=HIGU49QqNEGreD>we_D z(;X$o-O`5btowoX#wCeIW@;riT)vu3cIqL|xS&0 Date: Mon, 25 Nov 2024 21:10:45 -0500 Subject: [PATCH 06/12] feat: `withOrchestration` returns `baggage` - `withOrchestration` the baggage that was provided to it by the original caller - needed so users of `withOrchestration` can access baggage --- packages/orchestration/src/utils/start-helper.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/orchestration/src/utils/start-helper.js b/packages/orchestration/src/utils/start-helper.js index 902c7194808..e6c36bd523c 100644 --- a/packages/orchestration/src/utils/start-helper.js +++ b/packages/orchestration/src/utils/start-helper.js @@ -164,6 +164,7 @@ export const provideOrchestration = ( return { ...defaultOrchestrateKit, makeOrchestrateKit, + baggage, chainHub, vowTools, asyncFlowTools, From 2dfddb3fb2018d769b1acc1b32f4ff3b4c7f67b7 Mon Sep 17 00:00:00 2001 From: 0xPatrick Date: Mon, 25 Nov 2024 20:55:35 -0500 Subject: [PATCH 07/12] feat: export `DenomDetailShape` --- .../orchestration-imports.test.js.md | 22 ++++++++++++++++++ .../orchestration-imports.test.js.snap | Bin 3636 -> 3753 bytes .../orchestration/src/exos/chain-hub-admin.js | 3 +-- packages/orchestration/src/exos/chain-hub.js | 7 +----- .../orchestration/src/orchestration-api.ts | 3 +++ packages/orchestration/src/typeGuards.js | 9 +++++++ .../test/snapshots/exports.test.ts.md | 1 + .../test/snapshots/exports.test.ts.snap | Bin 654 -> 662 bytes 8 files changed, 37 insertions(+), 8 deletions(-) diff --git a/packages/builders/test/snapshots/orchestration-imports.test.js.md b/packages/builders/test/snapshots/orchestration-imports.test.js.md index e831da4a395..7749e126b16 100644 --- a/packages/builders/test/snapshots/orchestration-imports.test.js.md +++ b/packages/builders/test/snapshots/orchestration-imports.test.js.md @@ -218,6 +218,28 @@ Generated by [AVA](https://avajs.dev). payload: [], }, }, + DenomDetailShape: Object @match:splitRecord { + payload: [ + { + baseDenom: Object @match:string { + payload: [], + }, + baseName: Object @match:string { + payload: [], + }, + chainName: Object @match:string { + payload: [], + }, + }, + { + brand: Object @match:remotable { + payload: { + label: 'Brand', + }, + }, + }, + ], + }, DenomInfoShape: { base: Object @match:remotable { payload: { diff --git a/packages/builders/test/snapshots/orchestration-imports.test.js.snap b/packages/builders/test/snapshots/orchestration-imports.test.js.snap index 90441888f07938e004013b3a65473804e275fe17..e3536ba0aecf546bded44c857e96d8a48817649f 100644 GIT binary patch literal 3753 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 TE(gRxtMC5{XXopq=r8~P1@TL_ literal 3636 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 GE&u?xu_<-{ diff --git a/packages/orchestration/src/exos/chain-hub-admin.js b/packages/orchestration/src/exos/chain-hub-admin.js index e790257b3b4..2a365508ebe 100644 --- a/packages/orchestration/src/exos/chain-hub-admin.js +++ b/packages/orchestration/src/exos/chain-hub-admin.js @@ -2,8 +2,7 @@ /* eslint-disable no-restricted-syntax */ import { heapVowE } from '@agoric/vow/vat.js'; import { M } from '@endo/patterns'; -import { CosmosChainInfoShape } from '../typeGuards.js'; -import { DenomDetailShape } from './chain-hub.js'; +import { CosmosChainInfoShape, DenomDetailShape } from '../typeGuards.js'; /** * @import {Zone} from '@agoric/zone'; diff --git a/packages/orchestration/src/exos/chain-hub.js b/packages/orchestration/src/exos/chain-hub.js index 2a55b35605c..a782294256c 100644 --- a/packages/orchestration/src/exos/chain-hub.js +++ b/packages/orchestration/src/exos/chain-hub.js @@ -7,6 +7,7 @@ import { VowShape } from '@agoric/vow'; import { ChainAddressShape, CosmosChainInfoShape, + DenomDetailShape, IBCConnectionInfoShape, } from '../typeGuards.js'; import { getBech32Prefix } from '../utils/address.js'; @@ -19,7 +20,6 @@ import { getBech32Prefix } from '../utils/address.js'; * @import {ChainInfo, KnownChains} from '../chain-info.js'; * @import {ChainAddress, Denom} from '../orchestration-api.js'; * @import {Remote} from '@agoric/internal'; - * @import {TypedPattern} from '@agoric/internal'; */ /** @@ -40,11 +40,6 @@ import { getBech32Prefix } from '../utils/address.js'; * @property {Brand<'nat'>} [brand] - vbank brand, if registered * @see {ChainHub} `registerAsset` method */ -/** @type {TypedPattern} */ -export const DenomDetailShape = M.splitRecord( - { chainName: M.string(), baseName: M.string(), baseDenom: M.string() }, - { brand: BrandShape }, -); /** * @enum {(typeof HubName)[keyof typeof HubName]} diff --git a/packages/orchestration/src/orchestration-api.ts b/packages/orchestration/src/orchestration-api.ts index 9bf49592a3a..50830862c05 100644 --- a/packages/orchestration/src/orchestration-api.ts +++ b/packages/orchestration/src/orchestration-api.ts @@ -102,6 +102,9 @@ export interface Chain { // TODO provide a way to get the local denom/brand/whatever for this chain } +/** + * Used with `orch.getDenomInfo('ibc/1234')`. See {@link Orchestrator.getDenomInfo} + */ export interface DenomInfo< HoldingChain extends keyof KnownChains, IssuingChain extends keyof KnownChains, diff --git a/packages/orchestration/src/typeGuards.js b/packages/orchestration/src/typeGuards.js index bc3142ce0e0..721345c0d9f 100644 --- a/packages/orchestration/src/typeGuards.js +++ b/packages/orchestration/src/typeGuards.js @@ -1,3 +1,4 @@ +import { BrandShape } from '@agoric/ertp/src/typeGuards.js'; import { VowShape } from '@agoric/vow'; import { M } from '@endo/patterns'; @@ -7,6 +8,7 @@ import { M } from '@endo/patterns'; * @import {Any as Proto3Msg} from '@agoric/cosmic-proto/google/protobuf/any.js'; * @import {TxBody} from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js'; * @import {TypedJson} from '@agoric/cosmic-proto'; + * @import {DenomDetail} from './exos/chain-hub.js'; */ /** @@ -119,6 +121,13 @@ export const DenomInfoShape = { }; harden(DenomInfoShape); +/** @type {TypedPattern} */ +export const DenomDetailShape = M.splitRecord( + { chainName: M.string(), baseName: M.string(), baseDenom: M.string() }, + { brand: BrandShape }, +); +harden(DenomDetailShape); + /** @type {TypedPattern} */ export const DenomAmountShape = { denom: DenomShape, value: M.nat() }; harden(DenomAmountShape); diff --git a/packages/orchestration/test/snapshots/exports.test.ts.md b/packages/orchestration/test/snapshots/exports.test.ts.md index be240c69462..c57931aa11b 100644 --- a/packages/orchestration/test/snapshots/exports.test.ts.md +++ b/packages/orchestration/test/snapshots/exports.test.ts.md @@ -18,6 +18,7 @@ Generated by [AVA](https://avajs.dev). 'CosmosChainInfoShape', 'DelegationShape', 'DenomAmountShape', + 'DenomDetailShape', 'DenomInfoShape', 'DenomShape', 'IBCChannelIDShape', diff --git a/packages/orchestration/test/snapshots/exports.test.ts.snap b/packages/orchestration/test/snapshots/exports.test.ts.snap index 88ddb6e567c6c6fd6c7c9246f62fcd1a929ed326..acdc30319ea66e263ba980fca052e20ce47d0ff2 100644 GIT binary patch literal 662 zcmV;H0%`q0RzVZ(wHnwQ*mbZ4G+2aX7K2sm>~b6;Byq?JM z18)DSfJBZo&Jy#8`brCjVqd43@=PW|Xfh_KQ}L~oq%99rkXK#4+*D?$Okxb#b82cr zU0iG0salH$bjWR{WB_IySZtA0!warG8;TZLo(%#q=Py)>b4|>zxx?7dB$b`90gKRQop$CM5&rntD%~#w&>hid%M}yT$%&YoxHH&Eb9)= zx0?@lO}JA_E?n>EeoDsb^8NSJ5$Ui@!^w@#$oAAoivP{+a480)+s-cgBlonj>Q+!_ z#lKZI8eg7-rI`t4?h>RqlCPTGHjQ`=p;`ec#kIKQm2- wnX#nHvL=zD{0I5YHXU3!%4}MqCeL{<8)P;k&$j$#7A%vt8!XJwW00000000AR)4OgHK@(R zZm?%oGvg#KQ_{c-P!I}gC@3lEDG?1V4}e4o*@YRhPF$_^e>!t^&e`*WZcio8&DmSB zne7o}QqXB;B+pH%tT{Uuf?NKq_BF%=iXWR~x8DGG2jDY+9{}bUaF+pl3^-=MYX*E` zz;_1xX23=OJP3d!0A2*ZhXD8%0KWp@P6+IVz)=Xi3W4__@FfI(Ui`1ufcrIoYQW2j z=Z`g@$;KOOEYg|}8FNqddL3*UY!hr2O%`B@gt{gG#^64_KWHbIYT3d0Paw)0T+OCjU zf2)_s=oxeVWecRFq@;M0ky7(ctyI-$wYqbwt*yADxikl)+j(KDlUi_arWHTgHPwx2 zxNxnlla!3r>IXVy7PRgbUgwn<`rxijcSqMu2p)}7jPs@&q1w4}>p_emdTiEnDd&rH){W-RHltcj#3 ozYpKpO$V1xGMknt<~i?Xz079h*)6}B1*=T(5BT#U!2$&U06rl)82|tP From e5a8b6489368f0bf3a099ce4c5ddf9607a6192c1 Mon Sep 17 00:00:00 2001 From: 0xPatrick Date: Mon, 25 Nov 2024 19:13:54 -0500 Subject: [PATCH 08/12] feat: parameterize fusdc with chainInfo and assetInfo --- .../scripts/fast-usdc/init-fast-usdc.js | 29 +++++++++++++++++- packages/fast-usdc/src/fast-usdc.contract.js | 24 +++++++++++++-- packages/fast-usdc/src/fast-usdc.start.js | 19 +++++++++--- .../snapshots/fast-usdc.contract.test.ts.md | 1 + .../snapshots/fast-usdc.contract.test.ts.snap | Bin 2028 -> 2050 bytes packages/fast-usdc/test/supports.ts | 2 ++ 6 files changed, 66 insertions(+), 9 deletions(-) diff --git a/packages/builders/scripts/fast-usdc/init-fast-usdc.js b/packages/builders/scripts/fast-usdc/init-fast-usdc.js index 08a5d996cdb..5786cb0f0b0 100644 --- a/packages/builders/scripts/fast-usdc/init-fast-usdc.js +++ b/packages/builders/scripts/fast-usdc/init-fast-usdc.js @@ -124,11 +124,17 @@ const options = { default: 'ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9', }, + chainInfo: { type: 'string' }, + assetInfo: { type: 'string' }, }; const oraclesUsage = 'use --oracle name:address ...'; const feedPolicyUsage = 'use --feedPolicy ...'; +const chainInfoUsage = 'use --chainInfo chainName:CosmosChainInfo ...'; +const assetInfoUsage = + 'use --assetInfo denom:DenomInfo & {brandKey?: string} ...'; + /** * @typedef {{ * flatFee: string; @@ -139,6 +145,8 @@ const feedPolicyUsage = 'use --feedPolicy ...'; * oracle?: string[]; * usdcDenom: string; * feedPolicy?: string; + * chainInfo: string; + * assetInfo: string; * }} FastUSDCOpts */ @@ -180,7 +188,15 @@ export default async (homeP, endowments) => { /** @type {{ values: FastUSDCOpts }} */ // @ts-expect-error ensured by options const { - values: { oracle: oracleArgs, net, usdcDenom, feedPolicy, ...fees }, + values: { + oracle: oracleArgs, + net, + usdcDenom, + feedPolicy, + chainInfo, + assetInfo, + ...fees + }, } = parseArgs({ args: scriptArgs, options }); const parseFeedPolicy = () => { @@ -226,6 +242,15 @@ export default async (homeP, endowments) => { }; }; + const parseChainInfo = () => { + if (!chainInfo) throw Error(chainInfoUsage); + return JSON.parse(chainInfo); + }; + const parseAssetInfo = () => { + if (!assetInfo) throw Error(assetInfoUsage); + return JSON.parse(assetInfo); + }; + /** @type {FastUSDCConfig} */ const config = harden({ oracles: parseOracleArgs(), @@ -234,6 +259,8 @@ export default async (homeP, endowments) => { }, feeConfig: parseFeeConfigArgs(), feedPolicy: parseFeedPolicy(), + chainInfo: parseChainInfo(), + assetInfo: parseAssetInfo(), }); await writeCoreEval('start-fast-usdc', utils => diff --git a/packages/fast-usdc/src/fast-usdc.contract.js b/packages/fast-usdc/src/fast-usdc.contract.js index 952d26480d1..50dd0de2f18 100644 --- a/packages/fast-usdc/src/fast-usdc.contract.js +++ b/packages/fast-usdc/src/fast-usdc.contract.js @@ -6,7 +6,10 @@ import { } from '@agoric/internal'; import { observeIteration, subscribeEach } from '@agoric/notifier'; import { + CosmosChainInfoShape, + DenomDetailShape, OrchestrationPowersShape, + registerChainsAndAssets, withOrchestration, } from '@agoric/orchestration'; import { provideSingleton } from '@agoric/zoe/src/contractSupport/durability.js'; @@ -27,9 +30,8 @@ import * as flows from './fast-usdc.flows.js'; const trace = makeTracer('FastUsdc'); /** - * @import {Denom} from '@agoric/orchestration'; * @import {HostInterface} from '@agoric/async-flow'; - * @import {OrchestrationAccount} from '@agoric/orchestration'; + * @import {CosmosChainInfo, Denom, DenomDetail, OrchestrationAccount} from '@agoric/orchestration'; * @import {OrchestrationPowers, OrchestrationTools} from '@agoric/orchestration/src/utils/start-helper.js'; * @import {Vow} from '@agoric/vow'; * @import {Zone} from '@agoric/zone'; @@ -53,6 +55,8 @@ export const meta = { ...OrchestrationPowersShape, feeConfig: FeeConfigShape, marshaller: M.remotable(), + chainInfo: M.recordOf(M.string(), CosmosChainInfoShape), + assetInfo: M.recordOf(M.string(), DenomDetailShape), }, }; harden(meta); @@ -62,6 +66,8 @@ harden(meta); * @param {OrchestrationPowers & { * marshaller: Marshaller; * feeConfig: FeeConfig; + * chainInfo: Record; + * assetInfo: Record; * }} privateArgs * @param {Zone} zone * @param {OrchestrationTools} tools @@ -82,7 +88,7 @@ export const contract = async (zcf, privateArgs, zone, tools) => { const { USDC } = terms.brands; const { withdrawToSeat } = tools.zoeTools; - const { chainHub, orchestrateAll, vowTools } = tools; + const { baggage, chainHub, orchestrateAll, vowTools } = tools; const makeSettler = prepareSettler(zone, { statusManager, USDC, @@ -212,6 +218,18 @@ export const contract = async (zcf, privateArgs, zone, tools) => { makeLiquidityPoolKit(shareMint, privateArgs.storageNode), ); + /** Chain, connection, and asset info can only be registered once */ + const firstIncarnationKey = 'firstIncarnationKey'; + if (!baggage.has(firstIncarnationKey)) { + baggage.init(firstIncarnationKey, true); + registerChainsAndAssets( + chainHub, + terms.brands, + privateArgs.chainInfo, + privateArgs.assetInfo, + ); + } + const feedKit = zone.makeOnce('Feed Kit', () => makeFeedKit()); const poolAccountV = zone.makeOnce('PoolAccount', () => makeLocalAccount()); diff --git a/packages/fast-usdc/src/fast-usdc.start.js b/packages/fast-usdc/src/fast-usdc.start.js index 96f14569dad..0dce7f375e2 100644 --- a/packages/fast-usdc/src/fast-usdc.start.js +++ b/packages/fast-usdc/src/fast-usdc.start.js @@ -1,4 +1,5 @@ import { deeplyFulfilledObject, makeTracer, objectMap } from '@agoric/internal'; +import { CosmosChainInfoShape, DenomDetailShape } from '@agoric/orchestration'; import { Fail } from '@endo/errors'; import { E } from '@endo/far'; import { makeMarshal } from '@endo/marshal'; @@ -13,6 +14,7 @@ import { fromExternalConfig } from './utils/config-marshal.js'; /** * @import {DepositFacet} from '@agoric/ertp/src/types.js' * @import {TypedPattern} from '@agoric/internal' + * @import {CosmosChainInfo, Denom, DenomDetail} from '@agoric/orchestration'; * @import {Instance, StartParams} from '@agoric/zoe/src/zoeService/utils' * @import {Board} from '@agoric/vats' * @import {ManifestBundleRef} from '@agoric/deploy-script-support/src/externalTypes.js' @@ -33,6 +35,8 @@ const contractName = 'fastUsdc'; * oracles: Record; * feeConfig: FeeConfig; * feedPolicy: FeedPolicy & Passable; + * chainInfo: Record; + * assetInfo: Record; * }} FastUSDCConfig */ /** @type {TypedPattern} */ @@ -41,6 +45,8 @@ export const FastUSDCConfigShape = M.splitRecord({ oracles: M.recordOf(M.string(), M.string()), feeConfig: FeeConfigShape, feedPolicy: FeedPolicyShape, + chainInfo: M.recordOf(M.string(), CosmosChainInfoShape), + assetInfo: M.recordOf(M.string(), DenomDetailShape), }); /** @@ -149,11 +155,12 @@ export const startFastUSDC = async ( USDC: await E(USDCissuer).getBrand(), }); - const { terms, oracles, feeConfig, feedPolicy } = fromExternalConfig( - config?.options, // just in case config is missing somehow - brands, - FastUSDCConfigShape, - ); + const { terms, oracles, feeConfig, feedPolicy, chainInfo, assetInfo } = + fromExternalConfig( + config?.options, // just in case config is missing somehow + brands, + FastUSDCConfigShape, + ); trace('using terms', terms); trace('using fee config', feeConfig); @@ -187,6 +194,8 @@ export const startFastUSDC = async ( storageNode, timerService, marshaller, + chainInfo, + assetInfo, }), ); diff --git a/packages/fast-usdc/test/snapshots/fast-usdc.contract.test.ts.md b/packages/fast-usdc/test/snapshots/fast-usdc.contract.test.ts.md index e508daf0f99..ec82b58c800 100644 --- a/packages/fast-usdc/test/snapshots/fast-usdc.contract.test.ts.md +++ b/packages/fast-usdc/test/snapshots/fast-usdc.contract.test.ts.md @@ -100,6 +100,7 @@ Generated by [AVA](https://avajs.dev). Recorder_kindHandle: 'Alleged: kind', }, }, + firstIncarnationKey: true, orchestration: { 'Cosmos Orchestration Account Holder_kindHandle': 'Alleged: kind', 'Local Orchestration Account Kit_kindHandle': 'Alleged: kind', diff --git a/packages/fast-usdc/test/snapshots/fast-usdc.contract.test.ts.snap b/packages/fast-usdc/test/snapshots/fast-usdc.contract.test.ts.snap index 5428f409065f1cc146eb00cb8b3eb4e35d236f29..5e8c6efc2ee166cdb8debd759e505f5ff9a38a96 100644 GIT binary patch literal 2050 zcmV+d2>tg#RzVG!>_-m6#d)q6c(+i6-tZ#z%Dz+BU{SgT1}E!twH z!)eFa6|VEt3x+{m`time;z*$qG4lwQJL+#k7rX(=wf1ZN+pSZ=2k>M!8|J09IJE zEY@PigIZsva8x&$E^LF@Cr~UB@&o|_ah5uVTwk_C&l9~Ri8A^wHTkt})05O=vP5v# zrn;-zv18hfd!6gl=F~L>Utx!yELQS3z9MlHgstx~$F)76Cw^NJC-z0p>F;@=5eKw5 z@OT{fW*qo+9JrVOZY6-{62R>QkWT_1Oaj|UpqEr)5F3p_hUCAS1b&zV{+I;rO97iH zfTw`ZrGRgzfLBvMEDfxt6{@sKRev@Od@&9DDh-^^05k)9F9ZDP&i@Z&fhV%SkF!83 z2Q+iQr*pt_Ip9Y*;BPtLN*-9x1N(X4={)da9(XGc{5}t4rhp4miV0=agzSf>fW;}` z3sb;5Q^2JHpcjCz7l2m^z%L65#d}nW^xq4>zwW?4QUsnU0zWANr4sN+Nl|@o=sZs; zXP~}l?3sKqI8~D#$sUwtUKPI1cZ9!dRFai+!MT6Rj{r|ffTZDbjyTn@ zglKm=O9Ahsn{v0L?<{g-X=ucxOy>toBVL?NkR(Y9e>9%>sxSX$duTeJEoVp4x+*E`JaAFmU(r$s_8SEM4g!MI`a z*7kv;5a;{WEb6-GayNJuzd7heS0#${7GpfDU+_=DaSXc>Lt@Y5{*FE^Jw|k*%OYoE|Y5m2efO#I$0k-!g>Fy(5ZC{ zAb)?2##xSHOi$wkKRR+46T%=eo5!tw*| zNRoVq>TTu@gawe4dO>(S=O%OQ!~V>6ng(|vf+AEi=0}^{5wx1v8@AXp9rhS?_1(!& zPUEKNUFR;dIklWqoRk@F-5aiHIVTI!m!$n}*s^0v`1qv0Yk zy9OMn3!ERjfEIG_TQ%VOD#?YhBo|eZ_)lxVFKWQTj6!sGXuTUVz$aALrBIlh8Q^dR zczFi+w+g>6#JX|@c=U_{yML?~?+Z=mL`m0Ni*e@P58k5$B4H`o61J%;Ujt~7kY~;u zWw9)cd(zh=X<85Z(jp=Mlmx}#;@uFvU}}6|R-)|;dcX+#=C^Ii9qP>tC+%zfa$Y2a zON(Th!nXVCdy;QRlA^&n!ZBT+)R+H8)?^2M)%2&ixd_9HgltOB(>CkS!vWQ2B|)iY zy1Rx=d&9LNT+a3zrLA3R4;?HI9sHEOv*z_S!}z=*(U~A6oLlzQgP-#tmklrm-=b`X+O_mV4U!GDI+Do>8%pfvs;GH617OC_|Es zI-u2ol{(T=p~#Od6w?)QK4L8K#*RV0MyXXR&MI%aWp+fFCPE9E( z!KLzpI`EQuR_+R2e(%rC$*Id01AB_Eue=U1MPFE<9iNyT1m0B@*qD*V?@z<)J3oQ=Cp%U~95 gGV5R=_;p7c{3@o=9hcdf<5JuG4>(V4Mmie+0Fxi;;Q#;t literal 2028 zcmVvcwNkkfn+)z#oeU00000000BUSzU-ER~7zl|Nl()O#jSJ_sq`rW;eSUji9TDdCFvVhS}^+ zcCxcSh>F~#1``qpf)7FTLGeWl z5my9J5VxzkYHr=?X{W~r=ViLv*QubNtp6mAGzNbpLo(|CE(5p&;0*wO1n_SF3k3K$0V*U_BB?9Q&oNC9 z5`3JQnE@$)q(P=pA+aingCt92`9ja8O_MdYdQH=Cb{m%r@!7Uv=^ND2P3FT2E2ha> zOn;;?kSQFMt4!mz&g>&7775uTfG^HcXW!D+P2P7!&r70=wo46bqt|pLe-25wC2Xn* zS7OBuBn573yUYAjhUCAT1iqF8ewqaSl?2YDfJalnr&GWeQ^2z+;MXZ&IjvBo zRjQhn28=ZDavJz+8aST;ZfAg>-TzOrz-AWsMizJ{3w$&OJdp!f4)}Twcs&Os^T4S* zu#pF79(XzrJf8=CoCkiB2mY22z&8uPO9h4E zL6su?Mge&HKD=B6nnmD+BJlenur#fxejsv6r<4;`ThTj)wc?+ZNe}3PqV5=0%VdIE zK43o34kHzw>SM;hN`qUITClX1vrQ)Gpw6gC?aL=Mw6-m%V3YV+B!o+rRlS86~K^qmz;Uk!|ylNK}jlNTg=i8t95P9QHb*cYgROk_blN*i{BXbn9CAH zdYdsTs$cL>UvJOf?r62%q>T7o3^~m zD5F^Xp;hj5xYM{IlQ)JAG&Z<-wC+5_`OsyqQS%VWV~h!lE}vWB*QrMJi93t=15+li zfJ;|dhYL2@^7m8dFLGG5&}}uEeCqFs$8@zwf63n)!=^W#v%)0Ad7l!E^ zEl8%c-*sDdOlkizB=&R}xKma}khn6vc+%vGZPR^{@IOsYPX{tzGdWVzm!{OIDE3Mj zcvW3KGnOP9A^B|?_=8H48%t6gE1g!CNc^)5paRq?z$YroQl*GRPga1NDr`0~6Mnk_ z+^qmVssQg)fO{1nR|QU271g=1=AIZAuH|sJNbEutcwAlJZWefWR)L+3glTOSxHJpgnFW5O!rvcZJuwHIo>O2CjrHP# zk?EW$>6&XXi+T5h`zV2tuoP`^+t8G+KD0CGl08XM)LEB1hVV!| z`444Hw&zt%Z<-rrc#)7Z3(`*5tV{QYRG*Rr(|tqi>Nf2MYmIO@J7|=)cc~pXI1@Pd zd2MIY?QMeiJSWl5bZDEo7y7UxaB;E!^V`M1)SoXLdX&P$;>E{S-LUU4dz)E0vyao* z7)|Xeb9$yY?tK{{7&FhP*pY#)Z5=cnNAoB{lJ716_ZEN?HDIj5z0?&G2y4n=ENG)Ac{mB_in)RdCqUn*a%0neys<$=iM_gW2jvj+T0 zg`SJtFbU;2PsuO6B6%HxroC5NdQeh5)Whf1OUuxnTC)bl$%DpbyaBT=jcSgd?ZJS_ z+stxC=2?|a@J@O}f%L~c*@Oor6Oy;6*<) => { marshaller, timerService: timer, feeConfig: makeTestFeeConfig(usdc), + chainInfo: {}, + assetInfo: {}, }, facadeServices: { agoricNames, From afb4f34518124b3809d1df07ea706743fa47f2b1 Mon Sep 17 00:00:00 2001 From: 0xPatrick Date: Mon, 25 Nov 2024 19:36:16 -0500 Subject: [PATCH 09/12] feat: fusdc assetInfo and chainInfo by netname --- .../scripts/fast-usdc/init-fast-usdc.js | 55 ++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/packages/builders/scripts/fast-usdc/init-fast-usdc.js b/packages/builders/scripts/fast-usdc/init-fast-usdc.js index 5786cb0f0b0..783ce078f43 100644 --- a/packages/builders/scripts/fast-usdc/init-fast-usdc.js +++ b/packages/builders/scripts/fast-usdc/init-fast-usdc.js @@ -6,6 +6,8 @@ import { getManifestForFastUSDC, } from '@agoric/fast-usdc/src/fast-usdc.start.js'; import { toExternalConfig } from '@agoric/fast-usdc/src/utils/config-marshal.js'; +import { denomHash, withChainCapabilities } from '@agoric/orchestration'; +import fetchedChainInfo from '@agoric/orchestration/src/fetched-chain-info.js'; import { multiplyBy, parseRatio, @@ -17,12 +19,35 @@ import { parseArgs } from 'node:util'; * @import {CoreEvalBuilder, DeployScriptFunction} from '@agoric/deploy-script-support/src/externalTypes.js' * @import {ParseArgsConfig} from 'node:util' * @import {FastUSDCConfig} from '@agoric/fast-usdc/src/fast-usdc.start.js' + * @import {Passable} from '@endo/marshal'; + * @import {CosmosChainInfo} from '@agoric/orchestration'; */ const { keys } = Object; +const defaultAssetInfo = { + uusdc: { + baseName: 'noble', + chainName: 'noble', + baseDenom: 'uusdc', + }, + [`ibc/${denomHash({ denom: 'uusdc', channelId: fetchedChainInfo.agoric.connections['noble-1'].transferChannel.channelId })}`]: + { + baseName: 'noble', + chainName: 'agoric', + baseDenom: 'uusdc', + brandKey: 'USDC', + }, + [`ibc/${denomHash({ denom: 'uusdc', channelId: fetchedChainInfo.osmosis.connections['noble-1'].transferChannel.channelId })}`]: + { + baseName: 'noble', + chainName: 'osmosis', + baseDenom: 'uusdc', + }, +}; + /** - * @type {Record>} + * @type {Record>} * * TODO: determine OCW operator addresses * meanwhile, use price oracle addresses (from updatePriceFeeds.js). @@ -47,6 +72,10 @@ const configurations = { }, }, }, + chainInfo: /** @type {Record} */ ( + withChainCapabilities(fetchedChainInfo) + ), + assetInfo: defaultAssetInfo, }, MAINNET: { oracles: { @@ -69,6 +98,10 @@ const configurations = { }, }, }, + chainInfo: /** @type {Record} */ ( + withChainCapabilities(fetchedChainInfo) + ), + assetInfo: defaultAssetInfo, }, DEVNET: { oracles: { @@ -90,6 +123,10 @@ const configurations = { }, }, }, + chainInfo: /** @type {Record} */ ( + withChainCapabilities(fetchedChainInfo) // TODO: use devnet values + ), + assetInfo: defaultAssetInfo, // TODO: use emerynet values }, EMERYNET: { oracles: { @@ -108,6 +145,10 @@ const configurations = { }, }, }, + chainInfo: /** @type {Record} */ ( + withChainCapabilities(fetchedChainInfo) // TODO: use emerynet values + ), + assetInfo: defaultAssetInfo, // TODO: use emerynet values }, }; @@ -243,10 +284,22 @@ export default async (homeP, endowments) => { }; const parseChainInfo = () => { + if (net) { + if (!(net in configurations)) { + throw Error(`${net} not in ${keys(configurations)}`); + } + return configurations[net].chainInfo; + } if (!chainInfo) throw Error(chainInfoUsage); return JSON.parse(chainInfo); }; const parseAssetInfo = () => { + if (net) { + if (!(net in configurations)) { + throw Error(`${net} not in ${keys(configurations)}`); + } + return configurations[net].assetInfo; + } if (!assetInfo) throw Error(assetInfoUsage); return JSON.parse(assetInfo); }; From 032f98ab7b2536ac9c9abbaf4a5b33e9299e3cc2 Mon Sep 17 00:00:00 2001 From: 0xPatrick Date: Mon, 25 Nov 2024 18:10:56 -0500 Subject: [PATCH 10/12] feat: support builderOpts --- multichain-testing/test/support.ts | 3 ++- multichain-testing/tools/deploy.ts | 13 ++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/multichain-testing/test/support.ts b/multichain-testing/test/support.ts index 9c2a297296e..f98b5a13f08 100644 --- a/multichain-testing/test/support.ts +++ b/multichain-testing/test/support.ts @@ -89,6 +89,7 @@ export const commonSetup = async (t: ExecutionContext) => { const startContract = async ( contractName: string, contractBuilder: string, + builderOpts?: Record, ) => { const { vstorageClient } = tools; const instances = Object.fromEntries( @@ -98,7 +99,7 @@ export const commonSetup = async (t: ExecutionContext) => { return t.log('Contract found. Skipping installation...'); } t.log('bundle and install contract', contractName); - await deployBuilder(contractBuilder); + await deployBuilder(contractBuilder, builderOpts); await retryUntilCondition( () => vstorageClient.queryData(`published.agoricNames.instance`), res => contractName in Object.fromEntries(res), diff --git a/multichain-testing/tools/deploy.ts b/multichain-testing/tools/deploy.ts index 17b70cf5bb4..52a460f6094 100755 --- a/multichain-testing/tools/deploy.ts +++ b/multichain-testing/tools/deploy.ts @@ -2,6 +2,7 @@ import { createRequire } from 'module'; import type { AgdTools } from './agd-tools.js'; import type { CoreEvalPlan } from '@agoric/deploy-script-support/src/writeCoreEvalParts.js'; +import { flags } from './agd-lib.js'; const nodeRequire = createRequire(import.meta.url); @@ -10,10 +11,16 @@ export const makeDeployBuilder = ( readJSON: typeof import('fs-extra').readJSON, execa: typeof import('execa').execa, ) => - async function deployBuilder(builder: string) { + async function deployBuilder( + builder: string, + builderOpts?: Record, + ) { console.log(`building plan: ${builder}`); - // build the plan - const { stdout } = await execa`agoric run ${builder}`; + const args = ['run', builder]; + if (builderOpts) { + args.push(...flags(builderOpts)); + } + const { stdout } = await execa('agoric', args); const match = stdout.match(/ (?[-\w]+)-permit.json/); if (!(match && match.groups)) { throw Error('no permit found'); From 2fa2f7512b2a1a19d47f47b59e3206619794be18 Mon Sep 17 00:00:00 2001 From: 0xPatrick Date: Mon, 25 Nov 2024 18:56:02 -0500 Subject: [PATCH 11/12] feat: send-anywhere inits chainHub - split start-send-anywhere.js into proposal and start script so we can pass options - init-send-anywhere.js takes `--chainInfo` and `--assetInfo` options - send-anywhere.contrac.js registers chainInfo and assetInfo from privateArgs in ChainHub --- multichain-testing/test/send-anywhere.test.ts | 35 +++++++- .../orchestration/restart-contracts.test.ts | 2 +- .../scripts/testing/init-send-anywhere.js | 67 +++++++++++++++ .../src/examples/send-anywhere.contract.js | 11 +++ .../src/proposals}/start-send-anywhere.js | 85 ++++++++----------- 5 files changed, 146 insertions(+), 54 deletions(-) create mode 100644 packages/builders/scripts/testing/init-send-anywhere.js rename packages/{builders/scripts/testing => orchestration/src/proposals}/start-send-anywhere.js (53%) diff --git a/multichain-testing/test/send-anywhere.test.ts b/multichain-testing/test/send-anywhere.test.ts index 717e1b5282e..376853600f0 100644 --- a/multichain-testing/test/send-anywhere.test.ts +++ b/multichain-testing/test/send-anywhere.test.ts @@ -10,6 +10,8 @@ import { createWallet } from '../tools/wallet.js'; import { AmountMath } from '@agoric/ertp'; import { makeQueryClient } from '../tools/query.js'; import type { Amount } from '@agoric/ertp/src/types.js'; +import chainInfo from '../starship-chain-info.js'; +import { denomHash, withChainCapabilities } from '@agoric/orchestration'; const test = anyTest as TestFn; @@ -17,7 +19,7 @@ const accounts = ['osmosis1', 'osmosis2', 'cosmoshub1', 'cosmoshub2']; const contractName = 'sendAnywhere'; const contractBuilder = - '../packages/builders/scripts/testing/start-send-anywhere.js'; + '../packages/builders/scripts/testing/init-send-anywhere.js'; test.before(async t => { const { deleteTestKeys, setupTestKeys, ...rest } = await commonSetup(t); @@ -25,7 +27,36 @@ test.before(async t => { const wallets = await setupTestKeys(accounts); t.context = { ...rest, wallets, deleteTestKeys }; const { startContract } = rest; - await startContract(contractName, contractBuilder); + + const assetInfo = { + uosmo: { + baseName: 'osmosis', + chainName: 'osmosis', + baseDenom: 'uosmo', + }, + [`ibc/${denomHash({ denom: 'uosmo', channelId: chainInfo.agoric.connections['osmosislocal'].transferChannel.channelId })}`]: + { + baseName: 'osmosis', + chainName: 'agoric', + baseDenom: 'uosmo', + }, + uatom: { + baseName: 'cosmoshub', + chainName: 'cosmoshub', + baseDenom: 'uatom', + }, + [`ibc/${denomHash({ denom: 'uatom', channelId: chainInfo.agoric.connections['gaialocal'].transferChannel.channelId })}`]: + { + baseName: 'cosmoshub', + chainName: 'agoric', + baseDenom: 'uatom', + }, + }; + + await startContract(contractName, contractBuilder, { + chainInfo: JSON.stringify(withChainCapabilities(chainInfo)), + assetInfo: JSON.stringify(assetInfo), + }); }); test.after(async t => { diff --git a/packages/boot/test/orchestration/restart-contracts.test.ts b/packages/boot/test/orchestration/restart-contracts.test.ts index a8f5f56511a..790f58e5d44 100644 --- a/packages/boot/test/orchestration/restart-contracts.test.ts +++ b/packages/boot/test/orchestration/restart-contracts.test.ts @@ -32,7 +32,7 @@ test.serial('send-anywhere', async t => { t.log('start send-anywhere'); await evalProposal( - buildProposal('@agoric/builders/scripts/testing/start-send-anywhere.js'), + buildProposal('@agoric/builders/scripts/testing/init-send-anywhere.js'), ); t.log('making offer'); diff --git a/packages/builders/scripts/testing/init-send-anywhere.js b/packages/builders/scripts/testing/init-send-anywhere.js new file mode 100644 index 00000000000..fb953768ea2 --- /dev/null +++ b/packages/builders/scripts/testing/init-send-anywhere.js @@ -0,0 +1,67 @@ +import { makeHelpers } from '@agoric/deploy-script-support'; +import { + getManifest, + startSendAnywhere, +} from '@agoric/orchestration/src/proposals/start-send-anywhere.js'; +import { parseArgs } from 'node:util'; + +/** + * @import {ParseArgsConfig} from 'node:util' + */ + +/** @type {ParseArgsConfig['options']} */ +const parserOpts = { + chainInfo: { type: 'string' }, + assetInfo: { type: 'string' }, +}; + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ +export const defaultProposalBuilder = async ( + { publishRef, install }, + options, +) => + harden({ + sourceSpec: '@agoric/orchestration/src/proposals/start-send-anywhere.js', + getManifestCall: [ + getManifest.name, + { + installationRef: publishRef( + install( + '@agoric/orchestration/src/examples/send-anywhere.contract.js', + ), + ), + options, + }, + ], + }); + +/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ +export default async (homeP, endowments) => { + const { scriptArgs } = endowments; + + const { + values: { chainInfo, assetInfo }, + } = parseArgs({ + args: scriptArgs, + options: parserOpts, + }); + + const parseChainInfo = () => { + if (typeof chainInfo !== 'string') return undefined; + return JSON.parse(chainInfo); + }; + const parseAssetInfo = () => { + if (typeof assetInfo !== 'string') return undefined; + return JSON.parse(assetInfo); + }; + const opts = harden({ + chainInfo: parseChainInfo(), + assetInfo: parseAssetInfo(), + }); + + const { writeCoreEval } = await makeHelpers(homeP, endowments); + + await writeCoreEval(startSendAnywhere.name, utils => + defaultProposalBuilder(utils, opts), + ); +}; diff --git a/packages/orchestration/src/examples/send-anywhere.contract.js b/packages/orchestration/src/examples/send-anywhere.contract.js index 3cfab6ec922..3d2065de836 100644 --- a/packages/orchestration/src/examples/send-anywhere.contract.js +++ b/packages/orchestration/src/examples/send-anywhere.contract.js @@ -4,6 +4,7 @@ import { M } from '@endo/patterns'; import { prepareChainHubAdmin } from '../exos/chain-hub-admin.js'; import { AnyNatAmountShape } from '../typeGuards.js'; import { withOrchestration } from '../utils/start-helper.js'; +import { registerChainsAndAssets } from '../utils/chain-hub-helper.js'; import * as flows from './send-anywhere.flows.js'; import * as sharedFlows from './shared.flows.js'; @@ -11,6 +12,7 @@ import * as sharedFlows from './shared.flows.js'; * @import {Vow} from '@agoric/vow'; * @import {Zone} from '@agoric/zone'; * @import {OrchestrationPowers, OrchestrationTools} from '../utils/start-helper.js'; + * @import {CosmosChainInfo, Denom, DenomDetail} from '@agoric/orchestration'; */ export const SingleNatAmountRecord = M.and( @@ -27,6 +29,8 @@ harden(SingleNatAmountRecord); * @param {ZCF} zcf * @param {OrchestrationPowers & { * marshaller: Marshaller; + * chainInfo?: Record; + * assetInfo?: Record; * }} privateArgs * @param {Zone} zone * @param {OrchestrationTools} tools @@ -82,6 +86,13 @@ export const contract = async ( }, ); + registerChainsAndAssets( + chainHub, + zcf.getTerms().brands, + privateArgs.chainInfo, + privateArgs.assetInfo, + ); + return { publicFacet, creatorFacet }; }; harden(contract); diff --git a/packages/builders/scripts/testing/start-send-anywhere.js b/packages/orchestration/src/proposals/start-send-anywhere.js similarity index 53% rename from packages/builders/scripts/testing/start-send-anywhere.js rename to packages/orchestration/src/proposals/start-send-anywhere.js index e29d043ccb8..a50d87f3f7f 100644 --- a/packages/builders/scripts/testing/start-send-anywhere.js +++ b/packages/orchestration/src/proposals/start-send-anywhere.js @@ -1,7 +1,3 @@ -/** - * @file This is for use in tests in a3p-integration - * Unlike most builder scripts, this one includes the proposal exports as well. - */ import { deeplyFulfilledObject, makeTracer, @@ -12,6 +8,7 @@ import { E } from '@endo/far'; /// /** * @import {Installation} from '@agoric/zoe/src/zoeService/utils.js'; + * @import {CosmosChainInfo, Denom, DenomDetail} from '@agoric/orchestration'; */ const trace = makeTracer('StartSA', true); @@ -28,28 +25,37 @@ const trace = makeTracer('StartSA', true); * }; * }; * }} powers + * @param {{ + * options: { + * chainInfo: Record; + * assetInfo: Record; + * }; + * }} config */ -export const startSendAnywhere = async ({ - consume: { - agoricNames, - board, - chainStorage, - chainTimerService, - cosmosInterchainService, - localchain, - startUpgradable, - }, - installation: { - consume: { sendAnywhere }, - }, - instance: { - // @ts-expect-error unknown instance - produce: { sendAnywhere: produceInstance }, - }, - issuer: { - consume: { IST }, +export const startSendAnywhere = async ( + { + consume: { + agoricNames, + board, + chainStorage, + chainTimerService, + cosmosInterchainService, + localchain, + startUpgradable, + }, + installation: { + consume: { sendAnywhere }, + }, + instance: { + // @ts-expect-error unknown instance + produce: { sendAnywhere: produceInstance }, + }, + issuer: { + consume: { IST }, + }, }, -}) => { + { options: { chainInfo, assetInfo } }, +) => { trace(startSendAnywhere.name); const marshaller = await E(board).getReadonlyMarshaller(); @@ -64,6 +70,8 @@ export const startSendAnywhere = async ({ 'send-anywhere', ), timerService: chainTimerService, + chainInfo, + assetInfo, }), ); @@ -78,7 +86,7 @@ export const startSendAnywhere = async ({ }; harden(startSendAnywhere); -export const getManifest = ({ restoreRef }, { installationRef }) => { +export const getManifest = ({ restoreRef }, { installationRef, options }) => { return { manifest: { [startSendAnywhere.name]: { @@ -106,31 +114,6 @@ export const getManifest = ({ restoreRef }, { installationRef }) => { installations: { sendAnywhere: restoreRef(installationRef), }, + options, }; }; - -/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').CoreEvalBuilder} */ -export const defaultProposalBuilder = async ({ publishRef, install }) => - harden({ - // Somewhat unorthodox, source the exports from this builder module - sourceSpec: '@agoric/builders/scripts/testing/start-send-anywhere.js', - getManifestCall: [ - getManifest.name, - { - installationRef: publishRef( - install( - '@agoric/orchestration/src/examples/send-anywhere.contract.js', - ), - ), - }, - ], - }); - -/** @type {import('@agoric/deploy-script-support/src/externalTypes.js').DeployScriptFunction} */ -export default async (homeP, endowments) => { - // import dynamically so the module can work in CoreEval environment - const dspModule = await import('@agoric/deploy-script-support'); - const { makeHelpers } = dspModule; - const { writeCoreEval } = await makeHelpers(homeP, endowments); - await writeCoreEval(startSendAnywhere.name, defaultProposalBuilder); -}; From 118bc6a304bdf3e084885653c8d049f446bd2b5a Mon Sep 17 00:00:00 2001 From: 0xPatrick Date: Tue, 26 Nov 2024 11:22:55 -0500 Subject: [PATCH 12/12] test: disable exitOffer tool reclaims stuck payment - this test is flaky and will be addressed as part of #10565 --- a3p-integration/proposals/z:acceptance/wallet.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/a3p-integration/proposals/z:acceptance/wallet.test.js b/a3p-integration/proposals/z:acceptance/wallet.test.js index f3487a9f10d..9a2e18d1395 100644 --- a/a3p-integration/proposals/z:acceptance/wallet.test.js +++ b/a3p-integration/proposals/z:acceptance/wallet.test.js @@ -58,7 +58,7 @@ test.serial(`send invitation via namesByAddress`, async t => { }); // FIXME https://github.com/Agoric/agoric-sdk/issues/10565 -test.failing('exitOffer tool reclaims stuck payment', async t => { +test.skip('exitOffer tool reclaims stuck payment', async t => { const istBalanceBefore = await getBalances([GOV1ADDR], 'uist'); t.log('istBalanceBefore', istBalanceBefore);