From 78463c8e10a0724c230d64fec15a0a45c2cdf209 Mon Sep 17 00:00:00 2001 From: 0xPatrick Date: Thu, 6 Feb 2025 22:05:08 -0500 Subject: [PATCH 01/11] feat: `CosmosOrchestrationAccount` supports `.depositForBurn` --- packages/orchestration/src/cosmos-api.ts | 11 ++++ packages/orchestration/src/ethereum-api.ts | 2 + packages/orchestration/src/exos/chain-hub.js | 27 +++++++++- .../src/exos/cosmos-orchestration-account.js | 54 ++++++++++++++++++- .../orchestration/src/orchestration-api.ts | 5 +- packages/orchestration/src/typeGuards.js | 1 + packages/orchestration/test/types.test-d.ts | 28 +++++++++- 7 files changed, 122 insertions(+), 6 deletions(-) diff --git a/packages/orchestration/src/cosmos-api.ts b/packages/orchestration/src/cosmos-api.ts index 801d6f22bce..d03d9d31968 100644 --- a/packages/orchestration/src/cosmos-api.ts +++ b/packages/orchestration/src/cosmos-api.ts @@ -104,6 +104,7 @@ export interface CosmosAssetInfo extends Record { export type CosmosChainInfo = Readonly<{ /** can be used to lookup chainInfo (chainId) from an address value */ bech32Prefix?: string; + cctpDestinationDomain?: number; chainId: string; connections?: Record; // chainId or wellKnownName @@ -309,6 +310,16 @@ export interface LiquidStakingMethods { liquidStake: (amount: AmountArg) => Promise; } +export interface NobleMethods { + /** burn USDC on Noble and mint on a destination chain via CCTP */ + depositForBurn: ( + mintRecipient: CosmosChainAddress, + amount: AmountArg, + ) => Promise; + // consider including `registerForwardingAccount` (`MsgRegisterAccount`), so a contract can create its own forwarding address + // Requires `noble/forwarding` protos: https://github.com/noble-assets/forwarding/blob/main/proto/noble/forwarding/v1/tx.proto +} + // TODO support StakingAccountQueries /** Methods supported only on Agoric chain accounts */ export interface LocalAccountMethods extends StakingAccountActions { diff --git a/packages/orchestration/src/ethereum-api.ts b/packages/orchestration/src/ethereum-api.ts index d294033756e..4fa88e98180 100644 --- a/packages/orchestration/src/ethereum-api.ts +++ b/packages/orchestration/src/ethereum-api.ts @@ -2,6 +2,8 @@ * Info for an Ethereum-based chain. */ export type EthChainInfo = Readonly<{ + // XXX consider ~BaseChainInfo type, with `cctpDestinationDomain` + `chainId` + cctpDestinationDomain?: number; chainId: string; allegedName: string; }>; diff --git a/packages/orchestration/src/exos/chain-hub.js b/packages/orchestration/src/exos/chain-hub.js index d9d52607e4f..6d8c7fcd5e1 100644 --- a/packages/orchestration/src/exos/chain-hub.js +++ b/packages/orchestration/src/exos/chain-hub.js @@ -203,9 +203,11 @@ export const TransferRouteShape = M.splitRecord( ); const ChainHubI = M.interface('ChainHub', { + // TODO: support more than `CosmosChainInfoShape` registerChain: M.call(M.string(), CosmosChainInfoShape).returns(), updateChain: M.call(M.string(), CosmosChainInfoShape).returns(), getChainInfo: M.call(M.string()).returns(VowShape), + getChainInfoByChainId: M.call(M.string()).returns(CosmosChainInfoShape), registerConnection: M.call( M.string(), M.string(), @@ -247,6 +249,7 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { /** @type {MapStore} */ const chainInfos = zone.mapStore('chainInfos', { keyShape: M.string(), + // TODO: support more than `CosmosChainInfoShape` valueShape: CosmosChainInfoShape, }); /** @type {MapStore} */ @@ -270,6 +273,11 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { keyShape: M.string(), valueShape: M.string(), }); + /** @type {MapStore} */ + const chainIdToChainName = zone.mapStore('chainIdToChainName', { + keyShape: M.string(), + valueShape: M.string(), + }); /** * @param {Denom} denom - from perspective of the src/holding chain @@ -305,6 +313,7 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { // TODO consider makeAtomicProvider for vows if (!chainInfos.has(chainName)) { chainInfos.init(chainName, chainInfo); + chainIdToChainName.init(chainInfo.chainId, chainName); if (chainInfo.bech32Prefix) { bech32PrefixToChainName.init(chainInfo.bech32Prefix, chainName); } @@ -393,7 +402,10 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { */ registerChain(name, chainInfo) { chainInfos.init(name, chainInfo); - if (chainInfo.bech32Prefix) { + if (!chainIdToChainName.has(chainInfo.chainId)) { + chainIdToChainName.init(chainInfo.chainId, name); + } + if ('bech32Prefix' in chainInfo && chainInfo.bech32Prefix) { bech32PrefixToChainName.init(chainInfo.bech32Prefix, name); } }, @@ -413,7 +425,7 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { bech32PrefixToChainName.delete(oldInfo.bech32Prefix); } chainInfos.set(chainName, chainInfo); - if (chainInfo.bech32Prefix) { + if ('bech32Prefix' in chainInfo && chainInfo.bech32Prefix) { bech32PrefixToChainName.init(chainInfo.bech32Prefix, chainName); } }, @@ -432,6 +444,17 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { return lookupChainInfo(chainName); }, + /** @param {string} chainId */ + getChainInfoByChainId(chainId) { + // Either from registerChain or memoized remote lookup() + chainIdToChainName.has(chainId) || + Fail`Chain Info not found for ${q(chainId)}`; + const chainName = chainIdToChainName.get(chainId); + chainInfos.has(chainName) || Fail`Chain Info not found for ${q(chainId)}`; + return /** @type {ActualChainInfo} */ ( + chainInfos.get(chainName) + ); + }, /** * @param {string} primaryChainId * @param {string} counterpartyChainId diff --git a/packages/orchestration/src/exos/cosmos-orchestration-account.js b/packages/orchestration/src/exos/cosmos-orchestration-account.js index 72811216245..0af3ebca89a 100644 --- a/packages/orchestration/src/exos/cosmos-orchestration-account.js +++ b/packages/orchestration/src/exos/cosmos-orchestration-account.js @@ -1,5 +1,6 @@ /** @file Use-object for the owner of a staking account */ import { toRequestQueryJson } from '@agoric/cosmic-proto'; +import { MsgDepositForBurn } from '@agoric/cosmic-proto/circle/cctp/v1/tx.js'; import { QueryAllBalancesRequest, QueryAllBalancesResponse, @@ -67,7 +68,7 @@ import { makeTimestampHelper } from '../utils/time.js'; /** * @import {HostOf} from '@agoric/async-flow'; - * @import {AmountArg, IcaAccount, CosmosChainAddress, CosmosValidatorAddress, ICQConnection, StakingAccountActions, StakingAccountQueries, OrchestrationAccountCommon, CosmosRewardsResponse, IBCConnectionInfo, IBCMsgTransferOptions, ChainHub, CosmosDelegationResponse} from '../types.js'; + * @import {AmountArg, IcaAccount, CosmosChainAddress, CosmosValidatorAddress, ICQConnection, StakingAccountActions, StakingAccountQueries, NobleMethods, OrchestrationAccountCommon, CosmosRewardsResponse, IBCConnectionInfo, IBCMsgTransferOptions, ChainHub, CosmosDelegationResponse} from '../types.js'; * @import {ContractMeta, Invitation, OfferHandler, ZCF, ZCFSeat} from '@agoric/zoe'; * @import {RecorderKit, MakeRecorderKit} from '@agoric/zoe/src/contractSupport/recorder.js'; * @import {Coin} from '@agoric/cosmic-proto/cosmos/base/v1beta1/coin.js'; @@ -139,8 +140,17 @@ const stakingAccountQueriesMethods = { getRewards: M.call().returns(VowShape), }; +/** @see {NobleMethods} */ +const nobleMethods = { + depositForBurn: M.call(CosmosChainAddressShape, AmountArgShape).returns( + VowShape, + ), +}; + /** @see {OrchestrationAccountCommon} */ +// TODO: consider renaming to CosmosOrchAccountHolder export const IcaAccountHolderI = M.interface('IcaAccountHolder', { + ...nobleMethods, ...orchestrationAccountMethods, ...stakingAccountActionsMethods, ...stakingAccountQueriesMethods, @@ -208,7 +218,7 @@ export const prepareCosmosOrchestrationAccountKit = ( amountToCoin: M.call(AmountArgShape).returns(M.record()), }), returnVoidWatcher: M.interface('returnVoidWatcher', { - onFulfilled: M.call(M.or(M.string(), M.record())) + onFulfilled: M.call(M.any()) .optional(M.arrayOf(M.undefined())) .returns(M.undefined()), }), @@ -1128,6 +1138,46 @@ export const prepareCosmosOrchestrationAccountKit = ( watch(E(this.facets.helper.owned()).executeEncodedTx(msgs, opts)), ); }, + /** @type {HostOf} */ + depositForBurn(destination, amount) { + return asVow(() => { + trace('depositForBurn', { destination, amount }); + const { helper } = this.facets; + const { chainAddress } = this.state; + + chainAddress.chainId.startsWith('noble') || + Fail`'depositForBurn' not supported on chain: ${q(chainAddress.chainId)}`; + + const { cctpDestinationDomain } = chainHub.getChainInfoByChainId( + destination.chainId, + ); + if (!cctpDestinationDomain || cctpDestinationDomain !== 0) { + throw Fail`${q(destination.chainId)} does not have "cctpDestinationDomain" set in ChainInfo`; + } + + // TODO: logic for encoding solana + evm addresses + // see https://github.com/circlefin/noble-cctp/blob/master/examples/depositForBurn.ts#L52-L70 + const mintRecipient = new Uint8Array(); + + // TODO: do we need to support MsgDepositForBurnWithCaller? It's the + // same payload, plus `destinationCaller: Uint8Array`. + // (Functionally, only destinationCaller can call MsgReceive on the + // destination chain to mint) + const msg = MsgDepositForBurn.toProtoMsg({ + amount: helper.amountToCoin(amount)?.amount, + from: chainAddress.value, + destinationDomain: cctpDestinationDomain, + mintRecipient, + // safe to hardcode this constant? maybe best as part of opts bag with a default value? + burnToken: 'uusdc', + }); + + return watch( + E(helper.owned()).executeEncodedTx([Any.toJSON(msg)]), + this.facets.returnVoidWatcher, + ); + }); + }, }, }, ); diff --git a/packages/orchestration/src/orchestration-api.ts b/packages/orchestration/src/orchestration-api.ts index 8e3954b736a..053cf51c684 100644 --- a/packages/orchestration/src/orchestration-api.ts +++ b/packages/orchestration/src/orchestration-api.ts @@ -18,6 +18,7 @@ import type { KnownChains, LocalAccountMethods, ICQQueryFunction, + NobleMethods, } from './types.js'; import type { ResolvedContinuingOfferResult } from './utils/zoe-tools.js'; @@ -104,7 +105,9 @@ export type OrchestrationAccount = (CI extends CosmosChainInfo ? CI['chainId'] extends `agoric${string}` ? LocalAccountMethods - : CosmosChainAccountMethods + : CI['chainId'] extends `noble${string}` + ? CosmosChainAccountMethods & NobleMethods + : CosmosChainAccountMethods : object); /** diff --git a/packages/orchestration/src/typeGuards.js b/packages/orchestration/src/typeGuards.js index 3085af7a913..d17c80adae2 100644 --- a/packages/orchestration/src/typeGuards.js +++ b/packages/orchestration/src/typeGuards.js @@ -97,6 +97,7 @@ export const CosmosChainInfoShape = M.splitRecord( }, { bech32Prefix: M.string(), + cctpDestinationDomain: M.number(), connections: M.record(), stakingTokens: M.arrayOf({ denom: M.string() }), // UNTIL https://github.com/Agoric/agoric-sdk/issues/9326 diff --git a/packages/orchestration/test/types.test-d.ts b/packages/orchestration/test/types.test-d.ts index a5c96b352a8..b586722de60 100644 --- a/packages/orchestration/test/types.test-d.ts +++ b/packages/orchestration/test/types.test-d.ts @@ -1,5 +1,5 @@ /** - * @file pure types types, no runtime, ignored by Ava + * @file pure types, no runtime, ignored by Ava */ import type { HostInterface, HostOf } from '@agoric/async-flow'; @@ -319,4 +319,30 @@ expectNotType(chainAddr); expectType< (validator: CosmosValidatorAddress, amount: AmountArg) => Promise >(account.delegate); + + expectType<(destination, amount: AmountArg) => Promise>( + // @ts-expect-error `depositForBurn` only available for noble + account.depositForBurn, + ); +} + +// Test NobleAccountMethods +{ + type ChainFacade = Chain< + CosmosChainInfo & { + chainId: 'noble-1'; + } + >; + const remoteChain: ChainFacade = null as any; + const account = await remoteChain.makeAccount(); + + expectType<(destination, amount: AmountArg) => Promise>( + account.depositForBurn, + ); + + // Verify delegate is not available (no stakingTokens parameter) + expectType< + (validator: CosmosValidatorAddress, amount: AmountArg) => Promise + // @ts-expect-error StakingMethods not available on noble + >(account.delegate); } From 295162474bd2b68d79f9d61b26f433c8c6e0425c Mon Sep 17 00:00:00 2001 From: Chris Hibbert Date: Fri, 21 Feb 2025 10:31:52 -0800 Subject: [PATCH 02/11] feat: support CCTP in orchestration --- .../src/examples/send-anywhere.contract.js | 30 ++- .../src/examples/send-cctp.flows.js | 121 +++++++++ .../orchestration/src/exos/chain-hub-admin.js | 14 +- .../test/examples/send-cctp.test.ts | 243 ++++++++++++++++++ 4 files changed, 392 insertions(+), 16 deletions(-) create mode 100644 packages/orchestration/src/examples/send-cctp.flows.js create mode 100644 packages/orchestration/test/examples/send-cctp.test.ts diff --git a/packages/orchestration/src/examples/send-anywhere.contract.js b/packages/orchestration/src/examples/send-anywhere.contract.js index 344e9b25563..f72de33526a 100644 --- a/packages/orchestration/src/examples/send-anywhere.contract.js +++ b/packages/orchestration/src/examples/send-anywhere.contract.js @@ -5,9 +5,10 @@ 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'; +import * as cctpFlows from './send-cctp.flows.js'; + /** * @import {Remote, Vow} from '@agoric/vow'; * @import {Zone} from '@agoric/zone'; @@ -40,7 +41,7 @@ export const contract = async ( zcf, privateArgs, zone, - { chainHub, orchestrateAll, vowTools, zoeTools }, + { chainHub, orchestrate, vowTools, zoeTools }, ) => { const creatorFacet = prepareChainHubAdmin(zone, chainHub); @@ -49,7 +50,10 @@ export const contract = async ( /** @type {(msg: string) => Vow} */ const log = msg => vowTools.watch(E(logNode).setValue(msg)); - const { makeLocalAccount } = orchestrateAll(sharedFlows, {}); + // XXX why can't we do both at once? + const makeLocalAccount = orchestrate('f1', {}, sharedFlows.makeLocalAccount); + const makeNobleAccount = orchestrate('f2', {}, cctpFlows.makeNobleAccount); + /** * Setup a shared local account for use in async-flow functions. Typically, * exo initState functions need to resolve synchronously, but `makeOnce` @@ -62,13 +66,19 @@ export const contract = async ( const sharedLocalAccountP = zone.makeOnce('localAccount', () => makeLocalAccount(), ); - + const nobleAccountP = zone.makeOnce('nobleAccount', () => makeNobleAccount()); // orchestrate uses the names on orchestrationFns to do a "prepare" of the associated behavior - const orchFns = orchestrateAll(flows, { - log, - sharedLocalAccountP, - zoeTools, - }); + const sendByCCTP = orchestrate( + 'sendByCCTP', + { + log, + sharedLocalAccountP, + nobleAccountP, + zoeTools, + }, + // @ts-expect-error deprecated, but alternative is TBD. + cctpFlows.sendByCCTP, + ); const publicFacet = zone.exo( 'Send PF', @@ -78,7 +88,7 @@ export const contract = async ( { makeSendInvitation() { return zcf.makeInvitation( - orchFns.sendIt, + sendByCCTP, 'send', undefined, M.splitRecord({ give: SingleNatAmountRecord }), diff --git a/packages/orchestration/src/examples/send-cctp.flows.js b/packages/orchestration/src/examples/send-cctp.flows.js new file mode 100644 index 00000000000..19817355d89 --- /dev/null +++ b/packages/orchestration/src/examples/send-cctp.flows.js @@ -0,0 +1,121 @@ +import { NonNullish } from '@agoric/internal'; +import { Fail, makeError, q } from '@endo/errors'; +import { M, mustMatch } from '@endo/patterns'; + +/** + * @import {GuestInterface, GuestOf} from '@agoric/async-flow'; + * @import {Vow} from '@agoric/vow'; + * @import {LocalOrchestrationAccountKit} from '../exos/local-orchestration-account.js'; + * @import {ZoeTools} from '../utils/zoe-tools.js'; + * @import {Orchestrator, OrchestrationFlow, LocalAccountMethods, OrchestrationAccountCommon, OrchestrationAccount, IBCConnectionInfo, AccountIdArg, ForwardInfo, Chain} from '../types.js'; + * @import {IBCChannelID} from '@agoric/vats'; + */ + +const { entries } = Object; + +/** + * @satisfies {OrchestrationFlow} + * @param {Orchestrator} orch + */ +export const makeNobleAccount = async orch => { + const nobleChain = await orch.getChain('noble'); + return nobleChain.makeAccount(); +}; +harden(makeNobleAccount); + +// TODO use case should be handled by `sendIt` based on the destination +/** + * @satisfies {OrchestrationFlow} + * @param {Orchestrator} orch + * @param {object} ctx + * @param {Promise>} ctx.sharedLocalAccountP + * @param {Promise< + * GuestInterface< + * import('../exos/cosmos-orchestration-account.js').CosmosOrchestrationAccountKit['holder'] + * > + * >} ctx.nobleAccountP + * @param {GuestInterface} ctx.zoeTools + * @param {GuestOf<(msg: string) => Vow>} ctx.log + * @param {ZCFSeat} seat + * @param {{ chainName: string; destAddr: string }} offerArgs + */ +export const sendByCCTP = async ( + orch, + { + sharedLocalAccountP, + nobleAccountP, + log, + zoeTools: { localTransfer, withdrawToSeat }, + }, + seat, + offerArgs, +) => { + mustMatch(offerArgs, harden({ chainName: M.scalar(), destAddr: M.string() })); + const { chainName, destAddr } = offerArgs; + // NOTE the proposal shape ensures that the `give` is a single asset + const { give } = seat.getProposal(); + const [[_kw, amt]] = entries(give); + void log(`sending {${amt.value}} from ${chainName} to ${destAddr}`); + const agoric = await orch.getChain('agoric'); + const assets = await agoric.getVBankAssetInfo(); + void log(`got info for denoms: ${assets.map(a => a.denom).join(', ')}`); + const { denom } = NonNullish( + assets.find(a => a.brand === amt.brand), + `${amt.brand} not registered in vbank`, + ); + + /** @type {Chain} */ + const chain = await orch.getChain(chainName); + const info = await chain.getChainInfo(); + const { chainId } = info; + assert(typeof chainId === 'string', 'bad chainId'); + void log(`got info for chain: ${chainName} ${chainId}`); + + /** + * @type {OrchestrationAccount<{ chainId: 'agoric' }>} + */ + // @ts-expect-error XXX methods returning vows https://github.com/Agoric/agoric-sdk/issues/9822 + const sharedLocalAccount = await sharedLocalAccountP; + await localTransfer(seat, sharedLocalAccount, give); + + if (typeof info.cctpDestinationDomain !== 'number') { + // within the inter-chain; no CCTP needed + void log(`completed transfer to localAccount`); + + try { + await sharedLocalAccount.transfer( + { + value: destAddr, + encoding: 'bech32', + chainId, + }, + { denom, value: amt.value }, + ); + void log(`completed transfer to ${destAddr}`); + } catch (e) { + await withdrawToSeat(sharedLocalAccount, seat, give); + const errorMsg = `IBC Transfer failed ${q(e)}`; + void log(`ERROR: ${errorMsg}`); + seat.fail(errorMsg); + throw makeError(errorMsg); + } + } else { + // XXX is there a cleaner way to determine that this is USCD? + assets.some(a => a.brand === amt.brand && a.issuerName === 'USDC') || + Fail`CCTP must use USDC`; + + const nobleAccount = await nobleAccountP; + const nobleAddr = await nobleAccount.getAddress(); + const denomAmt = { denom, value: amt.value }; + await sharedLocalAccount.transfer(nobleAddr, denomAmt); + void log('assets are now on noble'); + + const encoding = 'ethereum'; // XXX TODO. could be solana? + /** @type {AccountIdArg} */ + const mintRecipient = { chainId, encoding, value: destAddr }; + await nobleAccount.depositForBurn(mintRecipient, denomAmt); + } + seat.exit(); + void log(`transfer complete, seat exited`); +}; +harden(sendByCCTP); diff --git a/packages/orchestration/src/exos/chain-hub-admin.js b/packages/orchestration/src/exos/chain-hub-admin.js index 2a365508ebe..f5f29765d57 100644 --- a/packages/orchestration/src/exos/chain-hub-admin.js +++ b/packages/orchestration/src/exos/chain-hub-admin.js @@ -34,11 +34,9 @@ export const prepareChainHubAdmin = (zone, chainHub) => { const makeCreatorFacet = zone.exo( 'ChainHub Admin', M.interface('ChainHub Admin', { - registerChain: M.callWhen( - M.string(), - CosmosChainInfoShape, - ConnectionInfoShape, - ).returns(M.undefined()), + registerChain: M.callWhen(M.string(), CosmosChainInfoShape) + .optional(ConnectionInfoShape) + .returns(M.undefined()), registerAsset: M.call(M.string(), DenomDetailShape).returns(M.promise()), }), { @@ -47,7 +45,7 @@ export const prepareChainHubAdmin = (zone, chainHub) => { * * @param {string} chainName - must not exist in chainHub * @param {CosmosChainInfo} chainInfo - * @param {IBCConnectionInfo} connectionInfo - from Agoric chain + * @param {IBCConnectionInfo} [connectionInfo] - from Agoric chain */ async registerChain(chainName, chainInfo, connectionInfo) { // when() because chainHub methods return vows. If this were inside @@ -56,6 +54,10 @@ export const prepareChainHubAdmin = (zone, chainHub) => { chainHub.getChainInfo('agoric'), ); chainHub.registerChain(chainName, chainInfo); + if (!connectionInfo) { + console.log('no connection info for', chainName, 'assuming CCTP'); + return; + } chainHub.registerConnection( agoricChainInfo.chainId, chainInfo.chainId, diff --git a/packages/orchestration/test/examples/send-cctp.test.ts b/packages/orchestration/test/examples/send-cctp.test.ts new file mode 100644 index 00000000000..81c9a490a31 --- /dev/null +++ b/packages/orchestration/test/examples/send-cctp.test.ts @@ -0,0 +1,243 @@ +import { test } from '@agoric/zoe/tools/prepare-test-env-ava.js'; + +import { setUpZoeForTest } from '@agoric/zoe/tools/setup-zoe.js'; +import { E } from '@endo/far'; +import { makeIssuerKit } from '@agoric/ertp'; +import { withAmountUtils } from '@agoric/zoe/tools/test-utils.js'; +import path from 'path'; +import type { + CosmosChainInfo, + IBCConnectionInfo, +} from '../../src/cosmos-api.js'; +import { commonSetup } from '../supports.js'; +import { denomHash } from '../../src/utils/denomHash.js'; +import type { DenomDetail } from '../../src/types.js'; +import fetchedChainInfo from '../../src/fetched-chain-info.js'; + +const dirname = path.dirname(new URL(import.meta.url).pathname); + +const contractName = 'sendAnywhere'; +const contractFile = `${dirname}/../../src/examples/send-anywhere.contract.js`; +type StartFn = + typeof import('../../src/examples/send-anywhere.contract.js').start; + +const txChannelDefaults = { + counterPartyPortId: 'transfer', + version: 'ics20-1', + portId: 'transfer', + ordering: 1, // ORDER_UNORDERED + state: 3, // STATE_OPEN +}; + +const AgoricDevnetConfig = { + chains: { + axelar: { + chainId: 'axelar-testnet-lisbon-3', + }, + osmosis: { + chainId: 'osmo-test-5', + bech32Prefix: 'osmosis', + connections: { + 'axelar-testnet-lisbon-3': { + id: 'connection-1233333', // XXX??? + client_id: '07-tendermint-1258', + state: 3, // STATE_OPEN, + counterparty: { + client_id: 'XXXX???', + connection_id: 'connection-87665', // XXX??? + }, + transferChannel: { + channelId: 'channel-566434324', // XXX??? + counterPartyChannelId: 'channel-112233', // ??? + ...txChannelDefaults, + }, + } as IBCConnectionInfo, + }, + } as CosmosChainInfo, + }, + connections: { + 'axelar-testnet-lisbon-3': { + // arbitrary ids... + id: 'connection-8600', + client_id: '07-tendermint-12700', + state: 3, // STATE_OPEN + counterparty: { + client_id: '07-tendermint-432600', + connection_id: 'connection-379300', + }, + transferChannel: { + counterPartyChannelId: 'channel-1006200', + channelId: 'channel-6500', + ...txChannelDefaults, + }, + } as IBCConnectionInfo, + + 'osmo-test-5': { + id: 'connection-86', + client_id: '07-tendermint-127', + state: 3, // STATE_OPEN + counterparty: { + client_id: '07-tendermint-4326', + connection_id: 'connection-3793', + }, + transferChannel: { + counterPartyChannelId: 'channel-10062', + channelId: 'channel-65', + ...txChannelDefaults, + }, + } as IBCConnectionInfo, + }, +}; + +const registerUSDC = async ({ bankManager, agoricNamesAdmin }) => { + const usdcKit = withAmountUtils(makeIssuerKit('USDC')); + const { issuer, mint, brand } = usdcKit; + + // TODO: use USDC denom + // const { axelar } = AgoricDevnetConfig.chains; + const { noble } = fetchedChainInfo; + const { channelId: agoricToNoble } = + fetchedChainInfo.agoric.connections[noble.chainId].transferChannel; + const denom = `ibc/${denomHash({ channelId: agoricToNoble, denom: 'uusdc' })}`; + + const issuerName = 'USDC'; + const proposedName = 'USDC noble'; + await E(bankManager).addAsset(denom, issuerName, proposedName, { + issuer, + mint, + brand, + }); + await E(E(agoricNamesAdmin).lookupAdmin('vbankAsset')).update( + denom, + /** @type {AssetInfo} */ harden({ + brand, + issuer, + issuerName, + denom, + proposedName, + displayInfo: { IOU: true }, + }), + ); + + return harden({ ...usdcKit, denom }); +}; + +test('send to base via noble CCTP', async t => { + t.log('bootstrap, orchestration core-eval'); + const { + bootstrap, + commonPrivateArgs, + brands: { ist }, + utils: { inspectLocalBridge, transmitTransferAck, populateChainHub }, + mocks: { ibcBridge }, + } = await commonSetup(t); + const vt = bootstrap.vowTools; + + populateChainHub(); + const { zoe, bundleAndInstall } = await setUpZoeForTest(); + + t.log('contract coreEval', contractName); + + const installation: Installation = + await bundleAndInstall(contractFile); + + const { bankManager, agoricNamesAdmin } = bootstrap; + const usdcKit = await registerUSDC({ + bankManager, + agoricNamesAdmin, + }); + + const storageNode = await E(bootstrap.storage.rootNode).makeChildNode( + contractName, + ); + + // Mix osmosis from AgoricDevnetConfig with commonPrivateArgs + const { + agoric, + osmosis: _x, + ...withoutOsmosis + } = commonPrivateArgs.chainInfo; + const { osmosis } = AgoricDevnetConfig.chains; + const connections = { + ...agoric.connections, + ...AgoricDevnetConfig.connections, + // XXX to get from Agoric to axelar, use osmosis + 'axelar-testnet-lisbon-3': AgoricDevnetConfig.connections[osmosis.chainId], + }; + const chainInfo = { + ...withoutOsmosis, + osmosis, + agoric: { ...agoric, connections }, + }; + const assetInfo: Array<[string, DenomDetail]> = [ + ...commonPrivateArgs.assetInfo, + ]; + const sendKit = await E(zoe).startInstance( + installation, + { Stable: ist.issuer, USDC: usdcKit.issuer }, + {}, + { + ...commonPrivateArgs, + assetInfo, + chainInfo, + storageNode, + }, + ); + + t.log('register the base chain'); + await E(sendKit.creatorFacet).registerChain( + 'base', + { + chainId: 'E8453', + // allegedName: 'base', + // https://developers.circle.com/stablecoins/supported-domains + cctpDestinationDomain: 6, + }, + // TODO: make this optional, since we don't really use it + fetchedChainInfo.agoric.connections['noble-1'], + ); + + t.log('client uses contract to send to EVM chain via CCTP'); + { + const anAmt = usdcKit.units(4.25); + const Send = await E(usdcKit.mint).mintPayment(anAmt); + + const publicFacet = await E(zoe).getPublicFacet(sendKit.instance); + const inv = E(publicFacet).makeSendInvitation(); + const userSeat = await E(zoe).offer( + inv, + { give: { Send: anAmt } }, + { Send }, + { + destAddr: '0x20E68F6c276AC6E297aC46c84Ab260928276691D', + chainName: 'base', + }, + ); + await transmitTransferAck(); + + await vt.when(E(userSeat).getOfferResult()); + const history = inspectLocalBridge(); + const { messages, address: fakeLocalChainAddr } = history.at(-1); + t.is(messages.length, 1); + const [txfr] = messages; + t.log('local bridge', txfr); + t.like(txfr, { + '@type': '/ibc.applications.transfer.v1.MsgTransfer', + receiver: 'cosmos1test', // TODO port setBech32Prefix from fastUSDC + sender: fakeLocalChainAddr, + sourceChannel: 'channel-62', + token: { + amount: '4250000', + // see test above + denom: + 'ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9', + }, + }); + t.is( + usdcKit.denom, + 'ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9', + ); + } + + t.log(ibcBridge.inspectDibcBridge()); +}); From bca90449e1e40344c7ad4dc8586984ee9288cfdf Mon Sep 17 00:00:00 2001 From: Chris Hibbert Date: Fri, 21 Feb 2025 10:33:26 -0800 Subject: [PATCH 03/11] test: update orcestration example snapshots --- .../snapshots/send-anywhere.test.ts.md | 55 +++++++++++++++++- .../snapshots/send-anywhere.test.ts.snap | Bin 30261 -> 30760 bytes .../snapshots/staking-combinations.test.ts.md | 4 ++ .../staking-combinations.test.ts.snap | Bin 2727 -> 2763 bytes .../snapshots/unbond.contract.test.ts.md | 5 ++ .../snapshots/unbond.contract.test.ts.snap | Bin 2281 -> 2326 bytes 6 files changed, 61 insertions(+), 3 deletions(-) diff --git a/packages/orchestration/test/examples/snapshots/send-anywhere.test.ts.md b/packages/orchestration/test/examples/snapshots/send-anywhere.test.ts.md index da8fa18a1e4..07d3d1fec71 100644 --- a/packages/orchestration/test/examples/snapshots/send-anywhere.test.ts.md +++ b/packages/orchestration/test/examples/snapshots/send-anywhere.test.ts.md @@ -24,6 +24,7 @@ Generated by [AVA](https://avajs.dev). StateUnwrapper_kindHandle: 'Alleged: kind', asyncFuncEagerWakers: [ Object @Alleged: asyncFlow flow {}, + Object @Alleged: asyncFlow flow {}, ], asyncFuncFailures: {}, flowForOutcomeVow: { @@ -80,6 +81,48 @@ Generated by [AVA](https://avajs.dev). 'Alleged: BLD brand': 'ubld', 'Alleged: IST brand': 'uist', }, + chainIdToChainName: { + 'agoric-3': 'agoric', + 'archway-1': 'archway', + 'beezee-1': 'beezee', + 'carbon-1': 'carbon', + 'cataclysm-1': 'nibiru', + celestia: 'celestia', + 'core-1': 'persistence', + 'coreum-mainnet-1': 'coreum', + 'cosmoshub-4': 'cosmoshub', + 'crescent-1': 'crescent', + 'dydx-mainnet-1': 'dydx', + 'dymension_1100-1': 'dymension', + 'empowerchain-1': 'empowerchain', + 'evmos_9001-2': 'evmos', + 'haqq_11235-1': 'haqq', + 'injective-1': 'injective', + 'juno-1': 'juno', + 'kaiyo-1': 'kujira', + 'kava_2222-10': 'kava', + 'lava-mainnet-1': 'lava', + 'migaloo-1': 'migaloo', + 'neutron-1': 'neutron', + 'noble-1': 'noble', + 'omniflixhub-1': 'omniflixhub', + 'osmosis-1': 'osmosis', + 'pacific-1': 'sei', + 'phoenix-1': 'terra2', + 'pio-mainnet-1': 'provenance', + 'pirin-1': 'nolus', + 'planq_7070-2': 'planq', + 'pryzm-1': 'pryzm', + 'quicksilver-2': 'quicksilver', + 'secret-4': 'secretnetwork', + 'shido_9008-1': 'shido', + 'sifchain-1': 'sifchain', + 'stargaze-1': 'stargaze', + 'stride-1': 'stride', + 'titan_18888-1': 'titan', + 'umee-1': 'umee', + 'vota-ash': 'doravota', + }, chainInfos: { agoric: { bech32Prefix: 'agoric', @@ -4689,11 +4732,15 @@ Generated by [AVA](https://avajs.dev). 'Send PF_kindHandle': 'Alleged: kind', 'Send PF_singleton': 'Alleged: Send PF', localAccount: 'Vow', + nobleAccount: 'Vow', orchestration: { - makeLocalAccount: { + f1: { asyncFlow_kindHandle: 'Alleged: kind', }, - sendIt: { + f2: { + asyncFlow_kindHandle: 'Alleged: kind', + }, + sendByCCTP: { asyncFlow_kindHandle: 'Alleged: kind', endowments: { 0: { @@ -4735,6 +4782,8 @@ Generated by [AVA](https://avajs.dev). VowRejectionTracker_kindHandle: 'Alleged: kind', VowRejectionTracker_singleton: 'Alleged: VowRejectionTracker', WatchUtils_kindHandle: 'Alleged: kind', - retryableFlowForOutcomeVow: {}, + retryableFlowForOutcomeVow: { + 'Alleged: VowInternalsKit vowV0': 'Alleged: lookupChainsAndConnection flow', + }, }, } diff --git a/packages/orchestration/test/examples/snapshots/send-anywhere.test.ts.snap b/packages/orchestration/test/examples/snapshots/send-anywhere.test.ts.snap index 0e54620618201b3e0ba52a79740e3a8a1deed561..26658f1fc55d834e321ad6e0b8e540137f3cda96 100644 GIT binary patch literal 30760 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 R)%vmde*jX&zs;sD002lVJY)a> literal 2727 zcmV;Y3Rv|)RzV~wcbAscCJp>yAV3hHHCiM_8pJh%q6P{SMSpCxc3Qw`lYS&3-dx2h>moNLNNc+3s>S5v(kw3?%O-ToeVauRRhi{f-Ll(Nu=pjJOA|$vS#5N6 z^Qy({J}<2)+9>*OxPaR(;NLFbXa(?01@Nm1Am9eZ+`w5kaNP~O?FJsWfhG?%vM&3` z`k0y-4>0cmp7Q{|@c@7G0JUCV&6S~W$FJ38}PHSqd>;l3K+ zYc;?NHNanLfP=NbdM$9P76|x($NZGks3YQPsc31PNUrkYM1J1O4Yn4FuJB??AgUzh z0nH}cj-+%#hxyzhEZ2kRR94i9C&e|H&1AL|_cnz#r-Gv!5mUec*5mrTzYy2K87Z}( zN-~)xDy!uTdV%KckAB6pNc5&3a;g~*DIx@kexo2V(4 z7qT)jAb+qzmIY~TN|H}xRZdzZryTQHmDRnRWi$D2noQT$2)i=NX7nM@W3rkapvhdW zDR+PxOrm1~>rLLIHIaR6=~Q!qaOu6{b23@xFDyzr?l`+jbYQHm0IW{Pte8APL}^vG zJ!-Y-d2(7@mW)x8Ew%tBiJ}qZ1;EP|fG25a+By{xBxxm^nat~!J1D&tzA_;uCru~H zRqD(s*?O@B5kD9o9m@GxFw#QVX@{bhNIP~UrPDJhttNPpB&WsmysB?gv-+Ya*P-1D zD!amqDML>eQa-C@tsrr%Fu`$BR#fv}R-DRh&UflI-e_$y;fz*Ga8oQt%C04vtX#(+ zhfJykRTYBDUhLe!kGNXl*3SI0b2<#nz8 z+)gPFEh6CvnKpYlU_;X>VosJ;d4)XAs$9DK@aR67Ny%)I%;&57ZR&Jwq~qvY%#_)H zLMQf9(%Q7B5?N#gWg7w8aY|YnTcN7w$zoj6|KyeUSiS>w4D*-;Tw_Qc zGTn9Skf$w>h9t>I3a?IRHLgHXtZJ0NKeEcKvMVIF+3LpMTZ}=?IAbYZbi_ZbE@#DL zPI^L2F3PN^ENhv>4-H^1I;Rg$<^c;tOcHrJdpn=t=82LO)NSqp5r=>yNw%7N8e24$ zTIUK|^45CfV?2E!U?c>b3IX2=0k4FpwN>L-oe=P02#7QRUuvQ#bu`8ML=$kP z3HVME@RKIsy(Zuzn%3Z;g~C8249tdsl`!z#F!0kbMQd_6_)ZwO8wNfN1AWcFBh3`0 z)sYI5&A{1a;8hyh?tuQX8TfUxb|XhYyB*0Y+5&XbumOkS*IR%@3-Em!I_St;Zn~nk zo-j)%rb^=+Y33JSJ{8c(kmt@F6}27HfVzVEV!P2|IUOj**OAcy}v!Q$%O1mW~w%NUBY15-`myQw2U$QvpMRxQMTgEkI9m61E zxtAegQd(OjqN;o@+5;uD=~Q2q_UGW+@r``*F|KR`_+|vQ8oAb9BQvf`5#Tur6reyA z--`e*MS!;=R32<}Tz|XT0ACxhw+#^5fLGdp+ik$THoz67=pjeO9f|^bqQDs%8g{gF zISRZO1zwK=|I%pf!0~n<+YVfAr|8Wk3(-i?dN03O+-wJ4qXj!0d&)cQz+D>Ft=&=+H+B*|nf%a?1%iP8NXT4+ZE2ZT);`N$R zC1~^$g9bf%L6unwSoVeHhC&WMyKH_I;}`{PujTIe8xkp84;wRargvv1zL=SKX_J|F zYiB0DpqZ%ZD>@TCrt*<2#X2lfsC>jS`z z0gBS)$jcZ6yo12>AaG?6cy|zJ9s-^mqNsh2)_yhw+#CWv83MjM3_LYVQTiRN-5Cac zI}G?ofG00Q9jcL7Ws_)46j>~d@zUiuNjdEr?0<5Lld z5|2;CZaD3ark4B7vL8*Y+!BwbwkuSdLagZZXxY#8#Z??0b(kU>-^$XL11kY%0a3NQ_-piER9S`#&i3s66>C004bTAQu1t diff --git a/packages/orchestration/test/examples/snapshots/unbond.contract.test.ts.md b/packages/orchestration/test/examples/snapshots/unbond.contract.test.ts.md index 4183011ae3d..25e292ad3b8 100644 --- a/packages/orchestration/test/examples/snapshots/unbond.contract.test.ts.md +++ b/packages/orchestration/test/examples/snapshots/unbond.contract.test.ts.md @@ -36,6 +36,11 @@ Generated by [AVA](https://avajs.dev). stride: 'stride', }, brandDenom: {}, + chainIdToChainName: { + 'agoric-3': 'agoric', + 'osmosis-1': 'osmosis', + 'stride-1': 'stride', + }, chainInfos: { agoric: { bech32Prefix: 'agoric', diff --git a/packages/orchestration/test/examples/snapshots/unbond.contract.test.ts.snap b/packages/orchestration/test/examples/snapshots/unbond.contract.test.ts.snap index a4f86b7a9dd231881799917ba4a065da4a0a1bbb..5e45686cd95831f52fcdc579f30f6d9ef869d1d2 100644 GIT binary patch literal 2326 zcmV+x3F-DhRzVK;-!PW_kr^l~=lqfT)Q8Y=l16Q&BTFH1 z_;0P=haZaw00000000BsT3w7AR~7!Q*Z*FRy=(7}f7dC6G?h{|o1bk$LEUV-O4NjG zHh(Rsimqqw+S481ac0KZ2B<_TLB#`7B_2>Dq>u=jKD3o80ez}?t3Xu+6`&M}NG(E0 zh#~|Jr4J}jkL~fy9cR~Gc!4}+e7^IYbMHC#oHKX!#(GuLbE^eq?IYzmnu^ueBq-m_i zlp~e4OyJ0@F6^Cb`z}#bu2YpCYgKK@Up*3?TLzUa zTT%}6B}v_o>&&zaYNYowS6EDPo zZ+`;+Weljqfs1kARvaJ+U?~B7BLUn_0F&ba)gE7ljSJb4TT&V-U+Tqq)a05K)J>Jw zG-m0%2bgiRy-0y4dsJkabPpT+xkFElbuL?7T0Yv6k)SN!slFGUd3o$>_#O+O)U8&dG$h zLCf9RGU^6RI*PskPB?nY?!xt^Yf&>*CfD~btQu@xefF$w-Nb<;r7> z>kV5LPxfV#c3nKKi28?Jn0N=n*Y(cM)?KoctaIKu34OqKU4W3%vFllQUeooBR&%+> zJL<;W@6tDyxU%dxF)Gtsm&vn=AxM&F3nW5*oV<6#@K~B|wtJ$yLS;5`Pn>e=`f?@f zsJdVS`}0G~y4ldp$|<*>l_go$TimJ~)3xE+u7~r%6S_>bdr;kpq`snF#-??VZpbA@K-G;eCo?Z9i@vW`m z(A+~sEJo+`&Ewo+2B(_2gM=-g*Eby#XN`7*M_yfN5QlGNMTcSlTr3&(V$WHsW)7FZ z3$8rP8}5V<8fTOQRwdxPBn)q3!W`IE6jB0S-PzmWpoOaULHfM8mH zPi^VyoJbaUAPqbulI-%?Je>wEq=E0Hfjc66w~uwt1n}7j0rtR_u080R(}|FN@fzc- z(+upNg6Q>34=hY;x}nO#qW}uFn^x~3Vs|jr6p2jBP!%RT4zwBV7}>jjYpb!Yp}qUI zF&*vL>f;3C5+Qt|f3_TJ5+OHSzxUZCLVoR5@X(JUZkfx}sVW`XCkg36?*626fIZe@Y@vcN}Kpfm*>nG)2deQIBx0_Z2O z?@R%&PXWK30zMMeaz3@0X`nO>oSp{sY2ey4@RMmltthIE-JS;SOan7B0`xv#843!~ z8h5`VZGGM&-8Ug$nGh?RDqnh>w|ip;8c5qmWdDroJ;1c+hRSPa^$o_&;T^LJ-8OE; zT*rKCzf!hePyQGDaw^c)8`duz!)(}dTRRpK%dxDfj9V8~$6jiFaj#`pmWIl$ZcV%C zVjZ{NL735`hIK`t3-o!$`>(J*-$Q2m3Zv7(y2bY$mxYwot#HeA$~n`9^gQkLeDQ!y zJU%q(dEhaTSE_r=-&*!M}V?+g3(9k!`2kM4cSz43<*E^hDtjqUsoi1&1KgquQ% zkoR2%;*2Z$W`l9dzU2)>azHW%&sdxEj2VTkx>a)K3`c5ABRUQZz1Zdu8=|};1v;b%Y z;D-g^y#nx$0#GgjpDPOL1)rsA5vUh|Ya+Ddv-EZmc((}LEdmEiK)nRKPy${n0dJQC z^|EiM{d)=cScHAb3ya&`JwZsKY<~}No)?7Yr#jCA@@t6mF@IRlaUI%=_c{y*4iCJ) ziOHQ@ceR7=FTTn()jfl&?K8M6swH}A`xoZLOG&rls%}`W3U4_RpLYVbzt^a|=8XE@ z*}ORvi+J9>&E_&QOtn9?MO4{bnC}j$+ec+W=oJgY1x0cPW#7X?#w6a`+=HT(A%n8- zfLP1_FN5N5;6sGO-K`gf42Ub+4~-NN=X4$X-;YP^i=W(D}5A}s3DzD0$_3q)#~%&^XJ^-_yH z!LDrThBER6;vkMKE)WO6#aCx)=?zt0W7IGxuZ{loPt^B$Gu!vZ3l*6fbb}q|msN}I w*DYpL>_4#hH`)H>sdpg&06xHXhX4Qo literal 2281 zcmVu$K?p-gASL+Hf*(R~LMWYY>ZGdB@>;X1$i{B@qHJ#O$*OdLsFFgvu-KBK z&>EHQFSl)+Mrxgknl4d&0AgGaRt2DIjuPX#DlRKp%QAhJF-62(BC8jgRm<`>mqk-e zortDo$@_Yin5K)n)G&2o%9?7KuQKMqHLYc|S26ZIAMkx2@U9P-^8(T13xew z0ImdpX9B>_0>B>wfDq(X*5_W?h%kC42z(|8w1U9PLE!g6;Qb(w4gse^z@-rIjS%pg z5GNJpr2>U8a3l;o5C*;y=HN3tJo57}@JblSMu6Q2@L~k`O9Z$t3Y?2_^pANQ-;M$_ z3cL^n-j4!{BfwWjfVW40+$iv+QQ$|Tz+Xo>srx+9HO56oZb_=k>QZ-)hYhSOM>k}( zrchH;yMQT&?M8As>2q@1OIcHg^`N-iR4w9`+R{m*F;I-V6bfDi&ouImfCp^F@Z?x8 zhQ}{ywGC6#=_)lzJ3sJ;v1=dJ(cFefOghXw;qWSK(t3uO)KryN#zwy+iNx|UEN_9^mQ<-%)b)a;XKn2=5s5T(N}1}pq76Np;ySHs zCLM10xF9^qgh52Eikq6I*oWaKjAgVz#64pR$lY{2b1OSCccJjf=!(`_QBA6= zL@^E#u%#~^GQ-(F!EmKyE!6Nu~Oq}L*HXyj77!iDT zV!($nt}*j-J)Uh1F6lbCE(E%NB@zk8)@26!GP~B0r&BG*fqUb?#Wpq^zGIhoG2dna_&hIC_KbNW0eme1{4xPV z$2s`D9@VXJ;0rwL6&$PdhFMm|zGVxdq0WwB=4LY#n@6E$n&g>!)7q{(#8ehEmo|lRy9>xQl(9usK!qFH1}EDnU!;uE?|SI64eh= zU*)Q}PK~Bw9x@Z>Jp!IYm2>z!wr_0Z)_P@euo*>!pg##jlfcO&@Wmu>BgsYlD1R`5 z-%bLzlE7<8;2%jKlj10G59MSExIYEZ6!26Ec!{S>@RZQ)6!2yW2&93dX<#J{?4&tb z#zXsh8h9!V{2~qfAq@mGz|jmx%X(;)46u>`Ze)OOWq?;Rz&kvxz|;KxNgz52R3DtLA70PY^ZPCIwISXOmA(NWKULWo7x^# zjlmtWa?Js5MVVv1zh4QL{-unT|s)Z)SZ-#*BH zAAhe!hPYXa3&L2Ixk{j_q_yf)HLV*_-$E8Rn}w@Y9CNpdg0GSVRya_C2W@15s~jlF zf&5|?kh8#dvRu}i^jvSgkpjO zo{@I)fRYEE%>%#A1Azi?PXYLB0jL!?dfqeA(*@vW0eF>%7Cj@qR{;K50FD;{QUq=m zftQQGZ;QZtMUFo0=_^aqz_Do#cGL|Uv8wy1AS_N>-wvGThq>n`?dLx6HNg3pJG)if zi1lqlR%=eT?QV}71F7)m-Cb<1QQeSxU0YZdjrrM5lX~#3OmMYgey~l6vzsz^X23le z=`QXmev|<>W$q-O%l|Jo#aqA!*b=r{&kwjEOthaKYDb*Yb?SeAKkPTTA58ZOoG@#p z$~UKhxA{~V^JLTyrU9YE!NxtXV zdH|qd>JqbD^%8Sc`ekvaa~m2F!Y`D7mrB6jOThUV;E5UF^%)>m<|cK_GpP`NDMt*0 z>gJXzKiZ@h>GhVTOG97E_0!nrQmzl2e|09NR+q(fN_3s5wc)>(@qCXr*`7CUD6do} zdvry;CY$6ipG~qHeV=cnZX{Jml`4-FyC2ibRZ^>w8ZDC@lj>#bKO_7bL5MjkqaXkP DRe@%< From fe1ec4cd2295f3ee8b70cca460c7245ba252602e Mon Sep 17 00:00:00 2001 From: Chris Hibbert Date: Fri, 21 Feb 2025 10:47:32 -0800 Subject: [PATCH 04/11] feat: encode cctp destination address --- packages/orchestration/package.json | 1 + .../src/exos/cosmos-orchestration-account.js | 10 ++++------ packages/orchestration/src/utils/address.js | 11 +++++++++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/orchestration/package.json b/packages/orchestration/package.json index 6a87081605d..b76c33375b7 100644 --- a/packages/orchestration/package.json +++ b/packages/orchestration/package.json @@ -46,6 +46,7 @@ "@agoric/vow": "^0.1.0", "@agoric/zoe": "^0.26.2", "@agoric/zone": "^0.2.2", + "@cosmjs/encoding": "^0.32.4", "@endo/base64": "^1.0.9", "@endo/errors": "^1.2.9", "@endo/far": "^1.1.10", diff --git a/packages/orchestration/src/exos/cosmos-orchestration-account.js b/packages/orchestration/src/exos/cosmos-orchestration-account.js index 0af3ebca89a..e5a211a30a8 100644 --- a/packages/orchestration/src/exos/cosmos-orchestration-account.js +++ b/packages/orchestration/src/exos/cosmos-orchestration-account.js @@ -65,6 +65,7 @@ import { } from '../utils/cosmos.js'; import { orchestrationAccountMethods } from '../utils/orchestrationAccount.js'; import { makeTimestampHelper } from '../utils/time.js'; +import { leftPadEthAddressTo32Bytes } from '../utils/address.js'; /** * @import {HostOf} from '@agoric/async-flow'; @@ -1145,19 +1146,16 @@ export const prepareCosmosOrchestrationAccountKit = ( const { helper } = this.facets; const { chainAddress } = this.state; - chainAddress.chainId.startsWith('noble') || - Fail`'depositForBurn' not supported on chain: ${q(chainAddress.chainId)}`; - const { cctpDestinationDomain } = chainHub.getChainInfoByChainId( destination.chainId, ); - if (!cctpDestinationDomain || cctpDestinationDomain !== 0) { + + if (typeof cctpDestinationDomain !== 'number') { throw Fail`${q(destination.chainId)} does not have "cctpDestinationDomain" set in ChainInfo`; } - // TODO: logic for encoding solana + evm addresses // see https://github.com/circlefin/noble-cctp/blob/master/examples/depositForBurn.ts#L52-L70 - const mintRecipient = new Uint8Array(); + const mintRecipient = leftPadEthAddressTo32Bytes(destination.value); // TODO: do we need to support MsgDepositForBurnWithCaller? It's the // same payload, plus `destinationCaller: Uint8Array`. diff --git a/packages/orchestration/src/utils/address.js b/packages/orchestration/src/utils/address.js index 908b8010d22..4b35b28664d 100644 --- a/packages/orchestration/src/utils/address.js +++ b/packages/orchestration/src/utils/address.js @@ -1,4 +1,5 @@ import { Fail, q } from '@endo/errors'; +import { fromHex } from '@cosmjs/encoding'; /** * @import {IBCConnectionID} from '@agoric/vats'; @@ -141,3 +142,13 @@ export const parseAccountId = partialId => { throw Fail`Invalid accountId: ${q(partialId)}`; }; harden(parseAccountId); + +// Left pad the mint recipient address with 0's to 32 bytes. +// standard ETH addresses are 20 bytes, but for ABI data structures and other +// reasons, 32 bytes are used. +export const leftPadEthAddressTo32Bytes = rawAddress => { + const cleanedAddress = rawAddress.replace(/^0x/, ''); + const zeroesNeeded = 64 - cleanedAddress.length; + const paddedAddress = '0'.repeat(zeroesNeeded) + cleanedAddress; + return fromHex(paddedAddress); +}; From 1fa99fb46f400172cab6553b51dd81df6f2dd6cf Mon Sep 17 00:00:00 2001 From: Chris Hibbert Date: Fri, 21 Feb 2025 10:50:50 -0800 Subject: [PATCH 05/11] refactor: support generic non-cosmos chainInfo in chain-hub --- packages/orchestration/src/exos/chain-hub.js | 22 +++++++------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/packages/orchestration/src/exos/chain-hub.js b/packages/orchestration/src/exos/chain-hub.js index 6d8c7fcd5e1..ce73018caa9 100644 --- a/packages/orchestration/src/exos/chain-hub.js +++ b/packages/orchestration/src/exos/chain-hub.js @@ -236,10 +236,10 @@ const ChainHubI = M.interface('ChainHub', { /** * Make a new ChainHub in the zone. * - * The resulting object is an Exo singleton. It has no precious state. It's only + * The resulting object is an Exo singleton. It has no precious state. Its only * state is a cache of queries to agoricNames and whatever info was provided in * registration calls. When you need a newer version you can simply make a hub - * hub and repeat the registrations. + * and repeat the registrations. * * @param {Zone} zone * @param {Remote} agoricNames @@ -364,9 +364,7 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { * @template {string} C2 * @param {C1} primaryName * @param {C2} counterName - * @returns {Promise< - * [ActualChainInfo, ActualChainInfo, IBCConnectionInfo] - * >} + * @returns {Promise<[ChainInfo, ChainInfo, IBCConnectionInfo]>} */ // eslint-disable-next-line no-restricted-syntax -- TODO more exact rules for vow best practices async (primaryName, counterName) => { @@ -379,7 +377,7 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { const connectionInfo = await vowTools.asPromise( chainHub.getConnectionInfo(primary, counter), ); - return /** @type {[ActualChainInfo, ActualChainInfo, IBCConnectionInfo]} */ ([ + return /** @type {[ChainInfo, ChainInfo, IBCConnectionInfo]} */ ([ primary, counter, connectionInfo, @@ -430,14 +428,13 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { } }, /** - * @template {string} K - * @param {K} chainName - * @returns {Vow>} + * @param {string} chainName + * @returns {Vow} */ getChainInfo(chainName) { // Either from registerChain or memoized remote lookup() if (chainInfos.has(chainName)) { - return /** @type {Vow>} */ ( + return /** @type {Vow} */ ( vowTools.asVow(() => chainInfos.get(chainName)) ); } @@ -517,12 +514,9 @@ export const makeChainHub = (zone, agoricNames, vowTools) => { * @template {string} C2 * @param {C1} primaryName the primary chain name * @param {C2} counterName the counterparty chain name - * @returns {Vow< - * [ActualChainInfo, ActualChainInfo, IBCConnectionInfo] - * >} + * @returns {Vow<[ChainInfo, ChainInfo, IBCConnectionInfo]>} */ getChainsAndConnection(primaryName, counterName) { - // @ts-expect-error XXX generic parameter propagation return lookupChainsAndConnection(primaryName, counterName); }, From 1f2c13232fb2766d3000a96357fb56e5a4d5e62f Mon Sep 17 00:00:00 2001 From: Chris Hibbert Date: Fri, 21 Feb 2025 10:57:09 -0800 Subject: [PATCH 06/11] test: test depositForBurn via Noble --- packages/orchestration/src/exos/README.md | 2 + .../exos/cosmos-orchestration-account.test.ts | 52 +++++++++++++++++++ .../test/exos/make-test-coa-kit.ts | 4 +- packages/orchestration/test/ibc-mocks.ts | 25 +++++++++ packages/orchestration/test/network-fakes.ts | 2 +- 5 files changed, 82 insertions(+), 3 deletions(-) diff --git a/packages/orchestration/src/exos/README.md b/packages/orchestration/src/exos/README.md index 0599cbbbf1a..a9b9969d024 100644 --- a/packages/orchestration/src/exos/README.md +++ b/packages/orchestration/src/exos/README.md @@ -92,6 +92,7 @@ classDiagram asContinuingOffer() delegate() deposit() + depositForBurn() executeTx() getAddress() getBalance() @@ -114,6 +115,7 @@ classDiagram asContinuingOffer() deactivate() delegate() + depositForBurn() executeEncodedTx() getAddress() getBalance() diff --git a/packages/orchestration/test/exos/cosmos-orchestration-account.test.ts b/packages/orchestration/test/exos/cosmos-orchestration-account.test.ts index f590bfa7af0..9cef6687893 100644 --- a/packages/orchestration/test/exos/cosmos-orchestration-account.test.ts +++ b/packages/orchestration/test/exos/cosmos-orchestration-account.test.ts @@ -47,6 +47,7 @@ import { withAmountUtils } from '@agoric/zoe/tools/test-utils.js'; import { decodeBase64 } from '@endo/base64'; import type { EReturn } from '@endo/far'; import type { TestFn } from 'ava'; +import { MsgDepositForBurn } from '@agoric/cosmic-proto/circle/cctp/v1/tx.js'; import type { CosmosValidatorAddress } from '../../src/cosmos-api.js'; import fetchedChainInfo from '../../src/fetched-chain-info.js'; import type { @@ -940,3 +941,54 @@ test('executeEncodedTx', async t => { 'delegateMsgSuccess', ); }); + +test(`depositForBurn via Noble to Base`, async t => { + t.context.utils.populateChainHub(); + const { chainHub } = t.context.facadeServices; + chainHub.registerChain('base', { + chainId: 'E8453', + cctpDestinationDomain: 0, + }); + const makeTestCOAKit = prepareMakeTestCOAKit(t, t.context, { noble: true }); + const nobleAccount = await makeTestCOAKit(); + const amount = { + denom: 'uusdc', + value: 10n, + }; + + const actual = await E(nobleAccount).depositForBurn( + { + value: '0xe0d43135EBd2593907F8f56c25ADC1Bf94FCf993', + chainId: 'E8453', + // allegedName: 'base', + encoding: 'ethereum', + }, + amount, + ); + + t.log('check the bridge'); + t.deepEqual(actual, undefined); + + const getAndDecodeLatestPacket = async () => { + await eventLoopIteration(); + const { bridgeDowncalls } = await t.context.utils.inspectDibcBridge(); + const latest = bridgeDowncalls[ + bridgeDowncalls.length - 1 + ] as IBCMethod<'sendPacket'>; + const { messages } = parseOutgoingTxPacket(latest.packet.data); + return MsgDepositForBurn.decode(messages[0].value); + }; + + const packet = await getAndDecodeLatestPacket(); + t.log({ packet }); + t.like( + packet, + { + amount: '10', + burnToken: 'uusdc', + destinationDomain: 0, + from: 'cosmos1test', + }, + 'it worked', + ); +}); diff --git a/packages/orchestration/test/exos/make-test-coa-kit.ts b/packages/orchestration/test/exos/make-test-coa-kit.ts index 4217c3c7df7..f91c0fca74d 100644 --- a/packages/orchestration/test/exos/make-test-coa-kit.ts +++ b/packages/orchestration/test/exos/make-test-coa-kit.ts @@ -21,8 +21,8 @@ export const prepareMakeTestCOAKit = ( bootstrap, commonPrivateArgs: { marshaller }, facadeServices, - utils, }: EReturn, + { noble } = { noble: false }, { zcf = Far('MockZCF', {}) } = {}, ) => { t.log('exo setup - prepareCosmosOrchestrationAccount'); @@ -47,7 +47,7 @@ export const prepareMakeTestCOAKit = ( return async ({ storageNode = bootstrap.storage.rootNode.makeChildNode('accounts'), - chainId = 'cosmoshub-4', + chainId = noble ? 'noble-1' : 'cosmoshub-4', hostConnectionId = 'connection-0' as const, controllerConnectionId = 'connection-1' as const, icqEnabled = false, diff --git a/packages/orchestration/test/ibc-mocks.ts b/packages/orchestration/test/ibc-mocks.ts index 6992227ee34..4a2fc33fd34 100644 --- a/packages/orchestration/test/ibc-mocks.ts +++ b/packages/orchestration/test/ibc-mocks.ts @@ -20,6 +20,10 @@ import { MsgSend, MsgSendResponse, } from '@agoric/cosmic-proto/cosmos/bank/v1beta1/tx.js'; +import { + MsgDepositForBurn, + MsgDepositForBurnResponse, +} from '@agoric/cosmic-proto/circle/cctp/v1/tx.js'; import { buildMsgResponseString, buildQueryResponseString, @@ -28,6 +32,7 @@ import { buildQueryPacketString, createMockAckMap, } from '../tools/ibc-mocks.js'; +import { leftPadEthAddressTo32Bytes } from '../src/utils/address.js'; /** * TODO: provide mappings to cosmos error codes (and module specific error codes) @@ -122,6 +127,26 @@ export const protoMsgMocks = { msg: buildTxPacketString([MsgSend.toProtoMsg(bankSendMulti)]), ack: buildMsgResponseString(MsgSendResponse, {}), }, + depositForBurn: { + // msg: 'eyJ0eXBlIjoxLCJkYXRhIjoiQ21ZS0lTOWphWEpqYkdVdVkyTjBjQzUyTVM1TmMyZEVaWEJ2YzJsMFJtOXlRblZ5YmhKQkNndGpiM050YjNNeGRHVnpkQklITkRJMU1EQXdNQmdHSWlBQUFBQUFBQUFBQUFBQUFBQWc1bzlzSjJyRzRwZXNSc2hLc21DU2duWnBIU29GZFhWelpHTT0iLCJtZW1vIjoiIn0=', + msg: buildTxPacketString([ + MsgDepositForBurn.toProtoMsg({ + amount: '4250000', + burnToken: 'uusdc', + from: 'cosmos1test', + destinationDomain: 6, + mintRecipient: leftPadEthAddressTo32Bytes( + '0x20E68F6c276AC6E297aC46c84Ab260928276691D', + ), + }), + ]), + ack: buildMsgResponseString(MsgDepositForBurnResponse, {}), + }, + depositForBurnForBase: { + msg: 'eyJ0eXBlIjoxLCJkYXRhIjoiQ2w4S0lTOWphWEpqYkdVdVkyTjBjQzUyTVM1TmMyZEVaWEJ2YzJsMFJtOXlRblZ5YmhJNkNndGpiM050YjNNeGRHVnpkQklDTVRBaUlBQUFBQUFBQUFBQUFBQUFBT0RVTVRYcjBsazVCL2oxYkNXdHdiK1UvUG1US2dWMWRYTmtZdz09IiwibWVtbyI6IiJ9', + // 'depositForBurn via Noble to Base' in cosmos-orchestration-account.test.ts + ack: buildMsgResponseString(MsgDepositForBurnResponse, {}), + }, }; export const defaultMockAckMap: Record = diff --git a/packages/orchestration/test/network-fakes.ts b/packages/orchestration/test/network-fakes.ts index b137a61930a..6dba6c9dd84 100644 --- a/packages/orchestration/test/network-fakes.ts +++ b/packages/orchestration/test/network-fakes.ts @@ -31,7 +31,7 @@ import { decodeProtobufBase64 } from '../tools/protobuf-decoder.js'; const trace = makeTracer('NetworkFakes'); /** - * Mimic IBC Channel version negotation + * Mimic IBC Channel version negotiation * * As part of the IBC Channel initialization, the version field is negotiated * with the host. `version` is a String or JSON string as determined by the IBC From 98425e3cf627457d378b8ecc2fab7cef8d338b70 Mon Sep 17 00:00:00 2001 From: Chris Hibbert Date: Fri, 21 Feb 2025 13:43:33 -0800 Subject: [PATCH 07/11] test: transmitTransferAck more defensive re: recent messages --- packages/orchestration/test/supports.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/orchestration/test/supports.ts b/packages/orchestration/test/supports.ts index 2d8a85cb056..67c118635f9 100644 --- a/packages/orchestration/test/supports.ts +++ b/packages/orchestration/test/supports.ts @@ -151,7 +151,14 @@ export const commonSetup = async (t: ExecutionContext) => { ibcSequenceNonce += 1n; // let the promise for the transfer start await eventLoopIteration(); - const lastMsgTransfer = localBridgeMessages.at(-1).messages[0]; + if (localBridgeMessages.length < 1) + throw Error('no messages on the local bridge'); + + const b1 = localBridgeMessages.at(-1); + if (!b1.messages || b1.messages.length < 1) + throw Error('no messages in the last tx'); + + const lastMsgTransfer = b1.messages[0]; await E(transferBridge).fromBridge( buildVTransferEvent({ receiver: lastMsgTransfer.receiver, From 1a32958d2511cad5c35b390e0d150d496d407bde Mon Sep 17 00:00:00 2001 From: Chris Hibbert Date: Wed, 5 Mar 2025 11:40:13 -0800 Subject: [PATCH 08/11] chore: type ignore. I couldn't find a way to effectively apply a type to osmosis in const [_, osmosis, connectionInfo] = --- packages/orchestration/src/proposals/start-stakeAtom.js | 1 + packages/orchestration/src/proposals/start-stakeOsmo.js | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/orchestration/src/proposals/start-stakeAtom.js b/packages/orchestration/src/proposals/start-stakeAtom.js index f6a245bfc08..52589b53a4b 100644 --- a/packages/orchestration/src/proposals/start-stakeAtom.js +++ b/packages/orchestration/src/proposals/start-stakeAtom.js @@ -66,6 +66,7 @@ export const startStakeAtom = async ({ chainId: cosmoshub.chainId, hostConnectionId: connectionInfo.counterparty.connection_id, controllerConnectionId: connectionInfo.id, + // @ts-expect-error cosmoshub is /** @type {CosmosChainInfo} */ icqEnabled: cosmoshub.icqEnabled, }, privateArgs: await deeplyFulfilledObject( diff --git a/packages/orchestration/src/proposals/start-stakeOsmo.js b/packages/orchestration/src/proposals/start-stakeOsmo.js index 77bd2d562c8..19f089c2681 100644 --- a/packages/orchestration/src/proposals/start-stakeOsmo.js +++ b/packages/orchestration/src/proposals/start-stakeOsmo.js @@ -71,6 +71,7 @@ export const startStakeOsmo = async ({ chainId: osmosis.chainId, hostConnectionId: connectionInfo.counterparty.connection_id, controllerConnectionId: connectionInfo.id, + // @ts-expect-error osmosis is /** @type {CosmosChainInfo} */ icqEnabled: osmosis.icqEnabled, }, privateArgs: await deeplyFulfilledObject( From b05c0f53f959a8e6ccc7a4da86cf79c76f16d570 Mon Sep 17 00:00:00 2001 From: Chris Hibbert Date: Wed, 5 Mar 2025 11:46:27 -0800 Subject: [PATCH 09/11] chore: correct parameters in call to prepareMakeTestCOAKit() --- packages/orchestration/test/exos/portfolio-holder-kit.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/orchestration/test/exos/portfolio-holder-kit.test.ts b/packages/orchestration/test/exos/portfolio-holder-kit.test.ts index b456399b57c..c9dc2ebc74d 100644 --- a/packages/orchestration/test/exos/portfolio-holder-kit.test.ts +++ b/packages/orchestration/test/exos/portfolio-holder-kit.test.ts @@ -24,7 +24,7 @@ test('portfolio holder kit behaviors', async t => { }, }); - const makeTestCOAKit = prepareMakeTestCOAKit(t, common, { + const makeTestCOAKit = prepareMakeTestCOAKit(t, common, undefined, { zcf: mockZcf, }); const makeTestLOAKit = prepareMakeTestLOAKit(t, common, { zcf: mockZcf }); From d5e70c2ca9edaeae60b1b21e62b04f535c0015c1 Mon Sep 17 00:00:00 2001 From: Chris Hibbert Date: Wed, 5 Mar 2025 11:47:09 -0800 Subject: [PATCH 10/11] test: update snapshot in fastUSDC --- .../snapshots/fast-usdc.contract.test.ts.md | 10 ++++++++++ .../snapshots/fast-usdc.contract.test.ts.snap | Bin 23623 -> 23707 bytes 2 files changed, 10 insertions(+) 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 06fdfc8ca41..517b58ef478 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 @@ -38,6 +38,11 @@ Generated by [AVA](https://avajs.dev). brandDenom: { 'Alleged: USDC brand': 'ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9', }, + chainIdToChainName: { + 'agoric-3': 'agoric', + 'noble-1': 'noble', + 'osmosis-1': 'osmosis', + }, chainInfos: { agoric: { bech32Prefix: 'agoric', @@ -1593,6 +1598,11 @@ Generated by [AVA](https://avajs.dev). brandDenom: { 'Alleged: USDC brand': 'ibc/FE98AAD68F02F03565E9FA39A5E627946699B2B07115889ED812D8BA639576A9', }, + chainIdToChainName: { + 'agoric-3': 'agoric', + 'noble-1': 'noble', + 'osmosis-1': 'osmosis', + }, chainInfos: { agoric: { bech32Prefix: 'agoric', 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 eb51e85e3f44942b12eb565318653cc16ceee61c..cdf8ac5bd53bd6c5efcc8c13b2a4db57df8dcba8 100644 GIT binary patch literal 23707 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 a2X6)`KDjfdvGxtzzMAp$Rw5V2x%WRkAw5w5 literal 23623 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 Date: Wed, 5 Mar 2025 16:17:07 -0800 Subject: [PATCH 11/11] test: reset snapshots for builders/test/snapshots/orchestration --- .../orchestration-imports.test.js.md | 3 +++ .../orchestration-imports.test.js.snap | Bin 4174 -> 4205 bytes 2 files changed, 3 insertions(+) diff --git a/packages/builders/test/snapshots/orchestration-imports.test.js.md b/packages/builders/test/snapshots/orchestration-imports.test.js.md index 4030cf35908..4e09d751ad8 100644 --- a/packages/builders/test/snapshots/orchestration-imports.test.js.md +++ b/packages/builders/test/snapshots/orchestration-imports.test.js.md @@ -167,6 +167,9 @@ Generated by [AVA](https://avajs.dev). bech32Prefix: Object @match:string { payload: [], }, + cctpDestinationDomain: Object @match:kind { + payload: 'number', + }, connections: Object @match:recordOf { payload: [ Object @match:any { diff --git a/packages/builders/test/snapshots/orchestration-imports.test.js.snap b/packages/builders/test/snapshots/orchestration-imports.test.js.snap index 44d4ef6c72d4443dca1605e8a32cc3a08bc4b475..6f84b2bb41b644b42c2183f8699f177cae61ee75 100644 GIT binary patch literal 4205 zcmV-z5R&gfRzV>1g8y zaZ1(Xc(r=^UpiMp&REz;4ns_7XyqloFuw5n&0-Iqv+x_HIfySykz_CFyYEdOf& zj{0EezBK>+k@@dGp8x)i2WapD zLtbFY3;dB6c+?A=^8)XCfleQ=)d!?}z->O@t3KeF`R}j!fT$lB_5(>jaQpoKQK2j> z2oa%dr<#~aN;Ne#5UL<7gAf*kZ}@?j;Dz9i2-QRJxH_ZgL)z4yX)!Gsz%K|89!fd% zKv_YL3@LNFMBStcNSGi|iez?6aaBtg(0b};cv_T|p+rKHGMR#(O9>J-kWpn)E$C^Y zR}8DNQjq?HNU>oxlTtH7nT({{9Xv&-g(g)zl4qUnip1kDCv`g_C8a5&FBO1w1gII2 z6g9=G?h*$vBI%->ED$Oo!Ukav;uO&<4ZWb)-?v+zgMi*0QgDOCG5~zCb(T!?i&fX|b5+J;HE-fXtWoXCyEzuXm zvpsjS7#9=LPD!6u6B&b9QAtKqBHMAcikWFcx|~R{v?irRO)~ob)|rW+L`qf+>I;Nw z%2UQz8C7&iGhVw#(q`qj8PxNHU#Lk_az>Xl!)<0rNf^V`jI1G80BeuP`m_NJi)nE} zPRhD0nb?&Ci)1ld3udQl&mBSF?w~P6Muf7liGxyH7d#OmkP`Ly^o6QsOqKz`^KcOO zCI`zoSOcNLz@G^MKjCA_N@dc1vA?^4u5#ZsiuM-QE;7>`sM%`?+1O%bWb) z2?1wAzzZSZ?GR91#jMxatDy#h&v?~}DxizQL(V#@0=9E(i(5%d_lYXtAh+9be!Cm1 zfLpoUxLaMHssirk7JJ<+zEcI9WvHEp)e`I9d&iRRbw*b;KUdVnnlZOJOcG;K1e?#aJUep91+tEs9RD%=o5K z#^;%NnVXwSxhXXvGy7Xg*%zOunf0xutew+0vpnIjtb!mI%fN~1!ZJ{v7Uz}}Q z?(*~QvcIN;>@nmHBA1CqZf892A=ZO}x?JQ{qbSHJ6(N#^Hl6I*HQ#?t; zkS?br%`&yZKV2$(vpYURWqmF!eN;;t!cU0cpB0lc60!O@6%|oY&Emd9on@rBs$>&K zE0kB@o=jdVScLsOD&?XC>l^Y566I5 z3}|9t8wXd#fbJM@0Rz`?a3lt7ivfEX*vAWWbqtVVY*||$5vt9_P?J)sE>7gm6s%HR z9|Mkas|$-{)hA=XX%2p*g!_Qt`Bn@#!}*OaYqRfXG2mZgz^`J!Z&+!!^3n>mKzXel z+R33vEwGS5m+=a2tp!%r0=*3UC;!FN+F@R?fRYqh`|+|@*}eA)VJEwrw;st$X`<-aUk4mu7M@R{q)DYQrvwFIw$3=E3kt&NIvDeiB|T$FzvEK- z!o0M9p(P2%gJY&-eZSxOZkqnWGA&!gybdkOOGz%>Zb@fyQekad0~bv6a$ zfmzvzHAfh@m*G_jX;Pd?>PBzK7*ETqIAiTcvP*gX>Ee=yI7VefmXP&{^tcQu(8Wvg z1-fzx>p7n_C9CegzQna@epOTs2%feEU{wPfJ-%#6=7gwgvNDyQ3pX|ZTN?ne0l1DE zl{t1W4Ldeu|I+}VkztXD5YA8e+1Yz+GLJ8A1e!S> zwGL7g)pESP5xA6-3;FxY_BR3t8i7nB@VQ3dfkxo(x!Dp&*gu{(dx2xiI9C3fM&R8> zpuPzhY67lm0ZGy-sA&P#wE*KS?5*1vZdbQ+X92kdP+Nc#ExAiK5n+#HKu*sssBtX@I)){Z>_*@TY>te%;A1V)n2?5 z*tit9oTCREsInB$mja*R=v5B%^itq~dCzA!8h0&`;waHimjb_B3V7OpMQy;QHs(-u z^wC5caFAoOjs`f^2He~RoN5EkwgGRn0SlHfvpI)Z_cCB`88E&Km{|s#Tn2obnR#x6 z-OifJUszURs`nc5J5)CIkE7;}`h6k+o{d73^+z`O)RYN^NbsA189*RN{N&Y0wDs>KR4O-4VP=JtpK#Iw{T>!rRoB zBBo4V?~$ivnYq-2nk3=*R+I>@%#bUI9GZ~g)BSzpnlvdNHM26J*2d#{dPK_TvSMuh zN7PjQgrJUK!MK%ln5Ef7#7a4Sc$1P%dCaCvQ!PE2qS`FcsxrEGNLHrys)r;cLz??f z2}BR6{*pYem=%+9Ley1_RLj>WkTCBzbAZ{Izd-@}xzV?X6v#@u@=bAu8X1*sO4e(i zSmEr_MN&n7Qk;;I*0*8vEXK;t-d>T<&e~U&OgGQtW6#RGj}rwSX3-y7Nm|{=FjG=O z7IkU26qnPol&j;vAy~O4>018s>hGwKJ?&9vbi;kQA%AzJy^@UkRI|;Wq;EEkMI>!p z)bzPw8}>B87Eo+l)$|;5jxYgLOGsLN&hfO9K9eq31juuLMi=$mF968n@>xmC7#DEX z_>Q&H(j>FBbG2+btS3?^7iKyera3N%>d9GbFCM~W&*W_gDVwViVJE-&QPfN^+lRiz0`ZTe)mo~z5 z;f;SzYap$uvvhL*GHnV~8BVIX>GbE+o2rbZC56;W%_>p~>8LI#**45wr<=ddSXHcY zM#$48imD82vM$HP3Skoh}u+sQ)V00fw-7VZkH8n z7wOB)DRBlxR3k7kIh6NOeES&Eq>P?tEF{}Q!_A)g6ov74~={JCX_+`DJ?tu%-i8-(lYnEO6Tp#7duX z1q9D<2QbP5X^03_xm)|J*WA|BS#alxSwQeibO6)bMUYFD7&x|*w6`F z(Ft7N3Eb5QJj6{$9LfJbb^`yxu}zMKFS8$P7OjkzJAqfZtFglIN?c5en!P`aaVOr& zE}*6h=rcC{Zl4*L(jzh3ZdV%3y z;HqBWcrWnfUf^kNHtndAS9^gsd+pVGm{;$+y@03B4rO?YhWda7eZUF^{-F&#|DJxM zd4OPD&Gh!!Z>-{d`KkJ|ee4$J_C9ip^8w!Re+0vV@V9-gzm)lQUx^WD&Z*D$eVFZq zU;O{rUsUv;cQ;hs|N9f}hLYi0t-rb7e$~07pLCp1_AQnN?>_a2!R+ogyHG&z9PbBC z^s@oe@Rlh&FWa)VL}ROKff@epV@2f{zz+Scct~NO_LTA3JwHA zNtz*@K%1tJq@k(zz1_Fxowxf;ndwYCo*n=K!~S_mNs9T38T@O3{B6TA@o5us){kx*w8eOQ~?JuPM=gK&`$ z!oz6?9;hhdkzr+ir>L8(A|*^HQA){PCnZ!ZX^_@YJtNbitPCfUnv~5J^=u%Nut6D9 zCeh@mCVxj!G$M%9u+< z!WD#2J1Qw^n!D~Q2V+#yMLAVusDu$V7jYxxpaI+pHOF%WYM^7 zqLNHW+L*x|Cfw>>nyRbuqM{T5qkH7El-0#_#$XjmrwFNL&)jA;Id317?-4?H&wNHo zUX!I0@4pGYFp-D3;NrjHpS*{NFY+ zF`P`xioyCUVKo<6##$LubV)N_yIay`<%DU}ON75jlcwaXE@_6^?68tFmaA!5V|9^O zcSP2w4bq615hvu7tjm%~yMfRmIht(*bK%WKhopoqcp^d|E$WHs z^{QqB%Yfi{uo`%T6Dv8f7QzC9e!d!bfzxXu!UB^nD#-%B!r=c$HSjj)*F}Vg$Mu7`a;5A09Wkk;#QQ+5%RBt1h8@{#e|4$U~ z#q0u0`Rl_mAQl6f8F3jWcE*6-7;q&cuHnSd7;sGt*u#heyh8_LfD~if+Pa8PV{V3; zlvZ_dB41OmdUZ4g9OqK&OJvojW58KX+*n3^K=6Dk20X#}n_c#1--|Ke)fn(^G2kuM z+ikqJLLE?9XD998q(~jGh>_mU9o$w2tgHk28S#2fd|w@~xemCN5pU$L-B$-3sAFBf zDI!#vT|X=rj}$kR`V0uZ6Lr9yb->r^fH%3SiBkEp_1RV&U2mu!h}Hv5^>&lf+~igD zz#2xH;iPr-z=nEe%v?l>n7LxwIFQmr(X+1}IKU)4A3<4>DkG*;3&L!@QKhREgtPT9 z;*bTMx1e`8v}#cS+PBDp1f$_r6SAJqSTu{>l2&7UoH zjj6#UuJDjMd}B$t3c03gLAZU1<-H{+^!R-4tB1JY-es8vW&R7>$-6R@5$7xDL3>}~?~HvwuBaAy`eq>B42(Aehntz$a)UKsw;GmAQ17q!g$f#B}~LkF-`~=hG8vikNr7-Motg4o*mk>G;4dO`4SF%!G}anXobm)6Cck zQZJAbH*ZmLd5k$m8!48VOjB$N!9rPGJS;0yd(^{{k|pDqB_vvTnkVfGX2q186m?Z2 z{rxZ{B+X09Ji(l$w^M?>81yj$1#-~Nf{#B*g$ys6P_gK6?vOhotQiHGO`>M*9+>Eu^$vs;1{T zUnZP@swE|@5KNvSNJXY7@jPkwXLV6G$Mh$(H?xwKHEz|cmGPRbH>sR=4$7v&*9jEN zo0-X(X|9V^Mbwj*Sh}jD39Y2LM$g~z=3PRnnkxvcda`(nZGb%l^rfY=Sz;O>t)cu- zZIk4wX>*7V5V$rETer1j878Rm-0ww5`Hg!~7k&dCuu9<(w#KZBSHYM3Z$nA*QyJQZd|F z-jmkyznYNzn{uT|GLv=?aDk{z6;4{VRUJr(snm8^v5tnm?7Wg-q=;%5CZ>i9T1uY@ zgPN4p3ml7*8#!W1wI=B^nqqK>wV(UrvG&2T)&^{ew7+bP(yHk_(g}R0ljTQMxHMAL;^b;{sjfY^^NZ)mxuVi|^?I&Tx%G z<%jLjF5q#_e_wh2kGp_ZIDdn)ivgixK{rs-4Xo-0c60+%-N3PKCOYcK=kM+Y?&Y*C zjv=qG*C|UnM zEj_@-9;WC64n_ORbjzGI2YUdCD@nSQP>=Qi$GOCmo5blJ;4GKOxU8aFwY~>AIXm#K~BtGTNS zDdWg$RtejBQlqAw?)l=@T`j$KV+IzKR!HklWCS^sUn_$%%`>DxH z$ZUFixeU|V4-3hgc|s-90ZmFs@@yWdr+R5>-ADnNTARIVC$LYE=Jd;VEw_hS3Dy{q zXUXh1fkMSIo&j6(*Ar4$lV;^ymPGQ&kCei9&ZH+KdN%v$8rLEGjywF8JKWIg3U4Y2 z2LzAY3#h$pK~|S6^yJrcsC2qv{&enBy};*t?c0A7zcxG53!Li(9$>_kJX(Ca7kHA9 zx;g0wy}+})2Wy?B>t5jZoOac_y*Kl;^a0EJnD|!L++{-_Fv>;tTd{6Jo{|;1Nd$z7 z1ARcE4>;Nfe7O(!hd$s+nlbgO1MlTv;TQiuP8Kf=T=pFF@*k18HSu!hTBBbVx8Gbg z#L2`7=H6my@a|QQ7@W4aIfVj(XLlUfA7=}u+3kmhS{#_;6068>gy#z@dzHceTpYNE z^LrfeW0XhR8`x6wJs1Zbi33l@fgi^0%WaZ}X5-!d3vu9L9C$qr{5lT&fr-f_#OP;0 z@Kg-~wS&z350!P0wJ16V-%DPS-@Hu~JBf-yP20NH-ZNMT2saE`_u4lNTKC#M^WNHG zrHU*q&#D%Lx!hMTdFRoRW(Ne%*+Jm12JP-^DZL@CD)Z^Hb8OWwL6pkW9Y7-FN;>WKT-4guG3+J_yt9%k+%50$)9P)Tzj_vclLQ9rdj z_ysC9s~*|gM|Q^V4*}0`1KLWRJ3Vg?0q-!X=NQVIY2QV{TcPm0tbT2o!QQYI7+uTW YeQU|GZ?5