@layerzerolabs/test-utils-stellar 1.2.26 → 1.2.29
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{7DZ4SVEO.js → 2MDWMEQT.js} +4 -3
- package/dist/2MDWMEQT.js.map +1 -0
- package/dist/{ZWKXKZVT.js → AYQIUXWL.js} +3 -3
- package/dist/{ZWKXKZVT.js.map → AYQIUXWL.js.map} +1 -1
- package/dist/{4UKUSHEU.js → CHSP4IIE.js} +3 -3
- package/dist/{4UKUSHEU.js.map → CHSP4IIE.js.map} +1 -1
- package/dist/{CYINPPER.js → FPY7PKKI.js} +54 -4
- package/dist/FPY7PKKI.js.map +1 -0
- package/dist/env.d.ts +8 -1
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +1 -1
- package/dist/index.js +4 -4
- package/dist/localnet-global-setup.js +2 -2
- package/dist/localnet.d.ts +15 -0
- package/dist/localnet.d.ts.map +1 -1
- package/dist/localnet.js +1 -1
- package/dist/protocol-global-setup.js +2 -2
- package/package.json +3 -3
- package/src/env.ts +12 -3
- package/src/localnet.ts +87 -0
- package/dist/7DZ4SVEO.js.map +0 -1
- package/dist/CYINPPER.js.map +0 -1
|
@@ -3,7 +3,7 @@ import { __name } from './VUOMXK5T.js';
|
|
|
3
3
|
import { Networks, Keypair, Asset } from '@stellar/stellar-sdk';
|
|
4
4
|
|
|
5
5
|
function createStellarTestEnv(options) {
|
|
6
|
-
const { containerName, hostPort, dockerImage } = options;
|
|
6
|
+
const { containerName, hostPort, dockerImage, dockerCommand } = options;
|
|
7
7
|
const networkPassphrase = Networks.STANDALONE;
|
|
8
8
|
const coreUrl = `http://localhost:${hostPort}`;
|
|
9
9
|
const junkWallet = Keypair.fromSecret("SCZ5VBFVGE4SLZV5WJO33LEEU36EEOEHWO27KYJIIUWGOKZB2OSNAQBI");
|
|
@@ -18,6 +18,7 @@ function createStellarTestEnv(options) {
|
|
|
18
18
|
CONTAINER_NAME: containerName,
|
|
19
19
|
HOST_PORT: hostPort,
|
|
20
20
|
DOCKER_IMAGE: dockerImage,
|
|
21
|
+
DOCKER_COMMAND: dockerCommand,
|
|
21
22
|
RPC_URL: `${coreUrl}/soroban/rpc`,
|
|
22
23
|
NETWORK_PASSPHRASE: networkPassphrase,
|
|
23
24
|
JUNK_WALLET: junkWallet,
|
|
@@ -42,5 +43,5 @@ function createStellarTestEnv(options) {
|
|
|
42
43
|
__name(createStellarTestEnv, "createStellarTestEnv");
|
|
43
44
|
|
|
44
45
|
export { createStellarTestEnv };
|
|
45
|
-
//# sourceMappingURL=
|
|
46
|
-
//# sourceMappingURL=
|
|
46
|
+
//# sourceMappingURL=2MDWMEQT.js.map
|
|
47
|
+
//# sourceMappingURL=2MDWMEQT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/env.ts"],"names":["createStellarTestEnv","options","containerName","hostPort","dockerImage","dockerCommand","networkPassphrase","Networks","STANDALONE","coreUrl","junkWallet","Keypair","fromSecret","defaultDeployer","zroDistributor","executorAdmin","chainBDeployer","dvnSigner","Secp256k1KeyPair","eidA","zroAsset","Asset","publicKey","CONTAINER_NAME","HOST_PORT","DOCKER_IMAGE","DOCKER_COMMAND","RPC_URL","NETWORK_PASSPHRASE","JUNK_WALLET","DEFAULT_DEPLOYER","ZRO_DISTRIBUTOR","EXECUTOR_ADMIN","CHAIN_B_DEPLOYER","DVN_SIGNER","DVN_VID","EID_A","EID_B","EID","NATIVE_TOKEN_ADDRESS","native","contractId","ZRO_ASSET","ZRO_TOKEN_ADDRESS","MSG_TYPE_VANILLA","MSG_TYPE_COMPOSED","MSG_TYPE_ABA","MSG_TYPE_COMPOSED_ABA"],"mappings":";;;;AAsDO,SAASA,qBAAqBC,OAAAA,EAAoC;AACrE,EAAA,MAAM,EAAEC,aAAAA,EAAeC,QAAAA,EAAUC,WAAAA,EAAaC,eAAa,GAAKJ,OAAAA;AAChE,EAAA,MAAMK,oBAAoBC,QAAAA,CAASC,UAAAA;AACnC,EAAA,MAAMC,OAAAA,GAAU,oBAAoBN,QAAAA,CAAAA,CAAAA;AAIpC,EAAA,MAAMO,UAAAA,GAAaC,OAAAA,CAAQC,UAAAA,CACvB,0DAAA,CAAA;AAEJ,EAAA,MAAMC,eAAAA,GAAkBF,OAAAA,CAAQC,UAAAA,CAC5B,0DAAA,CAAA;AAEJ,EAAA,MAAME,cAAAA,GAAiBH,OAAAA,CAAQC,UAAAA,CAC3B,0DAAA,CAAA;AAGJ,EAAA,MAAMG,aAAAA,GAAgBJ,OAAAA,CAAQC,UAAAA,CAC1B,0DAAA,CAAA;AAGJ,EAAA,MAAMI,cAAAA,GAAiBL,OAAAA,CAAQC,UAAAA,CAC3B,0DAAA,CAAA;AAIJ,EAAA,MAAMK,SAAAA,GAAY,IAAIC,gBAAAA,CAClB,oEAAA,CAAA;AAGJ,EAAA,MAAMC,IAAAA,GAAO,KAAA;AACb,EAAA,MAAMC,WAAW,IAAIC,KAAAA,CAAM,KAAA,EAAOR,eAAAA,CAAgBS,WAAS,CAAA;AAE3D,EAAA,OAAO;IACHC,cAAAA,EAAgBrB,aAAAA;IAChBsB,SAAAA,EAAWrB,QAAAA;IACXsB,YAAAA,EAAcrB,WAAAA;IACdsB,cAAAA,EAAgBrB,aAAAA;AAChBsB,IAAAA,OAAAA,EAAS,GAAGlB,OAAAA,CAAAA,YAAAA,CAAAA;IACZmB,kBAAAA,EAAoBtB,iBAAAA;IACpBuB,WAAAA,EAAanB,UAAAA;IACboB,gBAAAA,EAAkBjB,eAAAA;IAClBkB,eAAAA,EAAiBjB,cAAAA;IACjBkB,cAAAA,EAAgBjB,aAAAA;IAChBkB,gBAAAA,EAAkBjB,cAAAA;IAClBkB,UAAAA,EAAYjB,SAAAA;IACZkB,OAAAA,EAAS,CAAA;IACTC,KAAAA,EAAOjB,IAAAA;IACPkB,KAAAA,EAAO,KAAA;IACPC,GAAAA,EAAKnB,IAAAA;AACLoB,IAAAA,oBAAAA,EAAsBlB,KAAAA,CAAMmB,MAAAA,EAAM,CAAGC,UAAAA,CAAWnC,iBAAAA,CAAAA;IAChDoC,SAAAA,EAAWtB,QAAAA;IACXuB,iBAAAA,EAAmBvB,QAAAA,CAASqB,WAAWnC,iBAAAA,CAAAA;IACvCsC,gBAAAA,EAAkB,CAAA;IAClBC,iBAAAA,EAAmB,CAAA;IACnBC,YAAAA,EAAc,CAAA;IACdC,qBAAAA,EAAuB;AAC3B,GAAA;AACJ;AA1DgB/C,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA","file":"2MDWMEQT.js","sourcesContent":["import { Asset, Keypair, Networks } from '@stellar/stellar-sdk';\n\nimport { Secp256k1KeyPair } from './secp256k1.js';\n\nexport interface CreateStellarTestEnvOptions {\n /** Docker container name — must be unique when suites run concurrently. */\n containerName: string;\n /** Host port mapped to the localnet container's RPC port. */\n hostPort: number;\n /**\n * Optional localnet image override. Defaults to the versioned LayerZero ECR snapshot.\n * Useful for testing a locally built image or a pinned public image (e.g. stellar/quickstart@sha256:…).\n */\n dockerImage?: string;\n /**\n * Optional args appended after the image name in `docker run` (e.g. `['--local']` for\n * stock stellar/quickstart). Ignored by images whose ENTRYPOINT does not forward argv.\n */\n dockerCommand?: readonly string[];\n}\n\n/**\n * Shared Stellar E2E constants (RPC URL, keys, EIDs, token addresses).\n * Constructed from containerName/hostPort so concurrent suites do not collide.\n */\nexport interface StellarTestEnv {\n CONTAINER_NAME: string;\n HOST_PORT: number;\n /** Optional localnet Docker image override. */\n DOCKER_IMAGE?: string;\n /** Optional args appended after the image name in `docker run`. */\n DOCKER_COMMAND?: readonly string[];\n RPC_URL: string;\n NETWORK_PASSPHRASE: typeof Networks.STANDALONE;\n JUNK_WALLET: Keypair;\n DEFAULT_DEPLOYER: Keypair;\n ZRO_DISTRIBUTOR: Keypair;\n EXECUTOR_ADMIN: Keypair;\n CHAIN_B_DEPLOYER: Keypair;\n DVN_SIGNER: Secp256k1KeyPair;\n DVN_VID: number;\n EID_A: number;\n EID_B: number;\n /** Legacy single EID (alias of EID_A). */\n EID: number;\n NATIVE_TOKEN_ADDRESS: string;\n ZRO_ASSET: Asset;\n ZRO_TOKEN_ADDRESS: string;\n MSG_TYPE_VANILLA: number;\n MSG_TYPE_COMPOSED: number;\n MSG_TYPE_ABA: number;\n MSG_TYPE_COMPOSED_ABA: number;\n}\n\nexport function createStellarTestEnv(options: CreateStellarTestEnvOptions): StellarTestEnv {\n const { containerName, hostPort, dockerImage, dockerCommand } = options;\n const networkPassphrase = Networks.STANDALONE;\n const coreUrl = `http://localhost:${hostPort}`;\n\n // BIP39 \"test test...junk\" path m/44'/148'/0'. Pre-funded in the LayerZero ECR snapshot;\n // for stock stellar/quickstart, startStellarLocalnet funds it via friendbot first.\n const junkWallet = Keypair.fromSecret(\n 'SCZ5VBFVGE4SLZV5WJO33LEEU36EEOEHWO27KYJIIUWGOKZB2OSNAQBI',\n );\n const defaultDeployer = Keypair.fromSecret(\n 'SDLCA3JUES3G6R4FTI6XXDIWW7QCNMZNWPYQQIKQ26TEIZUFOLIVIUDK',\n );\n const zroDistributor = Keypair.fromSecret(\n 'SB6QAFXFRR2MXYHW4RRZ23JDGKHDCYCT5YTQEGG3WNT5VKZADJQFVNWG',\n );\n // Deterministic so globalSetup and test files agree (separate processes).\n const executorAdmin = Keypair.fromSecret(\n 'SACWJCNRT2AYRPBWW7IBRNI765EMZSWPXXAAHYN57UFQNOXMGET7HM5K',\n );\n // Separate deployer for Chain B parallel deploy in protocol globalSetup.\n const chainBDeployer = Keypair.fromSecret(\n 'SDLIZSTG7W4C3FZYY52WIKF7FTWAXCWC5Z4OVVF3TDA3MBOR37LMIANJ',\n );\n\n // Private key is keccak256(\"dvn_test_signer\") truncated to 32 bytes\n const dvnSigner = new Secp256k1KeyPair(\n '0x8d3f8d5d8f1c7e2a5b4c3d6e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a',\n );\n\n const eidA = 30401;\n const zroAsset = new Asset('ZRO', defaultDeployer.publicKey());\n\n return {\n CONTAINER_NAME: containerName,\n HOST_PORT: hostPort,\n DOCKER_IMAGE: dockerImage,\n DOCKER_COMMAND: dockerCommand,\n RPC_URL: `${coreUrl}/soroban/rpc`,\n NETWORK_PASSPHRASE: networkPassphrase,\n JUNK_WALLET: junkWallet,\n DEFAULT_DEPLOYER: defaultDeployer,\n ZRO_DISTRIBUTOR: zroDistributor,\n EXECUTOR_ADMIN: executorAdmin,\n CHAIN_B_DEPLOYER: chainBDeployer,\n DVN_SIGNER: dvnSigner,\n DVN_VID: 1,\n EID_A: eidA,\n EID_B: 30402,\n EID: eidA,\n NATIVE_TOKEN_ADDRESS: Asset.native().contractId(networkPassphrase),\n ZRO_ASSET: zroAsset,\n ZRO_TOKEN_ADDRESS: zroAsset.contractId(networkPassphrase),\n MSG_TYPE_VANILLA: 1,\n MSG_TYPE_COMPOSED: 2,\n MSG_TYPE_ABA: 3,\n MSG_TYPE_COMPOSED_ABA: 4,\n };\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createClient } from './GAGBEOCZ.js';
|
|
2
|
-
import { startStellarLocalnet, stopStellarLocalnet } from './
|
|
2
|
+
import { startStellarLocalnet, stopStellarLocalnet } from './FPY7PKKI.js';
|
|
3
3
|
import { uploadWasm, deployContract } from './TYAJMKGY.js';
|
|
4
4
|
import { __name } from './VUOMXK5T.js';
|
|
5
5
|
import { rpc } from '@stellar/stellar-sdk';
|
|
@@ -390,5 +390,5 @@ function createProtocolStackGlobalSetup(env, options) {
|
|
|
390
390
|
__name(createProtocolStackGlobalSetup, "createProtocolStackGlobalSetup");
|
|
391
391
|
|
|
392
392
|
export { createProtocolStackGlobalSetup };
|
|
393
|
-
//# sourceMappingURL=
|
|
394
|
-
//# sourceMappingURL=
|
|
393
|
+
//# sourceMappingURL=AYQIUXWL.js.map
|
|
394
|
+
//# sourceMappingURL=AYQIUXWL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/protocol-global-setup.ts"],"names":["getProtocolClientConstructor","client","moduleName","TypeError","getDeployableProtocolClient","deploy","createProtocolClient","env","contractId","createClient","uploadAllWasms","wasmDir","server","rpc","Server","RPC_URL","allowHttp","wasmFiles","endpoint","treasury","uln302","sml","priceFeed","executorFeeLib","dvnFeeLib","dvn","executorHelper","executor","hashes","name","file","Object","entries","wasmBuffer","readFileSync","path","join","console","log","length","toFixed","uploadWasm","DEFAULT_DEPLOYER","deployChainContracts","protocol","eid","chainLabel","deployer","wasmHashes","addresses","endpointV2","deployedEndpoint","deployContract","Client","owner","publicKey","native_token","NATIVE_TOKEN_ADDRESS","wasmHash","options","deployedTreasury","deployedUln302","deployedSml","fee_recipient","deployedPriceFeed","price_updater","deployedExecutorFeeLib","deployedDvnFeeLib","deployedDvn","vid","DVN_VID","signers","DVN_SIGNER","ethAddress","threshold","admins","supported_msglibs","price_feed","default_multiplier_bps","worker_fee_lib","deposit_address","deployedExecutorHelper","undefined","deployedExecutor","EXECUTOR_ADMIN","message_libs","initChainClients","executorClient","set_executor_helper","helper","allowed_functions","signAndSend","clients","endpointClient","uln302Client","smlClient","treasuryClient","executorHelperClient","executorFeeLibClient","priceFeedClient","dvnFeeLibClient","dvnClient","wireChainContracts","chain","otherChain","thisEid","otherEid","register_library","new_lib","set_zro","zro","ZRO_TOKEN_ADDRESS","set_default_executor_configs","params","dst_eid","config","max_message_size","set_default_send_uln_configs","confirmations","required_dvns","optional_dvns","optional_dvn_threshold","set_default_receive_uln_configs","set_default_send_library","set_default_receive_library","src_eid","grace_period","set_price_ratio_denominator","denominator","set_native_token_price_usd","native_token_price_usd","NORMALIZED_OTHER_EID","set_price","prices","price","gas_per_byte","gas_price_in_unit","price_ratio","set_dst_config","admin","dst_config","floor_margin_usd","lz_compose_base_gas","lz_receive_base_gas","multiplier_bps","native_cap","gas","createProtocolStackGlobalSetup","globalSetup","provide","startStellarLocalnet","addressesA","addressesB","Promise","all","EID_A","EID_B","CHAIN_B_DEPLOYER","chainA","chainB","error","stopStellarLocalnet"],"mappings":"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","file":"ZWKXKZVT.js","sourcesContent":["import type { Keypair } from '@stellar/stellar-sdk';\nimport { rpc } from '@stellar/stellar-sdk';\nimport { readFileSync } from 'fs';\nimport path from 'path';\n\nimport { createClient } from './client.js';\nimport { type DeployableContractClient, deployContract, uploadWasm } from './deploy.js';\nimport type { StellarTestEnv } from './env.js';\nimport { startStellarLocalnet, stopStellarLocalnet } from './localnet.js';\n\n/** Vitest globalSetup context subset (avoids a hard vitest type dependency in src/). */\nexport type ProtocolGlobalSetupContext = {\n provide: (key: 'chainA' | 'chainB', value: ChainAddresses) => void;\n};\n\ntype SigningTransaction = {\n signAndSend: () => Promise<unknown>;\n};\n\n/**\n * Generated Soroban clients expose asynchronous methods that construct a signable transaction.\n * Their method names and argument types remain owned by the generated SDK.\n */\ntype ProtocolClient = Record<string, (args: object) => Promise<SigningTransaction>>;\n\ntype ProtocolClientConstructor<TClient extends ProtocolClient> = new (options: {\n contractId: string;\n publicKey: string;\n signTransaction: (tx: string) => Promise<{ signedTxXdr: string; signerAddress: string }>;\n rpcUrl: string;\n networkPassphrase: string;\n allowHttp: boolean;\n}) => TClient;\n\nexport interface ProtocolContractModule {\n /** The generated SDK Client constructor. Validated at the adapter boundary before use. */\n Client: unknown;\n}\n\n/**\n * Protocol contract modules from `@layerzerolabs/lz-v2-stellar-sdk`.\n * Injected by consumers to avoid a workspace cycle (test-utils ↔ sdk).\n */\nexport interface ProtocolStackModules {\n endpoint: ProtocolContractModule;\n treasury: ProtocolContractModule;\n uln302: ProtocolContractModule;\n sml: ProtocolContractModule;\n priceFeed: ProtocolContractModule;\n executorFeeLib: ProtocolContractModule;\n dvnFeeLib: ProtocolContractModule;\n dvn: ProtocolContractModule;\n executorHelper: ProtocolContractModule;\n executor: ProtocolContractModule;\n}\n\n/**\n * Addresses for a single chain's protocol contracts\n */\nexport interface ChainAddresses {\n eid: number;\n endpointV2: string;\n uln302: string;\n sml: string;\n treasury: string;\n executor: string;\n executorHelper: string;\n executorFeeLib: string;\n priceFeed: string;\n dvnFeeLib: string;\n dvn: string;\n}\n\n/**\n * Clients for a single chain's protocol contracts\n */\ninterface ChainClients {\n endpointClient: ProtocolClient;\n uln302Client: ProtocolClient;\n smlClient: ProtocolClient;\n treasuryClient: ProtocolClient;\n executorClient: ProtocolClient;\n executorHelperClient: ProtocolClient;\n executorFeeLibClient: ProtocolClient;\n priceFeedClient: ProtocolClient;\n dvnFeeLibClient: ProtocolClient;\n dvnClient: ProtocolClient;\n}\n\n/**\n * Complete chain setup with addresses and clients\n */\ninterface ChainSetup {\n addresses: ChainAddresses;\n clients: ChainClients;\n}\n\ninterface WasmHashes {\n endpoint: string;\n treasury: string;\n uln302: string;\n sml: string;\n priceFeed: string;\n executorFeeLib: string;\n dvnFeeLib: string;\n dvn: string;\n executorHelper: string;\n executor: string;\n}\n\nfunction getProtocolClientConstructor<TClient extends ProtocolClient>(\n client: unknown,\n moduleName: string,\n): ProtocolClientConstructor<TClient> {\n if (typeof client !== 'function') {\n throw new TypeError(`${moduleName}.Client must be a generated contract client constructor`);\n }\n return client as ProtocolClientConstructor<TClient>;\n}\n\nfunction getDeployableProtocolClient<TClient extends { options: { contractId: string } }>(\n client: unknown,\n moduleName: string,\n): DeployableContractClient<TClient> {\n if (\n typeof client !== 'function' ||\n !('deploy' in client) ||\n typeof client.deploy !== 'function'\n ) {\n throw new TypeError(`${moduleName}.Client must expose a deploy method`);\n }\n return client as DeployableContractClient<TClient>;\n}\n\nfunction createProtocolClient(\n env: StellarTestEnv,\n client: unknown,\n contractId: string,\n moduleName: string,\n): ProtocolClient {\n return createClient(\n env,\n getProtocolClientConstructor<ProtocolClient>(client, moduleName),\n contractId,\n );\n}\n\n/**\n * Upload all protocol WASM files once and return their hashes.\n */\nasync function uploadAllWasms(env: StellarTestEnv, wasmDir: string): Promise<WasmHashes> {\n const server = new rpc.Server(env.RPC_URL, { allowHttp: true });\n\n const wasmFiles = {\n endpoint: 'endpoint_v2.wasm',\n treasury: 'treasury.wasm',\n uln302: 'uln302.wasm',\n sml: 'simple_message_lib.wasm',\n priceFeed: 'price_feed.wasm',\n executorFeeLib: 'executor_fee_lib.wasm',\n dvnFeeLib: 'dvn_fee_lib.wasm',\n dvn: 'dvn.wasm',\n executorHelper: 'executor_helper.wasm',\n executor: 'executor.wasm',\n };\n\n const hashes: Record<string, string> = {};\n for (const [name, file] of Object.entries(wasmFiles)) {\n const wasmBuffer = readFileSync(path.join(wasmDir, file));\n console.log(`📤 Uploading ${name} WASM (${(wasmBuffer.length / 1024).toFixed(1)} KB)...`);\n hashes[name] = await uploadWasm(env, wasmBuffer, env.DEFAULT_DEPLOYER, server);\n }\n\n return hashes as unknown as WasmHashes;\n}\n\n/**\n * Deploy all protocol contracts for a single chain using pre-uploaded WASM hashes.\n * The deployer pays gas; contract ownership is always DEFAULT_DEPLOYER.\n */\nasync function deployChainContracts(\n env: StellarTestEnv,\n protocol: ProtocolStackModules,\n eid: number,\n chainLabel: string,\n deployer: Keypair,\n wasmDir: string,\n wasmHashes: WasmHashes,\n): Promise<ChainAddresses> {\n const addresses: ChainAddresses = {\n eid,\n endpointV2: '',\n uln302: '',\n sml: '',\n treasury: '',\n executor: '',\n executorHelper: '',\n executorFeeLib: '',\n priceFeed: '',\n dvnFeeLib: '',\n dvn: '',\n };\n\n // 1. Deploy Endpoint\n console.log(`🚀 [${chainLabel}] Deploying Endpoint (EID: ${eid})...`);\n const deployedEndpoint = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.endpoint.Client, 'endpoint'),\n path.join(wasmDir, 'endpoint_v2.wasm'),\n {\n eid,\n owner: env.DEFAULT_DEPLOYER.publicKey(),\n native_token: env.NATIVE_TOKEN_ADDRESS,\n },\n deployer,\n { wasmHash: wasmHashes.endpoint },\n );\n addresses.endpointV2 = deployedEndpoint.options.contractId;\n console.log(`✅ [${chainLabel}] Endpoint deployed:`, addresses.endpointV2);\n\n // 2. Deploy Treasury\n console.log(`🚀 [${chainLabel}] Deploying Treasury...`);\n const deployedTreasury = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.treasury.Client, 'treasury'),\n path.join(wasmDir, 'treasury.wasm'),\n { owner: env.DEFAULT_DEPLOYER.publicKey() },\n deployer,\n { wasmHash: wasmHashes.treasury },\n );\n addresses.treasury = deployedTreasury.options.contractId;\n console.log(`✅ [${chainLabel}] Treasury deployed:`, addresses.treasury);\n\n // 3. Deploy ULN302\n console.log(`🚀 [${chainLabel}] Deploying ULN302...`);\n const deployedUln302 = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.uln302.Client, 'uln302'),\n path.join(wasmDir, 'uln302.wasm'),\n {\n owner: env.DEFAULT_DEPLOYER.publicKey(),\n endpoint: addresses.endpointV2,\n treasury: addresses.treasury,\n },\n deployer,\n { wasmHash: wasmHashes.uln302 },\n );\n addresses.uln302 = deployedUln302.options.contractId;\n console.log(`✅ [${chainLabel}] ULN302 deployed:`, addresses.uln302);\n\n // 4. Deploy SML (SimpleMessageLib)\n console.log(`🚀 [${chainLabel}] Deploying SimpleMessageLib...`);\n const deployedSml = await deployContract<ProtocolClient & { options: { contractId: string } }>(\n env,\n getDeployableProtocolClient(protocol.sml.Client, 'sml'),\n path.join(wasmDir, 'simple_message_lib.wasm'),\n {\n owner: env.DEFAULT_DEPLOYER.publicKey(),\n endpoint: addresses.endpointV2,\n fee_recipient: env.DEFAULT_DEPLOYER.publicKey(),\n },\n deployer,\n { wasmHash: wasmHashes.sml },\n );\n addresses.sml = deployedSml.options.contractId;\n console.log(`✅ [${chainLabel}] SimpleMessageLib deployed:`, addresses.sml);\n\n // 5. Deploy Price Feed\n console.log(`🚀 [${chainLabel}] Deploying Price Feed...`);\n const deployedPriceFeed = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.priceFeed.Client, 'priceFeed'),\n path.join(wasmDir, 'price_feed.wasm'),\n {\n owner: env.DEFAULT_DEPLOYER.publicKey(),\n price_updater: env.DEFAULT_DEPLOYER.publicKey(),\n },\n deployer,\n { wasmHash: wasmHashes.priceFeed },\n );\n addresses.priceFeed = deployedPriceFeed.options.contractId;\n console.log(`✅ [${chainLabel}] Price Feed deployed:`, addresses.priceFeed);\n\n // 6. Deploy Executor Fee Lib\n console.log(`🚀 [${chainLabel}] Deploying Executor Fee Lib...`);\n const deployedExecutorFeeLib = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.executorFeeLib.Client, 'executorFeeLib'),\n path.join(wasmDir, 'executor_fee_lib.wasm'),\n { owner: env.DEFAULT_DEPLOYER.publicKey() },\n deployer,\n { wasmHash: wasmHashes.executorFeeLib },\n );\n addresses.executorFeeLib = deployedExecutorFeeLib.options.contractId;\n console.log(`✅ [${chainLabel}] Executor Fee Lib deployed:`, addresses.executorFeeLib);\n\n // 7. Deploy DVN Fee Lib\n console.log(`🚀 [${chainLabel}] Deploying DVN Fee Lib...`);\n const deployedDvnFeeLib = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.dvnFeeLib.Client, 'dvnFeeLib'),\n path.join(wasmDir, 'dvn_fee_lib.wasm'),\n { owner: env.DEFAULT_DEPLOYER.publicKey() },\n deployer,\n { wasmHash: wasmHashes.dvnFeeLib },\n );\n addresses.dvnFeeLib = deployedDvnFeeLib.options.contractId;\n console.log(`✅ [${chainLabel}] DVN Fee Lib deployed:`, addresses.dvnFeeLib);\n\n // 8. Deploy DVN (same signer for both chains)\n console.log(`🚀 [${chainLabel}] Deploying DVN...`);\n const deployedDvn = await deployContract<ProtocolClient & { options: { contractId: string } }>(\n env,\n getDeployableProtocolClient(protocol.dvn.Client, 'dvn'),\n path.join(wasmDir, 'dvn.wasm'),\n {\n vid: env.DVN_VID,\n signers: [env.DVN_SIGNER.ethAddress],\n threshold: 1,\n admins: [env.DEFAULT_DEPLOYER.publicKey()],\n supported_msglibs: [addresses.uln302],\n price_feed: addresses.priceFeed,\n default_multiplier_bps: 10000,\n worker_fee_lib: addresses.dvnFeeLib,\n deposit_address: env.DEFAULT_DEPLOYER.publicKey(),\n },\n deployer,\n { wasmHash: wasmHashes.dvn },\n );\n addresses.dvn = deployedDvn.options.contractId;\n console.log(`✅ [${chainLabel}] DVN deployed:`, addresses.dvn);\n\n // 9. Deploy Executor Helper\n console.log(`🚀 [${chainLabel}] Deploying Executor Helper...`);\n const deployedExecutorHelper = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.executorHelper.Client, 'executorHelper'),\n path.join(wasmDir, 'executor_helper.wasm'),\n undefined,\n deployer,\n { wasmHash: wasmHashes.executorHelper },\n );\n addresses.executorHelper = deployedExecutorHelper.options.contractId;\n console.log(`✅ [${chainLabel}] Executor Helper deployed:`, addresses.executorHelper);\n\n // 10. Deploy Executor (supports both ULN302 and SML)\n console.log(`🚀 [${chainLabel}] Deploying Executor...`);\n const deployedExecutor = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.executor.Client, 'executor'),\n path.join(wasmDir, 'executor.wasm'),\n {\n owner: env.DEFAULT_DEPLOYER.publicKey(),\n endpoint: addresses.endpointV2,\n admins: [env.EXECUTOR_ADMIN.publicKey(), env.DEFAULT_DEPLOYER.publicKey()],\n message_libs: [addresses.uln302, addresses.sml],\n price_feed: addresses.priceFeed,\n default_multiplier_bps: 10000,\n worker_fee_lib: addresses.executorFeeLib,\n deposit_address: env.DEFAULT_DEPLOYER.publicKey(),\n },\n deployer,\n { wasmHash: wasmHashes.executor },\n );\n addresses.executor = deployedExecutor.options.contractId;\n console.log(`✅ [${chainLabel}] Executor deployed:`, addresses.executor);\n\n return addresses;\n}\n\n/**\n * Register executor helper and create owner-signed clients for a chain.\n * Must be called sequentially (uses DEFAULT_DEPLOYER for signing).\n */\nasync function initChainClients(\n env: StellarTestEnv,\n protocol: ProtocolStackModules,\n addresses: ChainAddresses,\n chainLabel: string,\n): Promise<ChainSetup> {\n // Register Executor Helper with Executor (needs owner-signed client)\n console.log(`🚀 [${chainLabel}] Registering Executor Helper with Executor...`);\n const executorClient = createProtocolClient(\n env,\n protocol.executor.Client,\n addresses.executor,\n 'executor',\n );\n await (\n await executorClient.set_executor_helper({\n helper: addresses.executorHelper,\n allowed_functions: ['execute', 'compose'],\n })\n ).signAndSend();\n console.log(`✅ [${chainLabel}] Executor Helper registered`);\n\n const clients: ChainClients = {\n endpointClient: createProtocolClient(\n env,\n protocol.endpoint.Client,\n addresses.endpointV2,\n 'endpoint',\n ),\n uln302Client: createProtocolClient(env, protocol.uln302.Client, addresses.uln302, 'uln302'),\n smlClient: createProtocolClient(env, protocol.sml.Client, addresses.sml, 'sml'),\n treasuryClient: createProtocolClient(\n env,\n protocol.treasury.Client,\n addresses.treasury,\n 'treasury',\n ),\n executorClient,\n executorHelperClient: createProtocolClient(\n env,\n protocol.executorHelper.Client,\n addresses.executorHelper,\n 'executorHelper',\n ),\n executorFeeLibClient: createProtocolClient(\n env,\n protocol.executorFeeLib.Client,\n addresses.executorFeeLib,\n 'executorFeeLib',\n ),\n priceFeedClient: createProtocolClient(\n env,\n protocol.priceFeed.Client,\n addresses.priceFeed,\n 'priceFeed',\n ),\n dvnFeeLibClient: createProtocolClient(\n env,\n protocol.dvnFeeLib.Client,\n addresses.dvnFeeLib,\n 'dvnFeeLib',\n ),\n dvnClient: createProtocolClient(env, protocol.dvn.Client, addresses.dvn, 'dvn'),\n };\n\n return { addresses, clients };\n}\n\n/**\n * Wire a single chain's protocol contracts for cross-chain communication\n *\n * @param chain - The chain to wire (this chain)\n * @param otherChain - The other chain (for cross-references)\n * @param chainLabel - Label for logging\n */\nasync function wireChainContracts(\n env: StellarTestEnv,\n chain: ChainSetup,\n otherChain: ChainSetup,\n chainLabel: string,\n): Promise<void> {\n const { addresses, clients } = chain;\n const { endpointClient, uln302Client, priceFeedClient, executorClient, dvnClient } = clients;\n\n const thisEid = addresses.eid;\n const otherEid = otherChain.addresses.eid;\n\n console.log(\n `\\n🔗 [${chainLabel}] Wiring protocol contracts (EID: ${thisEid} ↔ ${otherEid})...`,\n );\n\n // Register libraries\n await (await endpointClient.register_library({ new_lib: addresses.uln302 })).signAndSend();\n await (await endpointClient.register_library({ new_lib: addresses.sml })).signAndSend();\n console.log(`✅ [${chainLabel}] Libraries registered (ULN302 + SML)`);\n\n // Set ZRO token\n await (await endpointClient.set_zro({ zro: env.ZRO_TOKEN_ADDRESS })).signAndSend();\n console.log(`✅ [${chainLabel}] ZRO token set`);\n\n // ========================================================================\n // Configure for SENDING to the other chain (dst_eid = otherEid)\n // ========================================================================\n\n // ULN302 executor config for sending to other chain\n await (\n await uln302Client.set_default_executor_configs({\n params: [\n {\n dst_eid: otherEid,\n config: { executor: addresses.executor, max_message_size: 10000 },\n },\n ],\n })\n ).signAndSend();\n console.log(`✅ [${chainLabel}] ULN302 executor config set for dst_eid=${otherEid}`);\n\n // ULN302 send config: when sending to otherEid, use THIS chain's DVN for fee quoting\n // (The DVN needs dst_config for the destination EID to calculate fees)\n await (\n await uln302Client.set_default_send_uln_configs({\n params: [\n {\n eid: otherEid,\n config: {\n confirmations: 1n,\n required_dvns: [addresses.dvn], // THIS chain's DVN (has dst_config for otherEid)\n optional_dvns: [],\n optional_dvn_threshold: 0,\n },\n },\n ],\n })\n ).signAndSend();\n console.log(\n `✅ [${chainLabel}] ULN302 send config set for eid=${otherEid} (DVN: ${addresses.dvn})`,\n );\n\n // ========================================================================\n // Configure for RECEIVING from the other chain (src_eid = otherEid)\n // ========================================================================\n\n // ULN302 receive config: when receiving from otherEid, THIS chain's DVN verifies\n await (\n await uln302Client.set_default_receive_uln_configs({\n params: [\n {\n eid: otherEid,\n config: {\n confirmations: 1n,\n required_dvns: [addresses.dvn], // THIS chain's DVN verifies incoming\n optional_dvns: [],\n optional_dvn_threshold: 0,\n },\n },\n ],\n })\n ).signAndSend();\n console.log(\n `✅ [${chainLabel}] ULN302 receive config set for eid=${otherEid} (DVN: ${addresses.dvn})`,\n );\n\n // Set default send/receive libraries for the other chain\n await (\n await endpointClient.set_default_send_library({\n dst_eid: otherEid,\n new_lib: addresses.uln302,\n })\n ).signAndSend();\n await (\n await endpointClient.set_default_receive_library({\n src_eid: otherEid,\n new_lib: addresses.uln302,\n grace_period: 0n,\n })\n ).signAndSend();\n console.log(`✅ [${chainLabel}] Default libraries set to ULN302 for eid=${otherEid}`);\n\n // ========================================================================\n // Configure Price Feed for both chains\n // ========================================================================\n\n await (\n await priceFeedClient.set_price_ratio_denominator({ denominator: 100000000000000000000n })\n ).signAndSend();\n await (\n await priceFeedClient.set_native_token_price_usd({\n price_updater: env.DEFAULT_DEPLOYER.publicKey(),\n native_token_price_usd: 1000000000000000000n,\n })\n ).signAndSend();\n\n // Set prices for the other chain\n const NORMALIZED_OTHER_EID = otherEid % 30000;\n await (\n await priceFeedClient.set_price({\n price_updater: env.DEFAULT_DEPLOYER.publicKey(),\n prices: [\n {\n eid: NORMALIZED_OTHER_EID,\n price: {\n gas_per_byte: 1,\n gas_price_in_unit: 1n,\n price_ratio: 100000000000000000000n,\n },\n },\n ],\n })\n ).signAndSend();\n console.log(`✅ [${chainLabel}] Price Feed configured for eid=${otherEid}`);\n\n // ========================================================================\n // Configure Executor for sending to other chain\n // ========================================================================\n\n await (\n await executorClient.set_dst_config({\n admin: env.DEFAULT_DEPLOYER.publicKey(),\n params: [\n {\n dst_eid: otherEid,\n dst_config: {\n floor_margin_usd: 0n,\n lz_compose_base_gas: 50000n,\n lz_receive_base_gas: 100000n,\n multiplier_bps: 10000,\n native_cap: 1000000000000n,\n },\n },\n ],\n })\n ).signAndSend();\n console.log(`✅ [${chainLabel}] Executor configured for dst_eid=${otherEid}`);\n\n // ========================================================================\n // Configure DVN for verifying packets going to other chain\n // ========================================================================\n\n await (\n await dvnClient.set_dst_config({\n admin: env.DEFAULT_DEPLOYER.publicKey(),\n params: [\n {\n dst_eid: otherEid,\n config: {\n floor_margin_usd: 0n,\n gas: 100000n,\n multiplier_bps: 10000,\n },\n },\n ],\n })\n ).signAndSend();\n console.log(`✅ [${chainLabel}] DVN configured for dst_eid=${otherEid}`);\n\n console.log(`🎉 [${chainLabel}] Protocol wiring complete!`);\n}\n\nexport interface ProtocolStackGlobalSetupOptions {\n /**\n * Directory containing protocol WASM artifacts, or an async resolver.\n * Consumers typically resolve via getFullyQualifiedRepoRootPath.\n */\n wasmDir: string | (() => string | Promise<string>);\n /**\n * Protocol contract modules from `@layerzerolabs/lz-v2-stellar-sdk`.\n * Passed by the consumer to avoid a workspace dependency cycle.\n */\n protocol: ProtocolStackModules;\n}\n\n/**\n * Returns a Vitest globalSetup that deploys two protocol stacks and wires them.\n */\nexport function createProtocolStackGlobalSetup(\n env: StellarTestEnv,\n options: ProtocolStackGlobalSetupOptions,\n): (ctx: ProtocolGlobalSetupContext) => Promise<() => Promise<void>> {\n return async function globalSetup({\n provide,\n }: ProtocolGlobalSetupContext): Promise<() => Promise<void>> {\n console.log('\\n========================================');\n console.log('🌐 GLOBAL SETUP: Starting Stellar Localnet');\n console.log('========================================\\n');\n\n await startStellarLocalnet({ env });\n\n try {\n const wasmDir =\n typeof options.wasmDir === 'function' ? await options.wasmDir() : options.wasmDir;\n\n console.log('\\n========================================');\n console.log('📤 GLOBAL SETUP: Uploading WASM (once)');\n console.log('========================================\\n');\n\n const wasmHashes = await uploadAllWasms(env, wasmDir);\n\n console.log('\\n========================================');\n console.log('📦 GLOBAL SETUP: Deploying Protocol Contracts (Two Chains in Parallel)');\n console.log('========================================\\n');\n\n const { protocol } = options;\n\n const [addressesA, addressesB] = await Promise.all([\n deployChainContracts(\n env,\n protocol,\n env.EID_A,\n 'Chain A',\n env.DEFAULT_DEPLOYER,\n wasmDir,\n wasmHashes,\n ),\n deployChainContracts(\n env,\n protocol,\n env.EID_B,\n 'Chain B',\n env.CHAIN_B_DEPLOYER,\n wasmDir,\n wasmHashes,\n ),\n ]);\n\n const chainA = await initChainClients(env, protocol, addressesA, 'Chain A');\n const chainB = await initChainClients(env, protocol, addressesB, 'Chain B');\n\n console.log('\\n========================================');\n console.log('🔗 GLOBAL SETUP: Wiring Protocol Contracts (Cross-Chain)');\n console.log('========================================\\n');\n\n await wireChainContracts(env, chainA, chainB, 'Chain A');\n await wireChainContracts(env, chainB, chainA, 'Chain B');\n\n provide('chainA', chainA.addresses);\n provide('chainB', chainB.addresses);\n console.log('\\n✅ Chain addresses provided to tests (in-memory)');\n console.log(' Chain A (EID ' + env.EID_A + '):', chainA.addresses.endpointV2);\n console.log(' Chain B (EID ' + env.EID_B + '):', chainB.addresses.endpointV2);\n\n console.log('\\n========================================');\n console.log('✅ GLOBAL SETUP COMPLETE (Two-Chain Cross-Chain Ready)');\n console.log('========================================\\n');\n } catch (error) {\n await stopStellarLocalnet({ env });\n throw error;\n }\n\n return async () => {\n console.log('\\n========================================');\n console.log('🛑 GLOBAL TEARDOWN: Stopping Stellar Localnet');\n console.log('========================================\\n');\n\n await stopStellarLocalnet({ env });\n };\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/protocol-global-setup.ts"],"names":["getProtocolClientConstructor","client","moduleName","TypeError","getDeployableProtocolClient","deploy","createProtocolClient","env","contractId","createClient","uploadAllWasms","wasmDir","server","rpc","Server","RPC_URL","allowHttp","wasmFiles","endpoint","treasury","uln302","sml","priceFeed","executorFeeLib","dvnFeeLib","dvn","executorHelper","executor","hashes","name","file","Object","entries","wasmBuffer","readFileSync","path","join","console","log","length","toFixed","uploadWasm","DEFAULT_DEPLOYER","deployChainContracts","protocol","eid","chainLabel","deployer","wasmHashes","addresses","endpointV2","deployedEndpoint","deployContract","Client","owner","publicKey","native_token","NATIVE_TOKEN_ADDRESS","wasmHash","options","deployedTreasury","deployedUln302","deployedSml","fee_recipient","deployedPriceFeed","price_updater","deployedExecutorFeeLib","deployedDvnFeeLib","deployedDvn","vid","DVN_VID","signers","DVN_SIGNER","ethAddress","threshold","admins","supported_msglibs","price_feed","default_multiplier_bps","worker_fee_lib","deposit_address","deployedExecutorHelper","undefined","deployedExecutor","EXECUTOR_ADMIN","message_libs","initChainClients","executorClient","set_executor_helper","helper","allowed_functions","signAndSend","clients","endpointClient","uln302Client","smlClient","treasuryClient","executorHelperClient","executorFeeLibClient","priceFeedClient","dvnFeeLibClient","dvnClient","wireChainContracts","chain","otherChain","thisEid","otherEid","register_library","new_lib","set_zro","zro","ZRO_TOKEN_ADDRESS","set_default_executor_configs","params","dst_eid","config","max_message_size","set_default_send_uln_configs","confirmations","required_dvns","optional_dvns","optional_dvn_threshold","set_default_receive_uln_configs","set_default_send_library","set_default_receive_library","src_eid","grace_period","set_price_ratio_denominator","denominator","set_native_token_price_usd","native_token_price_usd","NORMALIZED_OTHER_EID","set_price","prices","price","gas_per_byte","gas_price_in_unit","price_ratio","set_dst_config","admin","dst_config","floor_margin_usd","lz_compose_base_gas","lz_receive_base_gas","multiplier_bps","native_cap","gas","createProtocolStackGlobalSetup","globalSetup","provide","startStellarLocalnet","addressesA","addressesB","Promise","all","EID_A","EID_B","CHAIN_B_DEPLOYER","chainA","chainB","error","stopStellarLocalnet"],"mappings":"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","file":"AYQIUXWL.js","sourcesContent":["import type { Keypair } from '@stellar/stellar-sdk';\nimport { rpc } from '@stellar/stellar-sdk';\nimport { readFileSync } from 'fs';\nimport path from 'path';\n\nimport { createClient } from './client.js';\nimport { type DeployableContractClient, deployContract, uploadWasm } from './deploy.js';\nimport type { StellarTestEnv } from './env.js';\nimport { startStellarLocalnet, stopStellarLocalnet } from './localnet.js';\n\n/** Vitest globalSetup context subset (avoids a hard vitest type dependency in src/). */\nexport type ProtocolGlobalSetupContext = {\n provide: (key: 'chainA' | 'chainB', value: ChainAddresses) => void;\n};\n\ntype SigningTransaction = {\n signAndSend: () => Promise<unknown>;\n};\n\n/**\n * Generated Soroban clients expose asynchronous methods that construct a signable transaction.\n * Their method names and argument types remain owned by the generated SDK.\n */\ntype ProtocolClient = Record<string, (args: object) => Promise<SigningTransaction>>;\n\ntype ProtocolClientConstructor<TClient extends ProtocolClient> = new (options: {\n contractId: string;\n publicKey: string;\n signTransaction: (tx: string) => Promise<{ signedTxXdr: string; signerAddress: string }>;\n rpcUrl: string;\n networkPassphrase: string;\n allowHttp: boolean;\n}) => TClient;\n\nexport interface ProtocolContractModule {\n /** The generated SDK Client constructor. Validated at the adapter boundary before use. */\n Client: unknown;\n}\n\n/**\n * Protocol contract modules from `@layerzerolabs/lz-v2-stellar-sdk`.\n * Injected by consumers to avoid a workspace cycle (test-utils ↔ sdk).\n */\nexport interface ProtocolStackModules {\n endpoint: ProtocolContractModule;\n treasury: ProtocolContractModule;\n uln302: ProtocolContractModule;\n sml: ProtocolContractModule;\n priceFeed: ProtocolContractModule;\n executorFeeLib: ProtocolContractModule;\n dvnFeeLib: ProtocolContractModule;\n dvn: ProtocolContractModule;\n executorHelper: ProtocolContractModule;\n executor: ProtocolContractModule;\n}\n\n/**\n * Addresses for a single chain's protocol contracts\n */\nexport interface ChainAddresses {\n eid: number;\n endpointV2: string;\n uln302: string;\n sml: string;\n treasury: string;\n executor: string;\n executorHelper: string;\n executorFeeLib: string;\n priceFeed: string;\n dvnFeeLib: string;\n dvn: string;\n}\n\n/**\n * Clients for a single chain's protocol contracts\n */\ninterface ChainClients {\n endpointClient: ProtocolClient;\n uln302Client: ProtocolClient;\n smlClient: ProtocolClient;\n treasuryClient: ProtocolClient;\n executorClient: ProtocolClient;\n executorHelperClient: ProtocolClient;\n executorFeeLibClient: ProtocolClient;\n priceFeedClient: ProtocolClient;\n dvnFeeLibClient: ProtocolClient;\n dvnClient: ProtocolClient;\n}\n\n/**\n * Complete chain setup with addresses and clients\n */\ninterface ChainSetup {\n addresses: ChainAddresses;\n clients: ChainClients;\n}\n\ninterface WasmHashes {\n endpoint: string;\n treasury: string;\n uln302: string;\n sml: string;\n priceFeed: string;\n executorFeeLib: string;\n dvnFeeLib: string;\n dvn: string;\n executorHelper: string;\n executor: string;\n}\n\nfunction getProtocolClientConstructor<TClient extends ProtocolClient>(\n client: unknown,\n moduleName: string,\n): ProtocolClientConstructor<TClient> {\n if (typeof client !== 'function') {\n throw new TypeError(`${moduleName}.Client must be a generated contract client constructor`);\n }\n return client as ProtocolClientConstructor<TClient>;\n}\n\nfunction getDeployableProtocolClient<TClient extends { options: { contractId: string } }>(\n client: unknown,\n moduleName: string,\n): DeployableContractClient<TClient> {\n if (\n typeof client !== 'function' ||\n !('deploy' in client) ||\n typeof client.deploy !== 'function'\n ) {\n throw new TypeError(`${moduleName}.Client must expose a deploy method`);\n }\n return client as DeployableContractClient<TClient>;\n}\n\nfunction createProtocolClient(\n env: StellarTestEnv,\n client: unknown,\n contractId: string,\n moduleName: string,\n): ProtocolClient {\n return createClient(\n env,\n getProtocolClientConstructor<ProtocolClient>(client, moduleName),\n contractId,\n );\n}\n\n/**\n * Upload all protocol WASM files once and return their hashes.\n */\nasync function uploadAllWasms(env: StellarTestEnv, wasmDir: string): Promise<WasmHashes> {\n const server = new rpc.Server(env.RPC_URL, { allowHttp: true });\n\n const wasmFiles = {\n endpoint: 'endpoint_v2.wasm',\n treasury: 'treasury.wasm',\n uln302: 'uln302.wasm',\n sml: 'simple_message_lib.wasm',\n priceFeed: 'price_feed.wasm',\n executorFeeLib: 'executor_fee_lib.wasm',\n dvnFeeLib: 'dvn_fee_lib.wasm',\n dvn: 'dvn.wasm',\n executorHelper: 'executor_helper.wasm',\n executor: 'executor.wasm',\n };\n\n const hashes: Record<string, string> = {};\n for (const [name, file] of Object.entries(wasmFiles)) {\n const wasmBuffer = readFileSync(path.join(wasmDir, file));\n console.log(`📤 Uploading ${name} WASM (${(wasmBuffer.length / 1024).toFixed(1)} KB)...`);\n hashes[name] = await uploadWasm(env, wasmBuffer, env.DEFAULT_DEPLOYER, server);\n }\n\n return hashes as unknown as WasmHashes;\n}\n\n/**\n * Deploy all protocol contracts for a single chain using pre-uploaded WASM hashes.\n * The deployer pays gas; contract ownership is always DEFAULT_DEPLOYER.\n */\nasync function deployChainContracts(\n env: StellarTestEnv,\n protocol: ProtocolStackModules,\n eid: number,\n chainLabel: string,\n deployer: Keypair,\n wasmDir: string,\n wasmHashes: WasmHashes,\n): Promise<ChainAddresses> {\n const addresses: ChainAddresses = {\n eid,\n endpointV2: '',\n uln302: '',\n sml: '',\n treasury: '',\n executor: '',\n executorHelper: '',\n executorFeeLib: '',\n priceFeed: '',\n dvnFeeLib: '',\n dvn: '',\n };\n\n // 1. Deploy Endpoint\n console.log(`🚀 [${chainLabel}] Deploying Endpoint (EID: ${eid})...`);\n const deployedEndpoint = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.endpoint.Client, 'endpoint'),\n path.join(wasmDir, 'endpoint_v2.wasm'),\n {\n eid,\n owner: env.DEFAULT_DEPLOYER.publicKey(),\n native_token: env.NATIVE_TOKEN_ADDRESS,\n },\n deployer,\n { wasmHash: wasmHashes.endpoint },\n );\n addresses.endpointV2 = deployedEndpoint.options.contractId;\n console.log(`✅ [${chainLabel}] Endpoint deployed:`, addresses.endpointV2);\n\n // 2. Deploy Treasury\n console.log(`🚀 [${chainLabel}] Deploying Treasury...`);\n const deployedTreasury = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.treasury.Client, 'treasury'),\n path.join(wasmDir, 'treasury.wasm'),\n { owner: env.DEFAULT_DEPLOYER.publicKey() },\n deployer,\n { wasmHash: wasmHashes.treasury },\n );\n addresses.treasury = deployedTreasury.options.contractId;\n console.log(`✅ [${chainLabel}] Treasury deployed:`, addresses.treasury);\n\n // 3. Deploy ULN302\n console.log(`🚀 [${chainLabel}] Deploying ULN302...`);\n const deployedUln302 = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.uln302.Client, 'uln302'),\n path.join(wasmDir, 'uln302.wasm'),\n {\n owner: env.DEFAULT_DEPLOYER.publicKey(),\n endpoint: addresses.endpointV2,\n treasury: addresses.treasury,\n },\n deployer,\n { wasmHash: wasmHashes.uln302 },\n );\n addresses.uln302 = deployedUln302.options.contractId;\n console.log(`✅ [${chainLabel}] ULN302 deployed:`, addresses.uln302);\n\n // 4. Deploy SML (SimpleMessageLib)\n console.log(`🚀 [${chainLabel}] Deploying SimpleMessageLib...`);\n const deployedSml = await deployContract<ProtocolClient & { options: { contractId: string } }>(\n env,\n getDeployableProtocolClient(protocol.sml.Client, 'sml'),\n path.join(wasmDir, 'simple_message_lib.wasm'),\n {\n owner: env.DEFAULT_DEPLOYER.publicKey(),\n endpoint: addresses.endpointV2,\n fee_recipient: env.DEFAULT_DEPLOYER.publicKey(),\n },\n deployer,\n { wasmHash: wasmHashes.sml },\n );\n addresses.sml = deployedSml.options.contractId;\n console.log(`✅ [${chainLabel}] SimpleMessageLib deployed:`, addresses.sml);\n\n // 5. Deploy Price Feed\n console.log(`🚀 [${chainLabel}] Deploying Price Feed...`);\n const deployedPriceFeed = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.priceFeed.Client, 'priceFeed'),\n path.join(wasmDir, 'price_feed.wasm'),\n {\n owner: env.DEFAULT_DEPLOYER.publicKey(),\n price_updater: env.DEFAULT_DEPLOYER.publicKey(),\n },\n deployer,\n { wasmHash: wasmHashes.priceFeed },\n );\n addresses.priceFeed = deployedPriceFeed.options.contractId;\n console.log(`✅ [${chainLabel}] Price Feed deployed:`, addresses.priceFeed);\n\n // 6. Deploy Executor Fee Lib\n console.log(`🚀 [${chainLabel}] Deploying Executor Fee Lib...`);\n const deployedExecutorFeeLib = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.executorFeeLib.Client, 'executorFeeLib'),\n path.join(wasmDir, 'executor_fee_lib.wasm'),\n { owner: env.DEFAULT_DEPLOYER.publicKey() },\n deployer,\n { wasmHash: wasmHashes.executorFeeLib },\n );\n addresses.executorFeeLib = deployedExecutorFeeLib.options.contractId;\n console.log(`✅ [${chainLabel}] Executor Fee Lib deployed:`, addresses.executorFeeLib);\n\n // 7. Deploy DVN Fee Lib\n console.log(`🚀 [${chainLabel}] Deploying DVN Fee Lib...`);\n const deployedDvnFeeLib = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.dvnFeeLib.Client, 'dvnFeeLib'),\n path.join(wasmDir, 'dvn_fee_lib.wasm'),\n { owner: env.DEFAULT_DEPLOYER.publicKey() },\n deployer,\n { wasmHash: wasmHashes.dvnFeeLib },\n );\n addresses.dvnFeeLib = deployedDvnFeeLib.options.contractId;\n console.log(`✅ [${chainLabel}] DVN Fee Lib deployed:`, addresses.dvnFeeLib);\n\n // 8. Deploy DVN (same signer for both chains)\n console.log(`🚀 [${chainLabel}] Deploying DVN...`);\n const deployedDvn = await deployContract<ProtocolClient & { options: { contractId: string } }>(\n env,\n getDeployableProtocolClient(protocol.dvn.Client, 'dvn'),\n path.join(wasmDir, 'dvn.wasm'),\n {\n vid: env.DVN_VID,\n signers: [env.DVN_SIGNER.ethAddress],\n threshold: 1,\n admins: [env.DEFAULT_DEPLOYER.publicKey()],\n supported_msglibs: [addresses.uln302],\n price_feed: addresses.priceFeed,\n default_multiplier_bps: 10000,\n worker_fee_lib: addresses.dvnFeeLib,\n deposit_address: env.DEFAULT_DEPLOYER.publicKey(),\n },\n deployer,\n { wasmHash: wasmHashes.dvn },\n );\n addresses.dvn = deployedDvn.options.contractId;\n console.log(`✅ [${chainLabel}] DVN deployed:`, addresses.dvn);\n\n // 9. Deploy Executor Helper\n console.log(`🚀 [${chainLabel}] Deploying Executor Helper...`);\n const deployedExecutorHelper = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.executorHelper.Client, 'executorHelper'),\n path.join(wasmDir, 'executor_helper.wasm'),\n undefined,\n deployer,\n { wasmHash: wasmHashes.executorHelper },\n );\n addresses.executorHelper = deployedExecutorHelper.options.contractId;\n console.log(`✅ [${chainLabel}] Executor Helper deployed:`, addresses.executorHelper);\n\n // 10. Deploy Executor (supports both ULN302 and SML)\n console.log(`🚀 [${chainLabel}] Deploying Executor...`);\n const deployedExecutor = await deployContract<\n ProtocolClient & { options: { contractId: string } }\n >(\n env,\n getDeployableProtocolClient(protocol.executor.Client, 'executor'),\n path.join(wasmDir, 'executor.wasm'),\n {\n owner: env.DEFAULT_DEPLOYER.publicKey(),\n endpoint: addresses.endpointV2,\n admins: [env.EXECUTOR_ADMIN.publicKey(), env.DEFAULT_DEPLOYER.publicKey()],\n message_libs: [addresses.uln302, addresses.sml],\n price_feed: addresses.priceFeed,\n default_multiplier_bps: 10000,\n worker_fee_lib: addresses.executorFeeLib,\n deposit_address: env.DEFAULT_DEPLOYER.publicKey(),\n },\n deployer,\n { wasmHash: wasmHashes.executor },\n );\n addresses.executor = deployedExecutor.options.contractId;\n console.log(`✅ [${chainLabel}] Executor deployed:`, addresses.executor);\n\n return addresses;\n}\n\n/**\n * Register executor helper and create owner-signed clients for a chain.\n * Must be called sequentially (uses DEFAULT_DEPLOYER for signing).\n */\nasync function initChainClients(\n env: StellarTestEnv,\n protocol: ProtocolStackModules,\n addresses: ChainAddresses,\n chainLabel: string,\n): Promise<ChainSetup> {\n // Register Executor Helper with Executor (needs owner-signed client)\n console.log(`🚀 [${chainLabel}] Registering Executor Helper with Executor...`);\n const executorClient = createProtocolClient(\n env,\n protocol.executor.Client,\n addresses.executor,\n 'executor',\n );\n await (\n await executorClient.set_executor_helper({\n helper: addresses.executorHelper,\n allowed_functions: ['execute', 'compose'],\n })\n ).signAndSend();\n console.log(`✅ [${chainLabel}] Executor Helper registered`);\n\n const clients: ChainClients = {\n endpointClient: createProtocolClient(\n env,\n protocol.endpoint.Client,\n addresses.endpointV2,\n 'endpoint',\n ),\n uln302Client: createProtocolClient(env, protocol.uln302.Client, addresses.uln302, 'uln302'),\n smlClient: createProtocolClient(env, protocol.sml.Client, addresses.sml, 'sml'),\n treasuryClient: createProtocolClient(\n env,\n protocol.treasury.Client,\n addresses.treasury,\n 'treasury',\n ),\n executorClient,\n executorHelperClient: createProtocolClient(\n env,\n protocol.executorHelper.Client,\n addresses.executorHelper,\n 'executorHelper',\n ),\n executorFeeLibClient: createProtocolClient(\n env,\n protocol.executorFeeLib.Client,\n addresses.executorFeeLib,\n 'executorFeeLib',\n ),\n priceFeedClient: createProtocolClient(\n env,\n protocol.priceFeed.Client,\n addresses.priceFeed,\n 'priceFeed',\n ),\n dvnFeeLibClient: createProtocolClient(\n env,\n protocol.dvnFeeLib.Client,\n addresses.dvnFeeLib,\n 'dvnFeeLib',\n ),\n dvnClient: createProtocolClient(env, protocol.dvn.Client, addresses.dvn, 'dvn'),\n };\n\n return { addresses, clients };\n}\n\n/**\n * Wire a single chain's protocol contracts for cross-chain communication\n *\n * @param chain - The chain to wire (this chain)\n * @param otherChain - The other chain (for cross-references)\n * @param chainLabel - Label for logging\n */\nasync function wireChainContracts(\n env: StellarTestEnv,\n chain: ChainSetup,\n otherChain: ChainSetup,\n chainLabel: string,\n): Promise<void> {\n const { addresses, clients } = chain;\n const { endpointClient, uln302Client, priceFeedClient, executorClient, dvnClient } = clients;\n\n const thisEid = addresses.eid;\n const otherEid = otherChain.addresses.eid;\n\n console.log(\n `\\n🔗 [${chainLabel}] Wiring protocol contracts (EID: ${thisEid} ↔ ${otherEid})...`,\n );\n\n // Register libraries\n await (await endpointClient.register_library({ new_lib: addresses.uln302 })).signAndSend();\n await (await endpointClient.register_library({ new_lib: addresses.sml })).signAndSend();\n console.log(`✅ [${chainLabel}] Libraries registered (ULN302 + SML)`);\n\n // Set ZRO token\n await (await endpointClient.set_zro({ zro: env.ZRO_TOKEN_ADDRESS })).signAndSend();\n console.log(`✅ [${chainLabel}] ZRO token set`);\n\n // ========================================================================\n // Configure for SENDING to the other chain (dst_eid = otherEid)\n // ========================================================================\n\n // ULN302 executor config for sending to other chain\n await (\n await uln302Client.set_default_executor_configs({\n params: [\n {\n dst_eid: otherEid,\n config: { executor: addresses.executor, max_message_size: 10000 },\n },\n ],\n })\n ).signAndSend();\n console.log(`✅ [${chainLabel}] ULN302 executor config set for dst_eid=${otherEid}`);\n\n // ULN302 send config: when sending to otherEid, use THIS chain's DVN for fee quoting\n // (The DVN needs dst_config for the destination EID to calculate fees)\n await (\n await uln302Client.set_default_send_uln_configs({\n params: [\n {\n eid: otherEid,\n config: {\n confirmations: 1n,\n required_dvns: [addresses.dvn], // THIS chain's DVN (has dst_config for otherEid)\n optional_dvns: [],\n optional_dvn_threshold: 0,\n },\n },\n ],\n })\n ).signAndSend();\n console.log(\n `✅ [${chainLabel}] ULN302 send config set for eid=${otherEid} (DVN: ${addresses.dvn})`,\n );\n\n // ========================================================================\n // Configure for RECEIVING from the other chain (src_eid = otherEid)\n // ========================================================================\n\n // ULN302 receive config: when receiving from otherEid, THIS chain's DVN verifies\n await (\n await uln302Client.set_default_receive_uln_configs({\n params: [\n {\n eid: otherEid,\n config: {\n confirmations: 1n,\n required_dvns: [addresses.dvn], // THIS chain's DVN verifies incoming\n optional_dvns: [],\n optional_dvn_threshold: 0,\n },\n },\n ],\n })\n ).signAndSend();\n console.log(\n `✅ [${chainLabel}] ULN302 receive config set for eid=${otherEid} (DVN: ${addresses.dvn})`,\n );\n\n // Set default send/receive libraries for the other chain\n await (\n await endpointClient.set_default_send_library({\n dst_eid: otherEid,\n new_lib: addresses.uln302,\n })\n ).signAndSend();\n await (\n await endpointClient.set_default_receive_library({\n src_eid: otherEid,\n new_lib: addresses.uln302,\n grace_period: 0n,\n })\n ).signAndSend();\n console.log(`✅ [${chainLabel}] Default libraries set to ULN302 for eid=${otherEid}`);\n\n // ========================================================================\n // Configure Price Feed for both chains\n // ========================================================================\n\n await (\n await priceFeedClient.set_price_ratio_denominator({ denominator: 100000000000000000000n })\n ).signAndSend();\n await (\n await priceFeedClient.set_native_token_price_usd({\n price_updater: env.DEFAULT_DEPLOYER.publicKey(),\n native_token_price_usd: 1000000000000000000n,\n })\n ).signAndSend();\n\n // Set prices for the other chain\n const NORMALIZED_OTHER_EID = otherEid % 30000;\n await (\n await priceFeedClient.set_price({\n price_updater: env.DEFAULT_DEPLOYER.publicKey(),\n prices: [\n {\n eid: NORMALIZED_OTHER_EID,\n price: {\n gas_per_byte: 1,\n gas_price_in_unit: 1n,\n price_ratio: 100000000000000000000n,\n },\n },\n ],\n })\n ).signAndSend();\n console.log(`✅ [${chainLabel}] Price Feed configured for eid=${otherEid}`);\n\n // ========================================================================\n // Configure Executor for sending to other chain\n // ========================================================================\n\n await (\n await executorClient.set_dst_config({\n admin: env.DEFAULT_DEPLOYER.publicKey(),\n params: [\n {\n dst_eid: otherEid,\n dst_config: {\n floor_margin_usd: 0n,\n lz_compose_base_gas: 50000n,\n lz_receive_base_gas: 100000n,\n multiplier_bps: 10000,\n native_cap: 1000000000000n,\n },\n },\n ],\n })\n ).signAndSend();\n console.log(`✅ [${chainLabel}] Executor configured for dst_eid=${otherEid}`);\n\n // ========================================================================\n // Configure DVN for verifying packets going to other chain\n // ========================================================================\n\n await (\n await dvnClient.set_dst_config({\n admin: env.DEFAULT_DEPLOYER.publicKey(),\n params: [\n {\n dst_eid: otherEid,\n config: {\n floor_margin_usd: 0n,\n gas: 100000n,\n multiplier_bps: 10000,\n },\n },\n ],\n })\n ).signAndSend();\n console.log(`✅ [${chainLabel}] DVN configured for dst_eid=${otherEid}`);\n\n console.log(`🎉 [${chainLabel}] Protocol wiring complete!`);\n}\n\nexport interface ProtocolStackGlobalSetupOptions {\n /**\n * Directory containing protocol WASM artifacts, or an async resolver.\n * Consumers typically resolve via getFullyQualifiedRepoRootPath.\n */\n wasmDir: string | (() => string | Promise<string>);\n /**\n * Protocol contract modules from `@layerzerolabs/lz-v2-stellar-sdk`.\n * Passed by the consumer to avoid a workspace dependency cycle.\n */\n protocol: ProtocolStackModules;\n}\n\n/**\n * Returns a Vitest globalSetup that deploys two protocol stacks and wires them.\n */\nexport function createProtocolStackGlobalSetup(\n env: StellarTestEnv,\n options: ProtocolStackGlobalSetupOptions,\n): (ctx: ProtocolGlobalSetupContext) => Promise<() => Promise<void>> {\n return async function globalSetup({\n provide,\n }: ProtocolGlobalSetupContext): Promise<() => Promise<void>> {\n console.log('\\n========================================');\n console.log('🌐 GLOBAL SETUP: Starting Stellar Localnet');\n console.log('========================================\\n');\n\n await startStellarLocalnet({ env });\n\n try {\n const wasmDir =\n typeof options.wasmDir === 'function' ? await options.wasmDir() : options.wasmDir;\n\n console.log('\\n========================================');\n console.log('📤 GLOBAL SETUP: Uploading WASM (once)');\n console.log('========================================\\n');\n\n const wasmHashes = await uploadAllWasms(env, wasmDir);\n\n console.log('\\n========================================');\n console.log('📦 GLOBAL SETUP: Deploying Protocol Contracts (Two Chains in Parallel)');\n console.log('========================================\\n');\n\n const { protocol } = options;\n\n const [addressesA, addressesB] = await Promise.all([\n deployChainContracts(\n env,\n protocol,\n env.EID_A,\n 'Chain A',\n env.DEFAULT_DEPLOYER,\n wasmDir,\n wasmHashes,\n ),\n deployChainContracts(\n env,\n protocol,\n env.EID_B,\n 'Chain B',\n env.CHAIN_B_DEPLOYER,\n wasmDir,\n wasmHashes,\n ),\n ]);\n\n const chainA = await initChainClients(env, protocol, addressesA, 'Chain A');\n const chainB = await initChainClients(env, protocol, addressesB, 'Chain B');\n\n console.log('\\n========================================');\n console.log('🔗 GLOBAL SETUP: Wiring Protocol Contracts (Cross-Chain)');\n console.log('========================================\\n');\n\n await wireChainContracts(env, chainA, chainB, 'Chain A');\n await wireChainContracts(env, chainB, chainA, 'Chain B');\n\n provide('chainA', chainA.addresses);\n provide('chainB', chainB.addresses);\n console.log('\\n✅ Chain addresses provided to tests (in-memory)');\n console.log(' Chain A (EID ' + env.EID_A + '):', chainA.addresses.endpointV2);\n console.log(' Chain B (EID ' + env.EID_B + '):', chainB.addresses.endpointV2);\n\n console.log('\\n========================================');\n console.log('✅ GLOBAL SETUP COMPLETE (Two-Chain Cross-Chain Ready)');\n console.log('========================================\\n');\n } catch (error) {\n await stopStellarLocalnet({ env });\n throw error;\n }\n\n return async () => {\n console.log('\\n========================================');\n console.log('🛑 GLOBAL TEARDOWN: Stopping Stellar Localnet');\n console.log('========================================\\n');\n\n await stopStellarLocalnet({ env });\n };\n };\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { startStellarLocalnet, stopStellarLocalnet } from './
|
|
1
|
+
import { startStellarLocalnet, stopStellarLocalnet } from './FPY7PKKI.js';
|
|
2
2
|
import { __name } from './VUOMXK5T.js';
|
|
3
3
|
|
|
4
4
|
// src/localnet-global-setup.ts
|
|
@@ -26,5 +26,5 @@ function createLocalnetOnlyGlobalSetup(env) {
|
|
|
26
26
|
__name(createLocalnetOnlyGlobalSetup, "createLocalnetOnlyGlobalSetup");
|
|
27
27
|
|
|
28
28
|
export { createLocalnetOnlyGlobalSetup };
|
|
29
|
-
//# sourceMappingURL=
|
|
30
|
-
//# sourceMappingURL=
|
|
29
|
+
//# sourceMappingURL=CHSP4IIE.js.map
|
|
30
|
+
//# sourceMappingURL=CHSP4IIE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/localnet-global-setup.ts"],"names":["createLocalnetOnlyGlobalSetup","env","globalSetup","_ctx","console","log","startStellarLocalnet","stopStellarLocalnet"],"mappings":";;;;AAOO,SAASA,8BACZC,GAAAA,EAAmB;AAEnB,EAAA,uBAAO,MAAA,CAAA,eAAeC,YAAYC,IAAAA,EAAc;AAC5CC,IAAAA,OAAAA,CAAQC,IAAI,4CAAA,CAAA;AACZD,IAAAA,OAAAA,CAAQC,IAAI,mDAAA,CAAA;AACZD,IAAAA,OAAAA,CAAQC,IAAI,4CAAA,CAAA;AAEZ,IAAA,MAAMC,oBAAAA,CAAqB;AAAEL,MAAAA;KAAI,CAAA;AAEjCG,IAAAA,OAAAA,CAAQC,IAAI,4CAAA,CAAA;AACZD,IAAAA,OAAAA,CAAQC,IAAI,8CAAA,CAAA;AACZD,IAAAA,OAAAA,CAAQC,IAAI,4CAAA,CAAA;AAEZ,IAAA,OAAO,YAAA;AACHD,MAAAA,OAAAA,CAAQC,IAAI,4CAAA,CAAA;AACZD,MAAAA,OAAAA,CAAQC,IAAI,sDAAA,CAAA;AACZD,MAAAA,OAAAA,CAAQC,IAAI,4CAAA,CAAA;AAEZ,MAAA,MAAME,mBAAAA,CAAoB;AAAEN,QAAAA;OAAI,CAAA;AACpC,IAAA,CAAA;EACJ,CAAA,EAlBO,aAAA,CAAA;AAmBX;AAtBgBD,MAAAA,CAAAA,6BAAAA,EAAAA,+BAAAA,CAAAA","file":"
|
|
1
|
+
{"version":3,"sources":["../src/localnet-global-setup.ts"],"names":["createLocalnetOnlyGlobalSetup","env","globalSetup","_ctx","console","log","startStellarLocalnet","stopStellarLocalnet"],"mappings":";;;;AAOO,SAASA,8BACZC,GAAAA,EAAmB;AAEnB,EAAA,uBAAO,MAAA,CAAA,eAAeC,YAAYC,IAAAA,EAAc;AAC5CC,IAAAA,OAAAA,CAAQC,IAAI,4CAAA,CAAA;AACZD,IAAAA,OAAAA,CAAQC,IAAI,mDAAA,CAAA;AACZD,IAAAA,OAAAA,CAAQC,IAAI,4CAAA,CAAA;AAEZ,IAAA,MAAMC,oBAAAA,CAAqB;AAAEL,MAAAA;KAAI,CAAA;AAEjCG,IAAAA,OAAAA,CAAQC,IAAI,4CAAA,CAAA;AACZD,IAAAA,OAAAA,CAAQC,IAAI,8CAAA,CAAA;AACZD,IAAAA,OAAAA,CAAQC,IAAI,4CAAA,CAAA;AAEZ,IAAA,OAAO,YAAA;AACHD,MAAAA,OAAAA,CAAQC,IAAI,4CAAA,CAAA;AACZD,MAAAA,OAAAA,CAAQC,IAAI,sDAAA,CAAA;AACZD,MAAAA,OAAAA,CAAQC,IAAI,4CAAA,CAAA;AAEZ,MAAA,MAAME,mBAAAA,CAAoB;AAAEN,QAAAA;OAAI,CAAA;AACpC,IAAA,CAAA;EACJ,CAAA,EAlBO,aAAA,CAAA;AAmBX;AAtBgBD,MAAAA,CAAAA,6BAAAA,EAAAA,+BAAAA,CAAAA","file":"CHSP4IIE.js","sourcesContent":["import type { StellarTestEnv } from './env.js';\nimport { startStellarLocalnet, stopStellarLocalnet } from './localnet.js';\n\n/**\n * Vitest globalSetup that only starts/stops Stellar localnet.\n * Use when the suite deploys its own contracts (e.g. protocol SDK upgrader tests).\n */\nexport function createLocalnetOnlyGlobalSetup(\n env: StellarTestEnv,\n): (_ctx?: unknown) => Promise<() => Promise<void>> {\n return async function globalSetup(_ctx?: unknown): Promise<() => Promise<void>> {\n console.log('\\n========================================');\n console.log('🌐 GLOBAL SETUP: Starting Stellar Localnet');\n console.log('========================================\\n');\n\n await startStellarLocalnet({ env });\n\n console.log('\\n========================================');\n console.log('✅ GLOBAL SETUP COMPLETE (localnet only)');\n console.log('========================================\\n');\n\n return async () => {\n console.log('\\n========================================');\n console.log('🛑 GLOBAL TEARDOWN: Stopping Stellar Localnet');\n console.log('========================================\\n');\n\n await stopStellarLocalnet({ env });\n };\n };\n}\n"]}
|
|
@@ -12,6 +12,7 @@ var REQUEST_TIMEOUT_MS = 5e3;
|
|
|
12
12
|
var FUNDING_RETRY_INTERVAL_MS = 2e3;
|
|
13
13
|
var DOCKER_NAME_RE = /^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/;
|
|
14
14
|
var DOCKER_IMAGE_RE = /^(?!-)[a-z0-9][a-z0-9._/-]*(?::[a-zA-Z0-9][a-zA-Z0-9_.-]*)?(?:@[a-zA-Z0-9][a-zA-Z0-9_+.-]*:[a-fA-F0-9]{32,})?$/;
|
|
15
|
+
var DOCKER_COMMAND_ARG_RE = /^(?:--)?[a-zA-Z0-9][a-zA-Z0-9._/=+-]*$/;
|
|
15
16
|
function assertDockerArgs(env) {
|
|
16
17
|
if (!DOCKER_NAME_RE.test(env.CONTAINER_NAME)) {
|
|
17
18
|
throw new Error(`Invalid docker container name: ${JSON.stringify(env.CONTAINER_NAME)}`);
|
|
@@ -23,6 +24,11 @@ function assertDockerArgs(env) {
|
|
|
23
24
|
if (!DOCKER_IMAGE_RE.test(dockerImage)) {
|
|
24
25
|
throw new Error(`Invalid docker image: ${JSON.stringify(dockerImage)}`);
|
|
25
26
|
}
|
|
27
|
+
for (const arg of env.DOCKER_COMMAND ?? []) {
|
|
28
|
+
if (!DOCKER_COMMAND_ARG_RE.test(arg)) {
|
|
29
|
+
throw new Error(`Invalid docker command arg: ${JSON.stringify(arg)}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
26
32
|
}
|
|
27
33
|
__name(assertDockerArgs, "assertDockerArgs");
|
|
28
34
|
function buildDockerRunArgs(env) {
|
|
@@ -36,7 +42,8 @@ function buildDockerRunArgs(env) {
|
|
|
36
42
|
STELLAR_LOCALNET_OWNER_LABEL,
|
|
37
43
|
"-p",
|
|
38
44
|
`127.0.0.1:${env.HOST_PORT}:${CONTAINER_PORT}`,
|
|
39
|
-
env.DOCKER_IMAGE ?? DEFAULT_STELLAR_LOCALNET_IMAGE
|
|
45
|
+
env.DOCKER_IMAGE ?? DEFAULT_STELLAR_LOCALNET_IMAGE,
|
|
46
|
+
...env.DOCKER_COMMAND ?? []
|
|
40
47
|
];
|
|
41
48
|
}
|
|
42
49
|
__name(buildDockerRunArgs, "buildDockerRunArgs");
|
|
@@ -121,6 +128,7 @@ async function startStellarLocalnet({ env, commandRunner = runDockerCommand }) {
|
|
|
121
128
|
console.log("\u23F3 Waiting for Stellar RPC to be healthy...");
|
|
122
129
|
await waitForRpcHealth(env);
|
|
123
130
|
console.log("\u2705 Stellar RPC is healthy");
|
|
131
|
+
await fundAccountViaFriendbot(env, env.JUNK_WALLET.publicKey());
|
|
124
132
|
await fundTestAccounts(env);
|
|
125
133
|
await deployNativeSac(env);
|
|
126
134
|
await deployZroToken(env);
|
|
@@ -224,6 +232,48 @@ async function waitForRpcHealth(env) {
|
|
|
224
232
|
throw new Error(`Stellar RPC failed to become healthy within ${STARTUP_TIMEOUT_MS / 1e3} seconds`);
|
|
225
233
|
}
|
|
226
234
|
__name(waitForRpcHealth, "waitForRpcHealth");
|
|
235
|
+
async function waitForAccountOnRpc(getAccount, publicKey, { timeoutMs = STARTUP_TIMEOUT_MS, intervalMs = FUNDING_RETRY_INTERVAL_MS, sleep = /* @__PURE__ */ __name((ms) => new Promise((resolve) => setTimeout(resolve, ms)), "sleep") } = {}) {
|
|
236
|
+
const startTime = Date.now();
|
|
237
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
238
|
+
if (await accountExists(getAccount, publicKey)) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
await sleep(intervalMs);
|
|
242
|
+
}
|
|
243
|
+
throw new Error(`Account ${publicKey} not visible to Soroban RPC within ${timeoutMs / 1e3} seconds`);
|
|
244
|
+
}
|
|
245
|
+
__name(waitForAccountOnRpc, "waitForAccountOnRpc");
|
|
246
|
+
async function fundAccountViaFriendbot(env, publicKey) {
|
|
247
|
+
const friendbotUrl = `http://localhost:${env.HOST_PORT}/friendbot?addr=${encodeURIComponent(publicKey)}`;
|
|
248
|
+
const startTime = Date.now();
|
|
249
|
+
let lastError;
|
|
250
|
+
while (Date.now() - startTime < STARTUP_TIMEOUT_MS) {
|
|
251
|
+
try {
|
|
252
|
+
const response = await fetch(friendbotUrl, {
|
|
253
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
|
|
254
|
+
});
|
|
255
|
+
const body = await response.text();
|
|
256
|
+
if (response.ok || body.includes("already funded") || body.includes("op_already_exists")) {
|
|
257
|
+
console.log(`\u2705 Friendbot funded ${publicKey}; waiting for RPC visibility\u2026`);
|
|
258
|
+
const server = new rpc.Server(env.RPC_URL, {
|
|
259
|
+
allowHttp: true
|
|
260
|
+
});
|
|
261
|
+
const remainingMs = Math.max(1, STARTUP_TIMEOUT_MS - (Date.now() - startTime));
|
|
262
|
+
await waitForAccountOnRpc((accountId) => server.getAccount(accountId), publicKey, {
|
|
263
|
+
timeoutMs: remainingMs
|
|
264
|
+
});
|
|
265
|
+
console.log(`\u2705 Account ${publicKey} visible to Soroban RPC`);
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
lastError = new Error(`friendbot HTTP ${response.status}: ${body}`);
|
|
269
|
+
} catch (err) {
|
|
270
|
+
lastError = err;
|
|
271
|
+
}
|
|
272
|
+
await new Promise((resolve) => setTimeout(resolve, FUNDING_RETRY_INTERVAL_MS));
|
|
273
|
+
}
|
|
274
|
+
throw new Error(`Friendbot failed to fund ${publicKey} within ${STARTUP_TIMEOUT_MS / 1e3} seconds: ${lastError instanceof Error ? lastError.message : String(lastError)}`);
|
|
275
|
+
}
|
|
276
|
+
__name(fundAccountViaFriendbot, "fundAccountViaFriendbot");
|
|
227
277
|
async function fundTestAccounts(env) {
|
|
228
278
|
console.log("\u{1F4B0} Funding test accounts from junk wallet...");
|
|
229
279
|
const server = new rpc.Server(env.RPC_URL, {
|
|
@@ -288,6 +338,6 @@ async function stopStellarLocalnet({ env, commandRunner = runDockerCommand }) {
|
|
|
288
338
|
}
|
|
289
339
|
__name(stopStellarLocalnet, "stopStellarLocalnet");
|
|
290
340
|
|
|
291
|
-
export { DEFAULT_STELLAR_LOCALNET_IMAGE, FUNDING_RETRY_INTERVAL_MS, STELLAR_LOCALNET_OWNER_LABEL, accountExists, assertDockerArgs, buildDockerContainerIdLookupArgs, buildDockerOwnershipLabelLookupArgs, buildDockerRemoveArgs, buildDockerRunArgs, fundAccount, getNamedContainerRemovalPolicy, pauseBeforeFundingRetry, startStellarLocalnet, stopStellarLocalnet };
|
|
292
|
-
//# sourceMappingURL=
|
|
293
|
-
//# sourceMappingURL=
|
|
341
|
+
export { DEFAULT_STELLAR_LOCALNET_IMAGE, FUNDING_RETRY_INTERVAL_MS, STELLAR_LOCALNET_OWNER_LABEL, accountExists, assertDockerArgs, buildDockerContainerIdLookupArgs, buildDockerOwnershipLabelLookupArgs, buildDockerRemoveArgs, buildDockerRunArgs, fundAccount, fundAccountViaFriendbot, getNamedContainerRemovalPolicy, pauseBeforeFundingRetry, startStellarLocalnet, stopStellarLocalnet, waitForAccountOnRpc };
|
|
342
|
+
//# sourceMappingURL=FPY7PKKI.js.map
|
|
343
|
+
//# sourceMappingURL=FPY7PKKI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/localnet.ts"],"names":["DEFAULT_STELLAR_LOCALNET_IMAGE","CONTAINER_PORT","STELLAR_LOCALNET_OWNER_LABEL","STELLAR_LOCALNET_OWNER_LABEL_KEY","split","STARTUP_TIMEOUT_MS","REQUEST_TIMEOUT_MS","FUNDING_RETRY_INTERVAL_MS","DOCKER_NAME_RE","DOCKER_IMAGE_RE","DOCKER_COMMAND_ARG_RE","assertDockerArgs","env","test","CONTAINER_NAME","Error","JSON","stringify","Number","isInteger","HOST_PORT","dockerImage","DOCKER_IMAGE","arg","DOCKER_COMMAND","buildDockerRunArgs","buildDockerContainerIdLookupArgs","containerName","buildDockerOwnershipLabelLookupArgs","containerId","buildDockerRemoveArgs","getNamedContainerRemovalPolicy","ownerLabel","runDockerCommand","args","result","spawnSync","encoding","error","message","cause","status","stdout","stderr","runDockerOrThrow","runner","action","trim","removeOwnedContainerIfPresent","commandRunner","normalizedContainerId","undefined","policy","dockerRunLocalnet","startStellarLocalnet","console","log","waitForRpcHealth","fundAccountViaFriendbot","JUNK_WALLET","publicKey","fundTestAccounts","deployNativeSac","deployZroToken","err","stopStellarLocalnet","fundAccountQueue","Promise","resolve","fundAccount","then","fundAccountInternal","catch","MAX_RETRIES","lastError","attempt","transactionSubmitted","getDestinationAccount","server","rpc","Server","RPC_URL","allowHttp","accountId","getAccount","junkAccount","tx","TransactionBuilder","fee","BASE_FEE","networkPassphrase","NETWORK_PASSPHRASE","addOperation","Operation","createAccount","destination","startingBalance","setTimeout","build","sign","sendResult","sendTransaction","txResult","pollTransaction","hash","accountExists","String","pauseBeforeFundingRetry","maxAttempts","sleep","ms","intervalMs","startTime","Date","now","response","fetch","method","headers","body","jsonrpc","id","signal","AbortSignal","timeout","data","json","waitForAccountOnRpc","timeoutMs","friendbotUrl","encodeURIComponent","text","ok","includes","remainingMs","Math","max","alreadyFunded","DEFAULT_DEPLOYER","FUNDING_ATTEMPTS","ZRO_DISTRIBUTOR","EXECUTOR_ADMIN","CHAIN_B_DEPLOYER","attempts","warn"],"mappings":"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","file":"FPY7PKKI.js","sourcesContent":["import { BASE_FEE, Operation, rpc, TransactionBuilder } from '@stellar/stellar-sdk';\nimport { spawnSync } from 'node:child_process';\n\nimport { deployNativeSac, deployZroToken } from './deploy.js';\nimport type { StellarTestEnv } from './env.js';\n\nexport const DEFAULT_STELLAR_LOCALNET_IMAGE =\n '438003944538.dkr.ecr.us-east-1.amazonaws.com/layerzerolabs/stellar:2026-03-02';\nconst CONTAINER_PORT = 8000;\nexport const STELLAR_LOCALNET_OWNER_LABEL = 'com.layerzerolabs.test-utils-stellar=1';\nconst STELLAR_LOCALNET_OWNER_LABEL_KEY = STELLAR_LOCALNET_OWNER_LABEL.split('=')[0];\n\n// Timeout configuration (in milliseconds)\nconst STARTUP_TIMEOUT_MS = 120_000; // 2 minutes\nconst REQUEST_TIMEOUT_MS = 5_000;\nexport const FUNDING_RETRY_INTERVAL_MS = 2_000;\n\n/** Docker container names: alphanumeric start, then alnum / `_` / `.` / `-`. */\nconst DOCKER_NAME_RE = /^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/;\nconst DOCKER_IMAGE_RE =\n /^(?!-)[a-z0-9][a-z0-9._/-]*(?::[a-zA-Z0-9][a-zA-Z0-9_.-]*)?(?:@[a-zA-Z0-9][a-zA-Z0-9_+.-]*:[a-fA-F0-9]{32,})?$/;\n/** Safe argv tokens for `docker run … IMAGE <args>` (flags / simple values only). */\nconst DOCKER_COMMAND_ARG_RE = /^(?:--)?[a-zA-Z0-9][a-zA-Z0-9._/=+-]*$/;\n\nexport interface DockerCommandResult {\n status: number;\n stdout: string;\n stderr: string;\n}\n\n/** Injectable so container lifecycle policy can be tested without a Docker daemon. */\nexport type DockerCommandRunner = (args: readonly string[]) => DockerCommandResult;\n\nexport interface LocalnetLifecycleOptions {\n env: StellarTestEnv;\n commandRunner?: DockerCommandRunner;\n}\n\nexport type NamedContainerRemovalPolicy = 'absent' | 'remove' | 'reject';\n\nexport function assertDockerArgs(env: StellarTestEnv): void {\n if (!DOCKER_NAME_RE.test(env.CONTAINER_NAME)) {\n throw new Error(`Invalid docker container name: ${JSON.stringify(env.CONTAINER_NAME)}`);\n }\n if (!Number.isInteger(env.HOST_PORT) || env.HOST_PORT < 1 || env.HOST_PORT > 65535) {\n throw new Error(`Invalid docker host port: ${env.HOST_PORT}`);\n }\n const dockerImage = env.DOCKER_IMAGE ?? DEFAULT_STELLAR_LOCALNET_IMAGE;\n if (!DOCKER_IMAGE_RE.test(dockerImage)) {\n throw new Error(`Invalid docker image: ${JSON.stringify(dockerImage)}`);\n }\n for (const arg of env.DOCKER_COMMAND ?? []) {\n if (!DOCKER_COMMAND_ARG_RE.test(arg)) {\n throw new Error(`Invalid docker command arg: ${JSON.stringify(arg)}`);\n }\n }\n}\n\nexport function buildDockerRunArgs(env: StellarTestEnv): string[] {\n assertDockerArgs(env);\n return [\n 'run',\n '-d',\n '--name',\n env.CONTAINER_NAME,\n '--label',\n STELLAR_LOCALNET_OWNER_LABEL,\n '-p',\n `127.0.0.1:${env.HOST_PORT}:${CONTAINER_PORT}`,\n env.DOCKER_IMAGE ?? DEFAULT_STELLAR_LOCALNET_IMAGE,\n ...(env.DOCKER_COMMAND ?? []),\n ];\n}\n\nexport function buildDockerContainerIdLookupArgs(containerName: string): string[] {\n return ['container', 'ls', '-aq', '--filter', `name=^/${containerName}$`];\n}\n\nexport function buildDockerOwnershipLabelLookupArgs(containerId: string): string[] {\n return [\n 'container',\n 'inspect',\n '--format',\n `{{ index .Config.Labels \"${STELLAR_LOCALNET_OWNER_LABEL_KEY}\" }}`,\n containerId,\n ];\n}\n\nexport function buildDockerRemoveArgs(containerId: string): string[] {\n return ['rm', '-f', containerId];\n}\n\nexport function getNamedContainerRemovalPolicy(\n containerId: string | undefined,\n ownerLabel: string | undefined,\n): NamedContainerRemovalPolicy {\n if (containerId == null) return 'absent';\n return ownerLabel === '1' ? 'remove' : 'reject';\n}\n\nconst runDockerCommand: DockerCommandRunner = (args) => {\n const result = spawnSync('docker', args, { encoding: 'utf8' });\n if (result.error != null) {\n throw new Error(`Unable to run docker ${args[0]}: ${result.error.message}`, {\n cause: result.error,\n });\n }\n return {\n status: result.status ?? 1,\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n };\n};\n\nfunction runDockerOrThrow(\n runner: DockerCommandRunner,\n args: readonly string[],\n action: string,\n): DockerCommandResult {\n const result = runner(args);\n if (result.status !== 0) {\n throw new Error(\n `Docker ${action} failed (exit ${result.status}): ${result.stderr.trim() || result.stdout.trim()}`,\n );\n }\n return result;\n}\n\nfunction removeOwnedContainerIfPresent(\n env: StellarTestEnv,\n commandRunner: DockerCommandRunner,\n): void {\n const containerId = runDockerOrThrow(\n commandRunner,\n buildDockerContainerIdLookupArgs(env.CONTAINER_NAME),\n `container lookup for ${env.CONTAINER_NAME}`,\n ).stdout.trim();\n const normalizedContainerId = containerId === '' ? undefined : containerId;\n\n if (normalizedContainerId == null) return;\n\n const ownerLabel = runDockerOrThrow(\n commandRunner,\n buildDockerOwnershipLabelLookupArgs(normalizedContainerId),\n `ownership lookup for ${env.CONTAINER_NAME}`,\n ).stdout.trim();\n const policy = getNamedContainerRemovalPolicy(normalizedContainerId, ownerLabel);\n if (policy === 'reject') {\n throw new Error(\n `Refusing to remove existing container ${env.CONTAINER_NAME}: it is not owned by ${STELLAR_LOCALNET_OWNER_LABEL}`,\n );\n }\n runDockerOrThrow(\n commandRunner,\n buildDockerRemoveArgs(normalizedContainerId),\n `removal of ${env.CONTAINER_NAME}`,\n );\n}\n\nfunction dockerRunLocalnet(env: StellarTestEnv, commandRunner: DockerCommandRunner): void {\n runDockerOrThrow(commandRunner, buildDockerRunArgs(env), 'localnet start');\n}\n\nexport async function startStellarLocalnet({\n env,\n commandRunner = runDockerCommand,\n}: LocalnetLifecycleOptions): Promise<void> {\n assertDockerArgs(env);\n console.log('🚀 Starting Stellar localnet...');\n\n removeOwnedContainerIfPresent(env, commandRunner);\n dockerRunLocalnet(env, commandRunner);\n\n // Container is up; if any startup step fails, tear it down before rethrowing.\n // globalSetup only registers its teardown once startup fully succeeds, so\n // without this a failed startup (e.g. a funding flake) would leak the container.\n try {\n console.log('⏳ Waiting for Stellar RPC to be healthy...');\n await waitForRpcHealth(env);\n console.log('✅ Stellar RPC is healthy');\n\n // Stock stellar/quickstart does not pre-fund the junk wallet; friendbot does.\n // Idempotent on the LayerZero ECR snapshot where the account already exists.\n await fundAccountViaFriendbot(env, env.JUNK_WALLET.publicKey());\n await fundTestAccounts(env);\n await deployNativeSac(env);\n await deployZroToken(env);\n } catch (err) {\n await stopStellarLocalnet({ env, commandRunner });\n throw err;\n }\n}\n\n// Serialization queue for fundAccount — the junk wallet can only have one pending tx at a time.\n// Chaining onto this promise ensures concurrent calls are sequenced correctly.\nlet fundAccountQueue: Promise<void> = Promise.resolve();\n\n/**\n * Fund a single account from the junk wallet (for ad-hoc test accounts).\n * Calls are serialized to avoid sequence number conflicts on the junk wallet.\n */\nexport function fundAccount(env: StellarTestEnv, publicKey: string): Promise<void> {\n const result = fundAccountQueue.then(() => fundAccountInternal(env, publicKey));\n fundAccountQueue = result.catch(() => {}); // keep queue alive if this call fails\n return result;\n}\n\nasync function fundAccountInternal(env: StellarTestEnv, publicKey: string): Promise<void> {\n const MAX_RETRIES = 5;\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\n let transactionSubmitted = false;\n let getDestinationAccount: ((accountId: string) => Promise<unknown>) | undefined;\n try {\n const server = new rpc.Server(env.RPC_URL, { allowHttp: true });\n getDestinationAccount = (accountId) => server.getAccount(accountId);\n // Re-fetch account on every attempt to get the latest sequence number\n const junkAccount = await server.getAccount(env.JUNK_WALLET.publicKey());\n\n const tx = new TransactionBuilder(junkAccount, {\n fee: BASE_FEE,\n networkPassphrase: env.NETWORK_PASSPHRASE,\n })\n .addOperation(\n Operation.createAccount({\n destination: publicKey,\n startingBalance: '100',\n }),\n )\n .setTimeout(30)\n .build();\n\n tx.sign(env.JUNK_WALLET);\n\n const sendResult = await server.sendTransaction(tx);\n if (sendResult.status !== 'PENDING') {\n throw new Error(\n `Failed to fund account ${publicKey}: ${JSON.stringify(sendResult)}`,\n );\n }\n transactionSubmitted = true;\n\n const txResult = await server.pollTransaction(sendResult.hash);\n if (txResult.status !== 'SUCCESS') {\n throw new Error(\n `Account funding failed for ${publicKey}: ${JSON.stringify(txResult)}`,\n );\n }\n\n return; // success\n } catch (err) {\n lastError = err;\n if (\n transactionSubmitted &&\n getDestinationAccount != null &&\n (await accountExists(getDestinationAccount, publicKey))\n ) {\n return;\n }\n if (attempt < MAX_RETRIES) {\n await new Promise((resolve) => setTimeout(resolve, FUNDING_RETRY_INTERVAL_MS));\n }\n }\n }\n\n throw new Error(\n `Failed to fund account ${publicKey} after ${MAX_RETRIES} attempts: ${lastError instanceof Error ? lastError.message : String(lastError)}`,\n );\n}\n\n/** Returns true when a destination account was created despite an ambiguous transaction poll. */\nexport async function accountExists(\n getAccount: (accountId: string) => Promise<unknown>,\n accountId: string,\n): Promise<boolean> {\n try {\n await getAccount(accountId);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Back off between fundTestAccounts rebuilds so a lagging localnet can confirm\n * the previous attempt before we burn another try.\n */\nexport async function pauseBeforeFundingRetry(\n attempt: number,\n maxAttempts: number,\n sleep: (ms: number) => Promise<void> = (ms) =>\n new Promise((resolve) => setTimeout(resolve, ms)),\n intervalMs: number = FUNDING_RETRY_INTERVAL_MS,\n): Promise<void> {\n if (attempt < maxAttempts) {\n await sleep(intervalMs);\n }\n}\n\nasync function waitForRpcHealth(env: StellarTestEnv): Promise<void> {\n const startTime = Date.now();\n while (Date.now() - startTime < STARTUP_TIMEOUT_MS) {\n try {\n const response = await fetch(env.RPC_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'getHealth' }),\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n });\n const data = (await response.json()) as { result?: { status?: string } };\n if (data.result?.status === 'healthy') return;\n } catch {\n // Not ready yet\n }\n await new Promise((resolve) => setTimeout(resolve, FUNDING_RETRY_INTERVAL_MS));\n }\n throw new Error(\n `Stellar RPC failed to become healthy within ${STARTUP_TIMEOUT_MS / 1000} seconds`,\n );\n}\n\n/**\n * Poll until an account is visible to Soroban RPC `getAccount`.\n * Friendbot / Horizon can acknowledge createAccount before RPC indexes it.\n */\nexport async function waitForAccountOnRpc(\n getAccount: (accountId: string) => Promise<unknown>,\n publicKey: string,\n {\n timeoutMs = STARTUP_TIMEOUT_MS,\n intervalMs = FUNDING_RETRY_INTERVAL_MS,\n sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)),\n }: {\n timeoutMs?: number;\n intervalMs?: number;\n sleep?: (ms: number) => Promise<void>;\n } = {},\n): Promise<void> {\n const startTime = Date.now();\n while (Date.now() - startTime < timeoutMs) {\n if (await accountExists(getAccount, publicKey)) {\n return;\n }\n await sleep(intervalMs);\n }\n throw new Error(\n `Account ${publicKey} not visible to Soroban RPC within ${timeoutMs / 1000} seconds`,\n );\n}\n\n/**\n * Fund an account via quickstart friendbot (creates the account if missing).\n * Idempotent when the account already exists. Waits until Soroban RPC can see\n * the account so subsequent `getAccount` calls (e.g. fundTestAccounts) do not race.\n */\nexport async function fundAccountViaFriendbot(\n env: StellarTestEnv,\n publicKey: string,\n): Promise<void> {\n const friendbotUrl = `http://localhost:${env.HOST_PORT}/friendbot?addr=${encodeURIComponent(publicKey)}`;\n const startTime = Date.now();\n let lastError: unknown;\n\n while (Date.now() - startTime < STARTUP_TIMEOUT_MS) {\n try {\n const response = await fetch(friendbotUrl, {\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n });\n const body = await response.text();\n if (\n response.ok ||\n body.includes('already funded') ||\n body.includes('op_already_exists')\n ) {\n console.log(`✅ Friendbot funded ${publicKey}; waiting for RPC visibility…`);\n const server = new rpc.Server(env.RPC_URL, { allowHttp: true });\n const remainingMs = Math.max(1, STARTUP_TIMEOUT_MS - (Date.now() - startTime));\n await waitForAccountOnRpc((accountId) => server.getAccount(accountId), publicKey, {\n timeoutMs: remainingMs,\n });\n console.log(`✅ Account ${publicKey} visible to Soroban RPC`);\n return;\n }\n lastError = new Error(`friendbot HTTP ${response.status}: ${body}`);\n } catch (err) {\n lastError = err;\n }\n await new Promise((resolve) => setTimeout(resolve, FUNDING_RETRY_INTERVAL_MS));\n }\n\n throw new Error(\n `Friendbot failed to fund ${publicKey} within ${STARTUP_TIMEOUT_MS / 1000} seconds: ${\n lastError instanceof Error ? lastError.message : String(lastError)\n }`,\n );\n}\n\nasync function fundTestAccounts(env: StellarTestEnv): Promise<void> {\n console.log('💰 Funding test accounts from junk wallet...');\n const server = new rpc.Server(env.RPC_URL, { allowHttp: true });\n\n // A funded DEFAULT_DEPLOYER is the signal that funding already landed — lets us\n // short-circuit when a prior attempt's tx confirmed after the poll gave up.\n const alreadyFunded = async (): Promise<boolean> => {\n try {\n await server.getAccount(env.DEFAULT_DEPLOYER.publicKey());\n return true;\n } catch {\n return false;\n }\n };\n\n // Running localnets concurrently makes the chain lag, so a funding tx can outrun\n // the poll window or expire (NOT_FOUND). Use a longer validity + poll window, and\n // rebuild-and-retry a bounded number of times before giving up.\n const FUNDING_ATTEMPTS = 3;\n for (let attempt = 1; attempt <= FUNDING_ATTEMPTS; attempt++) {\n const junkAccount = await server.getAccount(env.JUNK_WALLET.publicKey());\n const tx = new TransactionBuilder(junkAccount, {\n fee: BASE_FEE,\n networkPassphrase: env.NETWORK_PASSPHRASE,\n })\n .addOperation(\n Operation.createAccount({\n destination: env.DEFAULT_DEPLOYER.publicKey(),\n startingBalance: '2000',\n }),\n )\n .addOperation(\n Operation.createAccount({\n destination: env.ZRO_DISTRIBUTOR.publicKey(),\n startingBalance: '2000',\n }),\n )\n .addOperation(\n Operation.createAccount({\n destination: env.EXECUTOR_ADMIN.publicKey(),\n startingBalance: '2000',\n }),\n )\n .addOperation(\n Operation.createAccount({\n destination: env.CHAIN_B_DEPLOYER.publicKey(),\n startingBalance: '2000',\n }),\n )\n .setTimeout(120)\n .build();\n\n tx.sign(env.JUNK_WALLET);\n\n const sendResult = await server.sendTransaction(tx);\n if (sendResult.status === 'PENDING') {\n const txResult = await server.pollTransaction(sendResult.hash, { attempts: 60 });\n if (txResult.status === 'SUCCESS') {\n console.log('✅ All test accounts funded');\n return;\n }\n }\n\n // Send rejected or poll didn't confirm — but on a lagging chain the tx may\n // have landed anyway. If the accounts now exist, funding is effectively done.\n if (await alreadyFunded()) {\n console.log('✅ All test accounts funded (confirmed after poll window)');\n return;\n }\n\n console.warn(\n `⚠️ Funding attempt ${attempt}/${FUNDING_ATTEMPTS} did not confirm; retrying…`,\n );\n // Match fundAccountInternal: give a lagging localnet time to confirm before\n // rebuilding/retrying, otherwise we can burn all attempts while the first tx lands.\n await pauseBeforeFundingRetry(attempt, FUNDING_ATTEMPTS);\n }\n\n throw new Error(`Account funding failed to confirm after ${FUNDING_ATTEMPTS} attempts`);\n}\n\nexport async function stopStellarLocalnet({\n env,\n commandRunner = runDockerCommand,\n}: LocalnetLifecycleOptions): Promise<void> {\n // Guarded (like the startup docker rm -f) so a cleanup failure never throws —\n // otherwise it would mask the original error when called from a startup catch.\n try {\n assertDockerArgs(env);\n removeOwnedContainerIfPresent(env, commandRunner);\n console.log('✅ Stellar localnet stopped');\n } catch (err) {\n console.warn(`⚠️ Failed to remove container ${env.CONTAINER_NAME}:`, err);\n }\n}\n"]}
|
package/dist/env.d.ts
CHANGED
|
@@ -7,9 +7,14 @@ export interface CreateStellarTestEnvOptions {
|
|
|
7
7
|
hostPort: number;
|
|
8
8
|
/**
|
|
9
9
|
* Optional localnet image override. Defaults to the versioned LayerZero ECR snapshot.
|
|
10
|
-
* Useful for testing a locally built image
|
|
10
|
+
* Useful for testing a locally built image or a pinned public image (e.g. stellar/quickstart@sha256:…).
|
|
11
11
|
*/
|
|
12
12
|
dockerImage?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Optional args appended after the image name in `docker run` (e.g. `['--local']` for
|
|
15
|
+
* stock stellar/quickstart). Ignored by images whose ENTRYPOINT does not forward argv.
|
|
16
|
+
*/
|
|
17
|
+
dockerCommand?: readonly string[];
|
|
13
18
|
}
|
|
14
19
|
/**
|
|
15
20
|
* Shared Stellar E2E constants (RPC URL, keys, EIDs, token addresses).
|
|
@@ -20,6 +25,8 @@ export interface StellarTestEnv {
|
|
|
20
25
|
HOST_PORT: number;
|
|
21
26
|
/** Optional localnet Docker image override. */
|
|
22
27
|
DOCKER_IMAGE?: string;
|
|
28
|
+
/** Optional args appended after the image name in `docker run`. */
|
|
29
|
+
DOCKER_COMMAND?: readonly string[];
|
|
23
30
|
RPC_URL: string;
|
|
24
31
|
NETWORK_PASSPHRASE: typeof Networks.STANDALONE;
|
|
25
32
|
JUNK_WALLET: Keypair;
|
package/dist/env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,2BAA2B;IACxC,2EAA2E;IAC3E,aAAa,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,MAAM,WAAW,2BAA2B;IACxC,2EAA2E;IAC3E,aAAa,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC3B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,EAAE,OAAO,QAAQ,CAAC,UAAU,CAAC;IAC/C,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,KAAK,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,CAAC;CACjC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG,cAAc,CA0DzF"}
|
package/dist/env.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export { assertTransactionSucceeded, getNativeBalance, getTokenAuthorized, getTokenBalance, signAndSendWithExecutorAuth, signDvnAuthEntries } from './VRABOZPX.js';
|
|
2
|
-
export { createStellarTestEnv } from './
|
|
2
|
+
export { createStellarTestEnv } from './2MDWMEQT.js';
|
|
3
3
|
export { Secp256k1KeyPair } from './DNRE4ENZ.js';
|
|
4
|
-
export { createLocalnetOnlyGlobalSetup } from './
|
|
5
|
-
export { createProtocolStackGlobalSetup } from './
|
|
4
|
+
export { createLocalnetOnlyGlobalSetup } from './CHSP4IIE.js';
|
|
5
|
+
export { createProtocolStackGlobalSetup } from './AYQIUXWL.js';
|
|
6
6
|
export { createClient } from './GAGBEOCZ.js';
|
|
7
|
-
export { fundAccount, startStellarLocalnet, stopStellarLocalnet } from './
|
|
7
|
+
export { fundAccount, startStellarLocalnet, stopStellarLocalnet } from './FPY7PKKI.js';
|
|
8
8
|
export { deployAssetSac, deployContract, deployNativeSac, deployZroToken, uploadWasm } from './TYAJMKGY.js';
|
|
9
9
|
export { scanEvents, scanPacketSentEvents, waitAndScanEvents } from './PMDPSIA2.js';
|
|
10
10
|
import './VUOMXK5T.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export { createLocalnetOnlyGlobalSetup } from './
|
|
2
|
-
import './
|
|
1
|
+
export { createLocalnetOnlyGlobalSetup } from './CHSP4IIE.js';
|
|
2
|
+
import './FPY7PKKI.js';
|
|
3
3
|
import './TYAJMKGY.js';
|
|
4
4
|
import './VUOMXK5T.js';
|
|
5
5
|
//# sourceMappingURL=localnet-global-setup.js.map
|
package/dist/localnet.d.ts
CHANGED
|
@@ -33,5 +33,20 @@ export declare function accountExists(getAccount: (accountId: string) => Promise
|
|
|
33
33
|
* the previous attempt before we burn another try.
|
|
34
34
|
*/
|
|
35
35
|
export declare function pauseBeforeFundingRetry(attempt: number, maxAttempts: number, sleep?: (ms: number) => Promise<void>, intervalMs?: number): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Poll until an account is visible to Soroban RPC `getAccount`.
|
|
38
|
+
* Friendbot / Horizon can acknowledge createAccount before RPC indexes it.
|
|
39
|
+
*/
|
|
40
|
+
export declare function waitForAccountOnRpc(getAccount: (accountId: string) => Promise<unknown>, publicKey: string, { timeoutMs, intervalMs, sleep, }?: {
|
|
41
|
+
timeoutMs?: number;
|
|
42
|
+
intervalMs?: number;
|
|
43
|
+
sleep?: (ms: number) => Promise<void>;
|
|
44
|
+
}): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Fund an account via quickstart friendbot (creates the account if missing).
|
|
47
|
+
* Idempotent when the account already exists. Waits until Soroban RPC can see
|
|
48
|
+
* the account so subsequent `getAccount` calls (e.g. fundTestAccounts) do not race.
|
|
49
|
+
*/
|
|
50
|
+
export declare function fundAccountViaFriendbot(env: StellarTestEnv, publicKey: string): Promise<void>;
|
|
36
51
|
export declare function stopStellarLocalnet({ env, commandRunner, }: LocalnetLifecycleOptions): Promise<void>;
|
|
37
52
|
//# sourceMappingURL=localnet.d.ts.map
|
package/dist/localnet.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localnet.d.ts","sourceRoot":"","sources":["../src/localnet.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,eAAO,MAAM,8BAA8B,kFACwC,CAAC;AAEpF,eAAO,MAAM,4BAA4B,2CAA2C,CAAC;AAMrF,eAAO,MAAM,yBAAyB,OAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"localnet.d.ts","sourceRoot":"","sources":["../src/localnet.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,eAAO,MAAM,8BAA8B,kFACwC,CAAC;AAEpF,eAAO,MAAM,4BAA4B,2CAA2C,CAAC;AAMrF,eAAO,MAAM,yBAAyB,OAAQ,CAAC;AAS/C,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,sFAAsF;AACtF,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,mBAAmB,CAAC;AAEnF,MAAM,WAAW,wBAAwB;IACrC,GAAG,EAAE,cAAc,CAAC;IACpB,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACvC;AAED,MAAM,MAAM,2BAA2B,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEzE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,cAAc,GAAG,IAAI,CAgB1D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,EAAE,CAchE;AAED,wBAAgB,gCAAgC,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAEhF;AAED,wBAAgB,mCAAmC,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAQjF;AAED,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAEnE;AAED,wBAAgB,8BAA8B,CAC1C,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC/B,2BAA2B,CAG7B;AAiED,wBAAsB,oBAAoB,CAAC,EACvC,GAAG,EACH,aAAgC,GACnC,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB1C;AAMD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjF;AAkED,iGAAiG;AACjG,wBAAsB,aAAa,CAC/B,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EACnD,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CACzC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,KAAK,GAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CACkB,EACrD,UAAU,GAAE,MAAkC,GAC/C,OAAO,CAAC,IAAI,CAAC,CAIf;AAwBD;;;GAGG;AACH,wBAAsB,mBAAmB,CACrC,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EACnD,SAAS,EAAE,MAAM,EACjB,EACI,SAA8B,EAC9B,UAAsC,EACtC,KAA+E,GAClF,GAAE;IACC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC,GACP,OAAO,CAAC,IAAI,CAAC,CAWf;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CACzC,GAAG,EAAE,cAAc,EACnB,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAqCf;AAmFD,wBAAsB,mBAAmB,CAAC,EACtC,GAAG,EACH,aAAgC,GACnC,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAU1C"}
|
package/dist/localnet.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { DEFAULT_STELLAR_LOCALNET_IMAGE, FUNDING_RETRY_INTERVAL_MS, STELLAR_LOCALNET_OWNER_LABEL, accountExists, assertDockerArgs, buildDockerContainerIdLookupArgs, buildDockerOwnershipLabelLookupArgs, buildDockerRemoveArgs, buildDockerRunArgs, fundAccount, getNamedContainerRemovalPolicy, pauseBeforeFundingRetry, startStellarLocalnet, stopStellarLocalnet } from './
|
|
1
|
+
export { DEFAULT_STELLAR_LOCALNET_IMAGE, FUNDING_RETRY_INTERVAL_MS, STELLAR_LOCALNET_OWNER_LABEL, accountExists, assertDockerArgs, buildDockerContainerIdLookupArgs, buildDockerOwnershipLabelLookupArgs, buildDockerRemoveArgs, buildDockerRunArgs, fundAccount, fundAccountViaFriendbot, getNamedContainerRemovalPolicy, pauseBeforeFundingRetry, startStellarLocalnet, stopStellarLocalnet, waitForAccountOnRpc } from './FPY7PKKI.js';
|
|
2
2
|
import './TYAJMKGY.js';
|
|
3
3
|
import './VUOMXK5T.js';
|
|
4
4
|
//# sourceMappingURL=localnet.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { createProtocolStackGlobalSetup } from './
|
|
1
|
+
export { createProtocolStackGlobalSetup } from './AYQIUXWL.js';
|
|
2
2
|
import './GAGBEOCZ.js';
|
|
3
|
-
import './
|
|
3
|
+
import './FPY7PKKI.js';
|
|
4
4
|
import './TYAJMKGY.js';
|
|
5
5
|
import './VUOMXK5T.js';
|
|
6
6
|
//# sourceMappingURL=protocol-global-setup.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layerzerolabs/test-utils-stellar",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.29",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Shared Stellar/Soroban test harness (localnet, funding, deploy helpers) for LayerZero V2 protocol SDK and custom OApp/OFT tests",
|
|
6
6
|
"license": "MIT",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
"tsup": "^8.4.0",
|
|
27
27
|
"typescript": "^6.0.3",
|
|
28
28
|
"vitest": "^3.2.6",
|
|
29
|
-
"@layerzerolabs/tsup-configuration": "1.2.
|
|
30
|
-
"@layerzerolabs/typescript-configuration": "1.2.
|
|
29
|
+
"@layerzerolabs/tsup-configuration": "1.2.29",
|
|
30
|
+
"@layerzerolabs/typescript-configuration": "1.2.29"
|
|
31
31
|
},
|
|
32
32
|
"publishConfig": {
|
|
33
33
|
"access": "public",
|
package/src/env.ts
CHANGED
|
@@ -9,9 +9,14 @@ export interface CreateStellarTestEnvOptions {
|
|
|
9
9
|
hostPort: number;
|
|
10
10
|
/**
|
|
11
11
|
* Optional localnet image override. Defaults to the versioned LayerZero ECR snapshot.
|
|
12
|
-
* Useful for testing a locally built image
|
|
12
|
+
* Useful for testing a locally built image or a pinned public image (e.g. stellar/quickstart@sha256:…).
|
|
13
13
|
*/
|
|
14
14
|
dockerImage?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Optional args appended after the image name in `docker run` (e.g. `['--local']` for
|
|
17
|
+
* stock stellar/quickstart). Ignored by images whose ENTRYPOINT does not forward argv.
|
|
18
|
+
*/
|
|
19
|
+
dockerCommand?: readonly string[];
|
|
15
20
|
}
|
|
16
21
|
|
|
17
22
|
/**
|
|
@@ -23,6 +28,8 @@ export interface StellarTestEnv {
|
|
|
23
28
|
HOST_PORT: number;
|
|
24
29
|
/** Optional localnet Docker image override. */
|
|
25
30
|
DOCKER_IMAGE?: string;
|
|
31
|
+
/** Optional args appended after the image name in `docker run`. */
|
|
32
|
+
DOCKER_COMMAND?: readonly string[];
|
|
26
33
|
RPC_URL: string;
|
|
27
34
|
NETWORK_PASSPHRASE: typeof Networks.STANDALONE;
|
|
28
35
|
JUNK_WALLET: Keypair;
|
|
@@ -46,11 +53,12 @@ export interface StellarTestEnv {
|
|
|
46
53
|
}
|
|
47
54
|
|
|
48
55
|
export function createStellarTestEnv(options: CreateStellarTestEnvOptions): StellarTestEnv {
|
|
49
|
-
const { containerName, hostPort, dockerImage } = options;
|
|
56
|
+
const { containerName, hostPort, dockerImage, dockerCommand } = options;
|
|
50
57
|
const networkPassphrase = Networks.STANDALONE;
|
|
51
58
|
const coreUrl = `http://localhost:${hostPort}`;
|
|
52
59
|
|
|
53
|
-
//
|
|
60
|
+
// BIP39 "test test...junk" path m/44'/148'/0'. Pre-funded in the LayerZero ECR snapshot;
|
|
61
|
+
// for stock stellar/quickstart, startStellarLocalnet funds it via friendbot first.
|
|
54
62
|
const junkWallet = Keypair.fromSecret(
|
|
55
63
|
'SCZ5VBFVGE4SLZV5WJO33LEEU36EEOEHWO27KYJIIUWGOKZB2OSNAQBI',
|
|
56
64
|
);
|
|
@@ -81,6 +89,7 @@ export function createStellarTestEnv(options: CreateStellarTestEnvOptions): Stel
|
|
|
81
89
|
CONTAINER_NAME: containerName,
|
|
82
90
|
HOST_PORT: hostPort,
|
|
83
91
|
DOCKER_IMAGE: dockerImage,
|
|
92
|
+
DOCKER_COMMAND: dockerCommand,
|
|
84
93
|
RPC_URL: `${coreUrl}/soroban/rpc`,
|
|
85
94
|
NETWORK_PASSPHRASE: networkPassphrase,
|
|
86
95
|
JUNK_WALLET: junkWallet,
|
package/src/localnet.ts
CHANGED
|
@@ -19,6 +19,8 @@ export const FUNDING_RETRY_INTERVAL_MS = 2_000;
|
|
|
19
19
|
const DOCKER_NAME_RE = /^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/;
|
|
20
20
|
const DOCKER_IMAGE_RE =
|
|
21
21
|
/^(?!-)[a-z0-9][a-z0-9._/-]*(?::[a-zA-Z0-9][a-zA-Z0-9_.-]*)?(?:@[a-zA-Z0-9][a-zA-Z0-9_+.-]*:[a-fA-F0-9]{32,})?$/;
|
|
22
|
+
/** Safe argv tokens for `docker run … IMAGE <args>` (flags / simple values only). */
|
|
23
|
+
const DOCKER_COMMAND_ARG_RE = /^(?:--)?[a-zA-Z0-9][a-zA-Z0-9._/=+-]*$/;
|
|
22
24
|
|
|
23
25
|
export interface DockerCommandResult {
|
|
24
26
|
status: number;
|
|
@@ -47,6 +49,11 @@ export function assertDockerArgs(env: StellarTestEnv): void {
|
|
|
47
49
|
if (!DOCKER_IMAGE_RE.test(dockerImage)) {
|
|
48
50
|
throw new Error(`Invalid docker image: ${JSON.stringify(dockerImage)}`);
|
|
49
51
|
}
|
|
52
|
+
for (const arg of env.DOCKER_COMMAND ?? []) {
|
|
53
|
+
if (!DOCKER_COMMAND_ARG_RE.test(arg)) {
|
|
54
|
+
throw new Error(`Invalid docker command arg: ${JSON.stringify(arg)}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
50
57
|
}
|
|
51
58
|
|
|
52
59
|
export function buildDockerRunArgs(env: StellarTestEnv): string[] {
|
|
@@ -61,6 +68,7 @@ export function buildDockerRunArgs(env: StellarTestEnv): string[] {
|
|
|
61
68
|
'-p',
|
|
62
69
|
`127.0.0.1:${env.HOST_PORT}:${CONTAINER_PORT}`,
|
|
63
70
|
env.DOCKER_IMAGE ?? DEFAULT_STELLAR_LOCALNET_IMAGE,
|
|
71
|
+
...(env.DOCKER_COMMAND ?? []),
|
|
64
72
|
];
|
|
65
73
|
}
|
|
66
74
|
|
|
@@ -171,6 +179,9 @@ export async function startStellarLocalnet({
|
|
|
171
179
|
await waitForRpcHealth(env);
|
|
172
180
|
console.log('✅ Stellar RPC is healthy');
|
|
173
181
|
|
|
182
|
+
// Stock stellar/quickstart does not pre-fund the junk wallet; friendbot does.
|
|
183
|
+
// Idempotent on the LayerZero ECR snapshot where the account already exists.
|
|
184
|
+
await fundAccountViaFriendbot(env, env.JUNK_WALLET.publicKey());
|
|
174
185
|
await fundTestAccounts(env);
|
|
175
186
|
await deployNativeSac(env);
|
|
176
187
|
await deployZroToken(env);
|
|
@@ -309,6 +320,82 @@ async function waitForRpcHealth(env: StellarTestEnv): Promise<void> {
|
|
|
309
320
|
);
|
|
310
321
|
}
|
|
311
322
|
|
|
323
|
+
/**
|
|
324
|
+
* Poll until an account is visible to Soroban RPC `getAccount`.
|
|
325
|
+
* Friendbot / Horizon can acknowledge createAccount before RPC indexes it.
|
|
326
|
+
*/
|
|
327
|
+
export async function waitForAccountOnRpc(
|
|
328
|
+
getAccount: (accountId: string) => Promise<unknown>,
|
|
329
|
+
publicKey: string,
|
|
330
|
+
{
|
|
331
|
+
timeoutMs = STARTUP_TIMEOUT_MS,
|
|
332
|
+
intervalMs = FUNDING_RETRY_INTERVAL_MS,
|
|
333
|
+
sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)),
|
|
334
|
+
}: {
|
|
335
|
+
timeoutMs?: number;
|
|
336
|
+
intervalMs?: number;
|
|
337
|
+
sleep?: (ms: number) => Promise<void>;
|
|
338
|
+
} = {},
|
|
339
|
+
): Promise<void> {
|
|
340
|
+
const startTime = Date.now();
|
|
341
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
342
|
+
if (await accountExists(getAccount, publicKey)) {
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
await sleep(intervalMs);
|
|
346
|
+
}
|
|
347
|
+
throw new Error(
|
|
348
|
+
`Account ${publicKey} not visible to Soroban RPC within ${timeoutMs / 1000} seconds`,
|
|
349
|
+
);
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/**
|
|
353
|
+
* Fund an account via quickstart friendbot (creates the account if missing).
|
|
354
|
+
* Idempotent when the account already exists. Waits until Soroban RPC can see
|
|
355
|
+
* the account so subsequent `getAccount` calls (e.g. fundTestAccounts) do not race.
|
|
356
|
+
*/
|
|
357
|
+
export async function fundAccountViaFriendbot(
|
|
358
|
+
env: StellarTestEnv,
|
|
359
|
+
publicKey: string,
|
|
360
|
+
): Promise<void> {
|
|
361
|
+
const friendbotUrl = `http://localhost:${env.HOST_PORT}/friendbot?addr=${encodeURIComponent(publicKey)}`;
|
|
362
|
+
const startTime = Date.now();
|
|
363
|
+
let lastError: unknown;
|
|
364
|
+
|
|
365
|
+
while (Date.now() - startTime < STARTUP_TIMEOUT_MS) {
|
|
366
|
+
try {
|
|
367
|
+
const response = await fetch(friendbotUrl, {
|
|
368
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
369
|
+
});
|
|
370
|
+
const body = await response.text();
|
|
371
|
+
if (
|
|
372
|
+
response.ok ||
|
|
373
|
+
body.includes('already funded') ||
|
|
374
|
+
body.includes('op_already_exists')
|
|
375
|
+
) {
|
|
376
|
+
console.log(`✅ Friendbot funded ${publicKey}; waiting for RPC visibility…`);
|
|
377
|
+
const server = new rpc.Server(env.RPC_URL, { allowHttp: true });
|
|
378
|
+
const remainingMs = Math.max(1, STARTUP_TIMEOUT_MS - (Date.now() - startTime));
|
|
379
|
+
await waitForAccountOnRpc((accountId) => server.getAccount(accountId), publicKey, {
|
|
380
|
+
timeoutMs: remainingMs,
|
|
381
|
+
});
|
|
382
|
+
console.log(`✅ Account ${publicKey} visible to Soroban RPC`);
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
lastError = new Error(`friendbot HTTP ${response.status}: ${body}`);
|
|
386
|
+
} catch (err) {
|
|
387
|
+
lastError = err;
|
|
388
|
+
}
|
|
389
|
+
await new Promise((resolve) => setTimeout(resolve, FUNDING_RETRY_INTERVAL_MS));
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
throw new Error(
|
|
393
|
+
`Friendbot failed to fund ${publicKey} within ${STARTUP_TIMEOUT_MS / 1000} seconds: ${
|
|
394
|
+
lastError instanceof Error ? lastError.message : String(lastError)
|
|
395
|
+
}`,
|
|
396
|
+
);
|
|
397
|
+
}
|
|
398
|
+
|
|
312
399
|
async function fundTestAccounts(env: StellarTestEnv): Promise<void> {
|
|
313
400
|
console.log('💰 Funding test accounts from junk wallet...');
|
|
314
401
|
const server = new rpc.Server(env.RPC_URL, { allowHttp: true });
|
package/dist/7DZ4SVEO.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/env.ts"],"names":["createStellarTestEnv","options","containerName","hostPort","dockerImage","networkPassphrase","Networks","STANDALONE","coreUrl","junkWallet","Keypair","fromSecret","defaultDeployer","zroDistributor","executorAdmin","chainBDeployer","dvnSigner","Secp256k1KeyPair","eidA","zroAsset","Asset","publicKey","CONTAINER_NAME","HOST_PORT","DOCKER_IMAGE","RPC_URL","NETWORK_PASSPHRASE","JUNK_WALLET","DEFAULT_DEPLOYER","ZRO_DISTRIBUTOR","EXECUTOR_ADMIN","CHAIN_B_DEPLOYER","DVN_SIGNER","DVN_VID","EID_A","EID_B","EID","NATIVE_TOKEN_ADDRESS","native","contractId","ZRO_ASSET","ZRO_TOKEN_ADDRESS","MSG_TYPE_VANILLA","MSG_TYPE_COMPOSED","MSG_TYPE_ABA","MSG_TYPE_COMPOSED_ABA"],"mappings":";;;;AA+CO,SAASA,qBAAqBC,OAAAA,EAAoC;AACrE,EAAA,MAAM,EAAEC,aAAAA,EAAeC,QAAAA,EAAUC,WAAAA,EAAW,GAAKH,OAAAA;AACjD,EAAA,MAAMI,oBAAoBC,QAAAA,CAASC,UAAAA;AACnC,EAAA,MAAMC,OAAAA,GAAU,oBAAoBL,QAAAA,CAAAA,CAAAA;AAGpC,EAAA,MAAMM,UAAAA,GAAaC,OAAAA,CAAQC,UAAAA,CACvB,0DAAA,CAAA;AAEJ,EAAA,MAAMC,eAAAA,GAAkBF,OAAAA,CAAQC,UAAAA,CAC5B,0DAAA,CAAA;AAEJ,EAAA,MAAME,cAAAA,GAAiBH,OAAAA,CAAQC,UAAAA,CAC3B,0DAAA,CAAA;AAGJ,EAAA,MAAMG,aAAAA,GAAgBJ,OAAAA,CAAQC,UAAAA,CAC1B,0DAAA,CAAA;AAGJ,EAAA,MAAMI,cAAAA,GAAiBL,OAAAA,CAAQC,UAAAA,CAC3B,0DAAA,CAAA;AAIJ,EAAA,MAAMK,SAAAA,GAAY,IAAIC,gBAAAA,CAClB,oEAAA,CAAA;AAGJ,EAAA,MAAMC,IAAAA,GAAO,KAAA;AACb,EAAA,MAAMC,WAAW,IAAIC,KAAAA,CAAM,KAAA,EAAOR,eAAAA,CAAgBS,WAAS,CAAA;AAE3D,EAAA,OAAO;IACHC,cAAAA,EAAgBpB,aAAAA;IAChBqB,SAAAA,EAAWpB,QAAAA;IACXqB,YAAAA,EAAcpB,WAAAA;AACdqB,IAAAA,OAAAA,EAAS,GAAGjB,OAAAA,CAAAA,YAAAA,CAAAA;IACZkB,kBAAAA,EAAoBrB,iBAAAA;IACpBsB,WAAAA,EAAalB,UAAAA;IACbmB,gBAAAA,EAAkBhB,eAAAA;IAClBiB,eAAAA,EAAiBhB,cAAAA;IACjBiB,cAAAA,EAAgBhB,aAAAA;IAChBiB,gBAAAA,EAAkBhB,cAAAA;IAClBiB,UAAAA,EAAYhB,SAAAA;IACZiB,OAAAA,EAAS,CAAA;IACTC,KAAAA,EAAOhB,IAAAA;IACPiB,KAAAA,EAAO,KAAA;IACPC,GAAAA,EAAKlB,IAAAA;AACLmB,IAAAA,oBAAAA,EAAsBjB,KAAAA,CAAMkB,MAAAA,EAAM,CAAGC,UAAAA,CAAWlC,iBAAAA,CAAAA;IAChDmC,SAAAA,EAAWrB,QAAAA;IACXsB,iBAAAA,EAAmBtB,QAAAA,CAASoB,WAAWlC,iBAAAA,CAAAA;IACvCqC,gBAAAA,EAAkB,CAAA;IAClBC,iBAAAA,EAAmB,CAAA;IACnBC,YAAAA,EAAc,CAAA;IACdC,qBAAAA,EAAuB;AAC3B,GAAA;AACJ;AAxDgB7C,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA","file":"7DZ4SVEO.js","sourcesContent":["import { Asset, Keypair, Networks } from '@stellar/stellar-sdk';\n\nimport { Secp256k1KeyPair } from './secp256k1.js';\n\nexport interface CreateStellarTestEnvOptions {\n /** Docker container name — must be unique when suites run concurrently. */\n containerName: string;\n /** Host port mapped to the localnet container's RPC port. */\n hostPort: number;\n /**\n * Optional localnet image override. Defaults to the versioned LayerZero ECR snapshot.\n * Useful for testing a locally built image without changing the shared default.\n */\n dockerImage?: string;\n}\n\n/**\n * Shared Stellar E2E constants (RPC URL, keys, EIDs, token addresses).\n * Constructed from containerName/hostPort so concurrent suites do not collide.\n */\nexport interface StellarTestEnv {\n CONTAINER_NAME: string;\n HOST_PORT: number;\n /** Optional localnet Docker image override. */\n DOCKER_IMAGE?: string;\n RPC_URL: string;\n NETWORK_PASSPHRASE: typeof Networks.STANDALONE;\n JUNK_WALLET: Keypair;\n DEFAULT_DEPLOYER: Keypair;\n ZRO_DISTRIBUTOR: Keypair;\n EXECUTOR_ADMIN: Keypair;\n CHAIN_B_DEPLOYER: Keypair;\n DVN_SIGNER: Secp256k1KeyPair;\n DVN_VID: number;\n EID_A: number;\n EID_B: number;\n /** Legacy single EID (alias of EID_A). */\n EID: number;\n NATIVE_TOKEN_ADDRESS: string;\n ZRO_ASSET: Asset;\n ZRO_TOKEN_ADDRESS: string;\n MSG_TYPE_VANILLA: number;\n MSG_TYPE_COMPOSED: number;\n MSG_TYPE_ABA: number;\n MSG_TYPE_COMPOSED_ABA: number;\n}\n\nexport function createStellarTestEnv(options: CreateStellarTestEnvOptions): StellarTestEnv {\n const { containerName, hostPort, dockerImage } = options;\n const networkPassphrase = Networks.STANDALONE;\n const coreUrl = `http://localhost:${hostPort}`;\n\n // Pre-funded in the ECR localnet image (BIP39: \"test test...junk\", path m/44'/148'/0')\n const junkWallet = Keypair.fromSecret(\n 'SCZ5VBFVGE4SLZV5WJO33LEEU36EEOEHWO27KYJIIUWGOKZB2OSNAQBI',\n );\n const defaultDeployer = Keypair.fromSecret(\n 'SDLCA3JUES3G6R4FTI6XXDIWW7QCNMZNWPYQQIKQ26TEIZUFOLIVIUDK',\n );\n const zroDistributor = Keypair.fromSecret(\n 'SB6QAFXFRR2MXYHW4RRZ23JDGKHDCYCT5YTQEGG3WNT5VKZADJQFVNWG',\n );\n // Deterministic so globalSetup and test files agree (separate processes).\n const executorAdmin = Keypair.fromSecret(\n 'SACWJCNRT2AYRPBWW7IBRNI765EMZSWPXXAAHYN57UFQNOXMGET7HM5K',\n );\n // Separate deployer for Chain B parallel deploy in protocol globalSetup.\n const chainBDeployer = Keypair.fromSecret(\n 'SDLIZSTG7W4C3FZYY52WIKF7FTWAXCWC5Z4OVVF3TDA3MBOR37LMIANJ',\n );\n\n // Private key is keccak256(\"dvn_test_signer\") truncated to 32 bytes\n const dvnSigner = new Secp256k1KeyPair(\n '0x8d3f8d5d8f1c7e2a5b4c3d6e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a',\n );\n\n const eidA = 30401;\n const zroAsset = new Asset('ZRO', defaultDeployer.publicKey());\n\n return {\n CONTAINER_NAME: containerName,\n HOST_PORT: hostPort,\n DOCKER_IMAGE: dockerImage,\n RPC_URL: `${coreUrl}/soroban/rpc`,\n NETWORK_PASSPHRASE: networkPassphrase,\n JUNK_WALLET: junkWallet,\n DEFAULT_DEPLOYER: defaultDeployer,\n ZRO_DISTRIBUTOR: zroDistributor,\n EXECUTOR_ADMIN: executorAdmin,\n CHAIN_B_DEPLOYER: chainBDeployer,\n DVN_SIGNER: dvnSigner,\n DVN_VID: 1,\n EID_A: eidA,\n EID_B: 30402,\n EID: eidA,\n NATIVE_TOKEN_ADDRESS: Asset.native().contractId(networkPassphrase),\n ZRO_ASSET: zroAsset,\n ZRO_TOKEN_ADDRESS: zroAsset.contractId(networkPassphrase),\n MSG_TYPE_VANILLA: 1,\n MSG_TYPE_COMPOSED: 2,\n MSG_TYPE_ABA: 3,\n MSG_TYPE_COMPOSED_ABA: 4,\n };\n}\n"]}
|
package/dist/CYINPPER.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/localnet.ts"],"names":["DEFAULT_STELLAR_LOCALNET_IMAGE","CONTAINER_PORT","STELLAR_LOCALNET_OWNER_LABEL","STELLAR_LOCALNET_OWNER_LABEL_KEY","split","STARTUP_TIMEOUT_MS","REQUEST_TIMEOUT_MS","FUNDING_RETRY_INTERVAL_MS","DOCKER_NAME_RE","DOCKER_IMAGE_RE","assertDockerArgs","env","test","CONTAINER_NAME","Error","JSON","stringify","Number","isInteger","HOST_PORT","dockerImage","DOCKER_IMAGE","buildDockerRunArgs","buildDockerContainerIdLookupArgs","containerName","buildDockerOwnershipLabelLookupArgs","containerId","buildDockerRemoveArgs","getNamedContainerRemovalPolicy","ownerLabel","runDockerCommand","args","result","spawnSync","encoding","error","message","cause","status","stdout","stderr","runDockerOrThrow","runner","action","trim","removeOwnedContainerIfPresent","commandRunner","normalizedContainerId","undefined","policy","dockerRunLocalnet","startStellarLocalnet","console","log","waitForRpcHealth","fundTestAccounts","deployNativeSac","deployZroToken","err","stopStellarLocalnet","fundAccountQueue","Promise","resolve","fundAccount","publicKey","then","fundAccountInternal","catch","MAX_RETRIES","lastError","attempt","transactionSubmitted","getDestinationAccount","server","rpc","Server","RPC_URL","allowHttp","accountId","getAccount","junkAccount","JUNK_WALLET","tx","TransactionBuilder","fee","BASE_FEE","networkPassphrase","NETWORK_PASSPHRASE","addOperation","Operation","createAccount","destination","startingBalance","setTimeout","build","sign","sendResult","sendTransaction","txResult","pollTransaction","hash","accountExists","String","pauseBeforeFundingRetry","maxAttempts","sleep","ms","intervalMs","startTime","Date","now","response","fetch","method","headers","body","jsonrpc","id","signal","AbortSignal","timeout","data","json","alreadyFunded","DEFAULT_DEPLOYER","FUNDING_ATTEMPTS","ZRO_DISTRIBUTOR","EXECUTOR_ADMIN","CHAIN_B_DEPLOYER","attempts","warn"],"mappings":"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","file":"CYINPPER.js","sourcesContent":["import { BASE_FEE, Operation, rpc, TransactionBuilder } from '@stellar/stellar-sdk';\nimport { spawnSync } from 'node:child_process';\n\nimport { deployNativeSac, deployZroToken } from './deploy.js';\nimport type { StellarTestEnv } from './env.js';\n\nexport const DEFAULT_STELLAR_LOCALNET_IMAGE =\n '438003944538.dkr.ecr.us-east-1.amazonaws.com/layerzerolabs/stellar:2026-03-02';\nconst CONTAINER_PORT = 8000;\nexport const STELLAR_LOCALNET_OWNER_LABEL = 'com.layerzerolabs.test-utils-stellar=1';\nconst STELLAR_LOCALNET_OWNER_LABEL_KEY = STELLAR_LOCALNET_OWNER_LABEL.split('=')[0];\n\n// Timeout configuration (in milliseconds)\nconst STARTUP_TIMEOUT_MS = 120_000; // 2 minutes\nconst REQUEST_TIMEOUT_MS = 5_000;\nexport const FUNDING_RETRY_INTERVAL_MS = 2_000;\n\n/** Docker container names: alphanumeric start, then alnum / `_` / `.` / `-`. */\nconst DOCKER_NAME_RE = /^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/;\nconst DOCKER_IMAGE_RE =\n /^(?!-)[a-z0-9][a-z0-9._/-]*(?::[a-zA-Z0-9][a-zA-Z0-9_.-]*)?(?:@[a-zA-Z0-9][a-zA-Z0-9_+.-]*:[a-fA-F0-9]{32,})?$/;\n\nexport interface DockerCommandResult {\n status: number;\n stdout: string;\n stderr: string;\n}\n\n/** Injectable so container lifecycle policy can be tested without a Docker daemon. */\nexport type DockerCommandRunner = (args: readonly string[]) => DockerCommandResult;\n\nexport interface LocalnetLifecycleOptions {\n env: StellarTestEnv;\n commandRunner?: DockerCommandRunner;\n}\n\nexport type NamedContainerRemovalPolicy = 'absent' | 'remove' | 'reject';\n\nexport function assertDockerArgs(env: StellarTestEnv): void {\n if (!DOCKER_NAME_RE.test(env.CONTAINER_NAME)) {\n throw new Error(`Invalid docker container name: ${JSON.stringify(env.CONTAINER_NAME)}`);\n }\n if (!Number.isInteger(env.HOST_PORT) || env.HOST_PORT < 1 || env.HOST_PORT > 65535) {\n throw new Error(`Invalid docker host port: ${env.HOST_PORT}`);\n }\n const dockerImage = env.DOCKER_IMAGE ?? DEFAULT_STELLAR_LOCALNET_IMAGE;\n if (!DOCKER_IMAGE_RE.test(dockerImage)) {\n throw new Error(`Invalid docker image: ${JSON.stringify(dockerImage)}`);\n }\n}\n\nexport function buildDockerRunArgs(env: StellarTestEnv): string[] {\n assertDockerArgs(env);\n return [\n 'run',\n '-d',\n '--name',\n env.CONTAINER_NAME,\n '--label',\n STELLAR_LOCALNET_OWNER_LABEL,\n '-p',\n `127.0.0.1:${env.HOST_PORT}:${CONTAINER_PORT}`,\n env.DOCKER_IMAGE ?? DEFAULT_STELLAR_LOCALNET_IMAGE,\n ];\n}\n\nexport function buildDockerContainerIdLookupArgs(containerName: string): string[] {\n return ['container', 'ls', '-aq', '--filter', `name=^/${containerName}$`];\n}\n\nexport function buildDockerOwnershipLabelLookupArgs(containerId: string): string[] {\n return [\n 'container',\n 'inspect',\n '--format',\n `{{ index .Config.Labels \"${STELLAR_LOCALNET_OWNER_LABEL_KEY}\" }}`,\n containerId,\n ];\n}\n\nexport function buildDockerRemoveArgs(containerId: string): string[] {\n return ['rm', '-f', containerId];\n}\n\nexport function getNamedContainerRemovalPolicy(\n containerId: string | undefined,\n ownerLabel: string | undefined,\n): NamedContainerRemovalPolicy {\n if (containerId == null) return 'absent';\n return ownerLabel === '1' ? 'remove' : 'reject';\n}\n\nconst runDockerCommand: DockerCommandRunner = (args) => {\n const result = spawnSync('docker', args, { encoding: 'utf8' });\n if (result.error != null) {\n throw new Error(`Unable to run docker ${args[0]}: ${result.error.message}`, {\n cause: result.error,\n });\n }\n return {\n status: result.status ?? 1,\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n };\n};\n\nfunction runDockerOrThrow(\n runner: DockerCommandRunner,\n args: readonly string[],\n action: string,\n): DockerCommandResult {\n const result = runner(args);\n if (result.status !== 0) {\n throw new Error(\n `Docker ${action} failed (exit ${result.status}): ${result.stderr.trim() || result.stdout.trim()}`,\n );\n }\n return result;\n}\n\nfunction removeOwnedContainerIfPresent(\n env: StellarTestEnv,\n commandRunner: DockerCommandRunner,\n): void {\n const containerId = runDockerOrThrow(\n commandRunner,\n buildDockerContainerIdLookupArgs(env.CONTAINER_NAME),\n `container lookup for ${env.CONTAINER_NAME}`,\n ).stdout.trim();\n const normalizedContainerId = containerId === '' ? undefined : containerId;\n\n if (normalizedContainerId == null) return;\n\n const ownerLabel = runDockerOrThrow(\n commandRunner,\n buildDockerOwnershipLabelLookupArgs(normalizedContainerId),\n `ownership lookup for ${env.CONTAINER_NAME}`,\n ).stdout.trim();\n const policy = getNamedContainerRemovalPolicy(normalizedContainerId, ownerLabel);\n if (policy === 'reject') {\n throw new Error(\n `Refusing to remove existing container ${env.CONTAINER_NAME}: it is not owned by ${STELLAR_LOCALNET_OWNER_LABEL}`,\n );\n }\n runDockerOrThrow(\n commandRunner,\n buildDockerRemoveArgs(normalizedContainerId),\n `removal of ${env.CONTAINER_NAME}`,\n );\n}\n\nfunction dockerRunLocalnet(env: StellarTestEnv, commandRunner: DockerCommandRunner): void {\n runDockerOrThrow(commandRunner, buildDockerRunArgs(env), 'localnet start');\n}\n\nexport async function startStellarLocalnet({\n env,\n commandRunner = runDockerCommand,\n}: LocalnetLifecycleOptions): Promise<void> {\n assertDockerArgs(env);\n console.log('🚀 Starting Stellar localnet...');\n\n removeOwnedContainerIfPresent(env, commandRunner);\n dockerRunLocalnet(env, commandRunner);\n\n // Container is up; if any startup step fails, tear it down before rethrowing.\n // globalSetup only registers its teardown once startup fully succeeds, so\n // without this a failed startup (e.g. a funding flake) would leak the container.\n try {\n console.log('⏳ Waiting for Stellar RPC to be healthy...');\n await waitForRpcHealth(env);\n console.log('✅ Stellar RPC is healthy');\n\n await fundTestAccounts(env);\n await deployNativeSac(env);\n await deployZroToken(env);\n } catch (err) {\n await stopStellarLocalnet({ env, commandRunner });\n throw err;\n }\n}\n\n// Serialization queue for fundAccount — the junk wallet can only have one pending tx at a time.\n// Chaining onto this promise ensures concurrent calls are sequenced correctly.\nlet fundAccountQueue: Promise<void> = Promise.resolve();\n\n/**\n * Fund a single account from the junk wallet (for ad-hoc test accounts).\n * Calls are serialized to avoid sequence number conflicts on the junk wallet.\n */\nexport function fundAccount(env: StellarTestEnv, publicKey: string): Promise<void> {\n const result = fundAccountQueue.then(() => fundAccountInternal(env, publicKey));\n fundAccountQueue = result.catch(() => {}); // keep queue alive if this call fails\n return result;\n}\n\nasync function fundAccountInternal(env: StellarTestEnv, publicKey: string): Promise<void> {\n const MAX_RETRIES = 5;\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {\n let transactionSubmitted = false;\n let getDestinationAccount: ((accountId: string) => Promise<unknown>) | undefined;\n try {\n const server = new rpc.Server(env.RPC_URL, { allowHttp: true });\n getDestinationAccount = (accountId) => server.getAccount(accountId);\n // Re-fetch account on every attempt to get the latest sequence number\n const junkAccount = await server.getAccount(env.JUNK_WALLET.publicKey());\n\n const tx = new TransactionBuilder(junkAccount, {\n fee: BASE_FEE,\n networkPassphrase: env.NETWORK_PASSPHRASE,\n })\n .addOperation(\n Operation.createAccount({\n destination: publicKey,\n startingBalance: '100',\n }),\n )\n .setTimeout(30)\n .build();\n\n tx.sign(env.JUNK_WALLET);\n\n const sendResult = await server.sendTransaction(tx);\n if (sendResult.status !== 'PENDING') {\n throw new Error(\n `Failed to fund account ${publicKey}: ${JSON.stringify(sendResult)}`,\n );\n }\n transactionSubmitted = true;\n\n const txResult = await server.pollTransaction(sendResult.hash);\n if (txResult.status !== 'SUCCESS') {\n throw new Error(\n `Account funding failed for ${publicKey}: ${JSON.stringify(txResult)}`,\n );\n }\n\n return; // success\n } catch (err) {\n lastError = err;\n if (\n transactionSubmitted &&\n getDestinationAccount != null &&\n (await accountExists(getDestinationAccount, publicKey))\n ) {\n return;\n }\n if (attempt < MAX_RETRIES) {\n await new Promise((resolve) => setTimeout(resolve, FUNDING_RETRY_INTERVAL_MS));\n }\n }\n }\n\n throw new Error(\n `Failed to fund account ${publicKey} after ${MAX_RETRIES} attempts: ${lastError instanceof Error ? lastError.message : String(lastError)}`,\n );\n}\n\n/** Returns true when a destination account was created despite an ambiguous transaction poll. */\nexport async function accountExists(\n getAccount: (accountId: string) => Promise<unknown>,\n accountId: string,\n): Promise<boolean> {\n try {\n await getAccount(accountId);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Back off between fundTestAccounts rebuilds so a lagging localnet can confirm\n * the previous attempt before we burn another try.\n */\nexport async function pauseBeforeFundingRetry(\n attempt: number,\n maxAttempts: number,\n sleep: (ms: number) => Promise<void> = (ms) =>\n new Promise((resolve) => setTimeout(resolve, ms)),\n intervalMs: number = FUNDING_RETRY_INTERVAL_MS,\n): Promise<void> {\n if (attempt < maxAttempts) {\n await sleep(intervalMs);\n }\n}\n\nasync function waitForRpcHealth(env: StellarTestEnv): Promise<void> {\n const startTime = Date.now();\n while (Date.now() - startTime < STARTUP_TIMEOUT_MS) {\n try {\n const response = await fetch(env.RPC_URL, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'getHealth' }),\n signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),\n });\n const data = (await response.json()) as { result?: { status?: string } };\n if (data.result?.status === 'healthy') return;\n } catch {\n // Not ready yet\n }\n await new Promise((resolve) => setTimeout(resolve, FUNDING_RETRY_INTERVAL_MS));\n }\n throw new Error(\n `Stellar RPC failed to become healthy within ${STARTUP_TIMEOUT_MS / 1000} seconds`,\n );\n}\n\nasync function fundTestAccounts(env: StellarTestEnv): Promise<void> {\n console.log('💰 Funding test accounts from junk wallet...');\n const server = new rpc.Server(env.RPC_URL, { allowHttp: true });\n\n // A funded DEFAULT_DEPLOYER is the signal that funding already landed — lets us\n // short-circuit when a prior attempt's tx confirmed after the poll gave up.\n const alreadyFunded = async (): Promise<boolean> => {\n try {\n await server.getAccount(env.DEFAULT_DEPLOYER.publicKey());\n return true;\n } catch {\n return false;\n }\n };\n\n // Running localnets concurrently makes the chain lag, so a funding tx can outrun\n // the poll window or expire (NOT_FOUND). Use a longer validity + poll window, and\n // rebuild-and-retry a bounded number of times before giving up.\n const FUNDING_ATTEMPTS = 3;\n for (let attempt = 1; attempt <= FUNDING_ATTEMPTS; attempt++) {\n const junkAccount = await server.getAccount(env.JUNK_WALLET.publicKey());\n const tx = new TransactionBuilder(junkAccount, {\n fee: BASE_FEE,\n networkPassphrase: env.NETWORK_PASSPHRASE,\n })\n .addOperation(\n Operation.createAccount({\n destination: env.DEFAULT_DEPLOYER.publicKey(),\n startingBalance: '2000',\n }),\n )\n .addOperation(\n Operation.createAccount({\n destination: env.ZRO_DISTRIBUTOR.publicKey(),\n startingBalance: '2000',\n }),\n )\n .addOperation(\n Operation.createAccount({\n destination: env.EXECUTOR_ADMIN.publicKey(),\n startingBalance: '2000',\n }),\n )\n .addOperation(\n Operation.createAccount({\n destination: env.CHAIN_B_DEPLOYER.publicKey(),\n startingBalance: '2000',\n }),\n )\n .setTimeout(120)\n .build();\n\n tx.sign(env.JUNK_WALLET);\n\n const sendResult = await server.sendTransaction(tx);\n if (sendResult.status === 'PENDING') {\n const txResult = await server.pollTransaction(sendResult.hash, { attempts: 60 });\n if (txResult.status === 'SUCCESS') {\n console.log('✅ All test accounts funded');\n return;\n }\n }\n\n // Send rejected or poll didn't confirm — but on a lagging chain the tx may\n // have landed anyway. If the accounts now exist, funding is effectively done.\n if (await alreadyFunded()) {\n console.log('✅ All test accounts funded (confirmed after poll window)');\n return;\n }\n\n console.warn(\n `⚠️ Funding attempt ${attempt}/${FUNDING_ATTEMPTS} did not confirm; retrying…`,\n );\n // Match fundAccountInternal: give a lagging localnet time to confirm before\n // rebuilding/retrying, otherwise we can burn all attempts while the first tx lands.\n await pauseBeforeFundingRetry(attempt, FUNDING_ATTEMPTS);\n }\n\n throw new Error(`Account funding failed to confirm after ${FUNDING_ATTEMPTS} attempts`);\n}\n\nexport async function stopStellarLocalnet({\n env,\n commandRunner = runDockerCommand,\n}: LocalnetLifecycleOptions): Promise<void> {\n // Guarded (like the startup docker rm -f) so a cleanup failure never throws —\n // otherwise it would mask the original error when called from a startup catch.\n try {\n assertDockerArgs(env);\n removeOwnedContainerIfPresent(env, commandRunner);\n console.log('✅ Stellar localnet stopped');\n } catch (err) {\n console.warn(`⚠️ Failed to remove container ${env.CONTAINER_NAME}:`, err);\n }\n}\n"]}
|