@xyo-network/chain-sdk 1.0.12 → 1.1.0
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/neutral/index.mjs +8 -10
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/node/index-node.mjs +8 -10
- package/dist/node/index-node.mjs.map +1 -1
- package/dist/types/test/evm/stakingContractUtils.d.ts.map +1 -1
- package/package.json +34 -58
- package/src/test/evm/stakingContractUtils.ts +9 -7
package/dist/neutral/index.mjs
CHANGED
|
@@ -273,6 +273,9 @@ var createTestGenesisBlock = /* @__PURE__ */ __name(async (blockProducerAccounts
|
|
|
273
273
|
const stakeIntent = new PayloadBuilder({
|
|
274
274
|
schema: ChainStakeIntentSchema
|
|
275
275
|
}).fields({
|
|
276
|
+
$opCodes: [
|
|
277
|
+
"elevate"
|
|
278
|
+
],
|
|
276
279
|
from: blockProducerAccount.address,
|
|
277
280
|
exp: Number.MAX_SAFE_INTEGER,
|
|
278
281
|
nbf: 0,
|
|
@@ -280,20 +283,15 @@ var createTestGenesisBlock = /* @__PURE__ */ __name(async (blockProducerAccounts
|
|
|
280
283
|
}).build();
|
|
281
284
|
const signedStakedBlockProducerIntent = await buildTransaction(randomChainId, [
|
|
282
285
|
stakeIntent
|
|
283
|
-
],
|
|
286
|
+
], blockProducerAccount, 0, 1e3, []);
|
|
284
287
|
return signedStakedBlockProducerIntent;
|
|
285
288
|
}));
|
|
286
289
|
const intents = signedStakedBlockProducerIntents.map((intent) => intent[0]);
|
|
287
290
|
const payloads = signedStakedBlockProducerIntents.flatMap((intent) => intent[1]);
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
...intents,
|
|
293
|
-
...signedTransactionBws,
|
|
294
|
-
...payloads
|
|
295
|
-
]
|
|
296
|
-
];
|
|
291
|
+
return await buildBlock(randomChainId, signedStakedBlockProducerIntents, [
|
|
292
|
+
...intents,
|
|
293
|
+
...payloads
|
|
294
|
+
], blockProducerAccounts);
|
|
297
295
|
}, "createTestGenesisBlock");
|
|
298
296
|
export {
|
|
299
297
|
approveTestStakeChainAddress,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/index-shared.ts","../../src/orchestration/archivist/initArchivistSync.ts","../../src/orchestration/bridge.ts","../../src/orchestration/initBridgedModule.ts","../../src/test/evm/runGanache.ts","../../src/test/evm/stakingContractUtils.ts"],"sourcesContent":["export * from './index-shared.ts'\nexport * from './test/index.ts'\n","export * from './orchestration/index.ts'\nexport * from '@xyo-network/chain-ethereum'\nexport * from '@xyo-network/chain-model'\nexport * from '@xyo-network/chain-modules'\nexport * from '@xyo-network/chain-protocol'\nexport * from '@xyo-network/chain-services'\nexport * from '@xyo-network/chain-utils'\nexport * from '@xyo-network/chain-validation'\n","import type { TracerProvider } from '@opentelemetry/api'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistSyncDiviner } from '@xyo-network/chain-modules'\nimport { spanAsync } from '@xyo-network/chain-utils'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport { MemoryNode } from '@xyo-network/node-memory'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport { SentinelConfigSchema } from '@xyo-network/sentinel-model'\n\nexport const initArchivistSync = async (\n name: ModuleIdentifier,\n inArchivist: ArchivistInstance,\n outArchivist: ArchivistInstance,\n frequency = 1000,\n traceProvider?: TracerProvider,\n) => {\n const tracer = traceProvider?.getTracer(`archivist-sync-diviner [${name}]`)\n return await spanAsync(`initArchivistSync [${name}]`, async () => {\n const node = await MemoryNode.create({ account: 'random' })\n const finalizedArchivistSyncDiviner = await ArchivistSyncDiviner.create({\n account: 'random',\n inArchivist,\n outArchivist,\n tracer,\n config: { schema: DivinerConfigSchema, name },\n })\n\n await node.register(finalizedArchivistSyncDiviner)\n await node.attach(finalizedArchivistSyncDiviner.address)\n\n const sentinel = await MemorySentinel.create({\n account: 'random',\n config: {\n name,\n schema: SentinelConfigSchema,\n tasks: [\n {\n required: true,\n mod: finalizedArchivistSyncDiviner.address,\n endPoint: 'divine',\n },\n ],\n automations: [\n {\n frequency,\n frequencyUnits: 'millis',\n schema: 'network.xyo.automation.interval',\n start: Date.now(),\n type: 'interval',\n },\n ],\n },\n })\n\n await node.register(sentinel)\n await node.attach(sentinel.address)\n\n return node\n }, tracer)\n}\n","import { HttpBridge, HttpBridgeConfigSchema } from '@xyo-network/bridge-http'\nimport type { AttachableBridgeInstance } from '@xyo-network/bridge-model'\nimport { Mutex } from 'async-mutex'\n\nconst initMutex = new Mutex()\nconst bridgeSingletonMap = new Map<string, AttachableBridgeInstance>()\n\nexport const initBridge = async (nodeUrl: string): Promise<AttachableBridgeInstance> => {\n return await initMutex.runExclusive(async () => {\n const existing = bridgeSingletonMap.get(nodeUrl)\n if (existing) return existing\n const bridge = await HttpBridge.create({\n account: 'random',\n config: {\n name: 'HttpBridge',\n client: { url: nodeUrl, discoverRoots: 'start' },\n schema: HttpBridgeConfigSchema,\n security: { allowAnonymous: true },\n },\n })\n await bridge.start()\n bridgeSingletonMap.set(nodeUrl, bridge)\n return bridge\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport type { AttachableArchivistInstance } from '@xyo-network/archivist-model'\nimport { asAttachableArchivistInstance } from '@xyo-network/archivist-model'\nimport type { BridgeInstance } from '@xyo-network/bridge-model'\nimport type { Initializable } from '@xyo-network/chain-model'\nimport type { AttachableModuleInstance, ModuleIdentifier } from '@xyo-network/module-model'\nimport { asAttachableModuleInstance } from '@xyo-network/module-model'\nimport { Mutex } from 'async-mutex'\n\nconst initMutex = new Mutex()\nconst bridgedModuleDictionary: Record<Address, Record<ModuleIdentifier, AttachableModuleInstance>> = {}\n\nexport const initBridgedModule: Initializable<\n { bridge: BridgeInstance; moduleName: ModuleIdentifier }, AttachableModuleInstance\n> = async ({ bridge, moduleName }): Promise<AttachableModuleInstance> => {\n return await initMutex.runExclusive(async () => {\n const existing = bridgedModuleDictionary?.[bridge.address]?.[moduleName]\n if (existing) return existing\n const mod = assertEx(await bridge.resolve(moduleName), () => `Error: Could not resolve ${moduleName}`)\n const moduleInstance = assertEx(asAttachableModuleInstance(mod), () => `Error: Could not convert ${moduleName} to attachable module instance`)\n bridgedModuleDictionary[bridge.address] = bridgedModuleDictionary[bridge.address] || {}\n bridgedModuleDictionary[bridge.address][moduleName] = moduleInstance\n return moduleInstance\n })\n}\n\nexport const initBridgedArchivistModule: Initializable<\n { bridge: BridgeInstance; moduleName: ModuleIdentifier }, AttachableArchivistInstance\n> = async ({ bridge, moduleName }): Promise<AttachableArchivistInstance> => {\n return assertEx(\n asAttachableArchivistInstance(await initBridgedModule({ bridge, moduleName })),\n () => `Error: Could not convert ${moduleName} to attachable archivist instance`,\n )\n}\n","import type { ChildProcess } from 'node:child_process'\nimport { spawn } from 'node:child_process'\n\nimport { delay } from '@xylabs/delay'\nimport { JsonRpcProvider } from 'ethers/providers'\n\nasync function isGanacheRunning(url: string) {\n try {\n const provider = new JsonRpcProvider(url)\n await provider.getBlockNumber() // Try to fetch the latest block number\n return true // If this succeeds, the server is running\n } catch {\n return false // If this fails, the server is not running\n }\n}\n\nexport async function startGanache(port: number, mnemonic: string) {\n console.log('Starting Ganache CLI...')\n\n // Start Ganache CLI\n const ganacheProcess = spawn(\n 'yarn',\n ['ganache', '--port', `${port}`, '--chain.chainId', '1337', '--mnemonic', mnemonic],\n { stdio: 'inherit' },\n )\n\n // Wait for Ganache to be ready\n while (!await isGanacheRunning(`http://127.0.0.1:${port}`)) {\n await delay(500)\n }\n\n return ganacheProcess\n}\n\nexport function stopGanache(process: ChildProcess) {\n console.log('Stopping Ganache CLI...')\n\n if (process) {\n process.kill('SIGTERM')\n console.log('Ganache CLI stopped.')\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { asAddress } from '@xylabs/hex'\nimport type { AccountInstance, WalletInstance } from '@xyo-network/account'\nimport { Account } from '@xyo-network/account'\nimport { createChain } from '@xyo-network/chain-ethereum'\nimport type { ChainStakeIntent, HydratedBlock } from '@xyo-network/chain-model'\nimport { ChainStakeIntentSchema } from '@xyo-network/chain-model'\nimport { buildBlock, buildTransaction } from '@xyo-network/chain-protocol'\nimport { XYO_ZERO_ADDRESS } from '@xyo-network/chain-utils'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { BurnableErc20__factory as Erc20Factory } from '@xyo-network/typechain'\nimport { getAddress } from 'ethers/address'\nimport { JsonRpcProvider } from 'ethers/providers'\nimport { parseUnits } from 'ethers/utils'\nimport { Wallet } from 'ethers/wallet'\n\nconst gasConfig = () => {\n return {\n gasLimit: 2_000_000, // Set the gas limit\n gasPrice: parseUnits('100', 'gwei'),\n }\n}\n\nexport const createTestErc20 = async (ganachePort: number, testPhrase: string, contractCreator: WalletInstance): Promise<Address> => {\n const provider = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWallet = new Wallet(contractCreator.privateKey, provider)\n const erc20 = new Erc20Factory(ethWallet)\n const totalSupply = parseUnits('1000000', 18)\n const erc20Contract = await (await erc20.deploy('Test Token', 'TST', totalSupply, gasConfig())).waitForDeployment()\n const erc20Address = await erc20Contract.getAddress()\n const erc20ContractPerson0 = Erc20Factory.connect(erc20Address, ethWallet)\n const balance = await erc20ContractPerson0.balanceOf(ethWallet.address)\n assertEx(balance === totalSupply, () => 'Balance does not match total supply')\n return assertEx(asAddress(erc20Address), () => 'Invalid ERC20 contract address')\n}\n\nexport const transferTestTokens = async (ganachePort: number, erc20Address: Address, account0: WalletInstance, account1: WalletInstance) => {\n const provider0 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson0 = new Wallet(account0.privateKey, provider0)\n const provider1 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson1 = new Wallet(account1.privateKey, provider1)\n const erc20ContractPerson0 = Erc20Factory.connect(getAddress(erc20Address), ethWalletPerson0)\n const transferAmount = parseUnits('1000', 18)\n await (await erc20ContractPerson0.transfer(ethWalletPerson1.address, transferAmount, gasConfig())).wait()\n const erc20ContractPerson1 = Erc20Factory.connect(getAddress(erc20Address), ethWalletPerson1)\n const balance = await erc20ContractPerson1.balanceOf(ethWalletPerson1.address)\n assertEx(balance === transferAmount, () => 'Balance does not match transfer amount')\n}\n\nexport const createTestChainContract = async (\n ganachePort: number,\n erc20Address: Address,\n account0: WalletInstance,\n initialProducer: AccountInstance,\n): Promise<Address> => {\n const provider0 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson0 = new Wallet(account0.privateKey, provider0)\n const [xyoChainContractAddress] = await createChain(\n ethWalletPerson0,\n erc20Address,\n initialProducer,\n XYO_ZERO_ADDRESS,\n 0n,\n XYO_ZERO_ADDRESS,\n 50_000n,\n gasConfig(),\n )\n return assertEx(asAddress(xyoChainContractAddress), () => 'Invalid staking contract address')\n}\n\nexport const approveTestStakeChainAddress = async (ganachePort: number, erc20Address: Address, xyoChainContractAddress: Address, account1: WalletInstance) => {\n const provider1 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson1 = new Wallet(account1.privateKey, provider1)\n const erc20ContractPerson1 = Erc20Factory.connect(getAddress(erc20Address), ethWalletPerson1)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _approveResultTx = await (await erc20ContractPerson1.approve(getAddress(xyoChainContractAddress), parseUnits('100', 18), gasConfig())).wait()\n}\n\nexport const createTestGenesisBlock = async (\n blockProducerAccounts: WalletInstance[],\n): Promise<HydratedBlock> => {\n const randomChainId = (await Account.random()).address\n // Create staked intents for all the block producers declaring their intent to produce blocks\n const signedStakedBlockProducerIntents = await Promise.all(blockProducerAccounts.map(async (blockProducerAccount) => {\n const stakeIntent = new PayloadBuilder<ChainStakeIntent>({ schema: ChainStakeIntentSchema }).fields({\n from: blockProducerAccount.address,\n exp: Number.MAX_SAFE_INTEGER,\n nbf: 0,\n intent: 'producer',\n }).build()\n\n const signedStakedBlockProducerIntent = await buildTransaction(\n randomChainId,\n [stakeIntent],\n 0n,\n blockProducerAccount,\n 0,\n 1000,\n [],\n )\n return signedStakedBlockProducerIntent\n }))\n const intents = signedStakedBlockProducerIntents.map(intent => intent[0])\n const payloads = signedStakedBlockProducerIntents.flatMap(intent => intent[1])\n const [firstBlock, signedTransactionBws] = await buildBlock(randomChainId, signedStakedBlockProducerIntents, [], blockProducerAccounts)\n return [firstBlock, [...intents, ...signedTransactionBws, ...payloads]] as const\n}\n"],"mappings":"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","names":["ArchivistSyncDiviner","spanAsync","DivinerConfigSchema","MemoryNode","MemorySentinel","SentinelConfigSchema","initArchivistSync","name","inArchivist","outArchivist","frequency","traceProvider","tracer","getTracer","spanAsync","node","MemoryNode","create","account","finalizedArchivistSyncDiviner","ArchivistSyncDiviner","config","schema","DivinerConfigSchema","register","attach","address","sentinel","MemorySentinel","SentinelConfigSchema","tasks","required","mod","endPoint","automations","frequencyUnits","start","Date","now","type","HttpBridge","HttpBridgeConfigSchema","Mutex","initMutex","Mutex","bridgeSingletonMap","Map","initBridge","nodeUrl","runExclusive","existing","get","bridge","HttpBridge","create","account","config","name","client","url","discoverRoots","schema","HttpBridgeConfigSchema","security","allowAnonymous","start","set","assertEx","asAttachableArchivistInstance","asAttachableModuleInstance","Mutex","initMutex","Mutex","bridgedModuleDictionary","initBridgedModule","bridge","moduleName","runExclusive","existing","address","mod","assertEx","resolve","moduleInstance","asAttachableModuleInstance","initBridgedArchivistModule","asAttachableArchivistInstance","spawn","delay","JsonRpcProvider","isGanacheRunning","url","provider","JsonRpcProvider","getBlockNumber","startGanache","port","mnemonic","console","log","ganacheProcess","spawn","stdio","delay","stopGanache","process","kill","assertEx","asAddress","Account","createChain","ChainStakeIntentSchema","buildBlock","buildTransaction","XYO_ZERO_ADDRESS","PayloadBuilder","BurnableErc20__factory","Erc20Factory","getAddress","JsonRpcProvider","parseUnits","Wallet","gasConfig","gasLimit","gasPrice","parseUnits","createTestErc20","ganachePort","testPhrase","contractCreator","provider","JsonRpcProvider","ethWallet","Wallet","privateKey","erc20","Erc20Factory","totalSupply","erc20Contract","deploy","waitForDeployment","erc20Address","getAddress","erc20ContractPerson0","connect","balance","balanceOf","address","assertEx","asAddress","transferTestTokens","account0","account1","provider0","ethWalletPerson0","provider1","ethWalletPerson1","transferAmount","transfer","wait","erc20ContractPerson1","createTestChainContract","initialProducer","xyoChainContractAddress","createChain","XYO_ZERO_ADDRESS","approveTestStakeChainAddress","_approveResultTx","approve","createTestGenesisBlock","blockProducerAccounts","randomChainId","Account","random","signedStakedBlockProducerIntents","Promise","all","map","blockProducerAccount","stakeIntent","PayloadBuilder","schema","ChainStakeIntentSchema","fields","from","exp","Number","MAX_SAFE_INTEGER","nbf","intent","build","signedStakedBlockProducerIntent","buildTransaction","intents","payloads","flatMap","firstBlock","signedTransactionBws","buildBlock"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/index-shared.ts","../../src/orchestration/archivist/initArchivistSync.ts","../../src/orchestration/bridge.ts","../../src/orchestration/initBridgedModule.ts","../../src/test/evm/runGanache.ts","../../src/test/evm/stakingContractUtils.ts"],"sourcesContent":["export * from './index-shared.ts'\nexport * from './test/index.ts'\n","export * from './orchestration/index.ts'\nexport * from '@xyo-network/chain-ethereum'\nexport * from '@xyo-network/chain-model'\nexport * from '@xyo-network/chain-modules'\nexport * from '@xyo-network/chain-protocol'\nexport * from '@xyo-network/chain-services'\nexport * from '@xyo-network/chain-utils'\nexport * from '@xyo-network/chain-validation'\n","import type { TracerProvider } from '@opentelemetry/api'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistSyncDiviner } from '@xyo-network/chain-modules'\nimport { spanAsync } from '@xyo-network/chain-utils'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport { MemoryNode } from '@xyo-network/node-memory'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport { SentinelConfigSchema } from '@xyo-network/sentinel-model'\n\nexport const initArchivistSync = async (\n name: ModuleIdentifier,\n inArchivist: ArchivistInstance,\n outArchivist: ArchivistInstance,\n frequency = 1000,\n traceProvider?: TracerProvider,\n) => {\n const tracer = traceProvider?.getTracer(`archivist-sync-diviner [${name}]`)\n return await spanAsync(`initArchivistSync [${name}]`, async () => {\n const node = await MemoryNode.create({ account: 'random' })\n const finalizedArchivistSyncDiviner = await ArchivistSyncDiviner.create({\n account: 'random',\n inArchivist,\n outArchivist,\n tracer,\n config: { schema: DivinerConfigSchema, name },\n })\n\n await node.register(finalizedArchivistSyncDiviner)\n await node.attach(finalizedArchivistSyncDiviner.address)\n\n const sentinel = await MemorySentinel.create({\n account: 'random',\n config: {\n name,\n schema: SentinelConfigSchema,\n tasks: [\n {\n required: true,\n mod: finalizedArchivistSyncDiviner.address,\n endPoint: 'divine',\n },\n ],\n automations: [\n {\n frequency,\n frequencyUnits: 'millis',\n schema: 'network.xyo.automation.interval',\n start: Date.now(),\n type: 'interval',\n },\n ],\n },\n })\n\n await node.register(sentinel)\n await node.attach(sentinel.address)\n\n return node\n }, tracer)\n}\n","import { HttpBridge, HttpBridgeConfigSchema } from '@xyo-network/bridge-http'\nimport type { AttachableBridgeInstance } from '@xyo-network/bridge-model'\nimport { Mutex } from 'async-mutex'\n\nconst initMutex = new Mutex()\nconst bridgeSingletonMap = new Map<string, AttachableBridgeInstance>()\n\nexport const initBridge = async (nodeUrl: string): Promise<AttachableBridgeInstance> => {\n return await initMutex.runExclusive(async () => {\n const existing = bridgeSingletonMap.get(nodeUrl)\n if (existing) return existing\n const bridge = await HttpBridge.create({\n account: 'random',\n config: {\n name: 'HttpBridge',\n client: { url: nodeUrl, discoverRoots: 'start' },\n schema: HttpBridgeConfigSchema,\n security: { allowAnonymous: true },\n },\n })\n await bridge.start()\n bridgeSingletonMap.set(nodeUrl, bridge)\n return bridge\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport type { AttachableArchivistInstance } from '@xyo-network/archivist-model'\nimport { asAttachableArchivistInstance } from '@xyo-network/archivist-model'\nimport type { BridgeInstance } from '@xyo-network/bridge-model'\nimport type { Initializable } from '@xyo-network/chain-model'\nimport type { AttachableModuleInstance, ModuleIdentifier } from '@xyo-network/module-model'\nimport { asAttachableModuleInstance } from '@xyo-network/module-model'\nimport { Mutex } from 'async-mutex'\n\nconst initMutex = new Mutex()\nconst bridgedModuleDictionary: Record<Address, Record<ModuleIdentifier, AttachableModuleInstance>> = {}\n\nexport const initBridgedModule: Initializable<\n { bridge: BridgeInstance; moduleName: ModuleIdentifier }, AttachableModuleInstance\n> = async ({ bridge, moduleName }): Promise<AttachableModuleInstance> => {\n return await initMutex.runExclusive(async () => {\n const existing = bridgedModuleDictionary?.[bridge.address]?.[moduleName]\n if (existing) return existing\n const mod = assertEx(await bridge.resolve(moduleName), () => `Error: Could not resolve ${moduleName}`)\n const moduleInstance = assertEx(asAttachableModuleInstance(mod), () => `Error: Could not convert ${moduleName} to attachable module instance`)\n bridgedModuleDictionary[bridge.address] = bridgedModuleDictionary[bridge.address] || {}\n bridgedModuleDictionary[bridge.address][moduleName] = moduleInstance\n return moduleInstance\n })\n}\n\nexport const initBridgedArchivistModule: Initializable<\n { bridge: BridgeInstance; moduleName: ModuleIdentifier }, AttachableArchivistInstance\n> = async ({ bridge, moduleName }): Promise<AttachableArchivistInstance> => {\n return assertEx(\n asAttachableArchivistInstance(await initBridgedModule({ bridge, moduleName })),\n () => `Error: Could not convert ${moduleName} to attachable archivist instance`,\n )\n}\n","import type { ChildProcess } from 'node:child_process'\nimport { spawn } from 'node:child_process'\n\nimport { delay } from '@xylabs/delay'\nimport { JsonRpcProvider } from 'ethers/providers'\n\nasync function isGanacheRunning(url: string) {\n try {\n const provider = new JsonRpcProvider(url)\n await provider.getBlockNumber() // Try to fetch the latest block number\n return true // If this succeeds, the server is running\n } catch {\n return false // If this fails, the server is not running\n }\n}\n\nexport async function startGanache(port: number, mnemonic: string) {\n console.log('Starting Ganache CLI...')\n\n // Start Ganache CLI\n const ganacheProcess = spawn(\n 'yarn',\n ['ganache', '--port', `${port}`, '--chain.chainId', '1337', '--mnemonic', mnemonic],\n { stdio: 'inherit' },\n )\n\n // Wait for Ganache to be ready\n while (!await isGanacheRunning(`http://127.0.0.1:${port}`)) {\n await delay(500)\n }\n\n return ganacheProcess\n}\n\nexport function stopGanache(process: ChildProcess) {\n console.log('Stopping Ganache CLI...')\n\n if (process) {\n process.kill('SIGTERM')\n console.log('Ganache CLI stopped.')\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { asAddress } from '@xylabs/hex'\nimport type { AccountInstance, WalletInstance } from '@xyo-network/account'\nimport { Account } from '@xyo-network/account'\nimport { createChain } from '@xyo-network/chain-ethereum'\nimport type {\n ChainStakeIntent, Elevated, HydratedBlock,\n} from '@xyo-network/chain-model'\nimport { ChainStakeIntentSchema } from '@xyo-network/chain-model'\nimport { buildBlock, buildTransaction } from '@xyo-network/chain-protocol'\nimport { XYO_ZERO_ADDRESS } from '@xyo-network/chain-utils'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport { BurnableErc20__factory as Erc20Factory } from '@xyo-network/typechain'\nimport { getAddress } from 'ethers/address'\nimport { JsonRpcProvider } from 'ethers/providers'\nimport { parseUnits } from 'ethers/utils'\nimport { Wallet } from 'ethers/wallet'\n\nconst gasConfig = () => {\n return {\n gasLimit: 2_000_000, // Set the gas limit\n gasPrice: parseUnits('100', 'gwei'),\n }\n}\n\nexport const createTestErc20 = async (ganachePort: number, testPhrase: string, contractCreator: WalletInstance): Promise<Address> => {\n const provider = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWallet = new Wallet(contractCreator.privateKey, provider)\n const erc20 = new Erc20Factory(ethWallet)\n const totalSupply = parseUnits('1000000', 18)\n const erc20Contract = await (await erc20.deploy('Test Token', 'TST', totalSupply, gasConfig())).waitForDeployment()\n const erc20Address = await erc20Contract.getAddress()\n const erc20ContractPerson0 = Erc20Factory.connect(erc20Address, ethWallet)\n const balance = await erc20ContractPerson0.balanceOf(ethWallet.address)\n assertEx(balance === totalSupply, () => 'Balance does not match total supply')\n return assertEx(asAddress(erc20Address), () => 'Invalid ERC20 contract address')\n}\n\nexport const transferTestTokens = async (ganachePort: number, erc20Address: Address, account0: WalletInstance, account1: WalletInstance) => {\n const provider0 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson0 = new Wallet(account0.privateKey, provider0)\n const provider1 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson1 = new Wallet(account1.privateKey, provider1)\n const erc20ContractPerson0 = Erc20Factory.connect(getAddress(erc20Address), ethWalletPerson0)\n const transferAmount = parseUnits('1000', 18)\n await (await erc20ContractPerson0.transfer(ethWalletPerson1.address, transferAmount, gasConfig())).wait()\n const erc20ContractPerson1 = Erc20Factory.connect(getAddress(erc20Address), ethWalletPerson1)\n const balance = await erc20ContractPerson1.balanceOf(ethWalletPerson1.address)\n assertEx(balance === transferAmount, () => 'Balance does not match transfer amount')\n}\n\nexport const createTestChainContract = async (\n ganachePort: number,\n erc20Address: Address,\n account0: WalletInstance,\n initialProducer: AccountInstance,\n): Promise<Address> => {\n const provider0 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson0 = new Wallet(account0.privateKey, provider0)\n const [xyoChainContractAddress] = await createChain(\n ethWalletPerson0,\n erc20Address,\n initialProducer,\n XYO_ZERO_ADDRESS,\n 0n,\n XYO_ZERO_ADDRESS,\n 50_000n,\n gasConfig(),\n )\n return assertEx(asAddress(xyoChainContractAddress), () => 'Invalid staking contract address')\n}\n\nexport const approveTestStakeChainAddress = async (ganachePort: number, erc20Address: Address, xyoChainContractAddress: Address, account1: WalletInstance) => {\n const provider1 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson1 = new Wallet(account1.privateKey, provider1)\n const erc20ContractPerson1 = Erc20Factory.connect(getAddress(erc20Address), ethWalletPerson1)\n\n const _approveResultTx = await (await erc20ContractPerson1.approve(getAddress(xyoChainContractAddress), parseUnits('100', 18), gasConfig())).wait()\n}\n\nexport const createTestGenesisBlock = async (\n blockProducerAccounts: WalletInstance[],\n): Promise<HydratedBlock> => {\n const randomChainId = (await Account.random()).address\n // Create staked intents for all the block producers declaring their intent to produce blocks\n const signedStakedBlockProducerIntents = await Promise.all(blockProducerAccounts.map(async (blockProducerAccount) => {\n const stakeIntent = new PayloadBuilder<Elevated<ChainStakeIntent>>({ schema: ChainStakeIntentSchema }).fields({\n $opCodes: ['elevate'],\n from: blockProducerAccount.address,\n exp: Number.MAX_SAFE_INTEGER,\n nbf: 0,\n intent: 'producer',\n }).build()\n\n const signedStakedBlockProducerIntent = await buildTransaction(\n randomChainId,\n [stakeIntent],\n blockProducerAccount,\n 0,\n 1000,\n [],\n )\n return signedStakedBlockProducerIntent\n }))\n const intents = signedStakedBlockProducerIntents.map(intent => intent[0])\n const payloads = signedStakedBlockProducerIntents.flatMap(intent => intent[1]) as Elevated<WithStorageMeta<ChainStakeIntent>>[]\n return await buildBlock(randomChainId, signedStakedBlockProducerIntents, [...intents, ...payloads], blockProducerAccounts)\n}\n"],"mappings":"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","names":["ArchivistSyncDiviner","spanAsync","DivinerConfigSchema","MemoryNode","MemorySentinel","SentinelConfigSchema","initArchivistSync","name","inArchivist","outArchivist","frequency","traceProvider","tracer","getTracer","spanAsync","node","MemoryNode","create","account","finalizedArchivistSyncDiviner","ArchivistSyncDiviner","config","schema","DivinerConfigSchema","register","attach","address","sentinel","MemorySentinel","SentinelConfigSchema","tasks","required","mod","endPoint","automations","frequencyUnits","start","Date","now","type","HttpBridge","HttpBridgeConfigSchema","Mutex","initMutex","Mutex","bridgeSingletonMap","Map","initBridge","nodeUrl","runExclusive","existing","get","bridge","HttpBridge","create","account","config","name","client","url","discoverRoots","schema","HttpBridgeConfigSchema","security","allowAnonymous","start","set","assertEx","asAttachableArchivistInstance","asAttachableModuleInstance","Mutex","initMutex","Mutex","bridgedModuleDictionary","initBridgedModule","bridge","moduleName","runExclusive","existing","address","mod","assertEx","resolve","moduleInstance","asAttachableModuleInstance","initBridgedArchivistModule","asAttachableArchivistInstance","spawn","delay","JsonRpcProvider","isGanacheRunning","url","provider","JsonRpcProvider","getBlockNumber","startGanache","port","mnemonic","console","log","ganacheProcess","spawn","stdio","delay","stopGanache","process","kill","assertEx","asAddress","Account","createChain","ChainStakeIntentSchema","buildBlock","buildTransaction","XYO_ZERO_ADDRESS","PayloadBuilder","BurnableErc20__factory","Erc20Factory","getAddress","JsonRpcProvider","parseUnits","Wallet","gasConfig","gasLimit","gasPrice","parseUnits","createTestErc20","ganachePort","testPhrase","contractCreator","provider","JsonRpcProvider","ethWallet","Wallet","privateKey","erc20","Erc20Factory","totalSupply","erc20Contract","deploy","waitForDeployment","erc20Address","getAddress","erc20ContractPerson0","connect","balance","balanceOf","address","assertEx","asAddress","transferTestTokens","account0","account1","provider0","ethWalletPerson0","provider1","ethWalletPerson1","transferAmount","transfer","wait","erc20ContractPerson1","createTestChainContract","initialProducer","xyoChainContractAddress","createChain","XYO_ZERO_ADDRESS","approveTestStakeChainAddress","_approveResultTx","approve","createTestGenesisBlock","blockProducerAccounts","randomChainId","Account","random","signedStakedBlockProducerIntents","Promise","all","map","blockProducerAccount","stakeIntent","PayloadBuilder","schema","ChainStakeIntentSchema","fields","$opCodes","from","exp","Number","MAX_SAFE_INTEGER","nbf","intent","build","signedStakedBlockProducerIntent","buildTransaction","intents","payloads","flatMap","buildBlock"]}
|
package/dist/node/index-node.mjs
CHANGED
|
@@ -289,6 +289,9 @@ var createTestGenesisBlock = /* @__PURE__ */ __name(async (blockProducerAccounts
|
|
|
289
289
|
const stakeIntent = new PayloadBuilder({
|
|
290
290
|
schema: ChainStakeIntentSchema
|
|
291
291
|
}).fields({
|
|
292
|
+
$opCodes: [
|
|
293
|
+
"elevate"
|
|
294
|
+
],
|
|
292
295
|
from: blockProducerAccount.address,
|
|
293
296
|
exp: Number.MAX_SAFE_INTEGER,
|
|
294
297
|
nbf: 0,
|
|
@@ -296,20 +299,15 @@ var createTestGenesisBlock = /* @__PURE__ */ __name(async (blockProducerAccounts
|
|
|
296
299
|
}).build();
|
|
297
300
|
const signedStakedBlockProducerIntent = await buildTransaction(randomChainId, [
|
|
298
301
|
stakeIntent
|
|
299
|
-
],
|
|
302
|
+
], blockProducerAccount, 0, 1e3, []);
|
|
300
303
|
return signedStakedBlockProducerIntent;
|
|
301
304
|
}));
|
|
302
305
|
const intents = signedStakedBlockProducerIntents.map((intent) => intent[0]);
|
|
303
306
|
const payloads = signedStakedBlockProducerIntents.flatMap((intent) => intent[1]);
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
...intents,
|
|
309
|
-
...signedTransactionBws,
|
|
310
|
-
...payloads
|
|
311
|
-
]
|
|
312
|
-
];
|
|
307
|
+
return await buildBlock(randomChainId, signedStakedBlockProducerIntents, [
|
|
308
|
+
...intents,
|
|
309
|
+
...payloads
|
|
310
|
+
], blockProducerAccounts);
|
|
313
311
|
}, "createTestGenesisBlock");
|
|
314
312
|
|
|
315
313
|
// src/index-node.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index-node.ts","../../src/index.ts","../../src/index-shared.ts","../../src/orchestration/archivist/initArchivistSync.ts","../../src/orchestration/bridge.ts","../../src/orchestration/initBridgedModule.ts","../../src/test/evm/runGanache.ts","../../src/test/evm/stakingContractUtils.ts"],"sourcesContent":["// eslint-disable-next-line no-restricted-imports\nexport * from './index.ts'\n","export * from './index-shared.ts'\nexport * from './test/index.ts'\n","export * from './orchestration/index.ts'\nexport * from '@xyo-network/chain-ethereum'\nexport * from '@xyo-network/chain-model'\nexport * from '@xyo-network/chain-modules'\nexport * from '@xyo-network/chain-protocol'\nexport * from '@xyo-network/chain-services'\nexport * from '@xyo-network/chain-utils'\nexport * from '@xyo-network/chain-validation'\n","import type { TracerProvider } from '@opentelemetry/api'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistSyncDiviner } from '@xyo-network/chain-modules'\nimport { spanAsync } from '@xyo-network/chain-utils'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport { MemoryNode } from '@xyo-network/node-memory'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport { SentinelConfigSchema } from '@xyo-network/sentinel-model'\n\nexport const initArchivistSync = async (\n name: ModuleIdentifier,\n inArchivist: ArchivistInstance,\n outArchivist: ArchivistInstance,\n frequency = 1000,\n traceProvider?: TracerProvider,\n) => {\n const tracer = traceProvider?.getTracer(`archivist-sync-diviner [${name}]`)\n return await spanAsync(`initArchivistSync [${name}]`, async () => {\n const node = await MemoryNode.create({ account: 'random' })\n const finalizedArchivistSyncDiviner = await ArchivistSyncDiviner.create({\n account: 'random',\n inArchivist,\n outArchivist,\n tracer,\n config: { schema: DivinerConfigSchema, name },\n })\n\n await node.register(finalizedArchivistSyncDiviner)\n await node.attach(finalizedArchivistSyncDiviner.address)\n\n const sentinel = await MemorySentinel.create({\n account: 'random',\n config: {\n name,\n schema: SentinelConfigSchema,\n tasks: [\n {\n required: true,\n mod: finalizedArchivistSyncDiviner.address,\n endPoint: 'divine',\n },\n ],\n automations: [\n {\n frequency,\n frequencyUnits: 'millis',\n schema: 'network.xyo.automation.interval',\n start: Date.now(),\n type: 'interval',\n },\n ],\n },\n })\n\n await node.register(sentinel)\n await node.attach(sentinel.address)\n\n return node\n }, tracer)\n}\n","import { HttpBridge, HttpBridgeConfigSchema } from '@xyo-network/bridge-http'\nimport type { AttachableBridgeInstance } from '@xyo-network/bridge-model'\nimport { Mutex } from 'async-mutex'\n\nconst initMutex = new Mutex()\nconst bridgeSingletonMap = new Map<string, AttachableBridgeInstance>()\n\nexport const initBridge = async (nodeUrl: string): Promise<AttachableBridgeInstance> => {\n return await initMutex.runExclusive(async () => {\n const existing = bridgeSingletonMap.get(nodeUrl)\n if (existing) return existing\n const bridge = await HttpBridge.create({\n account: 'random',\n config: {\n name: 'HttpBridge',\n client: { url: nodeUrl, discoverRoots: 'start' },\n schema: HttpBridgeConfigSchema,\n security: { allowAnonymous: true },\n },\n })\n await bridge.start()\n bridgeSingletonMap.set(nodeUrl, bridge)\n return bridge\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport type { AttachableArchivistInstance } from '@xyo-network/archivist-model'\nimport { asAttachableArchivistInstance } from '@xyo-network/archivist-model'\nimport type { BridgeInstance } from '@xyo-network/bridge-model'\nimport type { Initializable } from '@xyo-network/chain-model'\nimport type { AttachableModuleInstance, ModuleIdentifier } from '@xyo-network/module-model'\nimport { asAttachableModuleInstance } from '@xyo-network/module-model'\nimport { Mutex } from 'async-mutex'\n\nconst initMutex = new Mutex()\nconst bridgedModuleDictionary: Record<Address, Record<ModuleIdentifier, AttachableModuleInstance>> = {}\n\nexport const initBridgedModule: Initializable<\n { bridge: BridgeInstance; moduleName: ModuleIdentifier }, AttachableModuleInstance\n> = async ({ bridge, moduleName }): Promise<AttachableModuleInstance> => {\n return await initMutex.runExclusive(async () => {\n const existing = bridgedModuleDictionary?.[bridge.address]?.[moduleName]\n if (existing) return existing\n const mod = assertEx(await bridge.resolve(moduleName), () => `Error: Could not resolve ${moduleName}`)\n const moduleInstance = assertEx(asAttachableModuleInstance(mod), () => `Error: Could not convert ${moduleName} to attachable module instance`)\n bridgedModuleDictionary[bridge.address] = bridgedModuleDictionary[bridge.address] || {}\n bridgedModuleDictionary[bridge.address][moduleName] = moduleInstance\n return moduleInstance\n })\n}\n\nexport const initBridgedArchivistModule: Initializable<\n { bridge: BridgeInstance; moduleName: ModuleIdentifier }, AttachableArchivistInstance\n> = async ({ bridge, moduleName }): Promise<AttachableArchivistInstance> => {\n return assertEx(\n asAttachableArchivistInstance(await initBridgedModule({ bridge, moduleName })),\n () => `Error: Could not convert ${moduleName} to attachable archivist instance`,\n )\n}\n","import type { ChildProcess } from 'node:child_process'\nimport { spawn } from 'node:child_process'\n\nimport { delay } from '@xylabs/delay'\nimport { JsonRpcProvider } from 'ethers/providers'\n\nasync function isGanacheRunning(url: string) {\n try {\n const provider = new JsonRpcProvider(url)\n await provider.getBlockNumber() // Try to fetch the latest block number\n return true // If this succeeds, the server is running\n } catch {\n return false // If this fails, the server is not running\n }\n}\n\nexport async function startGanache(port: number, mnemonic: string) {\n console.log('Starting Ganache CLI...')\n\n // Start Ganache CLI\n const ganacheProcess = spawn(\n 'yarn',\n ['ganache', '--port', `${port}`, '--chain.chainId', '1337', '--mnemonic', mnemonic],\n { stdio: 'inherit' },\n )\n\n // Wait for Ganache to be ready\n while (!await isGanacheRunning(`http://127.0.0.1:${port}`)) {\n await delay(500)\n }\n\n return ganacheProcess\n}\n\nexport function stopGanache(process: ChildProcess) {\n console.log('Stopping Ganache CLI...')\n\n if (process) {\n process.kill('SIGTERM')\n console.log('Ganache CLI stopped.')\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { asAddress } from '@xylabs/hex'\nimport type { AccountInstance, WalletInstance } from '@xyo-network/account'\nimport { Account } from '@xyo-network/account'\nimport { createChain } from '@xyo-network/chain-ethereum'\nimport type { ChainStakeIntent, HydratedBlock } from '@xyo-network/chain-model'\nimport { ChainStakeIntentSchema } from '@xyo-network/chain-model'\nimport { buildBlock, buildTransaction } from '@xyo-network/chain-protocol'\nimport { XYO_ZERO_ADDRESS } from '@xyo-network/chain-utils'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { BurnableErc20__factory as Erc20Factory } from '@xyo-network/typechain'\nimport { getAddress } from 'ethers/address'\nimport { JsonRpcProvider } from 'ethers/providers'\nimport { parseUnits } from 'ethers/utils'\nimport { Wallet } from 'ethers/wallet'\n\nconst gasConfig = () => {\n return {\n gasLimit: 2_000_000, // Set the gas limit\n gasPrice: parseUnits('100', 'gwei'),\n }\n}\n\nexport const createTestErc20 = async (ganachePort: number, testPhrase: string, contractCreator: WalletInstance): Promise<Address> => {\n const provider = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWallet = new Wallet(contractCreator.privateKey, provider)\n const erc20 = new Erc20Factory(ethWallet)\n const totalSupply = parseUnits('1000000', 18)\n const erc20Contract = await (await erc20.deploy('Test Token', 'TST', totalSupply, gasConfig())).waitForDeployment()\n const erc20Address = await erc20Contract.getAddress()\n const erc20ContractPerson0 = Erc20Factory.connect(erc20Address, ethWallet)\n const balance = await erc20ContractPerson0.balanceOf(ethWallet.address)\n assertEx(balance === totalSupply, () => 'Balance does not match total supply')\n return assertEx(asAddress(erc20Address), () => 'Invalid ERC20 contract address')\n}\n\nexport const transferTestTokens = async (ganachePort: number, erc20Address: Address, account0: WalletInstance, account1: WalletInstance) => {\n const provider0 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson0 = new Wallet(account0.privateKey, provider0)\n const provider1 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson1 = new Wallet(account1.privateKey, provider1)\n const erc20ContractPerson0 = Erc20Factory.connect(getAddress(erc20Address), ethWalletPerson0)\n const transferAmount = parseUnits('1000', 18)\n await (await erc20ContractPerson0.transfer(ethWalletPerson1.address, transferAmount, gasConfig())).wait()\n const erc20ContractPerson1 = Erc20Factory.connect(getAddress(erc20Address), ethWalletPerson1)\n const balance = await erc20ContractPerson1.balanceOf(ethWalletPerson1.address)\n assertEx(balance === transferAmount, () => 'Balance does not match transfer amount')\n}\n\nexport const createTestChainContract = async (\n ganachePort: number,\n erc20Address: Address,\n account0: WalletInstance,\n initialProducer: AccountInstance,\n): Promise<Address> => {\n const provider0 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson0 = new Wallet(account0.privateKey, provider0)\n const [xyoChainContractAddress] = await createChain(\n ethWalletPerson0,\n erc20Address,\n initialProducer,\n XYO_ZERO_ADDRESS,\n 0n,\n XYO_ZERO_ADDRESS,\n 50_000n,\n gasConfig(),\n )\n return assertEx(asAddress(xyoChainContractAddress), () => 'Invalid staking contract address')\n}\n\nexport const approveTestStakeChainAddress = async (ganachePort: number, erc20Address: Address, xyoChainContractAddress: Address, account1: WalletInstance) => {\n const provider1 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson1 = new Wallet(account1.privateKey, provider1)\n const erc20ContractPerson1 = Erc20Factory.connect(getAddress(erc20Address), ethWalletPerson1)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const _approveResultTx = await (await erc20ContractPerson1.approve(getAddress(xyoChainContractAddress), parseUnits('100', 18), gasConfig())).wait()\n}\n\nexport const createTestGenesisBlock = async (\n blockProducerAccounts: WalletInstance[],\n): Promise<HydratedBlock> => {\n const randomChainId = (await Account.random()).address\n // Create staked intents for all the block producers declaring their intent to produce blocks\n const signedStakedBlockProducerIntents = await Promise.all(blockProducerAccounts.map(async (blockProducerAccount) => {\n const stakeIntent = new PayloadBuilder<ChainStakeIntent>({ schema: ChainStakeIntentSchema }).fields({\n from: blockProducerAccount.address,\n exp: Number.MAX_SAFE_INTEGER,\n nbf: 0,\n intent: 'producer',\n }).build()\n\n const signedStakedBlockProducerIntent = await buildTransaction(\n randomChainId,\n [stakeIntent],\n 0n,\n blockProducerAccount,\n 0,\n 1000,\n [],\n )\n return signedStakedBlockProducerIntent\n }))\n const intents = signedStakedBlockProducerIntents.map(intent => intent[0])\n const payloads = signedStakedBlockProducerIntents.flatMap(intent => intent[1])\n const [firstBlock, signedTransactionBws] = await buildBlock(randomChainId, signedStakedBlockProducerIntents, [], blockProducerAccounts)\n return [firstBlock, [...intents, ...signedTransactionBws, ...payloads]] as const\n}\n"],"mappings":"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","names":["ArchivistSyncDiviner","spanAsync","DivinerConfigSchema","MemoryNode","MemorySentinel","SentinelConfigSchema","initArchivistSync","name","inArchivist","outArchivist","frequency","traceProvider","tracer","getTracer","spanAsync","node","MemoryNode","create","account","finalizedArchivistSyncDiviner","ArchivistSyncDiviner","config","schema","DivinerConfigSchema","register","attach","address","sentinel","MemorySentinel","SentinelConfigSchema","tasks","required","mod","endPoint","automations","frequencyUnits","start","Date","now","type","HttpBridge","HttpBridgeConfigSchema","Mutex","initMutex","Mutex","bridgeSingletonMap","Map","initBridge","nodeUrl","runExclusive","existing","get","bridge","HttpBridge","create","account","config","name","client","url","discoverRoots","schema","HttpBridgeConfigSchema","security","allowAnonymous","start","set","assertEx","asAttachableArchivistInstance","asAttachableModuleInstance","Mutex","initMutex","Mutex","bridgedModuleDictionary","initBridgedModule","bridge","moduleName","runExclusive","existing","address","mod","assertEx","resolve","moduleInstance","asAttachableModuleInstance","initBridgedArchivistModule","asAttachableArchivistInstance","spawn","delay","JsonRpcProvider","isGanacheRunning","url","provider","JsonRpcProvider","getBlockNumber","startGanache","port","mnemonic","console","log","ganacheProcess","spawn","stdio","delay","stopGanache","process","kill","assertEx","asAddress","Account","createChain","ChainStakeIntentSchema","buildBlock","buildTransaction","XYO_ZERO_ADDRESS","PayloadBuilder","BurnableErc20__factory","Erc20Factory","getAddress","JsonRpcProvider","parseUnits","Wallet","gasConfig","gasLimit","gasPrice","parseUnits","createTestErc20","ganachePort","testPhrase","contractCreator","provider","JsonRpcProvider","ethWallet","Wallet","privateKey","erc20","Erc20Factory","totalSupply","erc20Contract","deploy","waitForDeployment","erc20Address","getAddress","erc20ContractPerson0","connect","balance","balanceOf","address","assertEx","asAddress","transferTestTokens","account0","account1","provider0","ethWalletPerson0","provider1","ethWalletPerson1","transferAmount","transfer","wait","erc20ContractPerson1","createTestChainContract","initialProducer","xyoChainContractAddress","createChain","XYO_ZERO_ADDRESS","approveTestStakeChainAddress","_approveResultTx","approve","createTestGenesisBlock","blockProducerAccounts","randomChainId","Account","random","signedStakedBlockProducerIntents","Promise","all","map","blockProducerAccount","stakeIntent","PayloadBuilder","schema","ChainStakeIntentSchema","fields","from","exp","Number","MAX_SAFE_INTEGER","nbf","intent","build","signedStakedBlockProducerIntent","buildTransaction","intents","payloads","flatMap","firstBlock","signedTransactionBws","buildBlock"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index-node.ts","../../src/index.ts","../../src/index-shared.ts","../../src/orchestration/archivist/initArchivistSync.ts","../../src/orchestration/bridge.ts","../../src/orchestration/initBridgedModule.ts","../../src/test/evm/runGanache.ts","../../src/test/evm/stakingContractUtils.ts"],"sourcesContent":["// eslint-disable-next-line no-restricted-imports\nexport * from './index.ts'\n","export * from './index-shared.ts'\nexport * from './test/index.ts'\n","export * from './orchestration/index.ts'\nexport * from '@xyo-network/chain-ethereum'\nexport * from '@xyo-network/chain-model'\nexport * from '@xyo-network/chain-modules'\nexport * from '@xyo-network/chain-protocol'\nexport * from '@xyo-network/chain-services'\nexport * from '@xyo-network/chain-utils'\nexport * from '@xyo-network/chain-validation'\n","import type { TracerProvider } from '@opentelemetry/api'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport { ArchivistSyncDiviner } from '@xyo-network/chain-modules'\nimport { spanAsync } from '@xyo-network/chain-utils'\nimport { DivinerConfigSchema } from '@xyo-network/diviner-model'\nimport type { ModuleIdentifier } from '@xyo-network/module-model'\nimport { MemoryNode } from '@xyo-network/node-memory'\nimport { MemorySentinel } from '@xyo-network/sentinel-memory'\nimport { SentinelConfigSchema } from '@xyo-network/sentinel-model'\n\nexport const initArchivistSync = async (\n name: ModuleIdentifier,\n inArchivist: ArchivistInstance,\n outArchivist: ArchivistInstance,\n frequency = 1000,\n traceProvider?: TracerProvider,\n) => {\n const tracer = traceProvider?.getTracer(`archivist-sync-diviner [${name}]`)\n return await spanAsync(`initArchivistSync [${name}]`, async () => {\n const node = await MemoryNode.create({ account: 'random' })\n const finalizedArchivistSyncDiviner = await ArchivistSyncDiviner.create({\n account: 'random',\n inArchivist,\n outArchivist,\n tracer,\n config: { schema: DivinerConfigSchema, name },\n })\n\n await node.register(finalizedArchivistSyncDiviner)\n await node.attach(finalizedArchivistSyncDiviner.address)\n\n const sentinel = await MemorySentinel.create({\n account: 'random',\n config: {\n name,\n schema: SentinelConfigSchema,\n tasks: [\n {\n required: true,\n mod: finalizedArchivistSyncDiviner.address,\n endPoint: 'divine',\n },\n ],\n automations: [\n {\n frequency,\n frequencyUnits: 'millis',\n schema: 'network.xyo.automation.interval',\n start: Date.now(),\n type: 'interval',\n },\n ],\n },\n })\n\n await node.register(sentinel)\n await node.attach(sentinel.address)\n\n return node\n }, tracer)\n}\n","import { HttpBridge, HttpBridgeConfigSchema } from '@xyo-network/bridge-http'\nimport type { AttachableBridgeInstance } from '@xyo-network/bridge-model'\nimport { Mutex } from 'async-mutex'\n\nconst initMutex = new Mutex()\nconst bridgeSingletonMap = new Map<string, AttachableBridgeInstance>()\n\nexport const initBridge = async (nodeUrl: string): Promise<AttachableBridgeInstance> => {\n return await initMutex.runExclusive(async () => {\n const existing = bridgeSingletonMap.get(nodeUrl)\n if (existing) return existing\n const bridge = await HttpBridge.create({\n account: 'random',\n config: {\n name: 'HttpBridge',\n client: { url: nodeUrl, discoverRoots: 'start' },\n schema: HttpBridgeConfigSchema,\n security: { allowAnonymous: true },\n },\n })\n await bridge.start()\n bridgeSingletonMap.set(nodeUrl, bridge)\n return bridge\n })\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport type { AttachableArchivistInstance } from '@xyo-network/archivist-model'\nimport { asAttachableArchivistInstance } from '@xyo-network/archivist-model'\nimport type { BridgeInstance } from '@xyo-network/bridge-model'\nimport type { Initializable } from '@xyo-network/chain-model'\nimport type { AttachableModuleInstance, ModuleIdentifier } from '@xyo-network/module-model'\nimport { asAttachableModuleInstance } from '@xyo-network/module-model'\nimport { Mutex } from 'async-mutex'\n\nconst initMutex = new Mutex()\nconst bridgedModuleDictionary: Record<Address, Record<ModuleIdentifier, AttachableModuleInstance>> = {}\n\nexport const initBridgedModule: Initializable<\n { bridge: BridgeInstance; moduleName: ModuleIdentifier }, AttachableModuleInstance\n> = async ({ bridge, moduleName }): Promise<AttachableModuleInstance> => {\n return await initMutex.runExclusive(async () => {\n const existing = bridgedModuleDictionary?.[bridge.address]?.[moduleName]\n if (existing) return existing\n const mod = assertEx(await bridge.resolve(moduleName), () => `Error: Could not resolve ${moduleName}`)\n const moduleInstance = assertEx(asAttachableModuleInstance(mod), () => `Error: Could not convert ${moduleName} to attachable module instance`)\n bridgedModuleDictionary[bridge.address] = bridgedModuleDictionary[bridge.address] || {}\n bridgedModuleDictionary[bridge.address][moduleName] = moduleInstance\n return moduleInstance\n })\n}\n\nexport const initBridgedArchivistModule: Initializable<\n { bridge: BridgeInstance; moduleName: ModuleIdentifier }, AttachableArchivistInstance\n> = async ({ bridge, moduleName }): Promise<AttachableArchivistInstance> => {\n return assertEx(\n asAttachableArchivistInstance(await initBridgedModule({ bridge, moduleName })),\n () => `Error: Could not convert ${moduleName} to attachable archivist instance`,\n )\n}\n","import type { ChildProcess } from 'node:child_process'\nimport { spawn } from 'node:child_process'\n\nimport { delay } from '@xylabs/delay'\nimport { JsonRpcProvider } from 'ethers/providers'\n\nasync function isGanacheRunning(url: string) {\n try {\n const provider = new JsonRpcProvider(url)\n await provider.getBlockNumber() // Try to fetch the latest block number\n return true // If this succeeds, the server is running\n } catch {\n return false // If this fails, the server is not running\n }\n}\n\nexport async function startGanache(port: number, mnemonic: string) {\n console.log('Starting Ganache CLI...')\n\n // Start Ganache CLI\n const ganacheProcess = spawn(\n 'yarn',\n ['ganache', '--port', `${port}`, '--chain.chainId', '1337', '--mnemonic', mnemonic],\n { stdio: 'inherit' },\n )\n\n // Wait for Ganache to be ready\n while (!await isGanacheRunning(`http://127.0.0.1:${port}`)) {\n await delay(500)\n }\n\n return ganacheProcess\n}\n\nexport function stopGanache(process: ChildProcess) {\n console.log('Stopping Ganache CLI...')\n\n if (process) {\n process.kill('SIGTERM')\n console.log('Ganache CLI stopped.')\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Address } from '@xylabs/hex'\nimport { asAddress } from '@xylabs/hex'\nimport type { AccountInstance, WalletInstance } from '@xyo-network/account'\nimport { Account } from '@xyo-network/account'\nimport { createChain } from '@xyo-network/chain-ethereum'\nimport type {\n ChainStakeIntent, Elevated, HydratedBlock,\n} from '@xyo-network/chain-model'\nimport { ChainStakeIntentSchema } from '@xyo-network/chain-model'\nimport { buildBlock, buildTransaction } from '@xyo-network/chain-protocol'\nimport { XYO_ZERO_ADDRESS } from '@xyo-network/chain-utils'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WithStorageMeta } from '@xyo-network/payload-model'\nimport { BurnableErc20__factory as Erc20Factory } from '@xyo-network/typechain'\nimport { getAddress } from 'ethers/address'\nimport { JsonRpcProvider } from 'ethers/providers'\nimport { parseUnits } from 'ethers/utils'\nimport { Wallet } from 'ethers/wallet'\n\nconst gasConfig = () => {\n return {\n gasLimit: 2_000_000, // Set the gas limit\n gasPrice: parseUnits('100', 'gwei'),\n }\n}\n\nexport const createTestErc20 = async (ganachePort: number, testPhrase: string, contractCreator: WalletInstance): Promise<Address> => {\n const provider = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWallet = new Wallet(contractCreator.privateKey, provider)\n const erc20 = new Erc20Factory(ethWallet)\n const totalSupply = parseUnits('1000000', 18)\n const erc20Contract = await (await erc20.deploy('Test Token', 'TST', totalSupply, gasConfig())).waitForDeployment()\n const erc20Address = await erc20Contract.getAddress()\n const erc20ContractPerson0 = Erc20Factory.connect(erc20Address, ethWallet)\n const balance = await erc20ContractPerson0.balanceOf(ethWallet.address)\n assertEx(balance === totalSupply, () => 'Balance does not match total supply')\n return assertEx(asAddress(erc20Address), () => 'Invalid ERC20 contract address')\n}\n\nexport const transferTestTokens = async (ganachePort: number, erc20Address: Address, account0: WalletInstance, account1: WalletInstance) => {\n const provider0 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson0 = new Wallet(account0.privateKey, provider0)\n const provider1 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson1 = new Wallet(account1.privateKey, provider1)\n const erc20ContractPerson0 = Erc20Factory.connect(getAddress(erc20Address), ethWalletPerson0)\n const transferAmount = parseUnits('1000', 18)\n await (await erc20ContractPerson0.transfer(ethWalletPerson1.address, transferAmount, gasConfig())).wait()\n const erc20ContractPerson1 = Erc20Factory.connect(getAddress(erc20Address), ethWalletPerson1)\n const balance = await erc20ContractPerson1.balanceOf(ethWalletPerson1.address)\n assertEx(balance === transferAmount, () => 'Balance does not match transfer amount')\n}\n\nexport const createTestChainContract = async (\n ganachePort: number,\n erc20Address: Address,\n account0: WalletInstance,\n initialProducer: AccountInstance,\n): Promise<Address> => {\n const provider0 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson0 = new Wallet(account0.privateKey, provider0)\n const [xyoChainContractAddress] = await createChain(\n ethWalletPerson0,\n erc20Address,\n initialProducer,\n XYO_ZERO_ADDRESS,\n 0n,\n XYO_ZERO_ADDRESS,\n 50_000n,\n gasConfig(),\n )\n return assertEx(asAddress(xyoChainContractAddress), () => 'Invalid staking contract address')\n}\n\nexport const approveTestStakeChainAddress = async (ganachePort: number, erc20Address: Address, xyoChainContractAddress: Address, account1: WalletInstance) => {\n const provider1 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)\n const ethWalletPerson1 = new Wallet(account1.privateKey, provider1)\n const erc20ContractPerson1 = Erc20Factory.connect(getAddress(erc20Address), ethWalletPerson1)\n\n const _approveResultTx = await (await erc20ContractPerson1.approve(getAddress(xyoChainContractAddress), parseUnits('100', 18), gasConfig())).wait()\n}\n\nexport const createTestGenesisBlock = async (\n blockProducerAccounts: WalletInstance[],\n): Promise<HydratedBlock> => {\n const randomChainId = (await Account.random()).address\n // Create staked intents for all the block producers declaring their intent to produce blocks\n const signedStakedBlockProducerIntents = await Promise.all(blockProducerAccounts.map(async (blockProducerAccount) => {\n const stakeIntent = new PayloadBuilder<Elevated<ChainStakeIntent>>({ schema: ChainStakeIntentSchema }).fields({\n $opCodes: ['elevate'],\n from: blockProducerAccount.address,\n exp: Number.MAX_SAFE_INTEGER,\n nbf: 0,\n intent: 'producer',\n }).build()\n\n const signedStakedBlockProducerIntent = await buildTransaction(\n randomChainId,\n [stakeIntent],\n blockProducerAccount,\n 0,\n 1000,\n [],\n )\n return signedStakedBlockProducerIntent\n }))\n const intents = signedStakedBlockProducerIntents.map(intent => intent[0])\n const payloads = signedStakedBlockProducerIntents.flatMap(intent => intent[1]) as Elevated<WithStorageMeta<ChainStakeIntent>>[]\n return await buildBlock(randomChainId, signedStakedBlockProducerIntents, [...intents, ...payloads], blockProducerAccounts)\n}\n"],"mappings":"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","names":["ArchivistSyncDiviner","spanAsync","DivinerConfigSchema","MemoryNode","MemorySentinel","SentinelConfigSchema","initArchivistSync","name","inArchivist","outArchivist","frequency","traceProvider","tracer","getTracer","spanAsync","node","MemoryNode","create","account","finalizedArchivistSyncDiviner","ArchivistSyncDiviner","config","schema","DivinerConfigSchema","register","attach","address","sentinel","MemorySentinel","SentinelConfigSchema","tasks","required","mod","endPoint","automations","frequencyUnits","start","Date","now","type","HttpBridge","HttpBridgeConfigSchema","Mutex","initMutex","Mutex","bridgeSingletonMap","Map","initBridge","nodeUrl","runExclusive","existing","get","bridge","HttpBridge","create","account","config","name","client","url","discoverRoots","schema","HttpBridgeConfigSchema","security","allowAnonymous","start","set","assertEx","asAttachableArchivistInstance","asAttachableModuleInstance","Mutex","initMutex","Mutex","bridgedModuleDictionary","initBridgedModule","bridge","moduleName","runExclusive","existing","address","mod","assertEx","resolve","moduleInstance","asAttachableModuleInstance","initBridgedArchivistModule","asAttachableArchivistInstance","spawn","delay","JsonRpcProvider","isGanacheRunning","url","provider","JsonRpcProvider","getBlockNumber","startGanache","port","mnemonic","console","log","ganacheProcess","spawn","stdio","delay","stopGanache","process","kill","assertEx","asAddress","Account","createChain","ChainStakeIntentSchema","buildBlock","buildTransaction","XYO_ZERO_ADDRESS","PayloadBuilder","BurnableErc20__factory","Erc20Factory","getAddress","JsonRpcProvider","parseUnits","Wallet","gasConfig","gasLimit","gasPrice","parseUnits","createTestErc20","ganachePort","testPhrase","contractCreator","provider","JsonRpcProvider","ethWallet","Wallet","privateKey","erc20","Erc20Factory","totalSupply","erc20Contract","deploy","waitForDeployment","erc20Address","getAddress","erc20ContractPerson0","connect","balance","balanceOf","address","assertEx","asAddress","transferTestTokens","account0","account1","provider0","ethWalletPerson0","provider1","ethWalletPerson1","transferAmount","transfer","wait","erc20ContractPerson1","createTestChainContract","initialProducer","xyoChainContractAddress","createChain","XYO_ZERO_ADDRESS","approveTestStakeChainAddress","_approveResultTx","approve","createTestGenesisBlock","blockProducerAccounts","randomChainId","Account","random","signedStakedBlockProducerIntents","Promise","all","map","blockProducerAccount","stakeIntent","PayloadBuilder","schema","ChainStakeIntentSchema","fields","$opCodes","from","exp","Number","MAX_SAFE_INTEGER","nbf","intent","build","signedStakedBlockProducerIntent","buildTransaction","intents","payloads","flatMap","buildBlock"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stakingContractUtils.d.ts","sourceRoot":"","sources":["../../../../src/test/evm/stakingContractUtils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAG3E,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"stakingContractUtils.d.ts","sourceRoot":"","sources":["../../../../src/test/evm/stakingContractUtils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAG3E,OAAO,KAAK,EACkB,aAAa,EAC1C,MAAM,0BAA0B,CAAA;AAmBjC,eAAO,MAAM,eAAe,GAAU,aAAa,MAAM,EAAE,YAAY,MAAM,EAAE,iBAAiB,cAAc,KAAG,OAAO,CAAC,OAAO,CAW/H,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAU,aAAa,MAAM,EAAE,cAAc,OAAO,EAAE,UAAU,cAAc,EAAE,UAAU,cAAc,kBAWtI,CAAA;AAED,eAAO,MAAM,uBAAuB,GAClC,aAAa,MAAM,EACnB,cAAc,OAAO,EACrB,UAAU,cAAc,EACxB,iBAAiB,eAAe,KAC/B,OAAO,CAAC,OAAO,CAcjB,CAAA;AAED,eAAO,MAAM,4BAA4B,GAAU,aAAa,MAAM,EAAE,cAAc,OAAO,EAAE,yBAAyB,OAAO,EAAE,UAAU,cAAc,kBAMxJ,CAAA;AAED,eAAO,MAAM,sBAAsB,GACjC,uBAAuB,cAAc,EAAE,KACtC,OAAO,CAAC,aAAa,CAyBvB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "http://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@xyo-network/chain-sdk",
|
|
4
|
-
"version": "1.0
|
|
4
|
+
"version": "1.1.0",
|
|
5
5
|
"description": "XYO Layer One SDK",
|
|
6
6
|
"homepage": "https://xylabs.com",
|
|
7
7
|
"bugs": {
|
|
@@ -47,71 +47,47 @@
|
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"@opentelemetry/api": "^1.9.0",
|
|
50
|
-
"@xylabs/assert": "^4.7.
|
|
51
|
-
"@xylabs/delay": "^4.7.
|
|
52
|
-
"@xylabs/hex": "^4.7.
|
|
53
|
-
"@xyo-network/account": "^3.10.
|
|
54
|
-
"@xyo-network/archivist-model": "^3.10.
|
|
55
|
-
"@xyo-network/bridge-http": "^3.10.
|
|
56
|
-
"@xyo-network/bridge-model": "^3.10.
|
|
57
|
-
"@xyo-network/chain-ethereum": "^1.0
|
|
58
|
-
"@xyo-network/chain-model": "^1.0
|
|
59
|
-
"@xyo-network/chain-modules": "^1.0
|
|
60
|
-
"@xyo-network/chain-protocol": "^1.0
|
|
61
|
-
"@xyo-network/chain-services": "^1.0
|
|
62
|
-
"@xyo-network/chain-utils": "^1.0
|
|
63
|
-
"@xyo-network/chain-validation": "^1.0
|
|
64
|
-
"@xyo-network/diviner-model": "^3.10.
|
|
65
|
-
"@xyo-network/module-model": "^3.10.
|
|
66
|
-
"@xyo-network/node-memory": "^3.10.
|
|
67
|
-
"@xyo-network/payload-builder": "^3.10.
|
|
68
|
-
"@xyo-network/
|
|
69
|
-
"@xyo-network/sentinel-
|
|
50
|
+
"@xylabs/assert": "^4.7.15",
|
|
51
|
+
"@xylabs/delay": "^4.7.15",
|
|
52
|
+
"@xylabs/hex": "^4.7.15",
|
|
53
|
+
"@xyo-network/account": "^3.10.6",
|
|
54
|
+
"@xyo-network/archivist-model": "^3.10.6",
|
|
55
|
+
"@xyo-network/bridge-http": "^3.10.6",
|
|
56
|
+
"@xyo-network/bridge-model": "^3.10.6",
|
|
57
|
+
"@xyo-network/chain-ethereum": "^1.1.0",
|
|
58
|
+
"@xyo-network/chain-model": "^1.1.0",
|
|
59
|
+
"@xyo-network/chain-modules": "^1.1.0",
|
|
60
|
+
"@xyo-network/chain-protocol": "^1.1.0",
|
|
61
|
+
"@xyo-network/chain-services": "^1.1.0",
|
|
62
|
+
"@xyo-network/chain-utils": "^1.1.0",
|
|
63
|
+
"@xyo-network/chain-validation": "^1.1.0",
|
|
64
|
+
"@xyo-network/diviner-model": "^3.10.6",
|
|
65
|
+
"@xyo-network/module-model": "^3.10.6",
|
|
66
|
+
"@xyo-network/node-memory": "^3.10.6",
|
|
67
|
+
"@xyo-network/payload-builder": "^3.10.6",
|
|
68
|
+
"@xyo-network/payload-model": "^3.10.6",
|
|
69
|
+
"@xyo-network/sentinel-memory": "^3.10.6",
|
|
70
|
+
"@xyo-network/sentinel-model": "^3.10.6",
|
|
70
71
|
"@xyo-network/typechain": "^3.4.17",
|
|
71
72
|
"async-mutex": "^0.5.0",
|
|
72
|
-
"ethers": "
|
|
73
|
+
"ethers": "6.13.6"
|
|
73
74
|
},
|
|
74
75
|
"devDependencies": {
|
|
75
|
-
"@types/node": "^22.13.
|
|
76
|
-
"@
|
|
77
|
-
"@
|
|
78
|
-
"@xylabs/
|
|
79
|
-
"@xylabs/
|
|
80
|
-
"@
|
|
81
|
-
"@
|
|
82
|
-
"@
|
|
83
|
-
"@
|
|
84
|
-
"@
|
|
85
|
-
"@xylabs/vitest-extended": "^4.7.11",
|
|
86
|
-
"@xyo-network/account": "^3.10.4",
|
|
87
|
-
"@xyo-network/account-model": "^3.10.4",
|
|
88
|
-
"@xyo-network/archivist-memory": "^3.10.4",
|
|
89
|
-
"@xyo-network/boundwitness-builder": "^3.10.4",
|
|
90
|
-
"@xyo-network/open-zeppelin-typechain": "^3.4.17",
|
|
91
|
-
"@xyo-network/payload-model": "^3.10.4",
|
|
76
|
+
"@types/node": "^22.13.17",
|
|
77
|
+
"@xylabs/decimal-precision": "^4.7.15",
|
|
78
|
+
"@xylabs/delay": "^4.7.15",
|
|
79
|
+
"@xylabs/ts-scripts-yarn3": "^6.2.1",
|
|
80
|
+
"@xylabs/tsconfig": "^6.2.1",
|
|
81
|
+
"@xyo-network/account": "^3.10.6",
|
|
82
|
+
"@xyo-network/account-model": "^3.10.6",
|
|
83
|
+
"@xyo-network/archivist-memory": "^3.10.6",
|
|
84
|
+
"@xyo-network/boundwitness-builder": "^3.10.6",
|
|
85
|
+
"@xyo-network/payload-model": "^3.10.6",
|
|
92
86
|
"eslint": "^9.23.0",
|
|
93
|
-
"eslint-import-resolver-typescript": "^4.2.3",
|
|
94
|
-
"ganache": "^7.9.2",
|
|
95
|
-
"knip": "^5.46.0",
|
|
96
|
-
"reflect-metadata": "^0.2.2",
|
|
97
|
-
"ts-node": "^10.9.2",
|
|
98
|
-
"tslib": "^2.8.1",
|
|
99
|
-
"typedoc": "^0.28.1",
|
|
100
87
|
"typescript": "^5.8.2",
|
|
101
|
-
"
|
|
102
|
-
"vite-tsconfig-paths": "^5.1.4",
|
|
103
|
-
"vitest": "^3.0.9",
|
|
104
|
-
"vitest-mock-extended": "^3.0.1"
|
|
105
|
-
},
|
|
106
|
-
"packageManager": "yarn@4.6.0",
|
|
107
|
-
"engines": {
|
|
108
|
-
"node": ">=22"
|
|
88
|
+
"vitest": "^3.1.1"
|
|
109
89
|
},
|
|
110
90
|
"engineStrict": true,
|
|
111
|
-
"volta": {
|
|
112
|
-
"node": "22.3.0",
|
|
113
|
-
"yarn": "4.6.0"
|
|
114
|
-
},
|
|
115
91
|
"publishConfig": {
|
|
116
92
|
"access": "restricted"
|
|
117
93
|
}
|
|
@@ -4,11 +4,14 @@ import { asAddress } from '@xylabs/hex'
|
|
|
4
4
|
import type { AccountInstance, WalletInstance } from '@xyo-network/account'
|
|
5
5
|
import { Account } from '@xyo-network/account'
|
|
6
6
|
import { createChain } from '@xyo-network/chain-ethereum'
|
|
7
|
-
import type {
|
|
7
|
+
import type {
|
|
8
|
+
ChainStakeIntent, Elevated, HydratedBlock,
|
|
9
|
+
} from '@xyo-network/chain-model'
|
|
8
10
|
import { ChainStakeIntentSchema } from '@xyo-network/chain-model'
|
|
9
11
|
import { buildBlock, buildTransaction } from '@xyo-network/chain-protocol'
|
|
10
12
|
import { XYO_ZERO_ADDRESS } from '@xyo-network/chain-utils'
|
|
11
13
|
import { PayloadBuilder } from '@xyo-network/payload-builder'
|
|
14
|
+
import type { WithStorageMeta } from '@xyo-network/payload-model'
|
|
12
15
|
import { BurnableErc20__factory as Erc20Factory } from '@xyo-network/typechain'
|
|
13
16
|
import { getAddress } from 'ethers/address'
|
|
14
17
|
import { JsonRpcProvider } from 'ethers/providers'
|
|
@@ -73,7 +76,7 @@ export const approveTestStakeChainAddress = async (ganachePort: number, erc20Add
|
|
|
73
76
|
const provider1 = new JsonRpcProvider(`http://127.0.0.1:${ganachePort}`, 1337)
|
|
74
77
|
const ethWalletPerson1 = new Wallet(account1.privateKey, provider1)
|
|
75
78
|
const erc20ContractPerson1 = Erc20Factory.connect(getAddress(erc20Address), ethWalletPerson1)
|
|
76
|
-
|
|
79
|
+
|
|
77
80
|
const _approveResultTx = await (await erc20ContractPerson1.approve(getAddress(xyoChainContractAddress), parseUnits('100', 18), gasConfig())).wait()
|
|
78
81
|
}
|
|
79
82
|
|
|
@@ -83,7 +86,8 @@ export const createTestGenesisBlock = async (
|
|
|
83
86
|
const randomChainId = (await Account.random()).address
|
|
84
87
|
// Create staked intents for all the block producers declaring their intent to produce blocks
|
|
85
88
|
const signedStakedBlockProducerIntents = await Promise.all(blockProducerAccounts.map(async (blockProducerAccount) => {
|
|
86
|
-
const stakeIntent = new PayloadBuilder<ChainStakeIntent
|
|
89
|
+
const stakeIntent = new PayloadBuilder<Elevated<ChainStakeIntent>>({ schema: ChainStakeIntentSchema }).fields({
|
|
90
|
+
$opCodes: ['elevate'],
|
|
87
91
|
from: blockProducerAccount.address,
|
|
88
92
|
exp: Number.MAX_SAFE_INTEGER,
|
|
89
93
|
nbf: 0,
|
|
@@ -93,7 +97,6 @@ export const createTestGenesisBlock = async (
|
|
|
93
97
|
const signedStakedBlockProducerIntent = await buildTransaction(
|
|
94
98
|
randomChainId,
|
|
95
99
|
[stakeIntent],
|
|
96
|
-
0n,
|
|
97
100
|
blockProducerAccount,
|
|
98
101
|
0,
|
|
99
102
|
1000,
|
|
@@ -102,7 +105,6 @@ export const createTestGenesisBlock = async (
|
|
|
102
105
|
return signedStakedBlockProducerIntent
|
|
103
106
|
}))
|
|
104
107
|
const intents = signedStakedBlockProducerIntents.map(intent => intent[0])
|
|
105
|
-
const payloads = signedStakedBlockProducerIntents.flatMap(intent => intent[1])
|
|
106
|
-
|
|
107
|
-
return [firstBlock, [...intents, ...signedTransactionBws, ...payloads]] as const
|
|
108
|
+
const payloads = signedStakedBlockProducerIntents.flatMap(intent => intent[1]) as Elevated<WithStorageMeta<ChainStakeIntent>>[]
|
|
109
|
+
return await buildBlock(randomChainId, signedStakedBlockProducerIntents, [...intents, ...payloads], blockProducerAccounts)
|
|
108
110
|
}
|