moonwall 1.0.0-dev.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/LICENSE +681 -0
- package/README.md +54 -0
- package/config_schema.json +811 -0
- package/dist/api/constants/accounts.d.ts +36 -0
- package/dist/api/constants/accounts.d.ts.map +1 -0
- package/dist/api/constants/accounts.js +67 -0
- package/dist/api/constants/chain.d.ts +134 -0
- package/dist/api/constants/chain.d.ts.map +1 -0
- package/dist/api/constants/chain.js +149 -0
- package/dist/api/constants/index.d.ts +4 -0
- package/dist/api/constants/index.d.ts.map +1 -0
- package/dist/api/constants/index.js +3 -0
- package/dist/api/constants/smartContract.d.ts +29 -0
- package/dist/api/constants/smartContract.d.ts.map +1 -0
- package/dist/api/constants/smartContract.js +118 -0
- package/dist/api/testing/blocks.d.ts +59 -0
- package/dist/api/testing/blocks.d.ts.map +1 -0
- package/dist/api/testing/blocks.js +147 -0
- package/dist/api/testing/contracts.d.ts +5 -0
- package/dist/api/testing/contracts.d.ts.map +1 -0
- package/dist/api/testing/contracts.js +32 -0
- package/dist/api/testing/ethers.d.ts +3 -0
- package/dist/api/testing/ethers.d.ts.map +1 -0
- package/dist/api/testing/ethers.js +38 -0
- package/dist/api/testing/events.d.ts +12 -0
- package/dist/api/testing/events.d.ts.map +1 -0
- package/dist/api/testing/events.js +23 -0
- package/dist/api/testing/extrinsics.d.ts +5 -0
- package/dist/api/testing/extrinsics.d.ts.map +1 -0
- package/dist/api/testing/extrinsics.js +10 -0
- package/dist/api/testing/index.d.ts +9 -0
- package/dist/api/testing/index.d.ts.map +1 -0
- package/dist/api/testing/index.js +8 -0
- package/dist/api/testing/jumping.d.ts +8 -0
- package/dist/api/testing/jumping.d.ts.map +1 -0
- package/dist/api/testing/jumping.js +78 -0
- package/dist/api/testing/providers.d.ts +18 -0
- package/dist/api/testing/providers.d.ts.map +1 -0
- package/dist/api/testing/providers.js +34 -0
- package/dist/api/testing/viem.d.ts +139 -0
- package/dist/api/testing/viem.d.ts.map +1 -0
- package/dist/api/testing/viem.js +247 -0
- package/dist/api/types/config.d.ts +609 -0
- package/dist/api/types/config.d.ts.map +1 -0
- package/dist/api/types/config.js +1 -0
- package/dist/api/types/context.d.ts +125 -0
- package/dist/api/types/context.d.ts.map +1 -0
- package/dist/api/types/context.js +1 -0
- package/dist/api/types/contracts.d.ts +66 -0
- package/dist/api/types/contracts.d.ts.map +1 -0
- package/dist/api/types/contracts.js +1 -0
- package/dist/api/types/eth.d.ts +3 -0
- package/dist/api/types/eth.d.ts.map +1 -0
- package/dist/api/types/eth.js +1 -0
- package/dist/api/types/foundations.d.ts +11 -0
- package/dist/api/types/foundations.d.ts.map +1 -0
- package/dist/api/types/foundations.js +1 -0
- package/dist/api/types/helpers.d.ts +7 -0
- package/dist/api/types/helpers.d.ts.map +1 -0
- package/dist/api/types/helpers.js +1 -0
- package/dist/api/types/index.d.ts +8 -0
- package/dist/api/types/index.d.ts.map +1 -0
- package/dist/api/types/index.js +7 -0
- package/dist/api/types/runner.d.ts +490 -0
- package/dist/api/types/runner.d.ts.map +1 -0
- package/dist/api/types/runner.js +1 -0
- package/dist/cli/cmds/components/LogViewer.d.ts +17 -0
- package/dist/cli/cmds/components/LogViewer.d.ts.map +1 -0
- package/dist/cli/cmds/components/LogViewer.js +171 -0
- package/dist/cli/cmds/entrypoint.d.ts +6 -0
- package/dist/cli/cmds/entrypoint.d.ts.map +1 -0
- package/dist/cli/cmds/entrypoint.js +192 -0
- package/dist/cli/cmds/interactiveCmds/chopsticksIntCmds.d.ts +2 -0
- package/dist/cli/cmds/interactiveCmds/chopsticksIntCmds.d.ts.map +1 -0
- package/dist/cli/cmds/interactiveCmds/chopsticksIntCmds.js +117 -0
- package/dist/cli/cmds/interactiveCmds/devIntCmds.d.ts +2 -0
- package/dist/cli/cmds/interactiveCmds/devIntCmds.d.ts.map +1 -0
- package/dist/cli/cmds/interactiveCmds/devIntCmds.js +103 -0
- package/dist/cli/cmds/interactiveCmds/index.d.ts +4 -0
- package/dist/cli/cmds/interactiveCmds/index.d.ts.map +1 -0
- package/dist/cli/cmds/interactiveCmds/index.js +3 -0
- package/dist/cli/cmds/interactiveCmds/zombieIntCmds.d.ts +2 -0
- package/dist/cli/cmds/interactiveCmds/zombieIntCmds.d.ts.map +1 -0
- package/dist/cli/cmds/interactiveCmds/zombieIntCmds.js +32 -0
- package/dist/cli/cmds/main.d.ts +2 -0
- package/dist/cli/cmds/main.d.ts.map +1 -0
- package/dist/cli/cmds/main.js +336 -0
- package/dist/cli/cmds/runNetwork.d.ts +3 -0
- package/dist/cli/cmds/runNetwork.d.ts.map +1 -0
- package/dist/cli/cmds/runNetwork.js +292 -0
- package/dist/cli/cmds/runTests.d.ts +12 -0
- package/dist/cli/cmds/runTests.d.ts.map +1 -0
- package/dist/cli/cmds/runTests.js +257 -0
- package/dist/cli/internal/cmdFunctions/downloader.d.ts +4 -0
- package/dist/cli/internal/cmdFunctions/downloader.d.ts.map +1 -0
- package/dist/cli/internal/cmdFunctions/downloader.js +49 -0
- package/dist/cli/internal/cmdFunctions/fetchArtifact.d.ts +10 -0
- package/dist/cli/internal/cmdFunctions/fetchArtifact.d.ts.map +1 -0
- package/dist/cli/internal/cmdFunctions/fetchArtifact.js +145 -0
- package/dist/cli/internal/cmdFunctions/index.d.ts +5 -0
- package/dist/cli/internal/cmdFunctions/index.d.ts.map +1 -0
- package/dist/cli/internal/cmdFunctions/index.js +4 -0
- package/dist/cli/internal/cmdFunctions/initialisation.d.ts +20 -0
- package/dist/cli/internal/cmdFunctions/initialisation.d.ts.map +1 -0
- package/dist/cli/internal/cmdFunctions/initialisation.js +150 -0
- package/dist/cli/internal/cmdFunctions/tempLogs.d.ts +3 -0
- package/dist/cli/internal/cmdFunctions/tempLogs.d.ts.map +1 -0
- package/dist/cli/internal/cmdFunctions/tempLogs.js +37 -0
- package/dist/cli/internal/commandParsers.d.ts +59 -0
- package/dist/cli/internal/commandParsers.d.ts.map +1 -0
- package/dist/cli/internal/commandParsers.js +305 -0
- package/dist/cli/internal/deriveTestIds.d.ts +8 -0
- package/dist/cli/internal/deriveTestIds.d.ts.map +1 -0
- package/dist/cli/internal/deriveTestIds.js +123 -0
- package/dist/cli/internal/effect/index.d.ts +6 -0
- package/dist/cli/internal/effect/index.d.ts.map +1 -0
- package/dist/cli/internal/effect/index.js +5 -0
- package/dist/cli/internal/fileCheckers.d.ts +11 -0
- package/dist/cli/internal/fileCheckers.d.ts.map +1 -0
- package/dist/cli/internal/fileCheckers.js +165 -0
- package/dist/cli/internal/foundations/index.d.ts +4 -0
- package/dist/cli/internal/foundations/index.d.ts.map +1 -0
- package/dist/cli/internal/foundations/index.js +4 -0
- package/dist/cli/internal/index.d.ts +12 -0
- package/dist/cli/internal/index.d.ts.map +1 -0
- package/dist/cli/internal/index.js +11 -0
- package/dist/cli/internal/launcherCommon.d.ts +4 -0
- package/dist/cli/internal/launcherCommon.d.ts.map +1 -0
- package/dist/cli/internal/launcherCommon.js +130 -0
- package/dist/cli/internal/localNode.d.ts +16 -0
- package/dist/cli/internal/localNode.d.ts.map +1 -0
- package/dist/cli/internal/localNode.js +362 -0
- package/dist/cli/internal/logging.d.ts +2 -0
- package/dist/cli/internal/logging.d.ts.map +1 -0
- package/dist/cli/internal/logging.js +26 -0
- package/dist/cli/internal/node.d.ts +33 -0
- package/dist/cli/internal/node.d.ts.map +1 -0
- package/dist/cli/internal/node.js +228 -0
- package/dist/cli/internal/processHelpers.d.ts +17 -0
- package/dist/cli/internal/processHelpers.d.ts.map +1 -0
- package/dist/cli/internal/processHelpers.js +56 -0
- package/dist/cli/internal/providerFactories.d.ts +48 -0
- package/dist/cli/internal/providerFactories.d.ts.map +1 -0
- package/dist/cli/internal/providerFactories.js +442 -0
- package/dist/cli/internal/testIdParser.d.ts +34 -0
- package/dist/cli/internal/testIdParser.d.ts.map +1 -0
- package/dist/cli/internal/testIdParser.js +167 -0
- package/dist/cli/lib/binariesHelpers.d.ts +15 -0
- package/dist/cli/lib/binariesHelpers.d.ts.map +1 -0
- package/dist/cli/lib/binariesHelpers.js +99 -0
- package/dist/cli/lib/configReader.d.ts +8 -0
- package/dist/cli/lib/configReader.d.ts.map +1 -0
- package/dist/cli/lib/configReader.js +115 -0
- package/dist/cli/lib/contractFunctions.d.ts +2 -0
- package/dist/cli/lib/contractFunctions.d.ts.map +1 -0
- package/dist/cli/lib/contractFunctions.js +2 -0
- package/dist/cli/lib/globalContext.d.ts +46 -0
- package/dist/cli/lib/globalContext.d.ts.map +1 -0
- package/dist/cli/lib/globalContext.js +710 -0
- package/dist/cli/lib/governanceProcedures.d.ts +27 -0
- package/dist/cli/lib/governanceProcedures.d.ts.map +1 -0
- package/dist/cli/lib/governanceProcedures.js +458 -0
- package/dist/cli/lib/handlers/index.d.ts +5 -0
- package/dist/cli/lib/handlers/index.d.ts.map +1 -0
- package/dist/cli/lib/handlers/index.js +5 -0
- package/dist/cli/lib/repoDefinitions/index.d.ts +6 -0
- package/dist/cli/lib/repoDefinitions/index.d.ts.map +1 -0
- package/dist/cli/lib/repoDefinitions/index.js +21 -0
- package/dist/cli/lib/repoDefinitions/moonbeam.d.ts +4 -0
- package/dist/cli/lib/repoDefinitions/moonbeam.d.ts.map +1 -0
- package/dist/cli/lib/repoDefinitions/moonbeam.js +30 -0
- package/dist/cli/lib/repoDefinitions/polkadot.d.ts +4 -0
- package/dist/cli/lib/repoDefinitions/polkadot.d.ts.map +1 -0
- package/dist/cli/lib/repoDefinitions/polkadot.js +11 -0
- package/dist/cli/lib/repoDefinitions/tanssi.d.ts +4 -0
- package/dist/cli/lib/repoDefinitions/tanssi.d.ts.map +1 -0
- package/dist/cli/lib/repoDefinitions/tanssi.js +14 -0
- package/dist/cli/lib/rpcFunctions.d.ts +2 -0
- package/dist/cli/lib/rpcFunctions.d.ts.map +1 -0
- package/dist/cli/lib/rpcFunctions.js +26 -0
- package/dist/cli/lib/runnerContext.d.ts +32 -0
- package/dist/cli/lib/runnerContext.d.ts.map +1 -0
- package/dist/cli/lib/runnerContext.js +156 -0
- package/dist/cli/lib/shardManager.d.ts +40 -0
- package/dist/cli/lib/shardManager.d.ts.map +1 -0
- package/dist/cli/lib/shardManager.js +80 -0
- package/dist/cli/lib/upgradeProcedures.d.ts +5 -0
- package/dist/cli/lib/upgradeProcedures.d.ts.map +1 -0
- package/dist/cli/lib/upgradeProcedures.js +221 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +3 -0
- package/dist/contracts/contractInteraction.d.ts +17 -0
- package/dist/contracts/contractInteraction.d.ts.map +1 -0
- package/dist/contracts/contractInteraction.js +170 -0
- package/dist/contracts/index.d.ts +2 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +1 -0
- package/dist/foundations/chopsticks/handler.d.ts +3 -0
- package/dist/foundations/chopsticks/handler.d.ts.map +1 -0
- package/dist/foundations/chopsticks/handler.js +93 -0
- package/dist/foundations/chopsticks/helpers.d.ts +27 -0
- package/dist/foundations/chopsticks/helpers.d.ts.map +1 -0
- package/dist/foundations/chopsticks/helpers.js +133 -0
- package/dist/foundations/dev/handler.d.ts +3 -0
- package/dist/foundations/dev/handler.d.ts.map +1 -0
- package/dist/foundations/dev/handler.js +136 -0
- package/dist/foundations/dev/helpers.d.ts +27 -0
- package/dist/foundations/dev/helpers.d.ts.map +1 -0
- package/dist/foundations/dev/helpers.js +161 -0
- package/dist/foundations/read-only/handler.d.ts +3 -0
- package/dist/foundations/read-only/handler.d.ts.map +1 -0
- package/dist/foundations/read-only/handler.js +32 -0
- package/dist/foundations/zombie/handler.d.ts +3 -0
- package/dist/foundations/zombie/handler.d.ts.map +1 -0
- package/dist/foundations/zombie/handler.js +92 -0
- package/dist/foundations/zombie/helpers.d.ts +16 -0
- package/dist/foundations/zombie/helpers.d.ts.map +1 -0
- package/dist/foundations/zombie/helpers.js +97 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +47 -0
- package/dist/internal/common.d.ts +3 -0
- package/dist/internal/common.d.ts.map +1 -0
- package/dist/internal/common.js +41 -0
- package/dist/internal/index.d.ts +4 -0
- package/dist/internal/index.d.ts.map +1 -0
- package/dist/internal/index.js +3 -0
- package/dist/internal/logger.d.ts +24 -0
- package/dist/internal/logger.d.ts.map +1 -0
- package/dist/internal/logger.js +66 -0
- package/dist/internal/logging.d.ts +7 -0
- package/dist/internal/logging.d.ts.map +1 -0
- package/dist/internal/logging.js +36 -0
- package/dist/moondebug.d.ts +3 -0
- package/dist/moondebug.d.ts.map +1 -0
- package/dist/moondebug.js +2 -0
- package/dist/services/cache/FileLock.d.ts +11 -0
- package/dist/services/cache/FileLock.d.ts.map +1 -0
- package/dist/services/cache/FileLock.js +68 -0
- package/dist/services/cache/StartupCacheService.d.ts +23 -0
- package/dist/services/cache/StartupCacheService.d.ts.map +1 -0
- package/dist/services/cache/StartupCacheService.js +159 -0
- package/dist/services/cache/index.d.ts +3 -0
- package/dist/services/cache/index.d.ts.map +1 -0
- package/dist/services/cache/index.js +2 -0
- package/dist/services/chopsticks/ChopsticksMultiChain.d.ts +158 -0
- package/dist/services/chopsticks/ChopsticksMultiChain.d.ts.map +1 -0
- package/dist/services/chopsticks/ChopsticksMultiChain.js +282 -0
- package/dist/services/chopsticks/ChopsticksService.d.ts +313 -0
- package/dist/services/chopsticks/ChopsticksService.d.ts.map +1 -0
- package/dist/services/chopsticks/ChopsticksService.js +77 -0
- package/dist/services/chopsticks/chopsticksConfigParser.d.ts +40 -0
- package/dist/services/chopsticks/chopsticksConfigParser.d.ts.map +1 -0
- package/dist/services/chopsticks/chopsticksConfigParser.js +201 -0
- package/dist/services/chopsticks/index.d.ts +5 -0
- package/dist/services/chopsticks/index.d.ts.map +1 -0
- package/dist/services/chopsticks/index.js +4 -0
- package/dist/services/chopsticks/launchChopsticksEffect.d.ts +225 -0
- package/dist/services/chopsticks/launchChopsticksEffect.d.ts.map +1 -0
- package/dist/services/chopsticks/launchChopsticksEffect.js +623 -0
- package/dist/services/config/configAccessors.d.ts +41 -0
- package/dist/services/config/configAccessors.d.ts.map +1 -0
- package/dist/services/config/configAccessors.js +149 -0
- package/dist/services/config/index.d.ts +2 -0
- package/dist/services/config/index.d.ts.map +1 -0
- package/dist/services/config/index.js +1 -0
- package/dist/services/errors.d.ts +72 -0
- package/dist/services/errors.d.ts.map +1 -0
- package/dist/services/errors.js +31 -0
- package/dist/services/index.d.ts +7 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +6 -0
- package/dist/services/network/NodeReadinessService.d.ts +35 -0
- package/dist/services/network/NodeReadinessService.d.ts.map +1 -0
- package/dist/services/network/NodeReadinessService.js +120 -0
- package/dist/services/network/PortDiscoveryService.d.ts +22 -0
- package/dist/services/network/PortDiscoveryService.d.ts.map +1 -0
- package/dist/services/network/PortDiscoveryService.js +77 -0
- package/dist/services/network/RpcPortDiscoveryService.d.ts +25 -0
- package/dist/services/network/RpcPortDiscoveryService.d.ts.map +1 -0
- package/dist/services/network/RpcPortDiscoveryService.js +136 -0
- package/dist/services/network/index.d.ts +4 -0
- package/dist/services/network/index.d.ts.map +1 -0
- package/dist/services/network/index.js +3 -0
- package/dist/services/process/ProcessManagerService.d.ts +49 -0
- package/dist/services/process/ProcessManagerService.d.ts.map +1 -0
- package/dist/services/process/ProcessManagerService.js +162 -0
- package/dist/services/process/index.d.ts +3 -0
- package/dist/services/process/index.d.ts.map +1 -0
- package/dist/services/process/index.js +2 -0
- package/dist/services/process/launchNodeEffect.d.ts +40 -0
- package/dist/services/process/launchNodeEffect.d.ts.map +1 -0
- package/dist/services/process/launchNodeEffect.js +86 -0
- package/dist/util/functions/index.d.ts +3 -0
- package/dist/util/functions/index.d.ts.map +1 -0
- package/dist/util/functions/index.js +4 -0
- package/dist/util/index.d.ts +4 -0
- package/dist/util/index.d.ts.map +1 -0
- package/dist/util/index.js +2 -0
- package/package.json +157 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { ALITH_PRIVATE_KEY, PRECOMPILES, createEthersTransaction, createViemTransaction, deployViemContract, } from "../util/index.js";
|
|
2
|
+
import chalk from "chalk";
|
|
3
|
+
import { Interface, Wallet } from "ethers";
|
|
4
|
+
import fs, { readFileSync } from "node:fs";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { decodeFunctionResult, encodeFunctionData, toHex } from "viem";
|
|
7
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
8
|
+
import { importJsonConfig } from "../services/config/index.js";
|
|
9
|
+
function getCompiledPath(contractName) {
|
|
10
|
+
const config = importJsonConfig();
|
|
11
|
+
const contractsDir = config.environments.find((env) => env.name === process.env.MOON_TEST_ENV)?.contracts;
|
|
12
|
+
if (!contractsDir) {
|
|
13
|
+
throw new Error(`Contracts directory not found for environment config ${process.env.MOON_TEST_ENV}\n` +
|
|
14
|
+
`Please specify path to Foundry directory at: ${chalk.bgWhiteBright.blackBright("moonwall.config.json > environments > contracts")}`);
|
|
15
|
+
}
|
|
16
|
+
const compiledJsonPath = recursiveSearch(contractsDir, `${contractName}.json`);
|
|
17
|
+
const solidityFilePath = recursiveSearch(contractsDir, `${contractName}.sol`);
|
|
18
|
+
if (!compiledJsonPath && !solidityFilePath) {
|
|
19
|
+
throw new Error(`Neither solidity contract ${contractName}.sol nor its compiled json exists in ${contractsDir}`);
|
|
20
|
+
}
|
|
21
|
+
if (!compiledJsonPath) {
|
|
22
|
+
throw new Error(`Compiled contract ${contractName}.json doesn't exist\n` +
|
|
23
|
+
`Please ${chalk.bgWhiteBright.blackBright("recompile contract")} ${contractName}.sol`);
|
|
24
|
+
}
|
|
25
|
+
return compiledJsonPath;
|
|
26
|
+
}
|
|
27
|
+
export function fetchCompiledContract(contractName) {
|
|
28
|
+
const compiledPath = getCompiledPath(contractName);
|
|
29
|
+
const json = readFileSync(compiledPath, "utf8");
|
|
30
|
+
const parsed = JSON.parse(json);
|
|
31
|
+
return {
|
|
32
|
+
abi: parsed.contract.abi,
|
|
33
|
+
bytecode: parsed.byteCode,
|
|
34
|
+
methods: parsed.contract.evm.methodIdentifiers,
|
|
35
|
+
deployedBytecode: `0x${parsed.contract.evm.deployedBytecode.object}`,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export function recursiveSearch(dir, filename) {
|
|
39
|
+
const files = fs.readdirSync(dir);
|
|
40
|
+
for (const file of files) {
|
|
41
|
+
const filepath = path.join(dir, file);
|
|
42
|
+
const stats = fs.statSync(filepath);
|
|
43
|
+
if (stats.isDirectory()) {
|
|
44
|
+
const searchResult = recursiveSearch(filepath, filename);
|
|
45
|
+
if (searchResult) {
|
|
46
|
+
return searchResult;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
else if (stats.isFile() && file === filename) {
|
|
50
|
+
return filepath;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
export async function interactWithPrecompileContract(context, callOptions) {
|
|
56
|
+
const { precompileName, ...rest } = callOptions;
|
|
57
|
+
const precompileInfo = PRECOMPILES[precompileName];
|
|
58
|
+
if (!precompileInfo) {
|
|
59
|
+
throw new Error(`No precompile found with the name: ${precompileName}`);
|
|
60
|
+
}
|
|
61
|
+
const [contractAddress, contractName] = Array.isArray(precompileInfo)
|
|
62
|
+
? precompileInfo
|
|
63
|
+
: [precompileInfo, precompileName];
|
|
64
|
+
return await interactWithContract(context, {
|
|
65
|
+
...rest,
|
|
66
|
+
contractName,
|
|
67
|
+
contractAddress: contractAddress,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
export async function interactWithContract(context, callOptions) {
|
|
71
|
+
const { contractName, contractAddress, functionName, args = [], web3Library = "viem", gas = "estimate", value = 0n, privateKey = ALITH_PRIVATE_KEY, rawTxOnly = false, call = false, } = callOptions;
|
|
72
|
+
const { abi } = fetchCompiledContract(contractName);
|
|
73
|
+
const data = encodeFunctionData({
|
|
74
|
+
abi,
|
|
75
|
+
functionName,
|
|
76
|
+
args,
|
|
77
|
+
});
|
|
78
|
+
const account = privateKeyToAccount(privateKey);
|
|
79
|
+
const gasParam = gas === "estimate"
|
|
80
|
+
? await context.viem().estimateGas({
|
|
81
|
+
account: account.address,
|
|
82
|
+
to: contractAddress,
|
|
83
|
+
value: 0n,
|
|
84
|
+
data,
|
|
85
|
+
})
|
|
86
|
+
: gas > 0n
|
|
87
|
+
? gas
|
|
88
|
+
: 200000n;
|
|
89
|
+
if (!call && rawTxOnly) {
|
|
90
|
+
return web3Library === "viem"
|
|
91
|
+
? createViemTransaction(context, {
|
|
92
|
+
to: contractAddress,
|
|
93
|
+
data,
|
|
94
|
+
gas: gasParam,
|
|
95
|
+
privateKey,
|
|
96
|
+
value,
|
|
97
|
+
})
|
|
98
|
+
: createEthersTransaction(context, {
|
|
99
|
+
to: contractAddress,
|
|
100
|
+
data,
|
|
101
|
+
gas: gasParam,
|
|
102
|
+
value: toHex(value),
|
|
103
|
+
privateKey,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if (call) {
|
|
107
|
+
if (web3Library === "viem") {
|
|
108
|
+
const result = await context.viem().call({
|
|
109
|
+
account: account.address,
|
|
110
|
+
to: contractAddress,
|
|
111
|
+
value: 0n,
|
|
112
|
+
data,
|
|
113
|
+
gas: gasParam,
|
|
114
|
+
});
|
|
115
|
+
if (!result.data) {
|
|
116
|
+
throw new Error("No data field returned from call");
|
|
117
|
+
}
|
|
118
|
+
return decodeFunctionResult({ abi, functionName, data: result.data });
|
|
119
|
+
}
|
|
120
|
+
const result = await context.ethers().call({
|
|
121
|
+
from: account.address,
|
|
122
|
+
to: contractAddress,
|
|
123
|
+
value: toHex(value),
|
|
124
|
+
data,
|
|
125
|
+
gasLimit: toHex(gasParam),
|
|
126
|
+
});
|
|
127
|
+
return new Interface(abi).decodeFunctionResult(functionName, result);
|
|
128
|
+
}
|
|
129
|
+
if (!rawTxOnly) {
|
|
130
|
+
if (web3Library === "viem") {
|
|
131
|
+
const hash = await context.viem().sendTransaction({
|
|
132
|
+
account: account,
|
|
133
|
+
to: contractAddress,
|
|
134
|
+
value,
|
|
135
|
+
data,
|
|
136
|
+
gas: gasParam,
|
|
137
|
+
});
|
|
138
|
+
return hash;
|
|
139
|
+
}
|
|
140
|
+
const signer = new Wallet(privateKey, context.ethers().provider);
|
|
141
|
+
const { hash } = await signer.sendTransaction({
|
|
142
|
+
from: account.address,
|
|
143
|
+
to: contractAddress,
|
|
144
|
+
value: toHex(value),
|
|
145
|
+
data,
|
|
146
|
+
gasLimit: toHex(gasParam),
|
|
147
|
+
});
|
|
148
|
+
return hash;
|
|
149
|
+
}
|
|
150
|
+
throw new Error("This should never happen, if it does there's a logic error in the code");
|
|
151
|
+
}
|
|
152
|
+
export async function deployCreateCompiledContract(context, contractName, options) {
|
|
153
|
+
const { abi, bytecode, methods } = fetchCompiledContract(contractName);
|
|
154
|
+
const { privateKey = ALITH_PRIVATE_KEY, args = [], ...rest } = options || {};
|
|
155
|
+
const blob = {
|
|
156
|
+
...rest,
|
|
157
|
+
privateKey,
|
|
158
|
+
args,
|
|
159
|
+
};
|
|
160
|
+
const { contractAddress, logs, status, hash } = await deployViemContract(context, abi, bytecode, blob);
|
|
161
|
+
return {
|
|
162
|
+
contractAddress: contractAddress,
|
|
163
|
+
logs,
|
|
164
|
+
hash,
|
|
165
|
+
status,
|
|
166
|
+
abi,
|
|
167
|
+
bytecode,
|
|
168
|
+
methods,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contracts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,8BAA8B,EAC9B,oBAAoB,EACpB,4BAA4B,GAC7B,iCAAiC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { fetchCompiledContract, recursiveSearch, interactWithPrecompileContract, interactWithContract, deployCreateCompiledContract, } from "./contractInteraction.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/foundations/chopsticks/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,iBAAiB,EAClB,iCAAiC;AAelC,eAAO,MAAM,iBAAiB,EAAE,iBAAiB,CAAC,YAAY,CA4G7D,CAAC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { ALITH_PRIVATE_KEY, BALTATHAR_PRIVATE_KEY, CHARLETH_PRIVATE_KEY, DOROTHY_PRIVATE_KEY, jumpRoundsChopsticks, } from "../../util/index.js";
|
|
2
|
+
import { Keyring } from "@polkadot/api";
|
|
3
|
+
import { createChopsticksBlock, getWsUrlFromConfig, sendSetStorageRequest } from "./helpers.js";
|
|
4
|
+
import { getEnvironmentFromConfig } from "../../services/config/index.js";
|
|
5
|
+
import { MoonwallContext } from "../../cli/lib/globalContext.js";
|
|
6
|
+
import { upgradeRuntimeChopsticks } from "../../cli/lib/upgradeProcedures.js";
|
|
7
|
+
export const chopsticksHandler = ({ testCases, context, testCase, logger, }) => {
|
|
8
|
+
const accountTypeLookup = () => {
|
|
9
|
+
const metadata = ctx.polkadotJs().runtimeMetadata.asLatest;
|
|
10
|
+
const systemPalletIndex = metadata.pallets.findIndex((pallet) => pallet.name.toString() === "System");
|
|
11
|
+
const systemAccountStorageType = metadata.pallets[systemPalletIndex].storage
|
|
12
|
+
.unwrap()
|
|
13
|
+
.items.find((storage) => storage.name.toString() === "Account")?.type;
|
|
14
|
+
if (!systemAccountStorageType) {
|
|
15
|
+
throw new Error("System.Account storage not found");
|
|
16
|
+
}
|
|
17
|
+
return metadata.lookup.getTypeDef(systemAccountStorageType.asMap.key).type;
|
|
18
|
+
};
|
|
19
|
+
const newKeyring = () => {
|
|
20
|
+
const isEth = accountTypeLookup() === "AccountId20";
|
|
21
|
+
const keyring = new Keyring({
|
|
22
|
+
type: isEth ? "ethereum" : "sr25519",
|
|
23
|
+
});
|
|
24
|
+
return {
|
|
25
|
+
alice: keyring.addFromUri(isEth ? ALITH_PRIVATE_KEY : "//Alice", {
|
|
26
|
+
name: "Alice default",
|
|
27
|
+
}),
|
|
28
|
+
bob: keyring.addFromUri(isEth ? BALTATHAR_PRIVATE_KEY : "//Bob", {
|
|
29
|
+
name: "Bob default",
|
|
30
|
+
}),
|
|
31
|
+
charlie: keyring.addFromUri(isEth ? CHARLETH_PRIVATE_KEY : "//Charlie", {
|
|
32
|
+
name: "Charlie default",
|
|
33
|
+
}),
|
|
34
|
+
dave: keyring.addFromUri(isEth ? DOROTHY_PRIVATE_KEY : "//Dave", {
|
|
35
|
+
name: "Dave default",
|
|
36
|
+
}),
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
const ctx = {
|
|
40
|
+
...context,
|
|
41
|
+
get isEthereumChain() {
|
|
42
|
+
return accountTypeLookup() === "AccountId20";
|
|
43
|
+
},
|
|
44
|
+
get isSubstrateChain() {
|
|
45
|
+
return accountTypeLookup() === "AccountId32";
|
|
46
|
+
},
|
|
47
|
+
get pjsApi() {
|
|
48
|
+
return context.polkadotJs();
|
|
49
|
+
},
|
|
50
|
+
get keyring() {
|
|
51
|
+
return newKeyring();
|
|
52
|
+
},
|
|
53
|
+
createBlock: async (options = {}) => {
|
|
54
|
+
// Get newBlockTimeout from foundation config if not provided in options
|
|
55
|
+
const env = getEnvironmentFromConfig();
|
|
56
|
+
const launchSpec = env.foundation.type === "chopsticks" ? env.foundation.launchSpec[0] : undefined;
|
|
57
|
+
const configTimeout = launchSpec?.newBlockTimeout;
|
|
58
|
+
return await createChopsticksBlock(context, {
|
|
59
|
+
...options,
|
|
60
|
+
timeout: options.timeout ?? configTimeout,
|
|
61
|
+
});
|
|
62
|
+
},
|
|
63
|
+
setStorage: async (params) => await sendSetStorageRequest(params),
|
|
64
|
+
upgradeRuntime: async (providerName) => {
|
|
65
|
+
const path = (await MoonwallContext.getContext()).rtUpgradePath;
|
|
66
|
+
if (!path) {
|
|
67
|
+
throw new Error("No runtime upgrade path defined in config");
|
|
68
|
+
}
|
|
69
|
+
await upgradeRuntimeChopsticks(ctx, path, providerName);
|
|
70
|
+
},
|
|
71
|
+
jumpRounds: async (options) => {
|
|
72
|
+
const api = context.polkadotJs(options.providerName);
|
|
73
|
+
if (!containsPallet(api, "ParachainStaking")) {
|
|
74
|
+
throw new Error("ParachainStaking pallet is not enabled");
|
|
75
|
+
}
|
|
76
|
+
const wsUrl = await getWsUrlFromConfig(options.providerName);
|
|
77
|
+
const url = new URL(wsUrl);
|
|
78
|
+
const port = Number.parseInt(url.port, 10);
|
|
79
|
+
await jumpRoundsChopsticks(api, port, options.rounds);
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
testCases({
|
|
83
|
+
context: ctx,
|
|
84
|
+
it: testCase,
|
|
85
|
+
log: logger.info.bind(logger),
|
|
86
|
+
logger,
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
const containsPallet = (polkadotJsApi, palletName) => {
|
|
90
|
+
const metadata = polkadotJsApi.runtimeMetadata.asLatest;
|
|
91
|
+
const systemPalletIndex = metadata.pallets.findIndex((pallet) => pallet.name.toString() === palletName);
|
|
92
|
+
return systemPalletIndex !== -1;
|
|
93
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ChopsticksBlockCreation, GenericContext } from "../../api/types/index.js";
|
|
2
|
+
import type { WsProvider } from "@polkadot/api";
|
|
3
|
+
import type { ApiTypes, AugmentedEvent } from "@polkadot/api/types";
|
|
4
|
+
import type { EventRecord } from "@polkadot/types/interfaces";
|
|
5
|
+
export declare function getWsFromConfig(providerName?: string, timeout?: number): Promise<WsProvider>;
|
|
6
|
+
export declare function getWsUrlFromConfig(providerName?: string): Promise<string>;
|
|
7
|
+
export declare function sendNewBlockAndCheck(context: GenericContext, expectedEvents: AugmentedEvent<ApiTypes>[]): Promise<{
|
|
8
|
+
match: boolean;
|
|
9
|
+
events: EventRecord[];
|
|
10
|
+
}>;
|
|
11
|
+
export declare function createChopsticksBlock(context: GenericContext, options?: ChopsticksBlockCreation): Promise<{
|
|
12
|
+
result: string;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function sendSetHeadRequest(newHead: string, providerName?: string): Promise<string>;
|
|
15
|
+
export declare function sendNewBlockRequest(params?: {
|
|
16
|
+
providerName?: string;
|
|
17
|
+
count?: number;
|
|
18
|
+
to?: number;
|
|
19
|
+
timeout?: number;
|
|
20
|
+
}): Promise<string>;
|
|
21
|
+
export declare function sendSetStorageRequest(params: {
|
|
22
|
+
providerName?: string;
|
|
23
|
+
module: string;
|
|
24
|
+
method: string;
|
|
25
|
+
methodParams: any[];
|
|
26
|
+
}): Promise<void>;
|
|
27
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/foundations/chopsticks/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,cAAc,EAAE,iCAAiC;AACxF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAK9D,wBAAsB,eAAe,CACnC,YAAY,CAAC,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CA+BrB;AAED,wBAAsB,kBAAkB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoB/E;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,cAAc,CAAC,QAAQ,CAAC,EAAE,GACzC,OAAO,CAAC;IACT,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC,CAoBD;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE,uBAAkD;;GA4C5D;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,mBAW9E;AAED,wBAAsB,mBAAmB,CAAC,MAAM,CAAC,EAAE;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,mBAiBA;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,GAAG,EAAE,CAAC;CACrB,iBASA"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { setTimeout } from "node:timers/promises";
|
|
3
|
+
import { MoonwallContext } from "../../cli/lib/globalContext.js";
|
|
4
|
+
export async function getWsFromConfig(providerName, timeout) {
|
|
5
|
+
if (providerName) {
|
|
6
|
+
const provider = (await MoonwallContext.getContext()).environment.providers.find(({ name }) => name === providerName);
|
|
7
|
+
if (typeof provider === "undefined") {
|
|
8
|
+
throw new Error(`Cannot find provider ${chalk.bgWhiteBright.blackBright(providerName)}`);
|
|
9
|
+
}
|
|
10
|
+
if (!provider.ws) {
|
|
11
|
+
throw new Error("Provider does not have an attached ws() property ");
|
|
12
|
+
}
|
|
13
|
+
return provider.ws(timeout);
|
|
14
|
+
}
|
|
15
|
+
const provider = (await MoonwallContext.getContext()).environment.providers.find(({ type }) => type === "polkadotJs");
|
|
16
|
+
if (typeof provider === "undefined") {
|
|
17
|
+
throw new Error(`Cannot find providers of type ${chalk.bgWhiteBright.blackBright("polkadotJs")}`);
|
|
18
|
+
}
|
|
19
|
+
if (!provider.ws) {
|
|
20
|
+
throw new Error("Provider does not have an attached ws() property ");
|
|
21
|
+
}
|
|
22
|
+
return provider.ws(timeout);
|
|
23
|
+
}
|
|
24
|
+
export async function getWsUrlFromConfig(providerName) {
|
|
25
|
+
// Import the environment config directly which has the connections property
|
|
26
|
+
const { getEnvironmentFromConfig } = await import("../../cli/lib/configReader.js");
|
|
27
|
+
const env = getEnvironmentFromConfig();
|
|
28
|
+
if (providerName) {
|
|
29
|
+
const connection = env.connections?.find(({ name }) => name === providerName);
|
|
30
|
+
if (connection?.endpoints && connection.endpoints.length > 0) {
|
|
31
|
+
return connection.endpoints[0];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Default to first polkadotJs connection
|
|
35
|
+
const connection = env.connections?.find(({ type }) => type === "polkadotJs");
|
|
36
|
+
if (!connection || !connection.endpoints || connection.endpoints.length === 0) {
|
|
37
|
+
throw new Error("No WebSocket endpoint found in configuration");
|
|
38
|
+
}
|
|
39
|
+
return connection.endpoints[0];
|
|
40
|
+
}
|
|
41
|
+
export async function sendNewBlockAndCheck(context, expectedEvents) {
|
|
42
|
+
const newBlock = await sendNewBlockRequest();
|
|
43
|
+
const api = context.polkadotJs();
|
|
44
|
+
const apiAt = await api.at(newBlock);
|
|
45
|
+
const actualEvents = (await apiAt.query.system.events());
|
|
46
|
+
const match = expectedEvents.every((eEvt) => {
|
|
47
|
+
return actualEvents
|
|
48
|
+
.map((aEvt) => {
|
|
49
|
+
if (api.events.system.ExtrinsicSuccess.is(aEvt.event) &&
|
|
50
|
+
aEvt.event.data.dispatchInfo?.class?.toString() !== "Normal") {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
return eEvt.is(aEvt.event);
|
|
54
|
+
})
|
|
55
|
+
.reduce((acc, curr) => acc || curr, false);
|
|
56
|
+
});
|
|
57
|
+
return { match, events: actualEvents };
|
|
58
|
+
}
|
|
59
|
+
export async function createChopsticksBlock(context, options = { allowFailures: false }) {
|
|
60
|
+
const result = await sendNewBlockRequest(options);
|
|
61
|
+
const apiAt = await context.polkadotJs(options.providerName).at(result);
|
|
62
|
+
const actualEvents = await apiAt.query.system.events();
|
|
63
|
+
if (options?.expectEvents) {
|
|
64
|
+
const match = options.expectEvents.every((eEvt) => {
|
|
65
|
+
const found = actualEvents
|
|
66
|
+
.map((aEvt) => eEvt.is(aEvt.event))
|
|
67
|
+
.reduce((acc, curr) => acc || curr, false);
|
|
68
|
+
if (!found) {
|
|
69
|
+
const message = `Event ${chalk.bgWhiteBright.blackBright(eEvt.meta.name)} not present in block`;
|
|
70
|
+
if (options.logger) {
|
|
71
|
+
// Handle both pino Logger (has .error) and LogFn (callable)
|
|
72
|
+
if ("error" in options.logger) {
|
|
73
|
+
options.logger.error(message);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
options.logger(message);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
console.error(message);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return found;
|
|
84
|
+
});
|
|
85
|
+
if (!match) {
|
|
86
|
+
throw new Error("Expected events not present in block");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (options && options.allowFailures === true) {
|
|
90
|
+
// Skip ExtrinsicFailure Asserts
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
for (const event of actualEvents) {
|
|
94
|
+
if (context.polkadotJs().events.system.ExtrinsicFailed.is(event.event)) {
|
|
95
|
+
throw new Error(`ExtrinsicFailed event detected, enable 'allowFailures' if this is expected.`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return { result };
|
|
100
|
+
}
|
|
101
|
+
export async function sendSetHeadRequest(newHead, providerName) {
|
|
102
|
+
const ws = providerName ? await getWsFromConfig(providerName) : await getWsFromConfig();
|
|
103
|
+
let result = "";
|
|
104
|
+
await ws.isReady;
|
|
105
|
+
result = await ws.send("dev_setHead", [newHead]);
|
|
106
|
+
await ws.disconnect();
|
|
107
|
+
return result;
|
|
108
|
+
}
|
|
109
|
+
export async function sendNewBlockRequest(params) {
|
|
110
|
+
const ws = params
|
|
111
|
+
? await getWsFromConfig(params.providerName, params.timeout)
|
|
112
|
+
: await getWsFromConfig();
|
|
113
|
+
let result = "";
|
|
114
|
+
while (!ws.isConnected) {
|
|
115
|
+
await setTimeout(100);
|
|
116
|
+
}
|
|
117
|
+
if (params?.count || params?.to) {
|
|
118
|
+
result = await ws.send("dev_newBlock", [{ count: params.count, to: params.to }]);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
result = await ws.send("dev_newBlock", [{ count: 1 }]);
|
|
122
|
+
}
|
|
123
|
+
await ws.disconnect();
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
export async function sendSetStorageRequest(params) {
|
|
127
|
+
const ws = params ? await getWsFromConfig(params.providerName) : await getWsFromConfig();
|
|
128
|
+
while (!ws.isConnected) {
|
|
129
|
+
await setTimeout(100);
|
|
130
|
+
}
|
|
131
|
+
await ws.send("dev_setStorage", [{ [params.module]: { [params.method]: params.methodParams } }]);
|
|
132
|
+
await ws.disconnect();
|
|
133
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/foundations/dev/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAQV,iBAAiB,EAGlB,iCAAiC;AAsBlC,eAAO,MAAM,UAAU,EAAE,iBAAiB,CAAC,KAAK,CA0K/C,CAAC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { ALITH_PRIVATE_KEY, BALTATHAR_PRIVATE_KEY, CHARLETH_PRIVATE_KEY, DOROTHY_PRIVATE_KEY, alith, createEthersTransaction, createViemTransaction, jumpBlocksDev, jumpRoundsDev, } from "../../util/index.js";
|
|
2
|
+
import { Keyring } from "@polkadot/api";
|
|
3
|
+
import { createDevBlock } from "./helpers.js";
|
|
4
|
+
import { getEnvironmentFromConfig, isEthereumDevConfig } from "../../services/config/index.js";
|
|
5
|
+
import { deployCreateCompiledContract, interactWithContract, interactWithPrecompileContract, } from "../../contracts/index.js";
|
|
6
|
+
export const devHandler = ({ testCases, context, testCase, logger }) => {
|
|
7
|
+
const env = getEnvironmentFromConfig();
|
|
8
|
+
const ethCompatible = isEthereumDevConfig();
|
|
9
|
+
const accountTypeLookup = () => {
|
|
10
|
+
const metadata = ctx.polkadotJs().runtimeMetadata.asLatest;
|
|
11
|
+
const systemPalletIndex = metadata.pallets.findIndex((pallet) => pallet.name.toString() === "System");
|
|
12
|
+
const systemAccountStorage = metadata.pallets[systemPalletIndex].storage
|
|
13
|
+
.unwrap()
|
|
14
|
+
.items.find((storage) => storage.name.toString() === "Account");
|
|
15
|
+
if (!systemAccountStorage) {
|
|
16
|
+
throw new Error("Account storage not found");
|
|
17
|
+
}
|
|
18
|
+
const systemAccountStorageType = systemAccountStorage.type;
|
|
19
|
+
return metadata.lookup.getTypeDef(systemAccountStorageType.asMap.key).type;
|
|
20
|
+
};
|
|
21
|
+
const newKeyring = () => {
|
|
22
|
+
const isEth = accountTypeLookup() === "AccountId20";
|
|
23
|
+
const keyring = new Keyring({
|
|
24
|
+
type: isEth ? "ethereum" : "sr25519",
|
|
25
|
+
});
|
|
26
|
+
return {
|
|
27
|
+
alice: keyring.addFromUri(isEth ? ALITH_PRIVATE_KEY : "//Alice", {
|
|
28
|
+
name: "Alice default",
|
|
29
|
+
}),
|
|
30
|
+
bob: keyring.addFromUri(isEth ? BALTATHAR_PRIVATE_KEY : "//Bob", {
|
|
31
|
+
name: "Bob default",
|
|
32
|
+
}),
|
|
33
|
+
charlie: keyring.addFromUri(isEth ? CHARLETH_PRIVATE_KEY : "//Charlie", {
|
|
34
|
+
name: "Charlie default",
|
|
35
|
+
}),
|
|
36
|
+
dave: keyring.addFromUri(isEth ? DOROTHY_PRIVATE_KEY : "//Dave", {
|
|
37
|
+
name: "Dave default",
|
|
38
|
+
}),
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
const containsPallet = (palletName) => {
|
|
42
|
+
const metadata = context.polkadotJs().runtimeMetadata.asLatest;
|
|
43
|
+
const systemPalletIndex = metadata.pallets.findIndex((pallet) => pallet.name.toString() === palletName);
|
|
44
|
+
return systemPalletIndex !== -1;
|
|
45
|
+
};
|
|
46
|
+
const ctx = {
|
|
47
|
+
...context,
|
|
48
|
+
get isEthereumChain() {
|
|
49
|
+
return accountTypeLookup() === "AccountId20";
|
|
50
|
+
},
|
|
51
|
+
get isSubstrateChain() {
|
|
52
|
+
return accountTypeLookup() === "AccountId32";
|
|
53
|
+
},
|
|
54
|
+
get pjsApi() {
|
|
55
|
+
return context.polkadotJs();
|
|
56
|
+
},
|
|
57
|
+
get isParachainStaking() {
|
|
58
|
+
return containsPallet("ParachainStaking");
|
|
59
|
+
},
|
|
60
|
+
get keyring() {
|
|
61
|
+
return newKeyring();
|
|
62
|
+
},
|
|
63
|
+
createBlock: async (transactions, options) => {
|
|
64
|
+
const defaults = {
|
|
65
|
+
signer: env.defaultSigner || alith,
|
|
66
|
+
allowFailures: env.defaultAllowFailures === undefined ? true : env.defaultAllowFailures,
|
|
67
|
+
finalize: env.defaultFinalization === undefined ? true : env.defaultFinalization,
|
|
68
|
+
};
|
|
69
|
+
return await createDevBlock(context, { ...defaults, ...options }, transactions);
|
|
70
|
+
},
|
|
71
|
+
createTxn: !ethCompatible
|
|
72
|
+
? undefined
|
|
73
|
+
: (options) => {
|
|
74
|
+
const { libraryType = "viem", ...txnOptions } = options;
|
|
75
|
+
return libraryType === "viem"
|
|
76
|
+
? createViemTransaction(ctx, txnOptions)
|
|
77
|
+
: createEthersTransaction(ctx, txnOptions);
|
|
78
|
+
},
|
|
79
|
+
readPrecompile: !ethCompatible
|
|
80
|
+
? undefined
|
|
81
|
+
: async (options) => {
|
|
82
|
+
const response = await interactWithPrecompileContract(ctx, {
|
|
83
|
+
call: true,
|
|
84
|
+
...options,
|
|
85
|
+
});
|
|
86
|
+
return response;
|
|
87
|
+
},
|
|
88
|
+
writePrecompile: !ethCompatible
|
|
89
|
+
? undefined
|
|
90
|
+
: async (options) => {
|
|
91
|
+
const response = await interactWithPrecompileContract(ctx, {
|
|
92
|
+
call: false,
|
|
93
|
+
...options,
|
|
94
|
+
});
|
|
95
|
+
return response;
|
|
96
|
+
},
|
|
97
|
+
readContract: !ethCompatible
|
|
98
|
+
? undefined
|
|
99
|
+
: async (options) => {
|
|
100
|
+
const response = await interactWithContract(ctx, {
|
|
101
|
+
call: true,
|
|
102
|
+
...options,
|
|
103
|
+
});
|
|
104
|
+
return response;
|
|
105
|
+
},
|
|
106
|
+
writeContract: !ethCompatible
|
|
107
|
+
? undefined
|
|
108
|
+
: async (options) => {
|
|
109
|
+
const response = await interactWithContract(ctx, {
|
|
110
|
+
call: false,
|
|
111
|
+
...options,
|
|
112
|
+
});
|
|
113
|
+
return response;
|
|
114
|
+
},
|
|
115
|
+
deployContract: !ethCompatible
|
|
116
|
+
? undefined
|
|
117
|
+
: async (contractName, options) => {
|
|
118
|
+
return await deployCreateCompiledContract(ctx, contractName, options);
|
|
119
|
+
},
|
|
120
|
+
jumpBlocks: async (blocks) => {
|
|
121
|
+
await jumpBlocksDev(context.polkadotJs(), blocks);
|
|
122
|
+
},
|
|
123
|
+
jumpRounds: async (rounds) => {
|
|
124
|
+
if (!ctx.isParachainStaking) {
|
|
125
|
+
throw new Error("ParachainStaking pallet is not enabled");
|
|
126
|
+
}
|
|
127
|
+
await jumpRoundsDev(context.polkadotJs(), rounds);
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
testCases({
|
|
131
|
+
context: ctx,
|
|
132
|
+
it: testCase,
|
|
133
|
+
log: logger.info.bind(logger),
|
|
134
|
+
logger,
|
|
135
|
+
});
|
|
136
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { BlockCreation, ExtrinsicCreation, GenericContext } from "../../api/types/index.js";
|
|
2
|
+
import type { ApiTypes, SubmittableExtrinsic } from "@polkadot/api/types";
|
|
3
|
+
export declare function getDevProviderPath(): Promise<string>;
|
|
4
|
+
export type CreatedBlockResult = {
|
|
5
|
+
block: {
|
|
6
|
+
duration: number;
|
|
7
|
+
hash: string;
|
|
8
|
+
};
|
|
9
|
+
result: ExtrinsicCreation | ExtrinsicCreation[] | null;
|
|
10
|
+
};
|
|
11
|
+
export type CallType<TApi extends ApiTypes> = SubmittableExtrinsic<TApi> | Promise<SubmittableExtrinsic<TApi>> | `0x${string}` | Promise<string>;
|
|
12
|
+
export declare function createDevBlock<ApiType extends ApiTypes, Calls extends CallType<ApiType> | Array<CallType<ApiType>>>(context: GenericContext, options: BlockCreation, transactions?: Calls): Promise<{
|
|
13
|
+
block: {
|
|
14
|
+
duration: number;
|
|
15
|
+
hash: string;
|
|
16
|
+
proofSize?: number;
|
|
17
|
+
};
|
|
18
|
+
result?: undefined;
|
|
19
|
+
} | {
|
|
20
|
+
block: {
|
|
21
|
+
duration: number;
|
|
22
|
+
hash: string;
|
|
23
|
+
proofSize?: number;
|
|
24
|
+
};
|
|
25
|
+
result: any;
|
|
26
|
+
}>;
|
|
27
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/foundations/dev/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAEb,iBAAiB,EACjB,cAAc,EACf,iCAAiC;AAQlC,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAa1E,wBAAsB,kBAAkB,oBAKvC;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,EAAE,GAAG,IAAI,CAAC;CACxD,CAAC;AAEF,MAAM,MAAM,QAAQ,CAAC,IAAI,SAAS,QAAQ,IACtC,oBAAoB,CAAC,IAAI,CAAC,GAC1B,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,GACnC,KAAK,MAAM,EAAE,GACb,OAAO,CAAC,MAAM,CAAC,CAAC;AAgBpB,wBAAsB,cAAc,CAClC,OAAO,SAAS,QAAQ,EACxB,KAAK,SAAS,QAAQ,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAC1D,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,aAAa,EAAE,YAAY,CAAC,EAAE,KAAK;;;;;;;;;;;;;;GAqKtE"}
|