From db7ee8a0c71ba0fc4aab8274dd3e4f689096228e Mon Sep 17 00:00:00 2001 From: Igor Sikachyna Date: Thu, 21 Nov 2024 07:34:59 -0500 Subject: [PATCH] BLOCK-2590 - Migrate changes from the main branch --- .gitignore | 2 + ultratests/eosevm.spec.ts | 103 +++ ultratests/eosevm.ultra_test.js | 100 +++ ultratests/evmSetup.ts | 133 +++ ultratests/interfaces/eosio.evm.ts | 81 ++ ultratests/package-lock.json | 1337 ++++++++++++++++++++++++++++ ultratests/package.json | 23 + ultratests/sign.ts | 22 + 8 files changed, 1801 insertions(+) create mode 100644 ultratests/eosevm.spec.ts create mode 100644 ultratests/eosevm.ultra_test.js create mode 100644 ultratests/evmSetup.ts create mode 100644 ultratests/interfaces/eosio.evm.ts create mode 100644 ultratests/package-lock.json create mode 100644 ultratests/package.json create mode 100755 ultratests/sign.ts diff --git a/.gitignore b/.gitignore index dcf6e3d9..f5b291dd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ build tests/build .vscode +lib +node_modules \ No newline at end of file diff --git a/ultratests/eosevm.spec.ts b/ultratests/eosevm.spec.ts new file mode 100644 index 00000000..82b1ef36 --- /dev/null +++ b/ultratests/eosevm.spec.ts @@ -0,0 +1,103 @@ +import { assert, assertAsync, assertAsyncThrow, HTTP_API, sleep } from '@ultraos/ultratest/apis/testApi'; +import { SignerLibTransactResponse, UltraTest, UltraTestAPI } from '@ultraos/ultratest/interfaces/test'; +import { UltraAPIv2, ultraStartup } from 'ultratest-ultra-startup-plugin'; +import { ultraContracts } from 'ultratest-ultra-contracts-plugin'; +import { genesis } from 'ultratest-genesis-plugin/genesis'; +import { system, SystemAPI } from 'ultratest-system-plugin/system'; +import * as Web3 from 'web3'; +import * as Web3Accounts from 'web3-eth-accounts'; +import {signTransaction, Transaction} from 'web3-eth-accounts'; +import evmSetup, { EvmContractHelpers } from './evmSetup'; + +export default class Test extends UltraTest { + constructor() { + super(); + } + + async onChainStart(ultra: UltraTestAPI) { + ultra.addPlugins([genesis(ultra), system(ultra), ultraContracts(ultra), await ultraStartup(ultra), evmSetup()]); + } + + async tests(ultra: UltraTestAPI) { + const systemAPI = new SystemAPI(ultra); + const ultraAPI = new UltraAPIv2(ultra); + const evm = new EvmContractHelpers(ultraAPI, ultra.api, systemAPI); + + return { + 'Initialize evm contract': async () => { + await assertAsync(evm.init(15555, {gas_price: 150000000000, miner_cut: 10000, ingress_bridge_fee: "0.01000000 UOS"}), "failed to initialize evm"); + const config = await evm.getConfig(); + assert(config.chainid === 15555); + assert(config.miner_cut === 10000); + assert(config.gas_price == 150000000000); + }, + 'Perform a transfer and check balances': async () => { + let accounts = await evm.getAllAccounts(); + let balances = await evm.getAllBalances(); + let balanceWithDust = await evm.getBalanceWithDust(); + assert(accounts.length == 0, "wrong accounts length"); + assert(balances.length == 1, "wrong balances length"); + assert(balances[0].owner == 'eosio.evm', "wrong balance[0] owner"); + assert(balances[0].balance.balance == '0.00000000 UOS', "wrong balance[0] balance"); + assert(balanceWithDust?.balance == '0.00000000 UOS', "wrong balance with dust"); + + await ultraAPI.transferTokens("ultra.eosio", 'eosio.evm', 1, 'eosio.evm'); + balances = await evm.getAllBalances(); + assert(balances.length == 1, "wrong balances length after transfer"); + assert(balances[0].owner == 'eosio.evm', "wrong balance[0] owner after transfer"); + assert(balances[0].balance.balance == '1.00000000 UOS', "wrong balance[0] balance after transfer"); + + await ultraAPI.transferTokens("ultra.eosio", 'eosio.evm', 1000, "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955"); + accounts = await evm.getAllAccounts(); + balances = await evm.getAllBalances(); + balanceWithDust = await evm.getBalanceWithDust(); + assert(accounts.length == 1, "wrong accounts length after evm address transfer"); + assert(accounts[0].eth_address == '14dc79964da2c08b23698b3d3cc7ca32193d9955', "wrong ethereum account address"); + assert(Number('0x' + accounts[0].balance) == 999990000000000000000, "wrong ethereum account balance"); + assert(balances.length == 1, "wrong balances length after evm address transfer"); + assert(balances[0].owner == 'eosio.evm', "wrong balance[0] owner after evm address transfer"); + assert(balances[0].balance.balance == '1.01000000 UOS', "wrong balance[0] balance after evm address transfer"); + assert(balanceWithDust?.balance == '999.99000000 UOS', "wrong balance with dust after evm address transfer"); + + await ultraAPI.transferTokens("ultra.eosio", 'eosio.evm', 2, "0x3787b98fc4e731d0456b3941f0b3fe2e01439961"); + accounts = await evm.getAllAccounts(); + balances = await evm.getAllBalances(); + balanceWithDust = await evm.getBalanceWithDust(); + assert(accounts.length == 2, "wrong accounts length after evm address transfer 2"); + assert(accounts[1].eth_address == '3787b98fc4e731d0456b3941f0b3fe2e01439961', "wrong ethereum account address 2"); + assert(Number('0x' + accounts[1].balance) == 1990000000000000000, "wrong ethereum account balance 2"); + assert(balances.length == 1, "wrong balances length after evm address transfer 2"); + assert(balances[0].owner == 'eosio.evm', "wrong balance[0] owner after evm address transfer 2"); + assert(balances[0].balance.balance == '1.02000000 UOS', "wrong balance[0] balance after evm address transfer 2"); + assert(balanceWithDust?.balance == '1001.98000000 UOS', "wrong balance with dust after evm address transfer 2"); + }, + 'Perform a transfer in EVM': async () => { + const privateKey = '0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356'; + let account = Web3Accounts.privateKeyToAccount(privateKey); + let trx = new Transaction({ + to: '0x3787b98fc4e731d0456b3941f0b3fe2e01439961', + value: 1, + gasLimit: `0x${(1000000000).toString(16)}`, + gasPrice: `0x${(150000000000).toString(16)}`, + nonce: 0, + }, {common: Web3Accounts.Common.custom({chainId: 15555})}); + let signature = await signTransaction(trx, privateKey); + + await assertAsync(evm.pushTransaction('eosio.evm', signature.rawTransaction.substring(2)), 'Failed to send an EVM transfer'); + + let accounts = await evm.getAllAccounts(); + let balances = await evm.getAllBalances(); + let balanceWithDust = await evm.getBalanceWithDust(); + assert(accounts.length == 2, "wrong accounts length after evm transaction"); + assert(accounts[0].eth_address == '14dc79964da2c08b23698b3d3cc7ca32193d9955', "wrong ethereum account address 1"); + assert(Number('0x' + accounts[0].balance) == 999986850000000000000, "wrong ethereum account balance 1"); + assert(accounts[1].eth_address == '3787b98fc4e731d0456b3941f0b3fe2e01439961', "wrong ethereum account address 2"); + assert(Number('0x' + accounts[1].balance) == 1990000000000000001, "wrong ethereum account balance 2"); + assert(balances.length == 1, "wrong balances length after evm transaction"); + assert(balances[0].owner == 'eosio.evm', "wrong balance[0] owner after evm transaction"); + assert(balances[0].balance.balance == '1.02315000 UOS', "wrong balance[0] balance after evm transaction"); + assert(balanceWithDust?.balance == '1001.97685000 UOS', "wrong balance with dust after transaction"); + } + }; + } +} diff --git a/ultratests/eosevm.ultra_test.js b/ultratests/eosevm.ultra_test.js new file mode 100644 index 00000000..4e876475 --- /dev/null +++ b/ultratests/eosevm.ultra_test.js @@ -0,0 +1,100 @@ +module.exports = class test { + + constructor() {} + + requiresSystemContracts(){ + return true; + } + + requiredUnlimitedAccounts(){ + return []; + } + + requiredAccounts(){ + return [ + 'evmevmevmevm', + 'evmminer', + 'testa' + ]; + } + + nodeosConfigs(){ + return { + config:{ + 'abi-serializer-max-time-ms':100000, + }, + } + } + + tests({assert, endpoint, cleos, rpc, api, ecc, keychain}){ + const sleep = ms => new Promise(r => setTimeout(r, ms)); + const POST = (route, body = {}) => fetch(`${endpoint}/v1/${route}`, {method: 'POST', headers: {Accept: 'application/json'}, body: JSON.stringify(body)}).then(x => x.json()) + const activate_feature = (digest) => cleos(`push action eosio activate '["${digest}"]' -p eosio@active`, {swallow: true}) + + const assert_msg = (msg) => { + return 'assertion failure with message: ' + msg; + }; + const transact = actions => api.transact({actions}, { blocksBehind: 3, expireSeconds: 3600 }).then(x => true).catch(err => { + return false; + }); + const transact_assert = (actions, msg) => api.transact({actions}, { blocksBehind: 3, expireSeconds: 3600 }).then(x => true).catch(err => { + if(err.json.error.details[0].message !== msg) + assert(err.json.error.details[0].message === assert_msg(msg), 'Assertion message mismatch. Expected: "' + assert_msg(msg) + '". Got: "' + err.json.error.details[0].message + '"'); + return false; + }); + + const register_id_providers = (prov) => { + return transact([{ + account: 'eosio.eba', + name: 'regidp', + authorization: [{ actor: 'ultra.eba', permission: 'active' }], + data: { id_providers:prov } + }]); + }; + + const get_provider = (provider) => rpc.get_table_rows({ json: true, code: 'eosio.eba', scope: 'eosio.eba', table: 'idproviders'}).catch(() => null).then(data => { + if (typeof data.rows[0].id_providers !== "undefined") { + const prod = data.rows[0].id_providers.find((prod) => { + return prod.account === provider; + }); + + if (typeof prod !== "undefined") + return true; + } + return false; + }); + + const hide_action_log = false; + + return { + 'set up eos evm':async() => { + // diable KYC + assert(await cleos(`push action eosio.kyc togglekyc '[]' -p ultra.kyc`), "Failed to addcode to evm contract", {swallow:hide_action_log}); + + // activate get hash protocol feature + assert(await activate_feature("fd28b9886c4469f34062a419232f4d5b8007d790b81ccc6d675fec941e7d80bb"), `failed to activate action return value feature`); + assert(await activate_feature("1a5b44765728146d71b9169dce52a31d5fac2143b61b008b7ca9328fdd8bac45"), `failed to activate get code hash feature`); + assert(await activate_feature("cb79d449f8194bf6b403e40fda319a1e2f9d2b2108f7b6cb981662e6393ed6b9"), `failed to activate crypto primitives feature`); + + await sleep(3000); + + assert(await cleos(`set contract evmevmevmevm ${__dirname}/../build/evm_runtime evm_runtime.wasm evm_runtime.abi -p evmevmevmevm@active`), "Failed to publish evm contract", {swallow:hide_action_log}); + + // assert(await cleos(`push action evmevmevmevm init "{\"chainid\":15555,\"fee_params\":{\"gas_price\":150000000000,\"miner_cut\":10000,\"ingress_bridge_fee\":\"0.01000000 UOS\"}}" -p evmevmevmevm`), "Failed to init evm contract", {swallow:hide_action_log}); + assert(await cleos(`push action evmevmevmevm init '[15555,[150000000000,10000,"0.01000000 UOS"]]' -p evmevmevmevm`), "Failed to init evm contract", {swallow:hide_action_log}); + + assert(await cleos(`set account permission evmevmevmevm active --add-code -p evmevmevmevm@owner`), "Failed to addcode to evm contract", {swallow:hide_action_log}); + + // 1 UOS to evm contract + assert(await cleos(`transfer eosio evmevmevmevm "1.00000000 UOS" "evmevmevmevm"`), "Failed to transfer to evmevmevmevm", {swallow:hide_action_log}); + // bridge 1000 UOS to "0x2787b98fc4e731d0456b3941f0b3fe2e01439961" + assert(await cleos(`transfer eosio evmevmevmevm "1000.00000000 UOS" "0x2787b98fc4e731d0456b3941f0b3fe2e01439961"`), "Failed to transfer to evmevmevmevm", {swallow:hide_action_log}); + // bridge 1 UOS to "0x3787b98fc4e731d0456b3941f0b3fe2e01439961" + assert(await cleos(`transfer eosio evmevmevmevm "1.00000000 UOS" "0x3787b98fc4e731d0456b3941f0b3fe2e01439961"`), "Failed to transfer to evmevmevmevm", {swallow:hide_action_log}); + + // open account balance for evmminer account + assert(await cleos(`push action evmevmevmevm open '{"owner":"evmminer"}' -p evmminer`), "Failed to transfer to evmevmevmevm", {swallow:hide_action_log}); + }, + } + } +} diff --git a/ultratests/evmSetup.ts b/ultratests/evmSetup.ts new file mode 100644 index 00000000..debf4262 --- /dev/null +++ b/ultratests/evmSetup.ts @@ -0,0 +1,133 @@ +import { SignerLibTransactResponse, UltraTestAPI } from '@ultraos/ultratest/interfaces/test'; +import { RequiredContract } from 'ultratest-ultra-startup-plugin/interfaces'; +import { AccountConfiguration } from 'ultratest-ultra-startup-plugin/ultraStartupPermissions'; +import { Plugin } from '@ultraos/ultratest/interfaces/plugin'; +import { EvmAccount, EvmAccountCode, EvmBalance, EvmBalanceWithDust, EvmConfig, EvmConfig2, EvmMessageReceiver, EvmNextNonce, FeeParameters } from './interfaces/eosio.evm'; +import { UltraAPIv2 } from 'ultratest-ultra-startup-plugin'; +import { SystemAPI } from 'ultratest-system-plugin/system'; +import { HTTP_API } from '@ultraos/ultratest/apis/pluginApi'; + +export class EvmContractHelpers { + parent: UltraAPIv2; + systemAPI: SystemAPI; + api: HTTP_API; + + constructor(parent: UltraAPIv2, api: HTTP_API, system: SystemAPI) { + this.parent = parent; + this.systemAPI = system; + this.api = api; + } + + async init(chainid: number, fee_params: FeeParameters, token_contract: string | undefined = undefined) { + return this.parent.transactOrThrow([ + { + account: 'eosio.evm', + name: 'init', + authorization: [{actor: 'eosio.evm', permission: "active"}], + data: { + chainid: chainid, + fee_params: fee_params, + token_contract: token_contract + }, + }, + ]); + } + + async getAccount(eth_address: string): Promise { + const rows = await this.api.api.contract('eosio.evm').getTable('account', 'eosio.evm'); + return rows.find(v => { return v.eth_address === eth_address; }) + } + + async getAllAccounts(): Promise { + return await this.api.api.contract('eosio.evm').getTable('account', 'eosio.evm'); + } + + async getAccountCode(id: number): Promise { + const rows = await this.api.api.contract('eosio.evm').getTable('account', 'eosio.evm'); + return rows.find(v => { return v.id === id; }) + } + + async getBalance(owner: string): Promise { + const rows = await this.api.api.contract('eosio.evm').getTable('balances', 'eosio.evm'); + return rows.find(v => { return v.owner === owner; }) + } + + async getAllBalances(): Promise { + return await this.api.api.contract('eosio.evm').getTable('balances', 'eosio.evm'); + } + + async getConfig(): Promise { + return (await this.api.api.contract('eosio.evm').getTable('config', 'eosio.evm'))[0]; + } + + async getConfig2(): Promise { + return (await this.api.api.contract('eosio.evm').getTable('config2', 'eosio.evm'))[0]; + } + + async getBalanceWithDust(): Promise { + return (await this.api.api.contract('eosio.evm').getTable('inevm', 'eosio.evm'))[0]; + } + + async getMessageReceiver(account: string): Promise { + const rows = await this.api.api.contract('eosio.evm').getTable('msgreceiver', 'eosio.evm'); + return rows.find(v => { return v.account === account; }) + } + + async getNextNonce(owner: string): Promise { + const rows = await this.api.api.contract('eosio.evm').getTable('nextnonces', 'eosio.evm'); + return rows.find(v => { return v.owner === owner; }) + } + + async pushTransaction(miner: string, rlptx: string): Promise { + return await this.parent.transactOrThrow([ + { + account: 'eosio.evm', + name: 'pushtx', + data: { + miner: miner, + rlptx: rlptx + }, + authorization: [{ actor: 'eosio.evm', permission: 'active' }], + }, + ]); + } +} + +export default function evmSetup(): Plugin { + return { + name: 'evmSetup', + params: () => { return '' }, + initCallback: async (plugin: Plugin, restoredFromSnapshot: boolean, ultra: UltraTestAPI) => {}, + stopCallback: async () => {}, + + requiredAdditionalProtocolFeatures() { + return [ + "fd28b9886c4469f34062a419232f4d5b8007d790b81ccc6d675fec941e7d80bb", // action return value + "1a5b44765728146d71b9169dce52a31d5fac2143b61b008b7ca9328fdd8bac45", // get code hash + ] + }, + + requiredContracts(): RequiredContract[] { + return [{ + account: 'eosio.evm', + contract: "../build/evm_runtime", + }] + }, + + requiredAccounts(): (AccountConfiguration | string)[] { + return [{ + name: 'eosio.evm', + owner: { + threshold: 1, + accounts: [{ weight: 1, permission: { actor: 'ultra', permission: 'active' } }], + }, + active: { + threshold: 1, + accounts: [{ weight: 1, permission: { actor: 'ultra', permission: 'admin' } }, { weight: 1, permission: { actor: 'eosio.evm', permission: 'eosio.code' } }], + }, + }, + "uos.pool" + ] + } + } +} diff --git a/ultratests/interfaces/eosio.evm.ts b/ultratests/interfaces/eosio.evm.ts new file mode 100644 index 00000000..d5ca79cc --- /dev/null +++ b/ultratests/interfaces/eosio.evm.ts @@ -0,0 +1,81 @@ +export interface FeeParameters { + gas_price?: number; + miner_cut?: number; + ingress_bridge_fee?: string; +} + +export interface EvmAccount { + id: number; + eth_address: string; + nonce: number; + balance: string; + code_id?: number; + flags: number; +} + +export interface EvmAccountCode { + id: number; + ref_count: number; + code: string; + code_hahs: string; +} + +export interface EvmBalance { + owner: string; + balance: EvmBalanceWithDust; +} + +export interface EvmConsensusParameter { + gas_parameter: { + gas_txnewaccount: number; + gas_newaccount: number; + gas_txcreate: number; + gas_codedeposit: number; + gas_sset: number; + } +} + +export interface EvmConfig { + version: number; + chainid: number; + genesis_time: string; + ingress_bridge_fee: string; + gas_price: number; + miner_cut: number; + status: number; + evm_version: { + pending_value?: number; + cached_value: number + }, + consensus_parameter: { + cached_value: [string, EvmConsensusParameter], + pending_value?: [string, EvmConsensusParameter] + }, + token_contract: string; + queue_front_block: number; + gas_prices: { + overhead_price: number; + storage_price: number; + } +} + +export interface EvmConfig2 { + next_account_id: number; +} + +export interface EvmBalanceWithDust { + balance: string; + dust: number; +} + +export interface EvmMessageReceiver { + account: string; + handler: string; + min_fee: string; + flags: number; +} + +export interface EvmNextNonce { + owner: string; + next_nonce: number; +} \ No newline at end of file diff --git a/ultratests/package-lock.json b/ultratests/package-lock.json new file mode 100644 index 00000000..e2b792e9 --- /dev/null +++ b/ultratests/package-lock.json @@ -0,0 +1,1337 @@ +{ + "name": "tests", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "tests", + "version": "1.0.0", + "dependencies": { + "@ultraos/ultratest": "../../ultratest2/src", + "tsx": "4.7.1", + "ultratest-genesis-plugin": "../../ultratest2/src/plugins/native/genesis", + "ultratest-system-plugin": "../../ultratest2/src/plugins/native/system", + "ultratest-ultra-contracts-plugin": "../../ultratest2/src/plugins/native/ultraContracts", + "ultratest-ultra-startup-plugin": "../../ultratest2/src/plugins/native/ultraStartup", + "web3": "^4.15.0" + } + }, + "../../ultratest2/src": { + "name": "@ultraos/ultratest", + "version": "1.0.0" + }, + "../../ultratest2/src/plugins/native/genesis": {}, + "../../ultratest2/src/plugins/native/system": {}, + "../../ultratest2/src/plugins/native/ultraContracts": { + "name": "ultratest-ultra-contracts-plugin", + "version": "1.0.0" + }, + "../../ultratest2/src/plugins/native/ultraStartup": { + "name": "ultratest-ultra-startup-plugin", + "version": "1.0.0" + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz", + "integrity": "sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@noble/curves": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.2.tgz", + "integrity": "sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/base": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@types/node": { + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", + "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "dependencies": { + "undici-types": "~6.19.8" + } + }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ultraos/ultratest": { + "resolved": "../../ultratest2/src", + "link": true + }, + "node_modules/abitype": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.7.1.tgz", + "integrity": "sha512-VBkRHTDZf9Myaek/dO3yMmOzB/y2s3Zo6nVU7yaw1G+TvCHAjwaJzNGN9yo4K5D8bU/VZXKP1EJpRhFr862PlQ==", + "peerDependencies": { + "typescript": ">=4.9.4", + "zod": "^3 >=3.19.1" + }, + "peerDependenciesMeta": { + "zod": { + "optional": true + } + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" + } + }, + "node_modules/ethereum-cryptography": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.2.1.tgz", + "integrity": "sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==", + "dependencies": { + "@noble/curves": "1.4.2", + "@noble/hashes": "1.4.0", + "@scure/bip32": "1.4.0", + "@scure/bip39": "1.3.0" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tsx": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.1.tgz", + "integrity": "sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==", + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ultratest-genesis-plugin": { + "resolved": "../../ultratest2/src/plugins/native/genesis", + "link": true + }, + "node_modules/ultratest-system-plugin": { + "resolved": "../../ultratest2/src/plugins/native/system", + "link": true + }, + "node_modules/ultratest-ultra-contracts-plugin": { + "resolved": "../../ultratest2/src/plugins/native/ultraContracts", + "link": true + }, + "node_modules/ultratest-ultra-startup-plugin": { + "resolved": "../../ultratest2/src/plugins/native/ultraStartup", + "link": true + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/web3": { + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-4.15.0.tgz", + "integrity": "sha512-0QWDWE4gDWldXb4KWq++K8m/A9zsR0LpJLtVT39/b4OjfdW0d4mE0qAUd3UocxuKTh1eG5pOCfumbGS5l6p1qg==", + "dependencies": { + "web3-core": "^4.7.0", + "web3-errors": "^1.3.0", + "web3-eth": "^4.11.0", + "web3-eth-abi": "^4.4.0", + "web3-eth-accounts": "^4.3.0", + "web3-eth-contract": "^4.7.1", + "web3-eth-ens": "^4.4.0", + "web3-eth-iban": "^4.0.7", + "web3-eth-personal": "^4.1.0", + "web3-net": "^4.1.0", + "web3-providers-http": "^4.2.0", + "web3-providers-ws": "^4.0.8", + "web3-rpc-methods": "^1.3.0", + "web3-rpc-providers": "^1.0.0-rc.3", + "web3-types": "^1.9.0", + "web3-utils": "^4.3.2", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-4.7.0.tgz", + "integrity": "sha512-skP4P56fhlrE+rIuS4WY9fTdja1DPml2xrrDmv+vQhPtmSFBs7CqesycIRLQh4dK1D4de/a23tkX6DLYdUt3nA==", + "dependencies": { + "web3-errors": "^1.3.0", + "web3-eth-accounts": "^4.2.1", + "web3-eth-iban": "^4.0.7", + "web3-providers-http": "^4.2.0", + "web3-providers-ws": "^4.0.8", + "web3-types": "^1.8.1", + "web3-utils": "^4.3.2", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + }, + "optionalDependencies": { + "web3-providers-ipc": "^4.0.7" + } + }, + "node_modules/web3-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-errors/-/web3-errors-1.3.0.tgz", + "integrity": "sha512-j5JkAKCtuVMbY3F5PYXBqg1vWrtF4jcyyMY1rlw8a4PV67AkqlepjGgpzWJZd56Mt+TvHy6DA1F/3Id8LatDSQ==", + "dependencies": { + "web3-types": "^1.7.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-4.11.0.tgz", + "integrity": "sha512-nZIJ/8FOOj5aEXoS8p9puuX5jLyzewZv3nXqoKNtu531/vA/yIiU/EtPnAV62RvVMcbDSiF/BLVFdBZCsVMJbg==", + "dependencies": { + "setimmediate": "^1.0.5", + "web3-core": "^4.7.0", + "web3-errors": "^1.3.0", + "web3-eth-abi": "^4.4.0", + "web3-eth-accounts": "^4.3.0", + "web3-net": "^4.1.0", + "web3-providers-ws": "^4.0.8", + "web3-rpc-methods": "^1.3.0", + "web3-types": "^1.9.0", + "web3-utils": "^4.3.2", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-abi": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-4.4.0.tgz", + "integrity": "sha512-RQzt9W93OgFBwOdNGcc9ulCyYt4zmRAMkKGbEdp3wcN4vmwTlRhh21+akj2ND4bg3C3RUiP4yprYgDEyN0/Fmg==", + "dependencies": { + "abitype": "0.7.1", + "web3-errors": "^1.3.0", + "web3-types": "^1.9.0", + "web3-utils": "^4.3.2", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-accounts": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-4.3.0.tgz", + "integrity": "sha512-7UX3rJiNgHYoqrO1WRPks/9J5Mh2x5N9HAd9QsOM8zfKY2rwSyCIIQM03OFXDEQRZ/ztycKTHgeLStmhlUUKIQ==", + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "crc-32": "^1.2.2", + "ethereum-cryptography": "^2.0.0", + "web3-errors": "^1.3.0", + "web3-types": "^1.9.0", + "web3-utils": "^4.3.2", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-contract": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-4.7.1.tgz", + "integrity": "sha512-D9nHCclq4lj2CX1sOrGga1UFA9CNBWZV6NGwNr6WjbBGIFl9ui2mivE9c3vNGEfSMnvKEq/zE83N+eGOwcWZlg==", + "dependencies": { + "@ethereumjs/rlp": "^5.0.2", + "web3-core": "^4.7.0", + "web3-errors": "^1.3.0", + "web3-eth": "^4.11.0", + "web3-eth-abi": "^4.4.0", + "web3-types": "^1.9.0", + "web3-utils": "^4.3.2", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-contract/node_modules/@ethereumjs/rlp": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-5.0.2.tgz", + "integrity": "sha512-DziebCdg4JpGlEqEdGgXmjqcFoJi+JGulUXwEjsZGAscAQ7MyD/7LE/GVCP29vEQxKc7AAwjT3A2ywHp2xfoCA==", + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/web3-eth-ens": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-4.4.0.tgz", + "integrity": "sha512-DeyVIS060hNV9g8dnTx92syqvgbvPricE3MerCxe/DquNZT3tD8aVgFfq65GATtpCgDDJffO2bVeHp3XBemnSQ==", + "dependencies": { + "@adraffy/ens-normalize": "^1.8.8", + "web3-core": "^4.5.0", + "web3-errors": "^1.2.0", + "web3-eth": "^4.8.0", + "web3-eth-contract": "^4.5.0", + "web3-net": "^4.1.0", + "web3-types": "^1.7.0", + "web3-utils": "^4.3.0", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-iban": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-4.0.7.tgz", + "integrity": "sha512-8weKLa9KuKRzibC87vNLdkinpUE30gn0IGY027F8doeJdcPUfsa4IlBgNC4k4HLBembBB2CTU0Kr/HAOqMeYVQ==", + "dependencies": { + "web3-errors": "^1.1.3", + "web3-types": "^1.3.0", + "web3-utils": "^4.0.7", + "web3-validator": "^2.0.3" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-eth-personal": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-4.1.0.tgz", + "integrity": "sha512-RFN83uMuvA5cu1zIwwJh9A/bAj0OBxmGN3tgx19OD/9ygeUZbifOL06jgFzN0t+1ekHqm3DXYQM8UfHpXi7yDQ==", + "dependencies": { + "web3-core": "^4.6.0", + "web3-eth": "^4.9.0", + "web3-rpc-methods": "^1.3.0", + "web3-types": "^1.8.0", + "web3-utils": "^4.3.1", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-net": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-4.1.0.tgz", + "integrity": "sha512-WWmfvHVIXWEoBDWdgKNYKN8rAy6SgluZ0abyRyXOL3ESr7ym7pKWbfP4fjApIHlYTh8tNqkrdPfM4Dyi6CA0SA==", + "dependencies": { + "web3-core": "^4.4.0", + "web3-rpc-methods": "^1.3.0", + "web3-types": "^1.6.0", + "web3-utils": "^4.3.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-http": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-4.2.0.tgz", + "integrity": "sha512-IPMnDtHB7dVwaB7/mMxAZzyq7d5ezfO1+Vw0bNfAeIi7gaDlJiggp85SdyAfOgov8AMUA/dyiY72kQ0KmjXKvQ==", + "dependencies": { + "cross-fetch": "^4.0.0", + "web3-errors": "^1.3.0", + "web3-types": "^1.7.0", + "web3-utils": "^4.3.1" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-ipc": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-4.0.7.tgz", + "integrity": "sha512-YbNqY4zUvIaK2MHr1lQFE53/8t/ejHtJchrWn9zVbFMGXlTsOAbNoIoZWROrg1v+hCBvT2c9z8xt7e/+uz5p1g==", + "optional": true, + "dependencies": { + "web3-errors": "^1.1.3", + "web3-types": "^1.3.0", + "web3-utils": "^4.0.7" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-providers-ws": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-4.0.8.tgz", + "integrity": "sha512-goJdgata7v4pyzHRsg9fSegUG4gVnHZSHODhNnn6J93ykHkBI1nz4fjlGpcQLUMi4jAMz6SHl9Ibzs2jj9xqPw==", + "dependencies": { + "@types/ws": "8.5.3", + "isomorphic-ws": "^5.0.0", + "web3-errors": "^1.2.0", + "web3-types": "^1.7.0", + "web3-utils": "^4.3.1", + "ws": "^8.17.1" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-rpc-methods": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web3-rpc-methods/-/web3-rpc-methods-1.3.0.tgz", + "integrity": "sha512-/CHmzGN+IYgdBOme7PdqzF+FNeMleefzqs0LVOduncSaqsppeOEoskLXb2anSpzmQAP3xZJPaTrkQPWSJMORig==", + "dependencies": { + "web3-core": "^4.4.0", + "web3-types": "^1.6.0", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-rpc-providers": { + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/web3-rpc-providers/-/web3-rpc-providers-1.0.0-rc.3.tgz", + "integrity": "sha512-aeFPYgvHjsf2yQi3CSQA9Ie4xnmO7VmNkY098rA7AWvhgyjVgIWlrVgZjUn55FXtthbiiTRm/CLriv99UeOfGQ==", + "dependencies": { + "web3-errors": "^1.3.0", + "web3-providers-http": "^4.2.0", + "web3-providers-ws": "^4.0.8", + "web3-types": "^1.9.0", + "web3-utils": "^4.3.2", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-types": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-types/-/web3-types-1.9.0.tgz", + "integrity": "sha512-I520KBPoXqEaM/ybj6xHD1E3gRb8/WdudLQaRBvJNQSSfHuPW9P2sD59mbhm6dsKtnje+T90dIxSyzVVFlEdlg==", + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-4.3.2.tgz", + "integrity": "sha512-bEFpYEBMf6ER78Uvj2mdsCbaLGLK9kABOsa3TtXOEEhuaMy/RK0KlRkKoZ2vmf/p3hB8e1q5erknZ6Hy7AVp7A==", + "dependencies": { + "ethereum-cryptography": "^2.0.0", + "eventemitter3": "^5.0.1", + "web3-errors": "^1.3.0", + "web3-types": "^1.8.1", + "web3-validator": "^2.0.6" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/web3-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/web3-validator/-/web3-validator-2.0.6.tgz", + "integrity": "sha512-qn9id0/l1bWmvH4XfnG/JtGKKwut2Vokl6YXP5Kfg424npysmtRLe9DgiNBM9Op7QL/aSiaA0TVXibuIuWcizg==", + "dependencies": { + "ethereum-cryptography": "^2.0.0", + "util": "^0.12.5", + "web3-errors": "^1.2.0", + "web3-types": "^1.6.0", + "zod": "^3.21.4" + }, + "engines": { + "node": ">=14", + "npm": ">=6.12.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/ultratests/package.json b/ultratests/package.json new file mode 100644 index 00000000..015afbbe --- /dev/null +++ b/ultratests/package.json @@ -0,0 +1,23 @@ +{ + "name": "tests", + "version": "1.0.0", + "files": [], + "scripts": { + "build": "tsc" + }, + "dependencies": { + "@ultraos/ultratest": "../../ultratest2/src", + "tsx": "4.7.1", + "ultratest-genesis-plugin": "../../ultratest2/src/plugins/native/genesis", + "ultratest-system-plugin": "../../ultratest2/src/plugins/native/system", + "ultratest-ultra-contracts-plugin": "../../ultratest2/src/plugins/native/ultraContracts", + "ultratest-ultra-startup-plugin": "../../ultratest2/src/plugins/native/ultraStartup", + "web3": "^4.15.0" + }, + "ultratestPlugins": { + "ultratest-genesis-plugin": "native", + "ultratest-system-plugin": "native", + "ultratest-ultra-contracts-plugin": "native", + "ultratest-ultra-startup-plugin": "native" + } +} diff --git a/ultratests/sign.ts b/ultratests/sign.ts new file mode 100755 index 00000000..a3f3ac39 --- /dev/null +++ b/ultratests/sign.ts @@ -0,0 +1,22 @@ +#!/usr/bin/env -S npx tsx@4.7.1 + +import * as Web3 from 'web3'; +import * as Web3Accounts from 'web3-eth-accounts'; +import {signTransaction, Transaction} from 'web3-eth-accounts'; + +async function main() { + const privateKey = '0x4bbbf85ce3377467afe5d46f804f221813b2bb87f24d81f60f1fcdbf7cbf4356'; + let account = Web3Accounts.privateKeyToAccount(privateKey); + console.log(account.address); + let trx = new Transaction({ + to: '0x3787b98fc4e731d0456b3941f0b3fe2e01439961', + value: 1, + gasLimit: `0x${(1000000000).toString(16)}`, + gasPrice: `0x${(150000000000).toString(16)}`, + nonce: 0, + }, {common: Web3Accounts.Common.custom({chainId: 15555})}); + let signature = await signTransaction(trx, privateKey); + console.log(signature); +} + +main(); \ No newline at end of file