diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 19ea5d8..b646384 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,6 +13,8 @@ jobs: version: 'latest' - name: Install modules run: yarn + - name: Build package + run: yarn build - name: Run unit tests run: yarn test:unit - name: Run integration tests [basic] @@ -24,7 +26,7 @@ jobs: - name: Run regression tests run: yarn test:regression - name: Test example rust contracts - run: yarn build && yarn build:test:wasm + run: yarn build:test:wasm - name: Trigger integration tests if: github.ref_name == 'main' run: > @@ -35,4 +37,3 @@ jobs: -H "X-GitHub-Api-Version: 2022-11-28" https://api.github.com/repos/warp-contracts/warp-integration-tests/dispatches -d '{"event_type":"sdk_push","client_payload":{"ref":"${{github.ref}}","sha":"${{github.sha}}"}}' - diff --git a/package.json b/package.json index 196b923..96e6408 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,8 @@ "build:types": "tsc -b tsconfig.types.json", "bundle": "node bundle.js", "build": "yarn run clean && yarn build:cjs && yarn build:mjs && yarn mjs:burn:in:hell && yarn build:types && yarn bundle", + "install:warp": "yarn add -D warp-contracts@file:./lib/cjs", + "remove:warp": "yarn remove warp-contracts", "format": "prettier --write 'src/**/*.ts'", "clean": "rimraf ./lib", "lint": "eslint . --ext .ts --max-warnings=0", @@ -30,17 +32,18 @@ "version": "yarn format && git add -A src", "postversion": "git push origin HEAD && git push --tags", "yalc:publish": "yarn build && yalc publish --push", - "test": "jest", - "test:unit": "jest ./src/__tests__/unit", - "test:unit:cache": "jest ./src/__tests__/unit/cache-leveldb.test.ts", - "test:unit:cache:real": "jest ./src/__tests__/unit/cache-leveldb-real-data.test.ts", - "test:integration": "jest ./src/__tests__/integration", - "test:integration:basic": "jest ./src/__tests__/integration/basic", - "test:integration:basic:load": "jest --silent=false --detectOpenHandles ./src/__tests__/integration/basic/contract-loading.test.ts ", - "test:integration:basic:arweave": "jest ./src/__tests__/integration/basic/arweave-transactions-loading", - "test:integration:internal-writes": "jest ./src/__tests__/integration/internal-writes", - "test:integration:wasm": "jest ./src/__tests__/integration/wasm", - "test:regression": "node ./node_modules/.bin/jest ./src/__tests__/regression", + "argument": "echo \"The value of --foo is ${file} end of script\"", + "test": "yarn install:warp && jest ${file} && yarn remove:warp", + "test:unit": "file=./src/__tests__/unit yarn test", + "test:unit:cache": "file=./src/__tests__/unit/cache-leveldb.test.ts yarn test", + "test:unit:cache:real": "file=./src/__tests__/unit/cache-leveldb-real-data.test.ts yarn test", + "test:integration": "file=./src/__tests__/integration yarn test", + "test:integration:basic": "file=./src/__tests__/integration/basic yarn test", + "test:integration:basic:load": "--silent=false --detectOpenHandles file=./src/__tests__/integration/basic/contract-loading.test.ts yarn test", + "test:integration:basic:arweave": "file=./src/__tests__/integration/basic/arweave-transactions-loading yarn test", + "test:integration:internal-writes": "file=./src/__tests__/integration/internal-writes yarn test", + "test:integration:wasm": "file=./src/__tests__/integration/wasm yarn test", + "test:regression": "yarn install:warp && node ./node_modules/.bin/jest ./src/__tests__/regression && yarn remove:warp", "build:toy-contract": "wasm-pack build --target nodejs --dev --out-name rust-contract crates/toy-contract", "test:toy-contract": "jest crates/toy-contract/tests", "build:pst": "wasm-pack build --target nodejs --dev --out-name rust-contract crates/pst/contract/implementation", @@ -50,7 +53,7 @@ "format:json-bindings:pst": "eslint 'crates/pst/contract/definition/bindings/json/*.json' --fix", "format:ts-bindings:pst": "eslint 'crates/pst/contract/definition/bindings/ts/*.ts' --fix", "test:pst": "jest crates/pst/tests", - "build:test:wasm": "yarn build:toy-contract && yarn test:toy-contract && yarn build:pst && yarn gen-bindings:pst && yarn test:pst" + "build:test:wasm": "yarn install:warp && yarn build:toy-contract && yarn test:toy-contract && yarn build:pst && yarn gen-bindings:pst && yarn test:pst" }, "license": "MIT", "author": "Redstone Team ", @@ -88,7 +91,6 @@ "safe-stable-stringify": "2.4.1", "stream-buffers": "^3.0.2", "unzipit": "^1.4.0", - "vm2": "3.9.15", "warp-isomorphic": "1.0.4", "warp-wasm-metering": "1.0.1" }, @@ -114,7 +116,8 @@ "ts-jest": "^28.0.7", "ts-node": "^10.2.1", "typescript": "^4.9.5", - "warp-contracts-plugin-deploy": "1.0.0-beta.16", + "warp-contracts-plugin-deploy": "^1.0.3", + "warp-contracts-plugin-vm2": "1.0.0", "ws": "^8.11.0" }, "resolutions": { @@ -131,7 +134,6 @@ "fs": false, "path": false, "crypto": false, - "vm2": false, "archiver": false, "stream-buffers": false, "constants": false, diff --git a/src/__tests__/integration/basic/complicated-contract.test.ts b/src/__tests__/integration/basic/complicated-contract.test.ts index 7004b42..cf5a239 100644 --- a/src/__tests__/integration/basic/complicated-contract.test.ts +++ b/src/__tests__/integration/basic/complicated-contract.test.ts @@ -9,9 +9,11 @@ import { Warp } from '../../../core/Warp'; import { WarpFactory } from '../../../core/WarpFactory'; import { LoggerFactory } from '../../../logging/LoggerFactory'; import { DeployPlugin } from 'warp-contracts-plugin-deploy'; +import { VM2Plugin } from 'warp-contracts-plugin-vm2'; let arlocal: ArLocal; let warp: Warp; +let warpVm: Warp; let contract: Contract; let contractVM: Contract; @@ -29,6 +31,7 @@ describe('Testing the Warp client', () => { LoggerFactory.INST.logLevel('error'); warp = WarpFactory.forLocal(1800).use(new DeployPlugin()); + warpVm = WarpFactory.forLocal(1800).use(new DeployPlugin()).use(new VM2Plugin()); ({ jwk: wallet } = await warp.generateWallet()); contractSrc = fs.readFileSync(path.join(__dirname, '../data/very-complicated-contract.js'), 'utf8'); @@ -43,8 +46,7 @@ describe('Testing the Warp client', () => { contract = warp.contract(contractTxId).setEvaluationOptions({ mineArLocalBlocks: false }); - contractVM = warp.contract(contractTxId).setEvaluationOptions({ - useVM2: true, + contractVM = warpVm.contract(contractTxId).setEvaluationOptions({ mineArLocalBlocks: false }); contract.connect(wallet); diff --git a/src/__tests__/integration/basic/deploy-write-read.test.ts b/src/__tests__/integration/basic/deploy-write-read.test.ts index 8e85f57..8664fc2 100644 --- a/src/__tests__/integration/basic/deploy-write-read.test.ts +++ b/src/__tests__/integration/basic/deploy-write-read.test.ts @@ -9,6 +9,7 @@ import { Warp } from '../../../core/Warp'; import { WarpFactory } from '../../../core/WarpFactory'; import { LoggerFactory } from '../../../logging/LoggerFactory'; import { DeployPlugin } from 'warp-contracts-plugin-deploy'; +import { VM2Plugin } from 'warp-contracts-plugin-vm2'; interface ExampleContractState { counter: number; @@ -31,6 +32,7 @@ describe('Testing the Warp client', () => { let arlocal: ArLocal; let warp: Warp; + let warpVm: Warp; let contract: Contract; let contractInitData: Contract; let contractVM: Contract; @@ -43,6 +45,7 @@ describe('Testing the Warp client', () => { LoggerFactory.INST.logLevel('error'); warp = WarpFactory.forLocal(1810).use(new DeployPlugin()); + warpVm = WarpFactory.forLocal(1810).use(new DeployPlugin()).use(new VM2Plugin()); ({ jwk: wallet } = await warp.generateWallet()); contractSrc = fs.readFileSync(path.join(__dirname, '../data/example-contract.js'), 'utf8'); @@ -65,8 +68,7 @@ describe('Testing the Warp client', () => { contract = warp.contract(contractTxId).setEvaluationOptions({ mineArLocalBlocks: false }); - contractVM = warp.contract(contractTxId).setEvaluationOptions({ - useVM2: true, + contractVM = warpVm.contract(contractTxId).setEvaluationOptions({ mineArLocalBlocks: false }); contractInitData = warp.contract(contractInitDataTxId).setEvaluationOptions({ diff --git a/src/__tests__/integration/basic/pst.test.ts b/src/__tests__/integration/basic/pst.test.ts index 079b0b2..1fe6983 100644 --- a/src/__tests__/integration/basic/pst.test.ts +++ b/src/__tests__/integration/basic/pst.test.ts @@ -11,6 +11,7 @@ import { Warp } from '../../../core/Warp'; import { WarpFactory } from '../../../core/WarpFactory'; import { LoggerFactory } from '../../../logging/LoggerFactory'; import { DeployPlugin } from 'warp-contracts-plugin-deploy'; +import { VM2Plugin } from 'warp-contracts-plugin-vm2'; describe('Testing the Profit Sharing Token', () => { let contractSrc: string; @@ -23,6 +24,7 @@ describe('Testing the Profit Sharing Token', () => { let arweave: Arweave; let arlocal: ArLocal; let warp: Warp; + let warpVm: Warp; let pst: PstContract; let pstVM: PstContract; @@ -34,6 +36,7 @@ describe('Testing the Profit Sharing Token', () => { LoggerFactory.INST.logLevel('error'); warp = WarpFactory.forLocal(1820).use(new DeployPlugin()); + warpVm = WarpFactory.forLocal(1820).use(new DeployPlugin()).use(new VM2Plugin()); ({ arweave } = warp); ({ jwk: wallet, address: walletAddress } = await warp.generateWallet()); @@ -61,9 +64,7 @@ describe('Testing the Profit Sharing Token', () => { // connecting to the PST contract pst = warp.pst(contractTxId); - pstVM = warp.pst(contractTxId).setEvaluationOptions({ - useVM2: true - }) as PstContract; + pstVM = warpVm.pst(contractTxId); // connecting wallet to the PST contract pst.connect(wallet); diff --git a/src/__tests__/integration/internal-writes/internal-write-callee.test.ts b/src/__tests__/integration/internal-writes/internal-write-callee.test.ts index 84dcb81..aa8ccfd 100644 --- a/src/__tests__/integration/internal-writes/internal-write-callee.test.ts +++ b/src/__tests__/integration/internal-writes/internal-write-callee.test.ts @@ -10,6 +10,7 @@ import { Warp } from '../../../core/Warp'; import { WarpFactory } from '../../../core/WarpFactory'; import { LoggerFactory } from '../../../logging/LoggerFactory'; import { DeployPlugin } from 'warp-contracts-plugin-deploy'; +import { VM2Plugin } from 'warp-contracts-plugin-vm2'; interface ExampleContractState { counter: number; @@ -52,6 +53,7 @@ describe('Testing internal writes', () => { let arlocal: ArLocal; let warp: Warp; + let warpVm: Warp; let calleeContract: Contract; let calleeContractVM: Contract; let callingContract: Contract; @@ -75,6 +77,7 @@ describe('Testing internal writes', () => { async function deployContracts() { warp = WarpFactory.forLocal(port).use(new DeployPlugin()); + warpVm = WarpFactory.forLocal(port).use(new DeployPlugin()).use(new VM2Plugin()); ({ jwk: wallet } = await warp.generateWallet()); callingContractSrc = fs.readFileSync(path.join(__dirname, '../data/writing-contract.js'), 'utf8'); @@ -101,11 +104,10 @@ describe('Testing internal writes', () => { mineArLocalBlocks: false }) .connect(wallet); - calleeContractVM = warp + calleeContractVM = warpVm .contract(calleeTxId) .setEvaluationOptions({ internalWrites: true, - useVM2: true, mineArLocalBlocks: false }) .connect(wallet); @@ -117,11 +119,10 @@ describe('Testing internal writes', () => { mineArLocalBlocks: false }) .connect(wallet); - callingContractVM = warp + callingContractVM = warpVm .contract(callingTxId) .setEvaluationOptions({ internalWrites: true, - useVM2: true, mineArLocalBlocks: false }) .connect(wallet); @@ -272,10 +273,10 @@ describe('Testing internal writes', () => { }); const calleeContract2VM = WarpFactory.forLocal(port) .use(new DeployPlugin()) + .use(new VM2Plugin()) .contract(calleeTxId) .setEvaluationOptions({ - internalWrites: true, - useVM2: true + internalWrites: true }); expect((await calleeContract2.readState()).cachedValue.state.counter).toEqual(634); expect((await calleeContract2VM.readState()).cachedValue.state.counter).toEqual(634); diff --git a/src/__tests__/regression/read-state.test.ts b/src/__tests__/regression/read-state.test.ts index 26347c8..8775d38 100644 --- a/src/__tests__/regression/read-state.test.ts +++ b/src/__tests__/regression/read-state.test.ts @@ -7,6 +7,7 @@ import { WarpFactory, defaultCacheOptions, defaultWarpGwOptions } from '../../co import { LoggerFactory } from '../../logging/LoggerFactory'; import { SourceType } from '../../core/modules/impl/WarpGatewayInteractionsLoader'; import { DeployPlugin } from 'warp-contracts-plugin-deploy'; +import { VM2Plugin } from 'warp-contracts-plugin-vm2'; const stringify = require('safe-stable-stringify'); @@ -125,9 +126,9 @@ describe.each(chunkedVm)('v1 compare.suite (VM2) %#', (contracts: string[]) => { .use(new DeployPlugin()); const result2 = await warp + .use(new VM2Plugin()) .contract(contractTxId) .setEvaluationOptions({ - useVM2: true, unsafeClient: 'allow', allowBigInt: true }) diff --git a/src/__tests__/unit/evaluation-options.test.ts b/src/__tests__/unit/evaluation-options.test.ts index 0205802..1ab0cac 100644 --- a/src/__tests__/unit/evaluation-options.test.ts +++ b/src/__tests__/unit/evaluation-options.test.ts @@ -28,7 +28,6 @@ describe('Evaluation options evaluator', () => { unsafeClient: 'throw', updateCacheForEachInteraction: false, useKVStorage: false, - useVM2: false, waitForConfirmation: false, useConstructor: false, walletBalanceUrl: 'http://nyc-1.dev.arweave.net:1984/' @@ -36,7 +35,6 @@ describe('Evaluation options evaluator', () => { contract.setEvaluationOptions({ allowBigInt: true, - useVM2: true, internalWrites: true, gasLimit: 3453453 }); @@ -44,7 +42,6 @@ describe('Evaluation options evaluator', () => { expect( new EvaluationOptionsEvaluator(contract.evaluationOptions(), { allowBigInt: true, - useVM2: true, internalWrites: true, gasLimit: 3453453 }).rootOptions @@ -68,7 +65,6 @@ describe('Evaluation options evaluator', () => { unsafeClient: 'throw', updateCacheForEachInteraction: false, useKVStorage: false, - useVM2: true, waitForConfirmation: false, useConstructor: false, walletBalanceUrl: 'http://nyc-1.dev.arweave.net:1984/' @@ -76,7 +72,6 @@ describe('Evaluation options evaluator', () => { const contract2 = warp.contract(null).setEvaluationOptions({ internalWrites: true, - useVM2: true, unsafeClient: 'allow', gasLimit: 2222, maxCallDepth: 5 @@ -102,7 +97,6 @@ describe('Evaluation options evaluator', () => { unsafeClient: 'allow', updateCacheForEachInteraction: false, useKVStorage: false, - useVM2: true, waitForConfirmation: false, useConstructor: false, walletBalanceUrl: 'http://nyc-1.dev.arweave.net:1984/' @@ -110,9 +104,9 @@ describe('Evaluation options evaluator', () => { expect(function () { const result = new EvaluationOptionsEvaluator(contract2.evaluationOptions(), { - useVM2: false + internalWrites: false }).rootOptions; - }).toThrow('Option {useVM2} differs.'); + }).toThrow('Option {internalWrites} differs.'); }); it('should properly set foreign evaluation options - unsafeClient - allow', async () => { diff --git a/src/contract/EvaluationOptionsEvaluator.ts b/src/contract/EvaluationOptionsEvaluator.ts index b9071d9..0668bef 100644 --- a/src/contract/EvaluationOptionsEvaluator.ts +++ b/src/contract/EvaluationOptionsEvaluator.ts @@ -99,7 +99,6 @@ export class EvaluationOptionsEvaluator { sourceType: () => this.rootOptions['sourceType'], sequencerUrl: () => this.rootOptions['sequencerUrl'], gasLimit: () => this.rootOptions['gasLimit'], - useVM2: () => this.rootOptions['useVM2'], allowBigInt: () => this.rootOptions['allowBigInt'], // not sure about this walletBalanceUrl: () => this.rootOptions['walletBalanceUrl'], mineArLocalBlocks: () => this.rootOptions['mineArLocalBlocks'], diff --git a/src/core/WarpPlugin.ts b/src/core/WarpPlugin.ts index d44cc3f..82f5ab0 100644 --- a/src/core/WarpPlugin.ts +++ b/src/core/WarpPlugin.ts @@ -6,7 +6,8 @@ export const knownWarpPlugins = [ 'evaluation-progress', 'fetch-options', 'deploy', - 'contract-blacklist' + 'contract-blacklist', + 'vm2' ] as const; type WarpPluginPartialType = `smartweave-extension-${string}`; export type WarpKnownPluginType = (typeof knownWarpPlugins)[number]; diff --git a/src/core/modules/StateEvaluator.ts b/src/core/modules/StateEvaluator.ts index 35f9baf..6e15c5c 100644 --- a/src/core/modules/StateEvaluator.ts +++ b/src/core/modules/StateEvaluator.ts @@ -132,8 +132,6 @@ export class DefaultEvaluationOptions implements EvaluationOptions { sourceType = SourceType.BOTH; - useVM2 = false; - unsafeClient = 'throw' as const; allowBigInt = false; @@ -201,12 +199,6 @@ export interface EvaluationOptions { gasLimit: number; - // Whether js contracts' code should be run within vm2 sandbox (https://github.com/patriksimek/vm2#vm2-----) - // it greatly enhances security - at a cost of performance. - // use for contracts that you cannot trust. - // this obviously works only in a node.js env. - useVM2: boolean; - // Whether using unsafe client should be allowed // allow - allows to evaluate contracts with SmartWeave.unsafeClient calls // skip - skips all the transactions the make calls to unsafeClient (including all nested calls) diff --git a/src/core/modules/impl/HandlerExecutorFactory.ts b/src/core/modules/impl/HandlerExecutorFactory.ts index eb27079..91ce4ea 100644 --- a/src/core/modules/impl/HandlerExecutorFactory.ts +++ b/src/core/modules/impl/HandlerExecutorFactory.ts @@ -1,6 +1,5 @@ import Arweave from 'arweave'; import { rustWasmImports, WarpContractsCrateVersion } from './wasm/rust-wasm-imports'; -import * as vm2 from 'vm2'; import { ContractDefinition } from '../../../core/ContractDefinition'; import { ExecutionContext } from '../../../core/ExecutionContext'; import { GQLNodeInterface } from '../../../legacy/gqlResult'; @@ -16,6 +15,7 @@ import { Warp } from '../../Warp'; import { isBrowser } from '../../../utils/utils'; import { Buffer } from 'warp-isomorphic'; import { InteractionState } from '../../../contract/states/InteractionState'; +import { WarpLogger } from '../../../logging/WarpLogger'; // 'require' to fix esbuild adding same lib in both cjs and esm format // https://github.com/evanw/esbuild/issues/1950 @@ -166,7 +166,7 @@ export class HandlerExecutorFactory implements ExecutorFactory>('vm2'); + return vm2Plugin.process({ normalizedSource, swGlobal, logger: this.logger, contractDefinition }); } else if (warp.hasPlugin('ivm-handler-api')) { const ivmPlugin = warp.loadPlugin>('ivm-handler-api'); return ivmPlugin.process({ @@ -326,3 +293,10 @@ export interface IvmPluginInput { swGlobal: SmartWeaveGlobal; contractDefinition: ContractDefinition; } + +export interface VM2PluginInput { + normalizedSource: string; + swGlobal: SmartWeaveGlobal; + logger: WarpLogger; + contractDefinition: ContractDefinition; +} diff --git a/yarn.lock b/yarn.lock index d3eedb5..aff6aab 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2543,7 +2543,7 @@ bech32@1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -bignumber.js@9.1.1, bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@^9.0.2: +bignumber.js@9.1.1, bignumber.js@^9.0.0, bignumber.js@^9.0.1, bignumber.js@^9.0.2, bignumber.js@^9.1.1: version "9.1.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== @@ -7447,10 +7447,10 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -vm2@3.9.13: - version "3.9.13" - resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.13.tgz#774a1a3d73b9b90b1aa45bcc5f25e349f2eef649" - integrity sha512-0rvxpB8P8Shm4wX2EKOiMp7H2zq+HUE/UwodY0pCZXs9IffIKZq6vUti5OgkVCTakKo9e/fgO4X1fkwfjWxE3Q== +vm2@^3.9.16: + version "3.9.16" + resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.16.tgz#0fbc2a265f7bf8b837cea6f4a908f88a3f93b8e6" + integrity sha512-3T9LscojNTxdOyG+e8gFeyBXkMlOBYDoF6dqZbj+MPVHi9x10UfiTAJIobuchRCp3QvC+inybTbMJIUrLsig0w== dependencies: acorn "^8.7.0" acorn-walk "^8.2.0" @@ -7462,37 +7462,22 @@ walker@^1.0.8: dependencies: makeerror "1.0.12" -warp-contracts-plugin-deploy@1.0.0-beta.16: - version "1.0.0-beta.16" - resolved "https://registry.yarnpkg.com/warp-contracts-plugin-deploy/-/warp-contracts-plugin-deploy-1.0.0-beta.16.tgz#cd2a0472e1272f3ab238ab3137e394413a494f7e" - integrity sha512-66OYLIXM5FkyYxABfOGcTi+lk/XRU2Q1n3Wm3Jr12GrrO/NyC1WFi1q/dquCtrkoN5kesNIDOp8+i17cIHEBlA== +warp-contracts-plugin-deploy@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/warp-contracts-plugin-deploy/-/warp-contracts-plugin-deploy-1.0.3.tgz#9ca7cd53b4a7cd1b015881f1d369659bb6f9075b" + integrity sha512-zDF/yqHbxIDImtVKxE/hbIz824PjPOc0aXONQtnR7do0MFdF7eJqeAAA5a2W5WTHN3cplvej6y7vSv6f/E2dEg== dependencies: arbundles "^0.7.3" arlocal "^1.1.59" node-stdlib-browser "^1.2.0" - warp-contracts "1.2.43-beta.21" -warp-contracts@1.2.43-beta.21: - version "1.2.43-beta.21" - resolved "https://registry.yarnpkg.com/warp-contracts/-/warp-contracts-1.2.43-beta.21.tgz#55a7b661a7218073ce96d82e8cb0ffb2c342ad1f" - integrity sha512-2ZRCWULNDeSduhgS7iNbApyECSsCOtyHgPn9AuSFlpnB7z0Z7SfIRSuycG8zDqbnIPxrkumKrsT4O4oG0uxjiA== +warp-contracts-plugin-vm2@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/warp-contracts-plugin-vm2/-/warp-contracts-plugin-vm2-1.0.0.tgz#f55914a228102f3bda7dafc197c395078fa0e190" + integrity sha512-3XubaZ9eeRbBtMDwmTAewZk6WYgtcg9g44vATqH5vmn2wdPWIBcrBX3gA7XQIDbqPcLPpIgifMDZiQJSNwYZDA== dependencies: - "@idena/vrf-js" "^1.0.1" - archiver "^5.3.0" - arweave "^1.12.4" - async-mutex "^0.4.0" - bignumber.js "9.1.1" - elliptic "^6.5.4" - events "3.3.0" - fast-copy "^3.0.0" - level "^8.0.0" - memory-level "^1.0.0" - safe-stable-stringify "2.4.1" - stream-buffers "^3.0.2" - unzipit "^1.4.0" - vm2 "3.9.13" - warp-isomorphic "1.0.0" - warp-wasm-metering "1.0.1" + bignumber.js "^9.1.1" + vm2 "^3.9.16" warp-isomorphic@1.0.0: version "1.0.0"