diff --git a/.cspell.json b/.cspell.json index 9597e6cd79..20ab59d29f 100644 --- a/.cspell.json +++ b/.cspell.json @@ -4,6 +4,7 @@ "minWordLength": 4, "allowCompoundWords": true, "words": [ + "outsh", "adminpw", "Albertirsa", "ALLFORTX", diff --git a/packages/cactus-test-tooling/package.json b/packages/cactus-test-tooling/package.json index ae94a65b1b..813b426cad 100644 --- a/packages/cactus-test-tooling/package.json +++ b/packages/cactus-test-tooling/package.json @@ -90,6 +90,12 @@ "web3-utils": "1.6.1" }, "devDependencies": { + "@aries-framework/askar": "0.5.0-alpha.58", + "@aries-framework/core": "0.5.0-alpha.58", + "@aries-framework/indy-vdr": "0.5.0-alpha.58", + "@aries-framework/node": "0.5.0-alpha.58", + "@hyperledger/aries-askar-nodejs": "0.2.0-dev.1", + "@hyperledger/indy-vdr-nodejs": "0.2.0-dev.3", "@types/dockerode": "3.2.7", "@types/esm": "3.2.0", "@types/fs-extra": "9.0.13", diff --git a/packages/cactus-test-tooling/src/main/typescript/indy/indy-test-ledger.ts b/packages/cactus-test-tooling/src/main/typescript/indy/indy-test-ledger.ts new file mode 100644 index 0000000000..d3e73193cc --- /dev/null +++ b/packages/cactus-test-tooling/src/main/typescript/indy/indy-test-ledger.ts @@ -0,0 +1,368 @@ +import { EventEmitter } from "events"; +import Docker, { Container } from "dockerode"; +import { v4 as internalIpV4 } from "internal-ip"; +import type { IndyVdrPoolConfig } from "@aries-framework/indy-vdr"; + +import { + Logger, + Checks, + LogLevelDesc, + LoggerProvider, +} from "@hyperledger/cactus-common"; + +import { Containers } from "../common/containers"; + +export interface IIndyTestLedgerOptions { + readonly containerImageName?: string; + readonly containerImageVersion?: string; + readonly logLevel?: LogLevelDesc; + readonly emitContainerLogs?: boolean; + readonly envVars?: string[]; + // For test development, attach to ledger that is already running, don't spin up new one + readonly useRunningLedger?: boolean; +} + +/** + * Default values used by IndyTestLedger constructor. + */ +export const INDY_TEST_LEDGER_DEFAULT_OPTIONS = Object.freeze({ + containerImageName: "ghcr.io/outsh/cactus-indy-all-in-one", + containerImageVersion: "0.1", + logLevel: "info" as LogLevelDesc, + emitContainerLogs: false, + envVars: [], + useRunningLedger: false, +}); + +const INDY_ENDORSER_DID_SEED = "000000000000000000000000Steward1"; +const GENESIS_FILE_PATH = "/var/lib/indy/sandbox/pool_transactions_genesis"; +const DEFAULT_DID_INDY_NAMESPACE = "cacti:test"; +const DEFAULT_POOL_ADDRESS = "172.16.0.2"; +const DEFAULT_NODE1_PORT = "9701"; +const DEFAULT_NODE1_CLIENT_PORT = "9702"; +const DEFAULT_NODE2_PORT = "9703"; +const DEFAULT_NODE2_CLIENT_PORT = "9704"; +const DEFAULT_NODE3_PORT = "9705"; +const DEFAULT_NODE3_CLIENT_PORT = "9706"; +const DEFAULT_NODE4_PORT = "9707"; +const DEFAULT_NODE4_CLIENT_PORT = "9708"; + +export class IndyTestLedger { + private readonly log: Logger; + private readonly logLevel: LogLevelDesc; + private readonly containerImageName: string; + private readonly containerImageVersion: string; + private readonly envVars: string[]; + private readonly emitContainerLogs: boolean; + public readonly useRunningLedger: boolean; + private _container: Container | undefined; + + public get fullContainerImageName(): string { + return [this.containerImageName, this.containerImageVersion].join(":"); + } + + public get className(): string { + return "IndyTestLedger"; + } + + public get container(): Container { + if (this._container) { + return this._container; + } else { + throw new Error(`Invalid state: _container is not set. Called start()?`); + } + } + + constructor(public readonly options: IIndyTestLedgerOptions) { + Checks.truthy(options, `${this.className} arg options`); + + this.logLevel = + this.options.logLevel || INDY_TEST_LEDGER_DEFAULT_OPTIONS.logLevel; + this.log = LoggerProvider.getOrCreate({ + level: this.logLevel, + label: this.className, + }); + + this.emitContainerLogs = + options?.emitContainerLogs ?? + INDY_TEST_LEDGER_DEFAULT_OPTIONS.emitContainerLogs; + this.useRunningLedger = + options?.useRunningLedger ?? + INDY_TEST_LEDGER_DEFAULT_OPTIONS.useRunningLedger; + this.containerImageName = + this.options.containerImageName || + INDY_TEST_LEDGER_DEFAULT_OPTIONS.containerImageName; + this.containerImageVersion = + this.options.containerImageVersion || + INDY_TEST_LEDGER_DEFAULT_OPTIONS.containerImageVersion; + this.envVars = + this.options.envVars || INDY_TEST_LEDGER_DEFAULT_OPTIONS.envVars; + + this.log.info( + `Created ${this.className} OK. Image FQN: ${this.fullContainerImageName}`, + ); + } + + /** + * Get container status. + * + * @returns status string + */ + public async getContainerStatus(): Promise { + if (!this.container) { + throw new Error( + "IndyTestLedger#getContainerStatus(): Container not started yet!", + ); + } + + const { Status } = await Containers.getById(this.container.id); + return Status; + } + + /** + * Start a test Indy ledger. + * + * @param omitPull Don't pull docker image from upstream if true. + * @returns Promise + */ + public async start(omitPull = false): Promise { + if (this.useRunningLedger) { + this.log.info( + "Search for already running Indy Test Ledger because 'useRunningLedger' flag is enabled.", + ); + this.log.info( + "Search criteria - image name: ", + this.fullContainerImageName, + ", state: running", + ); + const containerInfo = await Containers.getByPredicate( + (ci) => + ci.Image === this.fullContainerImageName && ci.State === "running", + ); + const docker = new Docker(); + this._container = docker.getContainer(containerInfo.Id); + return this._container; + } + + if (this._container) { + this.log.warn("Container was already running - restarting it..."); + await this.container.stop(); + await this.container.remove(); + this._container = undefined; + } + + if (!omitPull) { + await Containers.pullImage( + this.fullContainerImageName, + {}, + this.logLevel, + ); + } + + return new Promise((resolve, reject) => { + const docker = new Docker(); + const eventEmitter: EventEmitter = docker.run( + this.fullContainerImageName, + [], + [], + { + ExposedPorts: { + [`${DEFAULT_NODE1_PORT}/tcp`]: {}, + [`${DEFAULT_NODE1_CLIENT_PORT}/tcp`]: {}, + [`${DEFAULT_NODE2_PORT}/tcp`]: {}, + [`${DEFAULT_NODE2_CLIENT_PORT}/tcp`]: {}, + [`${DEFAULT_NODE3_PORT}/tcp`]: {}, + [`${DEFAULT_NODE3_CLIENT_PORT}/tcp`]: {}, + [`${DEFAULT_NODE4_PORT}/tcp`]: {}, + [`${DEFAULT_NODE4_CLIENT_PORT}/tcp`]: {}, + }, + Env: this.envVars, + HostConfig: { + PublishAllPorts: true, + }, + }, + {}, + (err?: Error) => { + if (err) { + this.log.error( + `Failed to start ${this.fullContainerImageName} container; `, + err, + ); + reject(err); + } + }, + ); + + eventEmitter.once("start", async (container: Container) => { + this._container = container; + + if (this.emitContainerLogs) { + const fnTag = `[${this.fullContainerImageName}]`; + await Containers.streamLogs({ + container: this.container, + tag: fnTag, + log: this.log, + }); + } + + try { + await Containers.waitForHealthCheck(this.container.id); + resolve(container); + } catch (ex) { + reject(ex); + } + }); + }); + } + + /** + * Stop a test Indy ledger. + * + * @returns Stop operation results. + */ + public async stop(): Promise { + if (this.useRunningLedger) { + this.log.info("Ignore stop request because useRunningLedger is enabled."); + return; + } else if (this.container) { + return Containers.stop(this.container); + } else { + throw new Error( + `IndyTestLedger#stop() Container was never created, nothing to stop.`, + ); + } + } + + /** + * Destroy a test Indy ledger. + * + * @returns Destroy operation results. + */ + public async destroy(): Promise { + if (this.useRunningLedger) { + this.log.info( + "Ignore destroy request because useRunningLedger is enabled.", + ); + return; + } else if (this.container) { + return this.container.remove(); + } else { + throw new Error( + `IndyTestLedger#destroy() Container was never created, nothing to destroy.`, + ); + } + } + + /** + * Get localhost mapping of specified container port. + * + * @param port port in container + * @returns localhost port + */ + private async getHostPort(port: string): Promise { + const fnTag = `${this.className}#getHostPort()`; + if (this.container) { + const cInfo = await Containers.getById(this.container.id); + return Containers.getPublicPort(parseInt(port, 10), cInfo); + } else { + throw new Error(`${fnTag} Container not set. Did you call start()?`); + } + } + + /** + * Read ledger `pool_transactions_genesis` file from container storage. + * Patch the node IP and ports to match the ones exported to the localhost matchine. + * + * @returns pool_transactions_genesis contents + */ + public async readPoolTransactionsGenesis(): Promise { + if (!this.container) { + throw new Error( + "IndyTestLedger#readPoolTransactionsGenesis(): Container not started yet!", + ); + } + + // Read pool_transactions_genesis file + this.log.debug("Get client config from path:", GENESIS_FILE_PATH); + let genesisFile = await Containers.pullFile( + this.container, + GENESIS_FILE_PATH, + "ascii", + ); + // this.log.debug("Raw pool_transactions_genesis file:", genesisFile); + + // Patch pool address + const localhostIp = (await internalIpV4()) || "121.0.0.1"; + this.log.debug("localhost address found:", localhostIp); + genesisFile = genesisFile.replace( + new RegExp(DEFAULT_POOL_ADDRESS, "g"), + localhostIp, + ); + + // Patch ports + genesisFile = genesisFile + .replace( + DEFAULT_NODE1_PORT, + (await this.getHostPort(DEFAULT_NODE1_PORT)).toString(), + ) + .replace( + DEFAULT_NODE1_CLIENT_PORT, + (await this.getHostPort(DEFAULT_NODE1_CLIENT_PORT)).toString(), + ) + .replace( + DEFAULT_NODE2_PORT, + (await this.getHostPort(DEFAULT_NODE2_PORT)).toString(), + ) + .replace( + DEFAULT_NODE2_CLIENT_PORT, + (await this.getHostPort(DEFAULT_NODE2_CLIENT_PORT)).toString(), + ) + .replace( + DEFAULT_NODE3_PORT, + (await this.getHostPort(DEFAULT_NODE3_PORT)).toString(), + ) + .replace( + DEFAULT_NODE3_CLIENT_PORT, + (await this.getHostPort(DEFAULT_NODE3_CLIENT_PORT)).toString(), + ) + .replace( + DEFAULT_NODE4_PORT, + (await this.getHostPort(DEFAULT_NODE4_PORT)).toString(), + ) + .replace( + DEFAULT_NODE4_CLIENT_PORT, + (await this.getHostPort(DEFAULT_NODE4_CLIENT_PORT)).toString(), + ); + this.log.debug("Patched pool_transactions_genesis file:", genesisFile); + + return genesisFile; + } + + /** + * Get indy VDR pool configuration object. + * + * @param indyNamespace namespace to use (default: `cacti:test`) + * @returns `IndyVdrPoolConfig` + */ + public async getIndyVdrPoolConfig( + indyNamespace = DEFAULT_DID_INDY_NAMESPACE, + ): Promise { + const genesisTransactions = await this.readPoolTransactionsGenesis(); + return { + isProduction: false, + genesisTransactions, + indyNamespace, + connectOnStartup: true, + }; + } + + /** + * Get secret seed of already registered endorser did on indy ledger. + * Can be imported into ledger and used to authenticate write operations on Indy VDR. + * + * @returns DID Seed + */ + public getEndorserDidSeed(): string { + return INDY_ENDORSER_DID_SEED; + } +} diff --git a/packages/cactus-test-tooling/src/main/typescript/public-api.ts b/packages/cactus-test-tooling/src/main/typescript/public-api.ts index df89cd2144..440d12cfe6 100755 --- a/packages/cactus-test-tooling/src/main/typescript/public-api.ts +++ b/packages/cactus-test-tooling/src/main/typescript/public-api.ts @@ -61,6 +61,12 @@ export { LedgerStartOptions, } from "./fabric/fabric-test-ledger-v1"; +export { + IndyTestLedger, + IIndyTestLedgerOptions, + INDY_TEST_LEDGER_DEFAULT_OPTIONS, +} from "./indy/indy-test-ledger"; + export { IrohaTestLedger, IIrohaTestLedgerOptions, diff --git a/packages/cactus-test-tooling/src/test/typescript/integration/indy/indy-test-ledger/indy-test-ledger.test.ts b/packages/cactus-test-tooling/src/test/typescript/integration/indy/indy-test-ledger/indy-test-ledger.test.ts new file mode 100644 index 0000000000..b01295e2e8 --- /dev/null +++ b/packages/cactus-test-tooling/src/test/typescript/integration/indy/indy-test-ledger/indy-test-ledger.test.ts @@ -0,0 +1,239 @@ +/** + * Tests of Indy helper typescript setup class. + */ + +////////////////////////////////// +// Constants +////////////////////////////////// + +// Ledger settings +const containerImageName = "ghcr.io/outsh/cactus-indy-all-in-one"; +const containerImageVersion = "0.1"; + +// For development on local sawtooth network +// 1. leaveLedgerRunning = true, useRunningLedger = false to run ledger and leave it running after test finishes. +// 2. leaveLedgerRunning = true, useRunningLedger = true to use that ledger in future runs. +const leaveLedgerRunning = false; +const useRunningLedger = false; + +// Log settings +const testLogLevel: LogLevelDesc = "info"; + +import { + IndyTestLedger, + pruneDockerAllIfGithubAction, +} from "../../../../../main/typescript/index"; + +import { + LogLevelDesc, + LoggerProvider, + Logger, +} from "@hyperledger/cactus-common"; + +import * as path from "node:path"; +import * as os from "node:os"; +import { rm } from "node:fs/promises"; +import "jest-extended"; +import { v4 as uuidv4 } from "uuid"; +import { + Agent, + DidsModule, + TypedArrayEncoder, + KeyType, +} from "@aries-framework/core"; +import { + IndyVdrIndyDidResolver, + IndyVdrModule, +} from "@aries-framework/indy-vdr"; +import { AskarModule } from "@aries-framework/askar"; +import { agentDependencies } from "@aries-framework/node"; +import { ariesAskar } from "@hyperledger/aries-askar-nodejs"; +import { indyVdr } from "@hyperledger/indy-vdr-nodejs"; + +const TEST_WALLET_PATH = path.join( + os.tmpdir(), + "indy-test-ledger.test-test-wallet", +); +const TEST_INDY_NAMESPACE = "cacti:test"; + +// Logger setup +const log: Logger = LoggerProvider.getOrCreate({ + label: "indy-test-ledger.test", + level: testLogLevel, +}); + +/** + * Import endorser DID using it's seed. + * @warn If there's any endorser DID already in a wallet then it will be returned. New one (`seed`) will be ignored! + * + * @param agent Aries agent + * @param seed private DID seed + * + * @returns endorser fully-qualified DID + */ +async function importExistingIndyDidFromPrivateKey( + agent: Agent, + seed: string, +): Promise { + const [endorserDid] = await agent.dids.getCreatedDids({ method: "indy" }); + if (endorserDid) { + throw new Error("Endorser DID already present in a wallet"); + } + + const seedBuffer = TypedArrayEncoder.fromString(seed); + const key = await agent.wallet.createKey({ + keyType: KeyType.Ed25519, + privateKey: seedBuffer, + }); + + // did is first 16 bytes of public key encoded as base58 + const unqualifiedIndyDid = TypedArrayEncoder.toBase58( + key.publicKey.slice(0, 16), + ); + + const did = `did:indy:${TEST_INDY_NAMESPACE}:${unqualifiedIndyDid}`; + + await agent.dids.import({ + did, + }); + + return did; +} + +/** + * Main test suite + */ +describe("Indy Test Ledger checks", () => { + const walletName = uuidv4(); + let ledger: IndyTestLedger; + + ////////////////////////////////// + // Environment Setup + ////////////////////////////////// + + beforeAll(async () => { + log.info("Prune Docker..."); + await pruneDockerAllIfGithubAction({ logLevel: testLogLevel }); + + log.info("Start IndyTestLedger..."); + ledger = new IndyTestLedger({ + containerImageName, + containerImageVersion, + useRunningLedger, + emitContainerLogs: false, + logLevel: testLogLevel, + }); + log.debug("Indy image:", ledger.fullContainerImageName); + expect(ledger).toBeTruthy(); + + await ledger.start(); + }); + + afterAll(async () => { + log.info("FINISHING THE TESTS"); + + if (ledger && !leaveLedgerRunning) { + log.info("Stop the indy ledger..."); + await ledger.stop(); + await ledger.destroy(); + } + + log.info("Prune Docker..."); + await pruneDockerAllIfGithubAction({ logLevel: testLogLevel }); + + try { + await rm(TEST_WALLET_PATH, { + recursive: true, + force: true, + maxRetries: 5, + }); + log.info(`${TEST_WALLET_PATH} removed successfully.`); + } catch (error) { + log.warn(`${TEST_WALLET_PATH} could not be removed:`, error); + } + }); + + ////////////////////////////////// + // Tests + ////////////////////////////////// + + /** + * Check if started container is still healthy. + */ + test("Started container is healthy", async () => { + const status = await ledger.getContainerStatus(); + expect(status).toEndWith("(healthy)"); + }); + + test("Can read pool_transactions_genesis file from a container", async () => { + const genesisObj = await ledger.readPoolTransactionsGenesis(); + const genesisTxList = genesisObj + .split("\n") + .filter((v: string) => v.trim()); // remove empty lines + expect(genesisTxList.length).toBeGreaterThan(0); + + for (const tx of genesisTxList) { + expect(tx).toBeTruthy(); + const parsedTx = JSON.parse(tx); + expect(parsedTx).toBeTruthy(); + const txData = parsedTx.txn.data.data; + expect(txData).toBeTruthy(); + expect(txData.node_ip).toBeTruthy(); + expect(txData.node_port).toBeTruthy(); + } + }); + + test("Can get valid IndyVdrPoolConfig", async () => { + const indyPoolConfig = await ledger.getIndyVdrPoolConfig(); + expect(indyPoolConfig).toBeTruthy(); + expect(indyPoolConfig.isProduction).toBeDefined(); + expect(indyPoolConfig.genesisTransactions).toBeTruthy(); + expect(indyPoolConfig.indyNamespace).toBeTruthy(); + expect(indyPoolConfig.connectOnStartup).toBeDefined(); + }); + + test("Indy agent can connect and resolve did on the pool", async () => { + const indyPoolConfig = + await ledger.getIndyVdrPoolConfig(TEST_INDY_NAMESPACE); + expect(indyPoolConfig).toBeTruthy(); + const agent = new Agent({ + config: { + label: walletName, + walletConfig: { + id: walletName, + key: walletName, + storage: { + type: "sqlite", + path: path.join(TEST_WALLET_PATH, "test-wallet.sqlite"), + }, + }, + }, + modules: { + indyVdr: new IndyVdrModule({ + indyVdr, + networks: [indyPoolConfig], + }), + dids: new DidsModule({ + resolvers: [new IndyVdrIndyDidResolver()], + }), + askar: new AskarModule({ ariesAskar }), + }, + dependencies: agentDependencies, + }); + expect(agent).toBeTruthy(); + + try { + await agent.initialize(); + expect(agent.isInitialized).toBeTrue(); + + await importExistingIndyDidFromPrivateKey( + agent, + ledger.getEndorserDidSeed(), + ); + const createdDids = await agent.dids.getCreatedDids(); + expect(createdDids.length).toBeGreaterThan(0); + } finally { + agent.shutdown(); + } + }); +}); diff --git a/packages/cactus-test-verifier-client/package.json b/packages/cactus-test-verifier-client/package.json index 84c07e127a..3477a38915 100644 --- a/packages/cactus-test-verifier-client/package.json +++ b/packages/cactus-test-verifier-client/package.json @@ -56,7 +56,9 @@ "body-parser": "1.20.2", "express": "4.18.2", "log4js": "6.4.1", - "socket.io": "4.5.4" + "socket.io": "4.5.4", + "web3": "1.7.3", + "web3-core": "1.7.3" }, "devDependencies": { "@types/body-parser": "1.19.4", diff --git a/tools/docker/indy-all-in-one/script-cleanup.sh b/tools/docker/indy-all-in-one/script-cleanup.sh index 446122eaa4..95d56e5644 100755 --- a/tools/docker/indy-all-in-one/script-cleanup.sh +++ b/tools/docker/indy-all-in-one/script-cleanup.sh @@ -4,7 +4,7 @@ echo "# Stop running indy" docker compose down echo "# Clean Indy data" -rm -fr /tmp/indy-all-in-one/* +rm -fr /tmp/indy-all-in-one echo "# Remove cacti wallets from '~/.afj' (Aries JS Framework)" sudo find ~/.afj/data/wallet/ -iname '*cacti*' -exec rm -fr {} \; diff --git a/yarn.lock b/yarn.lock index 1ce2c66f9a..9997552c2c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8506,7 +8506,13 @@ __metadata: version: 0.0.0-use.local resolution: "@hyperledger/cactus-test-tooling@workspace:packages/cactus-test-tooling" dependencies: + "@aries-framework/askar": 0.5.0-alpha.58 + "@aries-framework/core": 0.5.0-alpha.58 + "@aries-framework/indy-vdr": 0.5.0-alpha.58 + "@aries-framework/node": 0.5.0-alpha.58 + "@hyperledger/aries-askar-nodejs": 0.2.0-dev.1 "@hyperledger/cactus-common": 2.0.0-alpha.2 + "@hyperledger/indy-vdr-nodejs": 0.2.0-dev.3 "@types/dockerode": 3.2.7 "@types/esm": 3.2.0 "@types/fs-extra": 9.0.13 @@ -8568,6 +8574,8 @@ __metadata: log4js: 6.4.1 socket.io: 4.5.4 uuid: 9.0.1 + web3: 1.7.3 + web3-core: 1.7.3 web3-eth-accounts: 4.0.3 languageName: unknown linkType: soft @@ -48926,6 +48934,17 @@ __metadata: languageName: node linkType: hard +"web3-bzz@npm:1.7.3": + version: 1.7.3 + resolution: "web3-bzz@npm:1.7.3" + dependencies: + "@types/node": ^12.12.6 + got: 9.6.0 + swarm-js: ^0.1.40 + checksum: cd4dddd51b445bd40d3e2fd57eba268d3cbc9d359e5b8ebd16735183135387f509923ff12ec5f0645a0faeaeed4ea7d4753385fdd289c74280cc774e89e5a56e + languageName: node + linkType: hard + "web3-bzz@npm:1.8.1": version: 1.8.1 resolution: "web3-bzz@npm:1.8.1" @@ -48987,6 +49006,16 @@ __metadata: languageName: node linkType: hard +"web3-core-helpers@npm:1.7.3": + version: 1.7.3 + resolution: "web3-core-helpers@npm:1.7.3" + dependencies: + web3-eth-iban: 1.7.3 + web3-utils: 1.7.3 + checksum: 8c02f7fe202f74f925a18cf6f32649df5caa3221cefc493a6a4fb554d43bece1b4dc7a4cb0952c9d8669a4766dfdafb6d6100a5f68d109b89cc7cf314ed59959 + languageName: node + linkType: hard + "web3-core-helpers@npm:1.8.1": version: 1.8.1 resolution: "web3-core-helpers@npm:1.8.1" @@ -49063,6 +49092,19 @@ __metadata: languageName: node linkType: hard +"web3-core-method@npm:1.7.3": + version: 1.7.3 + resolution: "web3-core-method@npm:1.7.3" + dependencies: + "@ethersproject/transactions": ^5.0.0-beta.135 + web3-core-helpers: 1.7.3 + web3-core-promievent: 1.7.3 + web3-core-subscriptions: 1.7.3 + web3-utils: 1.7.3 + checksum: cd1940676eb9ed6a28d172f9beaaccbb2021e831a19d690f9b50fa913a66be7bd8e85928c2a542c03f15ccdfb5dae63e43bcc8f04cd652b897233ae584a68d57 + languageName: node + linkType: hard + "web3-core-method@npm:1.8.1": version: 1.8.1 resolution: "web3-core-method@npm:1.8.1" @@ -49121,6 +49163,15 @@ __metadata: languageName: node linkType: hard +"web3-core-promievent@npm:1.7.3": + version: 1.7.3 + resolution: "web3-core-promievent@npm:1.7.3" + dependencies: + eventemitter3: 4.0.4 + checksum: a4784709f7c581bc3d74d996c80d764e95f73ebb30a7383f1af16bfc4c67e3c9fc0524962e48241fa180bce13d489b41f87a88f717e1009299ed0562612a0ad7 + languageName: node + linkType: hard + "web3-core-promievent@npm:1.8.1": version: 1.8.1 resolution: "web3-core-promievent@npm:1.8.1" @@ -49195,6 +49246,19 @@ __metadata: languageName: node linkType: hard +"web3-core-requestmanager@npm:1.7.3": + version: 1.7.3 + resolution: "web3-core-requestmanager@npm:1.7.3" + dependencies: + util: ^0.12.0 + web3-core-helpers: 1.7.3 + web3-providers-http: 1.7.3 + web3-providers-ipc: 1.7.3 + web3-providers-ws: 1.7.3 + checksum: fcee4c1280b621d9e50b339995295ece6a17b1de73b6e9acf490ea08037f3d3b39f0b2a339def4e470f5bbb2dec49634887089128cebb9b98da54e8f54b9a142 + languageName: node + linkType: hard + "web3-core-requestmanager@npm:1.8.1": version: 1.8.1 resolution: "web3-core-requestmanager@npm:1.8.1" @@ -49258,6 +49322,16 @@ __metadata: languageName: node linkType: hard +"web3-core-subscriptions@npm:1.7.3": + version: 1.7.3 + resolution: "web3-core-subscriptions@npm:1.7.3" + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.7.3 + checksum: 6b524a9df78ded17313979508564b1246cec8df99849d77d87f6c8316d276f62744ef05663cdb130bae8c9ddab56e3a267091a9051418a035c537bf90bafea28 + languageName: node + linkType: hard + "web3-core-subscriptions@npm:1.8.1": version: 1.8.1 resolution: "web3-core-subscriptions@npm:1.8.1" @@ -49343,6 +49417,21 @@ __metadata: languageName: node linkType: hard +"web3-core@npm:1.7.3": + version: 1.7.3 + resolution: "web3-core@npm:1.7.3" + dependencies: + "@types/bn.js": ^4.11.5 + "@types/node": ^12.12.6 + bignumber.js: ^9.0.0 + web3-core-helpers: 1.7.3 + web3-core-method: 1.7.3 + web3-core-requestmanager: 1.7.3 + web3-utils: 1.7.3 + checksum: 2959ea9bb018e8346ef14456a46b4ad06e68529882be1d6059876f60c9feeda6d7acf6d4e4f4c8caa1b45a216c904860c4113fd93e499af64d637cd5787a7b60 + languageName: node + linkType: hard + "web3-core@npm:1.8.1": version: 1.8.1 resolution: "web3-core@npm:1.8.1" @@ -49519,6 +49608,16 @@ __metadata: languageName: node linkType: hard +"web3-eth-abi@npm:1.7.3": + version: 1.7.3 + resolution: "web3-eth-abi@npm:1.7.3" + dependencies: + "@ethersproject/abi": 5.0.7 + web3-utils: 1.7.3 + checksum: 878ace128ce24f8deca93e4656950b4e582a2dd2aac8d2d718ddf611429266a4b6e25b0afe5000a19ef3876cc786fa165c9be7752d60f49dd4659462a0bd2e79 + languageName: node + linkType: hard + "web3-eth-abi@npm:1.8.1": version: 1.8.1 resolution: "web3-eth-abi@npm:1.8.1" @@ -49668,6 +49767,25 @@ __metadata: languageName: node linkType: hard +"web3-eth-accounts@npm:1.7.3": + version: 1.7.3 + resolution: "web3-eth-accounts@npm:1.7.3" + dependencies: + "@ethereumjs/common": ^2.5.0 + "@ethereumjs/tx": ^3.3.2 + crypto-browserify: 3.12.0 + eth-lib: 0.2.8 + ethereumjs-util: ^7.0.10 + scrypt-js: ^3.0.1 + uuid: 3.3.2 + web3-core: 1.7.3 + web3-core-helpers: 1.7.3 + web3-core-method: 1.7.3 + web3-utils: 1.7.3 + checksum: 141edccc5ac4371f610f1436ecb1340a7cb2739b6298d772c732348631e01ef2060620b3cca7d43daac647a4b6cf84157f8fae6df921896642c6aa376449860b + languageName: node + linkType: hard + "web3-eth-accounts@npm:1.8.1": version: 1.8.1 resolution: "web3-eth-accounts@npm:1.8.1" @@ -49811,6 +49929,22 @@ __metadata: languageName: node linkType: hard +"web3-eth-contract@npm:1.7.3": + version: 1.7.3 + resolution: "web3-eth-contract@npm:1.7.3" + dependencies: + "@types/bn.js": ^4.11.5 + web3-core: 1.7.3 + web3-core-helpers: 1.7.3 + web3-core-method: 1.7.3 + web3-core-promievent: 1.7.3 + web3-core-subscriptions: 1.7.3 + web3-eth-abi: 1.7.3 + web3-utils: 1.7.3 + checksum: e5bdb00cdff0ad5d4282de52cf8046dcfc24df8a5f338075345cc50953d2387a3b9ea6ff505334ee62a09e6d8fe533d048891df2821069f902fa519120c1a7c7 + languageName: node + linkType: hard + "web3-eth-contract@npm:1.8.1": version: 1.8.1 resolution: "web3-eth-contract@npm:1.8.1" @@ -49951,6 +50085,22 @@ __metadata: languageName: node linkType: hard +"web3-eth-ens@npm:1.7.3": + version: 1.7.3 + resolution: "web3-eth-ens@npm:1.7.3" + dependencies: + content-hash: ^2.5.2 + eth-ens-namehash: 2.0.8 + web3-core: 1.7.3 + web3-core-helpers: 1.7.3 + web3-core-promievent: 1.7.3 + web3-eth-abi: 1.7.3 + web3-eth-contract: 1.7.3 + web3-utils: 1.7.3 + checksum: b079e72e27831a377078b9c3cccc2d30295667d03d368b10a061f8d36e445557d75dfd986ea5b170baf15964f2a1c42a77d78aebbe5d249f60f5eff3ed0efa10 + languageName: node + linkType: hard + "web3-eth-ens@npm:1.8.1": version: 1.8.1 resolution: "web3-eth-ens@npm:1.8.1" @@ -50085,6 +50235,16 @@ __metadata: languageName: node linkType: hard +"web3-eth-iban@npm:1.7.3": + version: 1.7.3 + resolution: "web3-eth-iban@npm:1.7.3" + dependencies: + bn.js: ^4.11.9 + web3-utils: 1.7.3 + checksum: 0e36167c63955f3e0481b99b3e2fa89246785678644cdb42c73ee013220182d06abad91ddc32e5c726fa7a06db17aace48ffc167cb1e3411530e441a6fbaa0cc + languageName: node + linkType: hard + "web3-eth-iban@npm:1.8.1": version: 1.8.1 resolution: "web3-eth-iban@npm:1.8.1" @@ -50187,6 +50347,20 @@ __metadata: languageName: node linkType: hard +"web3-eth-personal@npm:1.7.3": + version: 1.7.3 + resolution: "web3-eth-personal@npm:1.7.3" + dependencies: + "@types/node": ^12.12.6 + web3-core: 1.7.3 + web3-core-helpers: 1.7.3 + web3-core-method: 1.7.3 + web3-net: 1.7.3 + web3-utils: 1.7.3 + checksum: be938abdc281c14f8d6ef7c7e980def172ea5b28aa4c7b0d18e81452938fcc9d193bfa42006641ad13d60775af12954f98cd91c41f3aa11181386d5f551bbaec + languageName: node + linkType: hard + "web3-eth-personal@npm:1.8.1": version: 1.8.1 resolution: "web3-eth-personal@npm:1.8.1" @@ -50337,6 +50511,26 @@ __metadata: languageName: node linkType: hard +"web3-eth@npm:1.7.3": + version: 1.7.3 + resolution: "web3-eth@npm:1.7.3" + dependencies: + web3-core: 1.7.3 + web3-core-helpers: 1.7.3 + web3-core-method: 1.7.3 + web3-core-subscriptions: 1.7.3 + web3-eth-abi: 1.7.3 + web3-eth-accounts: 1.7.3 + web3-eth-contract: 1.7.3 + web3-eth-ens: 1.7.3 + web3-eth-iban: 1.7.3 + web3-eth-personal: 1.7.3 + web3-net: 1.7.3 + web3-utils: 1.7.3 + checksum: 5d7d1606b484098ff7943f132ef2c805c2fd2596386917e828f7ee8dbac3497cbc0a81df240e13ffb3289b59c9f72191a02e0f2636034b846b094d927821c7b3 + languageName: node + linkType: hard + "web3-eth@npm:1.8.1": version: 1.8.1 resolution: "web3-eth@npm:1.8.1" @@ -50458,6 +50652,17 @@ __metadata: languageName: node linkType: hard +"web3-net@npm:1.7.3": + version: 1.7.3 + resolution: "web3-net@npm:1.7.3" + dependencies: + web3-core: 1.7.3 + web3-core-method: 1.7.3 + web3-utils: 1.7.3 + checksum: 09b31ab30dc59650ee83d8752b753b18862522d372d3101acc620ed188792c46e844e363c55da06f64400e587f37f609381f353a862ef14b379decf48f36173b + languageName: node + linkType: hard + "web3-net@npm:1.8.1": version: 1.8.1 resolution: "web3-net@npm:1.8.1" @@ -50559,6 +50764,16 @@ __metadata: languageName: node linkType: hard +"web3-providers-http@npm:1.7.3": + version: 1.7.3 + resolution: "web3-providers-http@npm:1.7.3" + dependencies: + web3-core-helpers: 1.7.3 + xhr2-cookies: 1.1.0 + checksum: e1539a36aec1b8f49fd79e407086c96274f4d62f33646bc95b65a94ccad8cb15bc40f6040cddc1eb018bfc3199687d6a6b7c18f11bb8423f6e24b1567e1191e2 + languageName: node + linkType: hard + "web3-providers-http@npm:1.8.1": version: 1.8.1 resolution: "web3-providers-http@npm:1.8.1" @@ -50657,6 +50872,16 @@ __metadata: languageName: node linkType: hard +"web3-providers-ipc@npm:1.7.3": + version: 1.7.3 + resolution: "web3-providers-ipc@npm:1.7.3" + dependencies: + oboe: 2.1.5 + web3-core-helpers: 1.7.3 + checksum: 28e7dbc73dc6f32302d1a579c48682efa3584150042883e5e8b1774c1beab848ac16d3932c94bfb9af5aac6f1558d920c8672079e67e5aff03be9510506cb184 + languageName: node + linkType: hard + "web3-providers-ipc@npm:1.8.1": version: 1.8.1 resolution: "web3-providers-ipc@npm:1.8.1" @@ -50755,6 +50980,17 @@ __metadata: languageName: node linkType: hard +"web3-providers-ws@npm:1.7.3": + version: 1.7.3 + resolution: "web3-providers-ws@npm:1.7.3" + dependencies: + eventemitter3: 4.0.4 + web3-core-helpers: 1.7.3 + websocket: ^1.0.32 + checksum: 041427c34763579ed89f16de63e811de4cb502a43b4d120fe725cf33e879a7d104fca34093a18f6bb3a0b10596543e5905875377c1fed35f56ce86c5dae3475c + languageName: node + linkType: hard + "web3-providers-ws@npm:1.8.1": version: 1.8.1 resolution: "web3-providers-ws@npm:1.8.1" @@ -50889,6 +51125,18 @@ __metadata: languageName: node linkType: hard +"web3-shh@npm:1.7.3": + version: 1.7.3 + resolution: "web3-shh@npm:1.7.3" + dependencies: + web3-core: 1.7.3 + web3-core-method: 1.7.3 + web3-core-subscriptions: 1.7.3 + web3-net: 1.7.3 + checksum: c4b66aa9361d7dc2e66f88b106e1eae81587465ab85b3c31b9979c1247fa4e6cd7aa44d0e8c8411e26df51aa75ccd1c24efb11d87b5e8eef1beab241faf925a8 + languageName: node + linkType: hard + "web3-shh@npm:1.8.1": version: 1.8.1 resolution: "web3-shh@npm:1.8.1" @@ -51012,6 +51260,21 @@ __metadata: languageName: node linkType: hard +"web3-utils@npm:1.7.3": + version: 1.7.3 + resolution: "web3-utils@npm:1.7.3" + dependencies: + bn.js: ^4.11.9 + ethereum-bloom-filters: ^1.0.6 + ethereumjs-util: ^7.1.0 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: ^2.1.0 + utf8: 3.0.0 + checksum: 96fd1d7310f4674ddccbd1f2f8e1ff1817b8869a67a1562ef3ce1130ae50dfec8e64fc4ce9f80855d87fa63fb6dd71b4561e5e1925be5b26f3787b0d4e5f89e7 + languageName: node + linkType: hard + "web3-utils@npm:1.8.1": version: 1.8.1 resolution: "web3-utils@npm:1.8.1" @@ -51172,6 +51435,21 @@ __metadata: languageName: node linkType: hard +"web3@npm:1.7.3": + version: 1.7.3 + resolution: "web3@npm:1.7.3" + dependencies: + web3-bzz: 1.7.3 + web3-core: 1.7.3 + web3-eth: 1.7.3 + web3-eth-personal: 1.7.3 + web3-net: 1.7.3 + web3-shh: 1.7.3 + web3-utils: 1.7.3 + checksum: a944c296e75bd9c5e95687754524561ca993663d0c57ca2e8da794b9e8de57d319522fa05ec3b06d98382cc9ba59a0b8f17eb092782aa849b4e8cecc7867522a + languageName: node + linkType: hard + "web3@npm:1.8.1": version: 1.8.1 resolution: "web3@npm:1.8.1"