From 4d17a3f49064e1c53dc18271b36a3d0570960838 Mon Sep 17 00:00:00 2001 From: 0xPatrick Date: Mon, 9 Dec 2024 19:09:59 -0500 Subject: [PATCH 1/4] chore: publish account addresses to storage --- packages/fast-usdc/src/fast-usdc.contract.js | 26 +++++++++++++++++++- packages/fast-usdc/src/fast-usdc.start.js | 1 + 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/fast-usdc/src/fast-usdc.contract.js b/packages/fast-usdc/src/fast-usdc.contract.js index 734bd423a3c..72b231d8d10 100644 --- a/packages/fast-usdc/src/fast-usdc.contract.js +++ b/packages/fast-usdc/src/fast-usdc.contract.js @@ -30,7 +30,7 @@ const FEE_NODE = 'feeConfig'; /** * @import {HostInterface} from '@agoric/async-flow'; - * @import {CosmosChainInfo, Denom, DenomDetail, OrchestrationAccount} from '@agoric/orchestration'; + * @import {ChainAddress, CosmosChainInfo, Denom, DenomDetail, OrchestrationAccount} from '@agoric/orchestration'; * @import {OrchestrationPowers, OrchestrationTools} from '@agoric/orchestration/src/utils/start-helper.js'; * @import {Remote} from '@agoric/internal'; * @import {Marshaller, StorageNode} from '@agoric/internal/src/lib-chainStorage.js' @@ -72,6 +72,17 @@ const publishFeeConfig = async (node, marshaller, feeConfig) => { return E(feeNode).setValue(JSON.stringify(value)); }; +/** + * @param {Remote} contractNode + * @param {{ + * poolAccount: ChainAddress['value']; + * settlementAccount: ChainAddress['value']; + * }} addresses + */ +const publishAddresses = (contractNode, addresses) => { + return E(contractNode).setValue(JSON.stringify(addresses)); +}; + /** * @param {ZCF} zcf * @param {OrchestrationPowers & { @@ -160,6 +171,19 @@ export const contract = async (zcf, privateArgs, zone, tools) => { ); }); }, + async publishAddresses() { + const [poolAccountAddress, settlementAccountAddress] = + await vowTools.when( + vowTools.all([ + E(poolAccount).getAddress(), + E(settlementAccount).getAddress(), + ]), + ); + await publishAddresses(storageNode, { + poolAccount: poolAccountAddress.value, + settlementAccount: settlementAccountAddress.value, + }); + }, }); const publicFacet = zone.exo('Fast USDC Public', undefined, { diff --git a/packages/fast-usdc/src/fast-usdc.start.js b/packages/fast-usdc/src/fast-usdc.start.js index 915df4e9cb3..f940e403865 100644 --- a/packages/fast-usdc/src/fast-usdc.start.js +++ b/packages/fast-usdc/src/fast-usdc.start.js @@ -224,6 +224,7 @@ export const startFastUSDC = async ( produceInstance.reset(); produceInstance.resolve(instance); + await E(kit.creatorFacet).publishAddresses(); if (!net.noNoble) { const addr = await E(kit.creatorFacet).connectToNoble(); trace('noble intermediate recipient', addr); From 092ad4a51b445010c9f7849307eee27c5375a587 Mon Sep 17 00:00:00 2001 From: 0xPatrick Date: Mon, 9 Dec 2024 19:27:18 -0500 Subject: [PATCH 2/4] chore: publish `PoolMetrics` to child node --- packages/fast-usdc/src/fast-usdc.contract.js | 14 ++++++++------ packages/fast-usdc/src/fast-usdc.start.js | 3 +++ packages/fast-usdc/test/supports.ts | 1 + 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/packages/fast-usdc/src/fast-usdc.contract.js b/packages/fast-usdc/src/fast-usdc.contract.js index 72b231d8d10..0aa443c1aa1 100644 --- a/packages/fast-usdc/src/fast-usdc.contract.js +++ b/packages/fast-usdc/src/fast-usdc.contract.js @@ -53,10 +53,11 @@ export const meta = { privateArgsShape: { // @ts-expect-error TypedPattern not recognized as record ...OrchestrationPowersShape, + assetInfo: M.arrayOf([DenomShape, DenomDetailShape]), + chainInfo: M.recordOf(M.string(), CosmosChainInfoShape), feeConfig: FeeConfigShape, marshaller: M.remotable(), - chainInfo: M.recordOf(M.string(), CosmosChainInfoShape), - assetInfo: M.arrayOf([DenomShape, DenomDetailShape]), + poolMetricsNode: M.remotable(), }, }; harden(meta); @@ -86,10 +87,11 @@ const publishAddresses = (contractNode, addresses) => { /** * @param {ZCF} zcf * @param {OrchestrationPowers & { - * marshaller: Marshaller; - * feeConfig: FeeConfig; - * chainInfo: Record; * assetInfo: [Denom, DenomDetail & { brandKey?: string}][]; + * chainInfo: Record; + * feeConfig: FeeConfig; + * marshaller: Marshaller; + * poolMetricsNode: Remote; * }} privateArgs * @param {Zone} zone * @param {OrchestrationTools} tools @@ -237,7 +239,7 @@ export const contract = async (zcf, privateArgs, zone, tools) => { ); const poolKit = zone.makeOnce('Liquidity Pool kit', () => - makeLiquidityPoolKit(shareMint, privateArgs.storageNode), + makeLiquidityPoolKit(shareMint, privateArgs.poolMetricsNode), ); /** Chain, connection, and asset info can only be registered once */ diff --git a/packages/fast-usdc/src/fast-usdc.start.js b/packages/fast-usdc/src/fast-usdc.start.js index f940e403865..070025a6c5e 100644 --- a/packages/fast-usdc/src/fast-usdc.start.js +++ b/packages/fast-usdc/src/fast-usdc.start.js @@ -78,6 +78,7 @@ const publishDisplayInfo = async (brand, { board, chainStorage }) => { }; const FEED_POLICY = 'feedPolicy'; +const POOL_METRICS = 'poolMetrics'; /** * @param {ERef} node @@ -175,6 +176,7 @@ export const startFastUSDC = async ( chainStorage, }, ); + const poolMetricsNode = await E(storageNode).makeChildNode(POOL_METRICS); const privateArgs = await deeplyFulfilledObject( harden({ @@ -182,6 +184,7 @@ export const startFastUSDC = async ( feeConfig, localchain, orchestrationService: cosmosInterchainService, + poolMetricsNode, storageNode, timerService, marshaller, diff --git a/packages/fast-usdc/test/supports.ts b/packages/fast-usdc/test/supports.ts index 7a64bcf2ff2..7106b0e948a 100644 --- a/packages/fast-usdc/test/supports.ts +++ b/packages/fast-usdc/test/supports.ts @@ -233,6 +233,7 @@ export const commonSetup = async (t: ExecutionContext) => { localchain, orchestrationService: cosmosInterchainService, storageNode: storage.rootNode, + poolMetricsNode: storage.rootNode.makeChildNode('poolMetrics'), marshaller, timerService: timer, feeConfig: makeTestFeeConfig(usdc), From bd2a9601aae0f9574ed71ac07dc470636e2e5687 Mon Sep 17 00:00:00 2001 From: 0xPatrick Date: Tue, 10 Dec 2024 13:11:01 -0500 Subject: [PATCH 3/4] test: `fastUsdc` vstorage coverage - include `poolMetrics` and account addresses --- .../boot/test/fast-usdc/fast-usdc.test.ts | 29 +++++- .../fast-usdc/snapshots/fast-usdc.test.ts.md | 87 ++++++++++++++++++ .../snapshots/fast-usdc.test.ts.snap | Bin 1193 -> 2150 bytes 3 files changed, 115 insertions(+), 1 deletion(-) diff --git a/packages/boot/test/fast-usdc/fast-usdc.test.ts b/packages/boot/test/fast-usdc/fast-usdc.test.ts index fe4b367de3f..0853f6b183b 100644 --- a/packages/boot/test/fast-usdc/fast-usdc.test.ts +++ b/packages/boot/test/fast-usdc/fast-usdc.test.ts @@ -160,7 +160,34 @@ test.serial('writes fee config to vstorage', async t => { await documentStorageSchema(t, storage, doc); }); -test.serial('makes usdc advance', async t => { +test.serial('writes pool metrics to vstorage', async t => { + const { storage } = t.context; + const doc = { + node: 'fastUsdc.poolMetrics', + owner: 'FastUSC LiquidityPool exo', + showValue: v => defaultMarshaller.fromCapData(JSON.parse(v)), + }; + await documentStorageSchema(t, storage, doc); +}); + +test.serial('writes account addresses to vstorage', async t => { + const { storage } = t.context; + const doc = { + node: 'fastUsdc', + showValue: JSON.parse, + pattern: /published\.fastUsdc\.(feeConfig|feedPolicy|poolMetrics)/, + replacement: '', + note: `Under "published", the "fastUsdc" node is delegated to FastUSDC contract. + Note: published.fastUsdc.[settleAcctAddr], published.fastUsdc.[poolAcctAddr], + and published.fastUsdc.[intermediateAcctAddr] are published by @agoric/orchestration + via 'withOrchestration' and (local|cosmos)-orch-account-kit.js. + `, + }; + + await documentStorageSchema(t, storage, doc); +}); + +test.skip('makes usdc advance', async t => { const { walletFactoryDriver: wd, storage, diff --git a/packages/boot/test/fast-usdc/snapshots/fast-usdc.test.ts.md b/packages/boot/test/fast-usdc/snapshots/fast-usdc.test.ts.md index 1441f49490d..4b19508a1d9 100644 --- a/packages/boot/test/fast-usdc/snapshots/fast-usdc.test.ts.md +++ b/packages/boot/test/fast-usdc/snapshots/fast-usdc.test.ts.md @@ -72,6 +72,93 @@ Generated by [AVA](https://avajs.dev). ], ] +## writes pool metrics to vstorage + +> Under "published", the "fastUsdc.poolMetrics" node is delegated to FastUSC LiquidityPool exo. +> The example below illustrates the schema of the data published there. +> +> See also board marshalling conventions (_to appear_). + + [ + [ + 'published.fastUsdc.poolMetrics', + { + encumberedBalance: { + brand: Object @Alleged: USDC brand {}, + value: 0n, + }, + shareWorth: { + denominator: { + brand: Object @Alleged: PoolShares brand {}, + value: 1n, + }, + numerator: { + brand: Object @Alleged: USDC brand {}, + value: 1n, + }, + }, + totalBorrows: { + brand: Object @Alleged: USDC brand {}, + value: 0n, + }, + totalContractFees: { + brand: Object @Alleged: USDC brand {}, + value: 0n, + }, + totalPoolFees: { + brand: Object @Alleged: USDC brand {}, + value: 0n, + }, + totalRepays: { + brand: Object @Alleged: USDC brand {}, + value: 0n, + }, + }, + ], + ] + +## writes account addresses to vstorage + +> Under "published", the "fastUsdc" node is delegated to FastUSDC contract. +> Note: published.fastUsdc.[settleAcctAddr], published.fastUsdc.[poolAcctAddr], +> and published.fastUsdc.[intermediateAcctAddr] are published by @agoric/orchestration +> via 'withOrchestration' and (local|cosmos)-orch-account-kit.js. +> +> The example below illustrates the schema of the data published there. +> +> See also board marshalling conventions (_to appear_). + + [ + [ + 'published.fastUsdc', + { + poolAccount: 'agoric1fakeLCAAddress', + settlementAccount: 'agoric1fakeLCAAddress1', + }, + ], + [ + 'published.fastUsdc.agoric1fakeLCAAddress', + { + body: '#""', + slots: [], + }, + ], + [ + 'published.fastUsdc.agoric1fakeLCAAddress1', + { + body: '#""', + slots: [], + }, + ], + [ + 'published.fastUsdc.noble1test', + { + body: '#{"localAddress":"/ibc-port/icacontroller-1/ordered/{\\"version\\":\\"ics27-1\\",\\"controllerConnectionId\\":\\"connection-72\\",\\"hostConnectionId\\":\\"connection-40\\",\\"address\\":\\"noble1test\\",\\"encoding\\":\\"proto3\\",\\"txType\\":\\"sdk_multi_msg\\"}/ibc-channel/channel-1","remoteAddress":"/ibc-hop/connection-72/ibc-port/icahost/ordered/{\\"version\\":\\"ics27-1\\",\\"controllerConnectionId\\":\\"connection-72\\",\\"hostConnectionId\\":\\"connection-40\\",\\"address\\":\\"noble1test\\",\\"encoding\\":\\"proto3\\",\\"txType\\":\\"sdk_multi_msg\\"}/ibc-channel/channel-1"}', + slots: [], + }, + ], + ] + ## makes usdc advance > Under "published", the "fastUsdc.status" node is delegated to the statuses of fast USDC transfers identified by their tx hashes. diff --git a/packages/boot/test/fast-usdc/snapshots/fast-usdc.test.ts.snap b/packages/boot/test/fast-usdc/snapshots/fast-usdc.test.ts.snap index 820fa8ddbf3bcfa3c1b40a990a2289fbb9915614..0245ac610536e1cb1eb05b4dcbb3488a31497b0d 100644 GIT binary patch literal 2150 zcmV-s2$}amRzVTcgM2TxIu zR}M@FWgm+O00000000BsSZ$0OM;U%*cYWvha?Kq{k&0+Katck*eR%KUJ10dbuCFOk z(=^Rj`8WvU-SK&I>m9Q*zT7E9BB1`_2ci;Hq5L3e5E4>%V%zI|8L+yn3MH@Ia9yU@$BkD_j3fGyG%;oXECAR`#->TC z7=~<%koMD_J$pbhAOvKBkPo+=Ob%cjz}FIvM$*v$*^Rx#z&>Jvq^8OJ^+wtEWR<&f z6(-er={j>!=BIVyx|^F(CnV~}`Za*x0eA<%JZbec_GI}IcN8%@k5f}qAd`r?xQCE) z1fA|CohtJJ9o*v*WKWb#+qf?fWuF(pXaZOUZ*Z9u{3UiK>{s*pwNGxCs5mDd;*75x^i zM%u|YY6|&WCUcf^%6utkS+LNhH5SS$^L;N^qmBqRc%Z9F4_;J)vU;7f@ZzDlHXGc( z%?4C|g|)$CVEz7%k-_sLlfnD@lR-)6t$TT~!v(3=0K5s{UjU{EFgu(NEWOSikFB%a zPHVoMVTx<(M$Bqee5Q2k^;qjfjcs0Fp~uR8)8*&!fEz7KGhmvS|0KXI0=zG|XcIh; zCT89M9yWk8NocwU+Ax4C2JmbWx~m8JeFONR0lblfW_k)_=<)o+hz-`|fv9-_QzFzx zYHk~M1&taHo2HKU<1s+09J0VoEcDa{^BY{hk=-O^=W@AR%>Sv;{KxaTTq45L=79Xa zutWZ7V!mVo-!p-qnS<#yP0YWTz~4+@+)6;lyP;DcW9|PmF+XSlGZs)vx=r--;99^X z3%Hhq?%v_6ebXALZiXE%*(;+tlZBY?FGuq=?XHjY+Yx)VLDJm?8Ji}1i@wj-xO=oo zzdB4${iFYuIQ-$=h(nWh257@Jr#3<@ZCVLBDsXoQzymD-s0-oK8dss`$iWhjx^TxN z;Oiqx!2UiG5T*V^GjrX~w>ly){uY3@0qi2c2MACiK!pI$3>SkjJ^gOPxOCy}ufRWMq|v{Am%YsDz9Z;o@`gq(^& zCN<==5PrwJ6{litKEvy5OX@1$G=T3Iz>kM3%UcHUwgH$)Y8&f;?l*x4P2k}qG}8n9 zgb94c1TH6`y>#}R34Ei)uY>3;P0U}J!0RUP*Ccdu2j;tHL<))1&k<{YR=Cy>t^4wA z^!(M^@O|Mne6Nr0o9>ar9SJv0%x_!3OBV2xA=;QG<{vHK&lZ5x;9blVNUGm|XHXBM zMpluI@9EKf(>>d>`#J@Q*6-PfC1ke_rCQqa#!&5v@!byU6KTx(vn6`c`)tE=J+&2e zO8KU^J2dCPmgX?W5sg4m);!GdA;L3OjR{Yx0N^74J__J0fKLw-Axn#c*9}c_(W9Xs{}er%diG6fkpPy+AeBlJvq*r)2=Ms?&`JWoM1Zdl;FSb$JPCY_0B;f? zV{`*ELk03Zy#lGnb+6GJZ9kubeMFV%YYw}@*7?a&v31vuerfl~zEE-m=iKPd#skKID_LJS%x`6zJ(`{O%Fb+EglgV%m_CXN-{;}1JugBx+K0_w zSlbScUwId6a&0wxRS&OqZ#dt+KeV$m z*^t+S;)yy`MSZ?2@viDb1NgtL%2hqHPWG8u=`M;K>*mrf+pYn&-7#BJinqwi!?bvy z{;rg0`}$}uLn)=FgyKhOA71-pb0HU<=EdfxX8M9!G|__Sh|#rUKd2Wd9@e<)F|{3) zvXIB5yu3w^HECjAgie*~J%A?y9eBfI^r6e1sy-PvJ)}E4s8{Ld93g8$9-57uXIoM} zyY8vEOR_oKyJ4>p*4R3iv>{!GGIt|7wDoK(KKA!JcA$NI1Qw=$n+jI(c z*;%r4`SMbZEi4{(mYsZ#IrehFUgBlP&F7bFcX4UStrW_Y#WK$ysZ ca;nO`kg82uWwOfU|8_(AAEU=jv>h7&0JuFVy#N3J literal 1193 zcmV;a1XlY&RzVpL2 zz;^)f2LL=thPmcm@U9`(#2mjaFE0Z*2}z0v2-zkuPIr>GSP-Sb15`kk5;7y>sVMeB ztT$sB@J5S85r*f)$XMWmm5q{fNcO=Gyr-=CS-0Zq?IB0Am_TX9q(fFJSv4z6J=cpiAs$;p0NAQ zX1Qz&$KKj(@LJV%N=^-#?>c8|wVJzSyS2)h(pkG!&%~Zji#po6`TlLlR*1)uAILV- zK^&=Jg^VMs--shE8Q1@w9EQxpu>aRiBv8_|@%>s`r@Do7?TBl(Mx$6D4HOj^Vv}hU zNy{YeO^i^okg`b7bekKhgFNs9KIp9=>9km;zRxnH>CWY?M%sJD!gdQO_F20VBK0tg zuhSq5yGl!z^k;%lyoGH>V?X^$x{;3gCQA~Fg~DY-%0d-WFJ@BEHj}Ew!Z3)Ml*dsI zqqM5@v8y_!tkXdzuRdNJsln+3HK6G!G>;bp>&N>h25-(R1`i)C291<=n&sWG7UaGL zfFA(hPXJgZ02}w#11s&b^Amlx$cOjs64RJkdlOd651CF^Z%(W(v|0ZOlL7O>0p!!k zfW4t*5HL^7-wD7S0`O3_X)`*IC#GuvJZ%76%DU#KT)PIq4Flkftm}y>*AESVj|_nC zv#y1y0vYLkelsRED=>=NLBw<{QzJDGj3=UQ8|A<>MxUQ>$a#`QBGc%(9t*peevw6z zb8OqTC-4_%!_T|6or&<0c?|#8?!rG$%=b)y4@`iM&Ew@YPt2c9fL~02c`M^Of7o>y z$lU0eC+4FTz`6y{$ifz;G6)Ocngy_*bzQv6sl8*(R5!z!EZHZsfk|ls`^9Wn(>Zil z-^`fV0g^vlkhvAIS`R~PqIhZ`ziF7M`X|rfaQNw;42Oa295WjZG_@#7KH_iWcX3c-~2+dcT>8>i;eO_}sUU6*KtJthmKEtcr zwHbG+HK&3e7p_}zM7dHCe$DgC9=e;pU#?YMw^Xe-Rl77yM##A1>swdq7aHd-JU6@v zckX!;24s%81_K9F$tn8dzW`dYNckug4McK6et?2{dkG?tRQG9%sTQjL_LBS!gGW`G HJq!Q Date: Tue, 10 Dec 2024 17:51:28 -0500 Subject: [PATCH 4/4] chore: fusdc `getStaticInfo` PF method - ensure contract consumers have access to the contract's orch account addresses which are currently only published to vstorage. since these are not expected to change, a public facet method seems more suitable than a recorderKit --- packages/fast-usdc/src/fast-usdc.contract.js | 15 ++++++++++++++- packages/fast-usdc/src/fast-usdc.start.js | 3 ++- .../fast-usdc/test/fast-usdc.contract.test.ts | 13 +++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/packages/fast-usdc/src/fast-usdc.contract.js b/packages/fast-usdc/src/fast-usdc.contract.js index 0aa443c1aa1..ff9f08c5000 100644 --- a/packages/fast-usdc/src/fast-usdc.contract.js +++ b/packages/fast-usdc/src/fast-usdc.contract.js @@ -12,6 +12,7 @@ import { import { makeZoeTools } from '@agoric/orchestration/src/utils/zoe-tools.js'; import { provideSingleton } from '@agoric/zoe/src/contractSupport/durability.js'; import { prepareRecorderKitMakers } from '@agoric/zoe/src/contractSupport/recorder.js'; +import { Fail } from '@endo/errors'; import { E } from '@endo/far'; import { M } from '@endo/patterns'; import { prepareAdvancer } from './exos/advancer.js'; @@ -27,6 +28,7 @@ const trace = makeTracer('FastUsdc'); const STATUS_NODE = 'status'; const FEE_NODE = 'feeConfig'; +const ADDRESSES_BAGGAGE_KEY = 'addresses'; /** * @import {HostInterface} from '@agoric/async-flow'; @@ -174,6 +176,7 @@ export const contract = async (zcf, privateArgs, zone, tools) => { }); }, async publishAddresses() { + !baggage.has(ADDRESSES_BAGGAGE_KEY) || Fail`Addresses already published`; const [poolAccountAddress, settlementAccountAddress] = await vowTools.when( vowTools.all([ @@ -181,10 +184,13 @@ export const contract = async (zcf, privateArgs, zone, tools) => { E(settlementAccount).getAddress(), ]), ); - await publishAddresses(storageNode, { + const addresses = harden({ poolAccount: poolAccountAddress.value, settlementAccount: settlementAccountAddress.value, }); + baggage.init(ADDRESSES_BAGGAGE_KEY, addresses); + await publishAddresses(storageNode, addresses); + return addresses; }, }); @@ -212,6 +218,13 @@ export const contract = async (zcf, privateArgs, zone, tools) => { getPublicTopics() { return poolKit.public.getPublicTopics(); }, + getStaticInfo() { + baggage.has(ADDRESSES_BAGGAGE_KEY) || + Fail`no addresses. creator must 'publishAddresses' first`; + return harden({ + [ADDRESSES_BAGGAGE_KEY]: baggage.get(ADDRESSES_BAGGAGE_KEY), + }); + }, }); // ^^^ Define all kinds above this line. Keep remote calls below. vvv diff --git a/packages/fast-usdc/src/fast-usdc.start.js b/packages/fast-usdc/src/fast-usdc.start.js index 070025a6c5e..2815569d2ed 100644 --- a/packages/fast-usdc/src/fast-usdc.start.js +++ b/packages/fast-usdc/src/fast-usdc.start.js @@ -227,7 +227,8 @@ export const startFastUSDC = async ( produceInstance.reset(); produceInstance.resolve(instance); - await E(kit.creatorFacet).publishAddresses(); + const addresses = await E(kit.creatorFacet).publishAddresses(); + trace('contract orch account addresses', addresses); if (!net.noNoble) { const addr = await E(kit.creatorFacet).connectToNoble(); trace('noble intermediate recipient', addr); diff --git a/packages/fast-usdc/test/fast-usdc.contract.test.ts b/packages/fast-usdc/test/fast-usdc.contract.test.ts index 665ed382320..872bffc2c0a 100644 --- a/packages/fast-usdc/test/fast-usdc.contract.test.ts +++ b/packages/fast-usdc/test/fast-usdc.contract.test.ts @@ -86,6 +86,7 @@ const startContract = async ( ), ); await E(startKit.creatorFacet).connectToNoble(); + await E(startKit.creatorFacet).publishAddresses(); return { ...startKit, @@ -179,6 +180,18 @@ test('baggage', async t => { t.snapshot(tree, 'contract baggage after start'); }); +test('getStaticInfo', async t => { + const { startKit } = t.context; + const { publicFacet } = startKit; + + t.deepEqual(await E(publicFacet).getStaticInfo(), { + addresses: { + poolAccount: 'agoric1fakeLCAAddress', + settlementAccount: 'agoric1fakeLCAAddress1', + }, + }); +}); + const purseOf = (issuer: Issuer, { pourPayment }) => async (value: bigint) => {