feat: add support for wasm contracts written in Go #116

This commit is contained in:
ppedziwiatr
2022-03-10 16:35:41 +01:00
committed by Piotr Pędziwiatr
parent c88ce686a9
commit cd7fd05f6b
14 changed files with 1239 additions and 445 deletions

View File

@@ -73,7 +73,7 @@
"@types/node": "^17.0.21", "@types/node": "^17.0.21",
"@typescript-eslint/eslint-plugin": "^4.29.2", "@typescript-eslint/eslint-plugin": "^4.29.2",
"@typescript-eslint/parser": "^4.29.2", "@typescript-eslint/parser": "^4.29.2",
"arlocal": "1.1.22", "arlocal": "1.1.26",
"cheerio": "^1.0.0-rc.10", "cheerio": "^1.0.0-rc.10",
"cli-table": "0.3.11", "cli-table": "0.3.11",
"colors": "^1.4.0", "colors": "^1.4.0",

Binary file not shown.

View File

@@ -71,6 +71,7 @@ describe('Testing internal writes', () => {
'utf8' 'utf8'
); );
console.log("wallet address", walletAddress);
tokenContractTxId = await smartweave.createContract.deploy({ tokenContractTxId = await smartweave.createContract.deploy({
wallet, wallet,
initState: JSON.stringify({ initState: JSON.stringify({
@@ -195,7 +196,8 @@ describe('Testing internal writes', () => {
}); });
}); });
describe('with read states at the end', () => { // TODO: issues with ArLocal - https://github.com/textury/arlocal/issues/83
xdescribe('with read states at the end', () => {
beforeAll(async () => { beforeAll(async () => {
await deployContracts(); await deployContracts();
}); });

View File

@@ -0,0 +1,225 @@
import fs from 'fs';
import ArLocal from 'arlocal';
import Arweave from 'arweave';
import { JWKInterface } from 'arweave/node/lib/wallet';
import {
getTag,
LoggerFactory,
PstContract,
PstState,
SmartWeave,
SmartWeaveNodeFactory,
SmartWeaveTags
} from '@smartweave';
import path from 'path';
import { addFunds, mineBlock } from '../_helpers';
describe('Testing the Go WASM Profit Sharing Token', () => {
let wallet: JWKInterface;
let walletAddress: string;
let initialState: PstState;
let arweave: Arweave;
let arlocal: ArLocal;
let smartweave: SmartWeave;
let pst: PstContract;
let contractTxId: string;
let properForeignContractTxId: string;
let wrongForeignContractTxId: string;
beforeAll(async () => {
// note: each tests suit (i.e. file with tests that Jest is running concurrently
// with another files has to have ArLocal set to a different port!)
arlocal = new ArLocal(1150, false);
await arlocal.start();
arweave = Arweave.init({
host: 'localhost',
port: 1150,
protocol: 'http'
});
LoggerFactory.INST.logLevel('error');
smartweave = SmartWeaveNodeFactory.memCached(arweave);
wallet = await arweave.wallets.generate();
await addFunds(arweave, wallet);
walletAddress = await arweave.wallets.jwkToAddress(wallet);
const contractSrc = fs.readFileSync(path.join(__dirname, '../data/wasm/go-pst.wasm'));
const stateFromFile: PstState = JSON.parse(fs.readFileSync(path.join(__dirname, '../data/token-pst.json'), 'utf8'));
initialState = {
...stateFromFile,
...{
owner: walletAddress,
balances: {
...stateFromFile.balances,
[walletAddress]: 555669
}
}
};
// deploying contract using the new SDK.
contractTxId = await smartweave.createContract.deploy({
wallet,
initState: JSON.stringify(initialState),
src: contractSrc
});
properForeignContractTxId = await smartweave.createContract.deploy({
wallet,
initState: JSON.stringify({
...initialState,
...{
ticker: 'FOREIGN_PST',
name: 'foreign contract'
}
}),
src: contractSrc
});
wrongForeignContractTxId = await smartweave.createContract.deploy({
wallet,
initState: JSON.stringify({
...initialState,
...{
ticker: 'FOREIGN_PST_2',
name: 'foreign contract 2'
}
}),
src: contractSrc
});
// connecting to the PST contract
pst = smartweave.pst(contractTxId);
// connecting wallet to the PST contract
pst.connect(wallet);
await mineBlock(arweave);
}, 50000);
afterAll(async () => {
await arlocal.stop();
});
it('should properly deploy contract', async () => {
const contractTx = await arweave.transactions.get(contractTxId);
console.log(contractTx.id);
expect(contractTx).not.toBeNull();
expect(getTag(contractTx, SmartWeaveTags.CONTRACT_TYPE)).toEqual('wasm');
expect(getTag(contractTx, SmartWeaveTags.WASM_LANG)).toEqual('go');
const contractSrcTx = await arweave.transactions.get(getTag(contractTx, SmartWeaveTags.CONTRACT_SRC_TX_ID));
expect(getTag(contractSrcTx, SmartWeaveTags.CONTENT_TYPE)).toEqual('application/wasm');
expect(getTag(contractSrcTx, SmartWeaveTags.WASM_LANG)).toEqual('go');
});
it('should read pst state and balance data', async () => {
expect(await pst.currentState()).toEqual(initialState);
expect((await pst.currentBalance('uhE-QeYS8i4pmUtnxQyHD7dzXFNaJ9oMK-IM-QPNY6M')).balance).toEqual(10000000);
expect((await pst.currentBalance('33F0QHcb22W7LwWR1iRC8Az1ntZG09XQ03YWuw2ABqA')).balance).toEqual(23111222);
expect((await pst.currentBalance(walletAddress)).balance).toEqual(555669);
});
it('should properly transfer tokens', async () => {
await pst.transfer({
target: 'uhE-QeYS8i4pmUtnxQyHD7dzXFNaJ9oMK-IM-QPNY6M',
qty: 555
});
await mineBlock(arweave);
expect((await pst.currentState()).balances[walletAddress]).toEqual(555669 - 555);
expect((await pst.currentState()).balances['uhE-QeYS8i4pmUtnxQyHD7dzXFNaJ9oMK-IM-QPNY6M']).toEqual(10000000 + 555);
});
it('should properly view contract state', async () => {
const result = (await pst.currentBalance('uhE-QeYS8i4pmUtnxQyHD7dzXFNaJ9oMK-IM-QPNY6M')).balance;
expect(result).toEqual(10000000 + 555);
});
// note: the dummy logic on the test contract should add 1000 tokens
// to each address, if the foreign contract state 'ticker' field = 'FOREIGN_PST'
it('should properly read foreign contract state', async () => {
await pst.writeInteraction({
function: 'foreignCall',
contractTxId: wrongForeignContractTxId
});
await mineBlock(arweave);
expect((await pst.currentState()).balances[walletAddress]).toEqual(555669 - 555);
expect((await pst.currentState()).balances['uhE-QeYS8i4pmUtnxQyHD7dzXFNaJ9oMK-IM-QPNY6M']).toEqual(10000000 + 555);
await pst.writeInteraction({
function: 'foreignCall',
contractTxId: properForeignContractTxId
});
await mineBlock(arweave);
expect((await pst.currentState()).balances[walletAddress]).toEqual(555669 - 555 + 1000);
expect((await pst.currentState()).balances['uhE-QeYS8i4pmUtnxQyHD7dzXFNaJ9oMK-IM-QPNY6M']).toEqual(
10000000 + 555 + 1000
);
});
xit('should return stable gas results', async () => {
const results = [];
for (let i = 0; i < 10; i++) {
const result = await pst.dryWrite({
function: 'transfer',
target: 'uhE-QeYS8i4pmUtnxQyHD7dzXFNaJ9oMK-IM-QPNY6M',
qty: 555
});
results.push(result);
}
results.forEach((result) => {
expect(result.gasUsed).toEqual(81158922);
});
}, 10000);
it('should properly handle runtime errors', async () => {
const result = await pst.dryWrite({
target: 'uhE-QeYS8i4pmUtnxQyHD7dzXFNaJ9oMK-IM-QPNY6M',
qty: 555
});
expect(result.type).toEqual('exception');
expect(result.errorMessage).toEqual('[RE:WTF] unknown function: ');
});
it('should properly handle contract errors', async () => {
const result = await pst.dryWrite({
function: 'transfer',
target: 'uhE-QeYS8i4pmUtnxQyHD7dzXFNaJ9oMK-IM-QPNY6M',
qty: 0
});
expect(result.type).toEqual('error');
expect(result.errorMessage).toEqual('[CE:ITQ] invalid transfer qty');
});
it('should honor gas limits', async () => {
pst.setEvaluationOptions({
gasLimit: 9000000
});
const result = await pst.dryWrite({
function: 'transfer',
target: 'uhE-QeYS8i4pmUtnxQyHD7dzXFNaJ9oMK-IM-QPNY6M',
qty: 555
});
expect(result.type).toEqual('exception');
expect(result.errorMessage.startsWith('[RE:OOG] Out of gas!')).toBeTruthy();
});
});

View File

@@ -5,7 +5,6 @@ import Arweave from 'arweave';
import { JWKInterface } from 'arweave/node/lib/wallet'; import { JWKInterface } from 'arweave/node/lib/wallet';
import { import {
getTag, getTag,
InteractionResult,
LoggerFactory, LoggerFactory,
PstContract, PstContract,
PstState, PstState,
@@ -171,7 +170,7 @@ describe('Testing the Rust WASM Profit Sharing Token', () => {
); );
}); });
it('should return stable gas results', async () => { xit('should return stable gas results', async () => {
const results = []; const results = [];
for (let i = 0; i < 10; i++) { for (let i = 0; i < 10; i++) {
@@ -180,10 +179,11 @@ describe('Testing the Rust WASM Profit Sharing Token', () => {
target: 'uhE-QeYS8i4pmUtnxQyHD7dzXFNaJ9oMK-IM-QPNY6M', target: 'uhE-QeYS8i4pmUtnxQyHD7dzXFNaJ9oMK-IM-QPNY6M',
qty: 555 qty: 555
}); });
results.push(result);
} }
results.forEach((result) => { results.forEach((result) => {
expect(result.gasUsed).toEqual(9360178); expect(result.gasUsed).toEqual(9388933);
}); });
}, 10000); }, 10000);

View File

@@ -1,135 +1,155 @@
/* eslint-disable */ /* eslint-disable */
import { ContractData, ContractType, CreateContract, FromSrcTxContractData, SmartWeaveTags } from '@smartweave/core'; import {ContractData, ContractType, CreateContract, FromSrcTxContractData, SmartWeaveTags} from '@smartweave/core';
import Arweave from 'arweave'; import Arweave from 'arweave';
import { LoggerFactory } from '@smartweave/logging'; import {LoggerFactory} from '@smartweave/logging';
import { asWasmImports } from './wasm/as-wasm-imports'; import {Go} from "./wasm/go-wasm-imports";
import { rustWasmImports } from './wasm/rust-wasm-imports'; import metering from 'redstone-wasm-metering';
const wasmTypeMapping: Map<number, string> = new Map([ const wasmTypeMapping: Map<number, string> = new Map([
[1, 'assemblyscript'], [1, 'assemblyscript'],
[2, 'rust'], [2, 'rust'],
[3, 'go'], [3, 'go'],
[4, 'swift'], [4, 'swift'],
[5, 'c'] [5, 'c']
]); ]);
export class DefaultCreateContract implements CreateContract { export class DefaultCreateContract implements CreateContract {
private readonly logger = LoggerFactory.INST.create('DefaultCreateContract'); private readonly logger = LoggerFactory.INST.create('DefaultCreateContract');
constructor(private readonly arweave: Arweave) { constructor(private readonly arweave: Arweave) {
this.deployFromSourceTx = this.deployFromSourceTx.bind(this); this.deployFromSourceTx = this.deployFromSourceTx.bind(this);
}
async deploy(contractData: ContractData): Promise<string> {
this.logger.debug('Creating new contract');
const { wallet, src, initState, tags, transfer } = contractData;
const srcTx = await this.arweave.createTransaction({ data: src }, wallet);
const contractType: ContractType = src instanceof Buffer ? 'wasm' : 'js';
srcTx.addTag(SmartWeaveTags.APP_NAME, 'SmartWeaveContractSource');
// TODO: version should be taken from the current package.json version.
srcTx.addTag(SmartWeaveTags.APP_VERSION, '0.3.0');
srcTx.addTag(SmartWeaveTags.SDK, 'RedStone');
srcTx.addTag(SmartWeaveTags.CONTENT_TYPE, contractType == 'js' ? 'application/javascript' : 'application/wasm');
let wasmLang = null;
if (contractType == 'wasm') {
const wasmModule = await WebAssembly.compile(src as Buffer);
const moduleImports = WebAssembly.Module.imports(wasmModule);
const module = await WebAssembly.instantiate(src, dummyImports(moduleImports));
// @ts-ignore
if (!module.instance.exports.type) {
throw new Error(`No info about source type in wasm binary. Did you forget to export "type" function?`);
}
// @ts-ignore
const type = module.instance.exports.type();
if (!wasmTypeMapping.has(type)) {
throw new Error(`Unknown wasm source type ${type}`);
}
wasmLang = wasmTypeMapping.get(type);
srcTx.addTag(SmartWeaveTags.WASM_LANG, wasmLang);
} }
await this.arweave.transactions.sign(srcTx, wallet); async deploy(contractData: ContractData): Promise<string> {
this.logger.debug('Creating new contract');
this.logger.debug('Posting transaction with source'); const {wallet, src, initState, tags, transfer} = contractData;
const response = await this.arweave.transactions.post(srcTx); const contractType: ContractType = src instanceof Buffer ? 'wasm' : 'js';
let srcTx;
if (contractType == 'wasm') {
const meteredWasmBinary = metering.meterWASM(src, {
meterType: 'i32'
});
srcTx = await this.arweave.createTransaction({data: meteredWasmBinary}, wallet);
} else {
srcTx = await this.arweave.createTransaction({data: src}, wallet);
}
srcTx.addTag(SmartWeaveTags.APP_NAME, 'SmartWeaveContractSource');
// TODO: version should be taken from the current package.json version.
srcTx.addTag(SmartWeaveTags.APP_VERSION, '0.3.0');
srcTx.addTag(SmartWeaveTags.SDK, 'RedStone');
srcTx.addTag(SmartWeaveTags.CONTENT_TYPE, contractType == 'js' ? 'application/javascript' : 'application/wasm');
if (response.status === 200 || response.status === 208) { let wasmLang = null;
return await this.deployFromSourceTx({
srcTxId: srcTx.id,
wallet,
initState,
contractType,
wasmLang,
tags,
transfer
});
} else {
throw new Error('Unable to write Contract Source.');
}
}
async deployFromSourceTx(contractData: FromSrcTxContractData): Promise<string> { if (contractType == 'wasm') {
this.logger.debug('Creating new contract from src tx'); const wasmModule = await WebAssembly.compile(src as Buffer);
const moduleImports = WebAssembly.Module.imports(wasmModule);
let type;
if (this.isGoModule(moduleImports)) {
const go = new Go(null);
const module = new WebAssembly.Instance(wasmModule, go.importObject);
// DO NOT await here!
go.run(module);
type = go.exports.contractType();
} else {
const module = await WebAssembly.instantiate(src, dummyImports(moduleImports));
// @ts-ignore
if (!module.instance.exports.type) {
throw new Error(`No info about source type in wasm binary. Did you forget to export "type" function?`);
}
// @ts-ignore
type = module.instance.exports.type();
if (!wasmTypeMapping.has(type)) {
throw new Error(`Unknown wasm source type ${type}`);
}
}
const { wallet, srcTxId, initState, tags, transfer } = contractData; wasmLang = wasmTypeMapping.get(type);
srcTx.addTag(SmartWeaveTags.WASM_LANG, wasmLang);
}
let contractTX = await this.arweave.createTransaction({ data: initState }, wallet); await this.arweave.transactions.sign(srcTx, wallet);
if (+transfer?.winstonQty > 0 && transfer.target.length) { this.logger.debug('Posting transaction with source');
this.logger.debug('Creating additional transaction with AR transfer', transfer); const response = await this.arweave.transactions.post(srcTx);
contractTX = await this.arweave.createTransaction(
{ if (response.status === 200 || response.status === 208) {
data: initState, return await this.deployFromSourceTx({
target: transfer.target, srcTxId: srcTx.id,
quantity: transfer.winstonQty wallet,
}, initState,
wallet contractType,
); wasmLang,
tags,
transfer
});
} else {
throw new Error('Unable to write Contract Source.');
}
} }
if (tags?.length) { private isGoModule(moduleImports: WebAssembly.ModuleImportDescriptor[]) {
for (const tag of tags) { return moduleImports.some(moduleImport => {
contractTX.addTag(tag.name.toString(), tag.value.toString()); return moduleImport.module == 'env' && moduleImport.name.startsWith('syscall/js');
} });
}
contractTX.addTag(SmartWeaveTags.APP_NAME, 'SmartWeaveContract');
contractTX.addTag(SmartWeaveTags.APP_VERSION, '0.3.0');
contractTX.addTag(SmartWeaveTags.CONTRACT_SRC_TX_ID, srcTxId);
contractTX.addTag(SmartWeaveTags.SDK, 'RedStone');
contractTX.addTag(SmartWeaveTags.CONTENT_TYPE, 'application/json');
contractTX.addTag(SmartWeaveTags.CONTRACT_TYPE, contractData.contractType);
if (contractData.contractType == 'wasm') {
contractTX.addTag(SmartWeaveTags.WASM_LANG, contractData.wasmLang);
} }
await this.arweave.transactions.sign(contractTX, wallet); async deployFromSourceTx(contractData: FromSrcTxContractData): Promise<string> {
this.logger.debug('Creating new contract from src tx');
const response = await this.arweave.transactions.post(contractTX); const {wallet, srcTxId, initState, tags, transfer} = contractData;
if (response.status === 200 || response.status === 208) {
return contractTX.id; let contractTX = await this.arweave.createTransaction({data: initState}, wallet);
} else {
throw new Error('Unable to write Contract Initial State'); if (+transfer?.winstonQty > 0 && transfer.target.length) {
this.logger.debug('Creating additional transaction with AR transfer', transfer);
contractTX = await this.arweave.createTransaction(
{
data: initState,
target: transfer.target,
quantity: transfer.winstonQty
},
wallet
);
}
if (tags?.length) {
for (const tag of tags) {
contractTX.addTag(tag.name.toString(), tag.value.toString());
}
}
contractTX.addTag(SmartWeaveTags.APP_NAME, 'SmartWeaveContract');
contractTX.addTag(SmartWeaveTags.APP_VERSION, '0.3.0');
contractTX.addTag(SmartWeaveTags.CONTRACT_SRC_TX_ID, srcTxId);
contractTX.addTag(SmartWeaveTags.SDK, 'RedStone');
contractTX.addTag(SmartWeaveTags.CONTENT_TYPE, 'application/json');
contractTX.addTag(SmartWeaveTags.CONTRACT_TYPE, contractData.contractType);
if (contractData.contractType == 'wasm') {
contractTX.addTag(SmartWeaveTags.WASM_LANG, contractData.wasmLang);
}
await this.arweave.transactions.sign(contractTX, wallet);
const response = await this.arweave.transactions.post(contractTX);
if (response.status === 200 || response.status === 208) {
return contractTX.id;
} else {
throw new Error('Unable to write Contract Initial State');
}
} }
}
} }
function dummyImports(moduleImports: WebAssembly.ModuleImportDescriptor[]) { function dummyImports(moduleImports: WebAssembly.ModuleImportDescriptor[]) {
const imports = {}; const imports = {};
moduleImports.forEach((moduleImport) => { moduleImports.forEach((moduleImport) => {
if (!Object.prototype.hasOwnProperty.call(imports, moduleImport.module)) { if (!Object.prototype.hasOwnProperty.call(imports, moduleImport.module)) {
imports[moduleImport.module] = {}; imports[moduleImport.module] = {};
} }
imports[moduleImport.module][moduleImport.name] = function () {}; imports[moduleImport.module][moduleImport.name] = function () {
}); };
});
return imports; return imports;
} }

View File

@@ -129,7 +129,7 @@ export abstract class DefaultStateEvaluator implements StateEvaluator {
}); });
if (newState !== null) { if (newState !== null) {
currentState = deepCopy(newState.cachedValue.state); currentState = newState.cachedValue.state;
validity[interactionTx.id] = newState.cachedValue.validity[interactionTx.id]; validity[interactionTx.id] = newState.cachedValue.validity[interactionTx.id];
const toCache = new EvalStateResult(currentState, validity); const toCache = new EvalStateResult(currentState, validity);

View File

@@ -1,20 +1,23 @@
import Arweave from 'arweave'; import Arweave from 'arweave';
import { import {
Benchmark,
ContractDefinition, ContractDefinition,
EvalStateResult, EvalStateResult,
ExecutionContext, ExecutionContext,
ExecutorFactory, ExecutorFactory,
GQLNodeInterface, GQLNodeInterface,
LoggerFactory, LoggerFactory,
MemCache,
normalizeContractSource, normalizeContractSource,
SmartWeaveGlobal SmartWeaveGlobal,
SwCache
} from '@smartweave'; } from '@smartweave';
import { ContractHandlerApi } from './ContractHandlerApi'; import { ContractHandlerApi } from './ContractHandlerApi';
import loader from '@assemblyscript/loader'; import loader from '@assemblyscript/loader';
import { WasmContractHandlerApi } from './WasmContractHandlerApi'; import { WasmContractHandlerApi } from './WasmContractHandlerApi';
import metering from 'redstone-wasm-metering';
import { asWasmImports } from './wasm/as-wasm-imports'; import { asWasmImports } from './wasm/as-wasm-imports';
import { rustWasmImports } from './wasm/rust-wasm-imports'; import { rustWasmImports } from './wasm/rust-wasm-imports';
import { Go } from './wasm/go-wasm-imports';
/** /**
* A factory that produces handlers that are compatible with the "current" style of * A factory that produces handlers that are compatible with the "current" style of
@@ -22,6 +25,7 @@ import { rustWasmImports } from './wasm/rust-wasm-imports';
*/ */
export class HandlerExecutorFactory implements ExecutorFactory<HandlerApi<unknown>> { export class HandlerExecutorFactory implements ExecutorFactory<HandlerApi<unknown>> {
private readonly logger = LoggerFactory.INST.create('HandlerExecutorFactory'); private readonly logger = LoggerFactory.INST.create('HandlerExecutorFactory');
private readonly cache: SwCache<string, WebAssembly.Module> = new MemCache();
constructor(private readonly arweave: Arweave) {} constructor(private readonly arweave: Arweave) {}
@@ -34,12 +38,9 @@ export class HandlerExecutorFactory implements ExecutorFactory<HandlerApi<unknow
if (contractDefinition.contractType == 'wasm') { if (contractDefinition.contractType == 'wasm') {
this.logger.info('Creating handler for wasm contract', contractDefinition.txId); this.logger.info('Creating handler for wasm contract', contractDefinition.txId);
const meteredWasmBinary = metering.meterWASM(contractDefinition.srcBinary, { const benchmark = Benchmark.measure();
meterType: 'i32'
});
let wasmInstance; let wasmInstance;
let jsExports = null; let jsExports = null;
switch (contractDefinition.srcWasmLang) { switch (contractDefinition.srcWasmLang) {
@@ -47,7 +48,10 @@ export class HandlerExecutorFactory implements ExecutorFactory<HandlerApi<unknow
const wasmInstanceExports = { const wasmInstanceExports = {
exports: null exports: null
}; };
wasmInstance = loader.instantiateSync(meteredWasmBinary, asWasmImports(swGlobal, wasmInstanceExports)); wasmInstance = loader.instantiateSync(
contractDefinition.srcBinary,
asWasmImports(swGlobal, wasmInstanceExports)
);
// note: well, exports are required by some imports // note: well, exports are required by some imports
// - e.g. those that use wasmModule.exports.__newString underneath (like Block.indep_hash) // - e.g. those that use wasmModule.exports.__newString underneath (like Block.indep_hash)
wasmInstanceExports.exports = wasmInstance.exports; wasmInstanceExports.exports = wasmInstance.exports;
@@ -70,7 +74,7 @@ export class HandlerExecutorFactory implements ExecutorFactory<HandlerApi<unknow
* to NOT mangle the import function names - unfortunately that is not currently possible * to NOT mangle the import function names - unfortunately that is not currently possible
* - https://github.com/rustwasm/wasm-bindgen/issues/1128 * - https://github.com/rustwasm/wasm-bindgen/issues/1128
*/ */
const wasmModule = await WebAssembly.compile(meteredWasmBinary); const wasmModule: WebAssembly.Module = await WebAssembly.compile(contractDefinition.srcBinary);
const moduleImports = WebAssembly.Module.imports(wasmModule); const moduleImports = WebAssembly.Module.imports(wasmModule);
const wbindgenImports = moduleImports const wbindgenImports = moduleImports
.filter((imp) => { .filter((imp) => {
@@ -85,11 +89,29 @@ export class HandlerExecutorFactory implements ExecutorFactory<HandlerApi<unknow
wasmInstanceExports.exports = wasmInstance.exports; wasmInstanceExports.exports = wasmInstance.exports;
break; break;
} }
case 'go': {
const go = new Go(swGlobal);
go.importObject.metering = {
usegas: function (value) {
swGlobal.useGas(value);
}
};
const wasmModule = await WebAssembly.compile(contractDefinition.srcBinary);
wasmInstance = new WebAssembly.Instance(wasmModule, go.importObject);
// nope - DO NOT await here!
go.run(wasmInstance);
jsExports = go.exports;
break;
}
default: { default: {
throw new Error(`Support for ${contractDefinition.srcWasmLang} not implemented yet.`); throw new Error(`Support for ${contractDefinition.srcWasmLang} not implemented yet.`);
} }
} }
this.logger.info(`WASM ${contractDefinition.srcWasmLang} handler created in ${benchmark.elapsed()}`);
return new WasmContractHandlerApi(swGlobal, contractDefinition, jsExports || wasmInstance.exports); return new WasmContractHandlerApi(swGlobal, contractDefinition, jsExports || wasmInstance.exports);
} else { } else {
this.logger.info('Creating handler for js contract', contractDefinition.txId); this.logger.info('Creating handler for js contract', contractDefinition.txId);

View File

@@ -42,7 +42,6 @@ export class WasmContractHandlerApi<State> implements HandlerApi<State> {
this.swGlobal.gasUsed = 0; this.swGlobal.gasUsed = 0;
this.assignReadContractState<Input>(executionContext, currentTx, currentResult, interactionTx); this.assignReadContractState<Input>(executionContext, currentTx, currentResult, interactionTx);
const handlerResult = await this.doHandle(interaction); const handlerResult = await this.doHandle(interaction);
return { return {
@@ -94,6 +93,10 @@ export class WasmContractHandlerApi<State> implements HandlerApi<State> {
this.wasmExports.initState(state); this.wasmExports.initState(state);
break; break;
} }
case "go": {
this.wasmExports.initState(stringify(state));
break;
}
default: { default: {
throw new Error(`Support for ${this.contractDefinition.srcWasmLang} not implemented yet.`); throw new Error(`Support for ${this.contractDefinition.srcWasmLang} not implemented yet.`);
} }
@@ -134,6 +137,10 @@ export class WasmContractHandlerApi<State> implements HandlerApi<State> {
} }
} }
} }
case "go": {
const result = await this.wasmExports.handle(stringify(action.input));
return JSON.parse(result);
}
default: { default: {
throw new Error(`Support for ${this.contractDefinition.srcWasmLang} not implemented yet.`); throw new Error(`Support for ${this.contractDefinition.srcWasmLang} not implemented yet.`);
} }
@@ -149,6 +156,10 @@ export class WasmContractHandlerApi<State> implements HandlerApi<State> {
case 'rust': { case 'rust': {
return this.wasmExports.currentState(); return this.wasmExports.currentState();
} }
case "go": {
const result = this.wasmExports.currentState();
return JSON.parse(result);
}
default: { default: {
throw new Error(`Support for ${this.contractDefinition.srcWasmLang} not implemented yet.`); throw new Error(`Support for ${this.contractDefinition.srcWasmLang} not implemented yet.`);
} }

View File

@@ -1,7 +1,7 @@
import { LoggerFactory, SmartWeaveGlobal } from '@smartweave'; import { LoggerFactory, SmartWeaveGlobal } from '@smartweave';
export const asWasmImports = (swGlobal: SmartWeaveGlobal, wasmInstance: any): any => { export const asWasmImports = (swGlobal: SmartWeaveGlobal, wasmInstance: any): any => {
const wasmLogger = LoggerFactory.INST.create('WASM'); const wasmLogger = LoggerFactory.INST.create('WASM:AS');
return { return {
metering: { metering: {

View File

@@ -0,0 +1,502 @@
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//
// This file has been modified for use by the TinyGo compiler.
// note: this file has been further modified to be used
// with RedStone SmartWeave SDK.
/* tslint:disable */
/* eslint-disable */
/* YOLO */
import {LoggerFactory, SmartWeaveGlobal} from "@smartweave";
const encoder = new TextEncoder();
const decoder = new TextDecoder("utf-8");
let logLine = [];
let globalJsModule;
// crying while committing...
(function (global) {
globalJsModule = global;
globalJsModule.redstone = {
go: {}
};
}).call(
this,
typeof global !== 'undefined'
? global
: typeof self !== 'undefined'
? self
: typeof window !== 'undefined'
? window
: {});
export class Go {
private _callbackTimeouts: Map<any, any>;
private _nextCallbackTimeoutID: number;
private _inst: any;
private _values: any;
private _ids: any;
private _idPool: any;
private _goRefCounts: any;
importObject: any;
private exited: boolean;
private _resolveCallbackPromise: () => void;
private _pendingEvent: any;
private _id: string;
public exports: any;
constructor(swGlobal: SmartWeaveGlobal) {
this._callbackTimeouts = new Map();
this._nextCallbackTimeoutID = 1;
const wasmLogger = LoggerFactory.INST.create('WASM:Go');
let go = this;
// it is safe to redeclare this for each new module in the global scope
// - this function is called only during module initialization.
globalJsModule.redstone.go = {
WasmModule: {
registerWasmModule: function (moduleId) {
go._id = moduleId;
go.exports = globalJsModule[moduleId];
delete globalJsModule[moduleId];
globalJsModule.redstone.go[moduleId] = {};
globalJsModule.redstone.go[moduleId].imports = {
console: {
log: function (...args) {
wasmLogger.debug(args[0], ...args.slice(1));
}
},
Transaction: {
id: function () {
return swGlobal.transaction.id;
},
owner: function () {
return swGlobal.transaction.owner;
},
target: function () {
return swGlobal.transaction.target;
}
},
Block: {
indep_hash: function () {
return swGlobal.block.indep_hash;
},
height: function () {
return swGlobal.block.height;
},
timestamp: function () {
return swGlobal.block.timestamp;
}
},
Contract: {
id: function () {
return swGlobal.contract.id;
},
owner: function () {
return swGlobal.contract.owner;
}
},
SmartWeave: {
readContractState: async function (contractTxId) {
return await swGlobal.contracts.readContractState(contractTxId);
}
},
};
}
}
}
const mem = () => {
// The buffer may change when requesting more memory.
return new DataView(this._inst.exports.memory.buffer);
}
const setInt64 = (addr, v) => {
mem().setUint32(addr + 0, v, true);
mem().setUint32(addr + 4, Math.floor(v / 4294967296), true);
}
const getInt64 = (addr) => {
const low = mem().getUint32(addr + 0, true);
const high = mem().getInt32(addr + 4, true);
return low + high * 4294967296;
}
const loadValue = (addr) => {
const f = mem().getFloat64(addr, true);
if (f === 0) {
return undefined;
}
if (!isNaN(f)) {
return f;
}
const id = mem().getUint32(addr, true);
return this._values[id];
}
const storeValue = (addr, v) => {
const nanHead = 0x7FF80000;
if (typeof v === "number") {
if (isNaN(v)) {
mem().setUint32(addr + 4, nanHead, true);
mem().setUint32(addr, 0, true);
return;
}
if (v === 0) {
mem().setUint32(addr + 4, nanHead, true);
mem().setUint32(addr, 1, true);
return;
}
mem().setFloat64(addr, v, true);
return;
}
switch (v) {
case undefined:
mem().setFloat64(addr, 0, true);
return;
case null:
mem().setUint32(addr + 4, nanHead, true);
mem().setUint32(addr, 2, true);
return;
case true:
mem().setUint32(addr + 4, nanHead, true);
mem().setUint32(addr, 3, true);
return;
case false:
mem().setUint32(addr + 4, nanHead, true);
mem().setUint32(addr, 4, true);
return;
}
let id = this._ids.get(v);
if (id === undefined) {
id = this._idPool.pop();
if (id === undefined) {
id = this._values.length;
}
this._values[id] = v;
this._goRefCounts[id] = 0;
this._ids.set(v, id);
}
this._goRefCounts[id]++;
let typeFlag = 1;
switch (typeof v) {
case "string":
typeFlag = 2;
break;
case "symbol":
typeFlag = 3;
break;
case "function":
typeFlag = 4;
break;
}
mem().setUint32(addr + 4, nanHead | typeFlag, true);
mem().setUint32(addr, id, true);
}
const loadSlice = (array, len, cap = null) => {
return new Uint8Array(this._inst.exports.memory.buffer, array, len);
}
const loadSliceOfValues = (array, len, cap) => {
const a = new Array(len);
for (let i = 0; i < len; i++) {
a[i] = loadValue(array + i * 8);
}
return a;
}
const loadString = (ptr, len) => {
return decoder.decode(new DataView(this._inst.exports.memory.buffer, ptr, len));
}
const timeOrigin = Date.now() - performance.now();
this.importObject = {
wasi_snapshot_preview1: {
// https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md#fd_write
fd_write: function (fd, iovs_ptr, iovs_len, nwritten_ptr) {
let nwritten = 0;
if (fd == 1) {
for (let iovs_i = 0; iovs_i < iovs_len; iovs_i++) {
let iov_ptr = iovs_ptr + iovs_i * 8; // assuming wasm32
let ptr = mem().getUint32(iov_ptr + 0, true);
let len = mem().getUint32(iov_ptr + 4, true);
nwritten += len;
for (let i = 0; i < len; i++) {
let c = mem().getUint8(ptr + i);
if (c == 13) { // CR
// ignore
} else if (c == 10) { // LF
// write line
let line = decoder.decode(new Uint8Array(logLine));
logLine = [];
console.log(line);
} else {
logLine.push(c);
}
}
}
} else {
console.error('invalid file descriptor:', fd);
}
mem().setUint32(nwritten_ptr, nwritten, true);
return 0;
},
fd_close: () => 0, // dummy
fd_fdstat_get: () => 0, // dummy
fd_seek: () => 0, // dummy
"proc_exit": (code) => {
// @ts-ignore
if (global.process) {
// Node.js
process.exit(code);
} else {
// Can't exit in a browser.
throw 'trying to exit with code ' + code;
}
},
random_get: (bufPtr, bufLen) => {
crypto.getRandomValues(loadSlice(bufPtr, bufLen, null));
return 0;
},
},
env: {
// func ticks() float64
"runtime.ticks": () => {
return timeOrigin + performance.now();
},
// func sleepTicks(timeout float64)
"runtime.sleepTicks": (timeout) => {
// Do not sleep, only reactivate scheduler after the given timeout.
setTimeout(this._inst.exports.go_scheduler, timeout);
},
// func finalizeRef(v ref)
// https://github.com/tinygo-org/tinygo/issues/1140#issuecomment-718145455
"syscall/js.finalizeRef": (v_addr) => {
// Note: TinyGo does not support finalizers so this is only called
// for one specific case, by js.go:jsString.
const id = mem().getUint32(v_addr, true);
this._goRefCounts[id]--;
if (this._goRefCounts[id] === 0) {
const v = this._values[id];
this._values[id] = null;
this._ids.delete(v);
this._idPool.push(id);
}
},
// func stringVal(value string) ref
"syscall/js.stringVal": (ret_ptr, value_ptr, value_len) => {
const s = loadString(value_ptr, value_len);
storeValue(ret_ptr, s);
},
// func valueGet(v ref, p string) ref
"syscall/js.valueGet": (retval, v_addr, p_ptr, p_len) => {
let prop = loadString(p_ptr, p_len);
let value = loadValue(v_addr);
let result = Reflect.get(value, prop);
storeValue(retval, result);
},
// func valueSet(v ref, p string, x ref)
"syscall/js.valueSet": (v_addr, p_ptr, p_len, x_addr) => {
const v = loadValue(v_addr);
const p = loadString(p_ptr, p_len);
const x = loadValue(x_addr);
Reflect.set(v, p, x);
},
// func valueDelete(v ref, p string)
"syscall/js.valueDelete": (v_addr, p_ptr, p_len) => {
const v = loadValue(v_addr);
const p = loadString(p_ptr, p_len);
Reflect.deleteProperty(v, p);
},
// func valueIndex(v ref, i int) ref
"syscall/js.valueIndex": (ret_addr, v_addr, i) => {
storeValue(ret_addr, Reflect.get(loadValue(v_addr), i));
},
// valueSetIndex(v ref, i int, x ref)
"syscall/js.valueSetIndex": (v_addr, i, x_addr) => {
Reflect.set(loadValue(v_addr), i, loadValue(x_addr));
},
// func valueCall(v ref, m string, args []ref) (ref, bool)
"syscall/js.valueCall": (ret_addr, v_addr, m_ptr, m_len, args_ptr, args_len, args_cap) => {
const v = loadValue(v_addr);
const name = loadString(m_ptr, m_len);
const args = loadSliceOfValues(args_ptr, args_len, args_cap);
try {
const m = Reflect.get(v, name);
storeValue(ret_addr, Reflect.apply(m, v, args));
mem().setUint8(ret_addr + 8, 1);
} catch (err) {
storeValue(ret_addr, err);
mem().setUint8(ret_addr + 8, 0);
}
},
// func valueInvoke(v ref, args []ref) (ref, bool)
"syscall/js.valueInvoke": (ret_addr, v_addr, args_ptr, args_len, args_cap) => {
try {
const v = loadValue(v_addr);
const args = loadSliceOfValues(args_ptr, args_len, args_cap);
storeValue(ret_addr, Reflect.apply(v, undefined, args));
mem().setUint8(ret_addr + 8, 1);
} catch (err) {
storeValue(ret_addr, err);
mem().setUint8(ret_addr + 8, 0);
}
},
// func valueNew(v ref, args []ref) (ref, bool)
"syscall/js.valueNew": (ret_addr, v_addr, args_ptr, args_len, args_cap) => {
const v = loadValue(v_addr);
const args = loadSliceOfValues(args_ptr, args_len, args_cap);
try {
storeValue(ret_addr, Reflect.construct(v, args));
mem().setUint8(ret_addr + 8, 1);
} catch (err) {
storeValue(ret_addr, err);
mem().setUint8(ret_addr + 8, 0);
}
},
// func valueLength(v ref) int
"syscall/js.valueLength": (v_addr) => {
return loadValue(v_addr).length;
},
// valuePrepareString(v ref) (ref, int)
"syscall/js.valuePrepareString": (ret_addr, v_addr) => {
const s = String(loadValue(v_addr));
const str = encoder.encode(s);
storeValue(ret_addr, str);
setInt64(ret_addr + 8, str.length);
},
// valueLoadString(v ref, b []byte)
"syscall/js.valueLoadString": (v_addr, slice_ptr, slice_len, slice_cap) => {
const str = loadValue(v_addr);
loadSlice(slice_ptr, slice_len, slice_cap).set(str);
},
// func valueInstanceOf(v ref, t ref) bool
"syscall/js.valueInstanceOf": (v_addr, t_addr) => {
return loadValue(v_addr) instanceof loadValue(t_addr);
},
// func copyBytesToGo(dst []byte, src ref) (int, bool)
"syscall/js.copyBytesToGo": (ret_addr, dest_addr, dest_len, dest_cap, source_addr) => {
let num_bytes_copied_addr = ret_addr;
let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable
const dst = loadSlice(dest_addr, dest_len);
const src = loadValue(source_addr);
if (!(src instanceof Uint8Array)) {
mem().setUint8(returned_status_addr, 0); // Return "not ok" status
return;
}
const toCopy = src.subarray(0, dst.length);
dst.set(toCopy);
setInt64(num_bytes_copied_addr, toCopy.length);
mem().setUint8(returned_status_addr, 1); // Return "ok" status
},
// copyBytesToJS(dst ref, src []byte) (int, bool)
// Originally copied from upstream Go project, then modified:
// https://github.com/golang/go/blob/3f995c3f3b43033013013e6c7ccc93a9b1411ca9/misc/wasm/wasm_exec.js#L404-L416
"syscall/js.copyBytesToJS": (ret_addr, dest_addr, source_addr, source_len, source_cap) => {
let num_bytes_copied_addr = ret_addr;
let returned_status_addr = ret_addr + 4; // Address of returned boolean status variable
const dst = loadValue(dest_addr);
const src = loadSlice(source_addr, source_len);
if (!(dst instanceof Uint8Array)) {
mem().setUint8(returned_status_addr, 0); // Return "not ok" status
return;
}
const toCopy = src.subarray(0, dst.length);
dst.set(toCopy);
setInt64(num_bytes_copied_addr, toCopy.length);
mem().setUint8(returned_status_addr, 1); // Return "ok" status
},
}
};
}
async run(instance) {
this._inst = instance;
this._values = [ // JS values that Go currently has references to, indexed by reference id
NaN,
0,
null,
true,
false,
global,
this,
];
this._goRefCounts = []; // number of references that Go has to a JS value, indexed by reference id
this._ids = new Map(); // mapping from JS values to reference ids
this._idPool = []; // unused ids that have been garbage collected
this.exited = false; // whether the Go program has exited
const mem = new DataView(this._inst.exports.memory.buffer)
while (true) {
const callbackPromise = new Promise((resolve) => {
this._resolveCallbackPromise = () => {
if (this.exited) {
throw new Error("bad callback: Go program has already exited");
}
setTimeout(resolve, 0); // make sure it is asynchronous
};
});
this._inst.exports._start();
if (this.exited) {
break;
}
await callbackPromise;
}
}
_resume() {
if (this.exited) {
throw new Error("Go program has already exited");
}
this._inst.exports.resume();
if (this.exited) {
this._resolveExitPromise();
}
}
_makeFuncWrapper(id) {
const go = this;
return function () {
const event = {id: id, this: this, args: arguments};
go._pendingEvent = event;
go._resume();
// @ts-ignore
return event.result;
};
}
private _resolveExitPromise() {
}
}

View File

@@ -30,6 +30,6 @@ export class CacheableExecutorFactory<Api> implements ExecutorFactory<Api> {
// switching off caching for now // switching off caching for now
// - https://github.com/redstone-finance/redstone-smartcontracts/issues/53 // - https://github.com/redstone-finance/redstone-smartcontracts/issues/53
// probably should be cached on a lower level - i.e. either handler function (for js contracts) // probably should be cached on a lower level - i.e. either handler function (for js contracts)
// or wasm instance. // or wasm module.
} }
} }

View File

@@ -88,9 +88,15 @@ export class ArweaveWrapper {
} }
async txData(id: string): Promise<Buffer> { async txData(id: string): Promise<Buffer> {
// https://github.com/textury/arlocal/issues/83
const txData = (await this.arweave.transactions.getData(id, {
decode: true
})) as Uint8Array;
return isomorphicBuffer.from(txData);
// note: this is using arweave.net cache - // note: this is using arweave.net cache -
// not very safe and clever, but fast... // not very safe and clever, but fast...
const response = await fetch(`${this.baseUrl}/${id}`); /*const response = await fetch(`${this.baseUrl}/${id}`);
if (!response.ok) { if (!response.ok) {
this.logger.warn(`Unable to load data from arweave.net/${id} endpoint, falling back to arweave.js`); this.logger.warn(`Unable to load data from arweave.net/${id} endpoint, falling back to arweave.js`);
// fallback to arweave-js as a last resort.. // fallback to arweave-js as a last resort..
@@ -101,7 +107,7 @@ export class ArweaveWrapper {
} else { } else {
const buffer = await response.arrayBuffer(); const buffer = await response.arrayBuffer();
return isomorphicBuffer.from(buffer); return isomorphicBuffer.from(buffer);
} }*/
} }
async txDataString(id: string): Promise<string> { async txDataString(id: string): Promise<string> {

644
yarn.lock
View File

@@ -370,345 +370,345 @@
minimatch "^3.0.4" minimatch "^3.0.4"
strip-json-comments "^3.1.1" strip-json-comments "^3.1.1"
"@ethersproject/abi@5.5.0", "@ethersproject/abi@^5.5.0": "@ethersproject/abi@5.6.0", "@ethersproject/abi@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.5.0.tgz#fb52820e22e50b854ff15ce1647cc508d6660613" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.0.tgz#ea07cbc1eec2374d32485679c12408005895e9f3"
integrity sha512-loW7I4AohP5KycATvc0MgujU6JyCHPqHdeoo9z3Nr9xEiNioxa65ccdm1+fsoJhkuhdRtfcL8cfyGamz2AxZ5w== integrity sha512-AhVByTwdXCc2YQ20v300w6KVHle9g2OFc28ZAFCPnJyEpkv1xKXjZcSTgWOlv1i+0dqlgF8RCF2Rn2KC1t+1Vg==
dependencies: dependencies:
"@ethersproject/address" "^5.5.0" "@ethersproject/address" "^5.6.0"
"@ethersproject/bignumber" "^5.5.0" "@ethersproject/bignumber" "^5.6.0"
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/constants" "^5.5.0" "@ethersproject/constants" "^5.6.0"
"@ethersproject/hash" "^5.5.0" "@ethersproject/hash" "^5.6.0"
"@ethersproject/keccak256" "^5.5.0" "@ethersproject/keccak256" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.5.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/strings" "^5.5.0" "@ethersproject/strings" "^5.6.0"
"@ethersproject/abstract-provider@5.5.1", "@ethersproject/abstract-provider@^5.5.0": "@ethersproject/abstract-provider@5.6.0", "@ethersproject/abstract-provider@^5.6.0":
version "5.5.1" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz#2f1f6e8a3ab7d378d8ad0b5718460f85649710c5" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.0.tgz#0c4ac7054650dbd9c476cf5907f588bbb6ef3061"
integrity sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg== integrity sha512-oPMFlKLN+g+y7a79cLK3WiLcjWFnZQtXWgnLAbHZcN3s7L4v90UHpTOrLk+m3yr0gt+/h9STTM6zrr7PM8uoRw==
dependencies: dependencies:
"@ethersproject/bignumber" "^5.5.0" "@ethersproject/bignumber" "^5.6.0"
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/networks" "^5.5.0" "@ethersproject/networks" "^5.6.0"
"@ethersproject/properties" "^5.5.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/transactions" "^5.5.0" "@ethersproject/transactions" "^5.6.0"
"@ethersproject/web" "^5.5.0" "@ethersproject/web" "^5.6.0"
"@ethersproject/abstract-signer@5.5.0", "@ethersproject/abstract-signer@^5.5.0": "@ethersproject/abstract-signer@5.6.0", "@ethersproject/abstract-signer@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz#590ff6693370c60ae376bf1c7ada59eb2a8dd08d" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.0.tgz#9cd7ae9211c2b123a3b29bf47aab17d4d016e3e7"
integrity sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA== integrity sha512-WOqnG0NJKtI8n0wWZPReHtaLkDByPL67tn4nBaDAhmVq8sjHTPbCdz4DRhVu/cfTOvfy9w3iq5QZ7BX7zw56BQ==
dependencies: dependencies:
"@ethersproject/abstract-provider" "^5.5.0" "@ethersproject/abstract-provider" "^5.6.0"
"@ethersproject/bignumber" "^5.5.0" "@ethersproject/bignumber" "^5.6.0"
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.5.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/address@5.5.0", "@ethersproject/address@^5.5.0": "@ethersproject/address@5.6.0", "@ethersproject/address@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.5.0.tgz#bcc6f576a553f21f3dd7ba17248f81b473c9c78f" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.0.tgz#13c49836d73e7885fc148ad633afad729da25012"
integrity sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw== integrity sha512-6nvhYXjbXsHPS+30sHZ+U4VMagFC/9zAk6Gd/h3S21YW4+yfb0WfRtaAIZ4kfM4rrVwqiy284LP0GtL5HXGLxQ==
dependencies: dependencies:
"@ethersproject/bignumber" "^5.5.0" "@ethersproject/bignumber" "^5.6.0"
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/keccak256" "^5.5.0" "@ethersproject/keccak256" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/rlp" "^5.5.0" "@ethersproject/rlp" "^5.6.0"
"@ethersproject/base64@5.5.0", "@ethersproject/base64@^5.5.0": "@ethersproject/base64@5.6.0", "@ethersproject/base64@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.5.0.tgz#881e8544e47ed976930836986e5eb8fab259c090" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.0.tgz#a12c4da2a6fb86d88563216b0282308fc15907c9"
integrity sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA== integrity sha512-2Neq8wxJ9xHxCF9TUgmKeSh9BXJ6OAxWfeGWvbauPh8FuHEjamgHilllx8KkSd5ErxyHIX7Xv3Fkcud2kY9ezw==
dependencies: dependencies:
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/basex@5.5.0", "@ethersproject/basex@^5.5.0": "@ethersproject/basex@5.6.0", "@ethersproject/basex@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.5.0.tgz#e40a53ae6d6b09ab4d977bd037010d4bed21b4d3" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.0.tgz#9ea7209bf0a1c3ddc2a90f180c3a7f0d7d2e8a69"
integrity sha512-ZIodwhHpVJ0Y3hUCfUucmxKsWQA5TMnavp5j/UOuDdzZWzJlRmuOjcTMIGgHCYuZmHt36BfiSyQPSRskPxbfaQ== integrity sha512-qN4T+hQd/Md32MoJpc69rOwLYRUXwjTlhHDIeUkUmiN/JyWkkLLMoG0TqvSQKNqZOMgN5stbUYN6ILC+eD7MEQ==
dependencies: dependencies:
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/properties" "^5.5.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/bignumber@5.5.0", "@ethersproject/bignumber@^5.5.0": "@ethersproject/bignumber@5.6.0", "@ethersproject/bignumber@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.5.0.tgz#875b143f04a216f4f8b96245bde942d42d279527" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.0.tgz#116c81b075c57fa765a8f3822648cf718a8a0e26"
integrity sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg== integrity sha512-VziMaXIUHQlHJmkv1dlcd6GY2PmT0khtAqaMctCIDogxkrarMzA9L94KN1NeXqqOfFD6r0sJT3vCTOFSmZ07DA==
dependencies: dependencies:
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
bn.js "^4.11.9" bn.js "^4.11.9"
"@ethersproject/bytes@5.5.0", "@ethersproject/bytes@^5.5.0": "@ethersproject/bytes@5.6.0", "@ethersproject/bytes@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.0.tgz#81652f2a0e04533575befadce555213c11d8aa20"
integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== integrity sha512-3hJPlYemb9V4VLfJF5BfN0+55vltPZSHU3QKUyP9M3Y2TcajbiRrz65UG+xVHOzBereB1b9mn7r12o177xgN7w==
dependencies: dependencies:
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/constants@5.5.0", "@ethersproject/constants@^5.5.0": "@ethersproject/constants@5.6.0", "@ethersproject/constants@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.5.0.tgz#d2a2cd7d94bd1d58377d1d66c4f53c9be4d0a45e" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.0.tgz#55e3eb0918584d3acc0688e9958b0cedef297088"
integrity sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ== integrity sha512-SrdaJx2bK0WQl23nSpV/b1aq293Lh0sUaZT/yYKPDKn4tlAbkH96SPJwIhwSwTsoQQZxuh1jnqsKwyymoiBdWA==
dependencies: dependencies:
"@ethersproject/bignumber" "^5.5.0" "@ethersproject/bignumber" "^5.6.0"
"@ethersproject/contracts@5.5.0": "@ethersproject/contracts@5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.5.0.tgz#b735260d4bd61283a670a82d5275e2a38892c197" resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.0.tgz#60f2cfc7addd99a865c6c8cfbbcec76297386067"
integrity sha512-2viY7NzyvJkh+Ug17v7g3/IJC8HqZBDcOjYARZLdzRxrfGlRgmYgl6xPRKVbEzy1dWKw/iv7chDcS83pg6cLxg== integrity sha512-74Ge7iqTDom0NX+mux8KbRUeJgu1eHZ3iv6utv++sLJG80FVuU9HnHeKVPfjd9s3woFhaFoQGf3B3iH/FrQmgw==
dependencies: dependencies:
"@ethersproject/abi" "^5.5.0" "@ethersproject/abi" "^5.6.0"
"@ethersproject/abstract-provider" "^5.5.0" "@ethersproject/abstract-provider" "^5.6.0"
"@ethersproject/abstract-signer" "^5.5.0" "@ethersproject/abstract-signer" "^5.6.0"
"@ethersproject/address" "^5.5.0" "@ethersproject/address" "^5.6.0"
"@ethersproject/bignumber" "^5.5.0" "@ethersproject/bignumber" "^5.6.0"
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/constants" "^5.5.0" "@ethersproject/constants" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.5.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/transactions" "^5.5.0" "@ethersproject/transactions" "^5.6.0"
"@ethersproject/hash@5.5.0", "@ethersproject/hash@^5.5.0": "@ethersproject/hash@5.6.0", "@ethersproject/hash@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.0.tgz#d24446a5263e02492f9808baa99b6e2b4c3429a2"
integrity sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg== integrity sha512-fFd+k9gtczqlr0/BruWLAu7UAOas1uRRJvOR84uDf4lNZ+bTkGl366qvniUZHKtlqxBRU65MkOobkmvmpHU+jA==
dependencies: dependencies:
"@ethersproject/abstract-signer" "^5.5.0" "@ethersproject/abstract-signer" "^5.6.0"
"@ethersproject/address" "^5.5.0" "@ethersproject/address" "^5.6.0"
"@ethersproject/bignumber" "^5.5.0" "@ethersproject/bignumber" "^5.6.0"
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/keccak256" "^5.5.0" "@ethersproject/keccak256" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.5.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/strings" "^5.5.0" "@ethersproject/strings" "^5.6.0"
"@ethersproject/hdnode@5.5.0", "@ethersproject/hdnode@^5.5.0": "@ethersproject/hdnode@5.6.0", "@ethersproject/hdnode@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.5.0.tgz#4a04e28f41c546f7c978528ea1575206a200ddf6" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.0.tgz#9dcbe8d629bbbcf144f2cae476337fe92d320998"
integrity sha512-mcSOo9zeUg1L0CoJH7zmxwUG5ggQHU1UrRf8jyTYy6HxdZV+r0PBoL1bxr+JHIPXRzS6u/UW4mEn43y0tmyF8Q== integrity sha512-61g3Jp3nwDqJcL/p4nugSyLrpl/+ChXIOtCEM8UDmWeB3JCAt5FoLdOMXQc3WWkc0oM2C0aAn6GFqqMcS/mHTw==
dependencies: dependencies:
"@ethersproject/abstract-signer" "^5.5.0" "@ethersproject/abstract-signer" "^5.6.0"
"@ethersproject/basex" "^5.5.0" "@ethersproject/basex" "^5.6.0"
"@ethersproject/bignumber" "^5.5.0" "@ethersproject/bignumber" "^5.6.0"
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/pbkdf2" "^5.5.0" "@ethersproject/pbkdf2" "^5.6.0"
"@ethersproject/properties" "^5.5.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/sha2" "^5.5.0" "@ethersproject/sha2" "^5.6.0"
"@ethersproject/signing-key" "^5.5.0" "@ethersproject/signing-key" "^5.6.0"
"@ethersproject/strings" "^5.5.0" "@ethersproject/strings" "^5.6.0"
"@ethersproject/transactions" "^5.5.0" "@ethersproject/transactions" "^5.6.0"
"@ethersproject/wordlists" "^5.5.0" "@ethersproject/wordlists" "^5.6.0"
"@ethersproject/json-wallets@5.5.0", "@ethersproject/json-wallets@^5.5.0": "@ethersproject/json-wallets@5.6.0", "@ethersproject/json-wallets@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.5.0.tgz#dd522d4297e15bccc8e1427d247ec8376b60e325" resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.0.tgz#4c2fc27f17e36c583e7a252fb938bc46f98891e5"
integrity sha512-9lA21XQnCdcS72xlBn1jfQdj2A1VUxZzOzi9UkNdnokNKke/9Ya2xA9aIK1SC3PQyBDLt4C+dfps7ULpkvKikQ== integrity sha512-fmh86jViB9r0ibWXTQipxpAGMiuxoqUf78oqJDlCAJXgnJF024hOOX7qVgqsjtbeoxmcLwpPsXNU0WEe/16qPQ==
dependencies: dependencies:
"@ethersproject/abstract-signer" "^5.5.0" "@ethersproject/abstract-signer" "^5.6.0"
"@ethersproject/address" "^5.5.0" "@ethersproject/address" "^5.6.0"
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/hdnode" "^5.5.0" "@ethersproject/hdnode" "^5.6.0"
"@ethersproject/keccak256" "^5.5.0" "@ethersproject/keccak256" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/pbkdf2" "^5.5.0" "@ethersproject/pbkdf2" "^5.6.0"
"@ethersproject/properties" "^5.5.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/random" "^5.5.0" "@ethersproject/random" "^5.6.0"
"@ethersproject/strings" "^5.5.0" "@ethersproject/strings" "^5.6.0"
"@ethersproject/transactions" "^5.5.0" "@ethersproject/transactions" "^5.6.0"
aes-js "3.0.0" aes-js "3.0.0"
scrypt-js "3.0.1" scrypt-js "3.0.1"
"@ethersproject/keccak256@5.5.0", "@ethersproject/keccak256@^5.5.0": "@ethersproject/keccak256@5.6.0", "@ethersproject/keccak256@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.5.0.tgz#e4b1f9d7701da87c564ffe336f86dcee82983492" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.0.tgz#fea4bb47dbf8f131c2e1774a1cecbfeb9d606459"
integrity sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg== integrity sha512-tk56BJ96mdj/ksi7HWZVWGjCq0WVl/QvfhFQNeL8fxhBlGoP+L80uDCiQcpJPd+2XxkivS3lwRm3E0CXTfol0w==
dependencies: dependencies:
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
js-sha3 "0.8.0" js-sha3 "0.8.0"
"@ethersproject/logger@5.5.0", "@ethersproject/logger@^5.5.0": "@ethersproject/logger@5.6.0", "@ethersproject/logger@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a"
integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg==
"@ethersproject/networks@5.5.2", "@ethersproject/networks@^5.5.0": "@ethersproject/networks@5.6.0", "@ethersproject/networks@^5.6.0":
version "5.5.2" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.5.2.tgz#784c8b1283cd2a931114ab428dae1bd00c07630b" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.0.tgz#486d03fff29b4b6b5414d47a232ded09fe10de5e"
integrity sha512-NEqPxbGBfy6O3x4ZTISb90SjEDkWYDUbEeIFhJly0F7sZjoQMnj5KYzMSkMkLKZ+1fGpx00EDpHQCy6PrDupkQ== integrity sha512-DaVzgyThzHgSDLuURhvkp4oviGoGe9iTZW4jMEORHDRCgSZ9K9THGFKqL+qGXqPAYLEgZTf5z2w56mRrPR1MjQ==
dependencies: dependencies:
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/pbkdf2@5.5.0", "@ethersproject/pbkdf2@^5.5.0": "@ethersproject/pbkdf2@5.6.0", "@ethersproject/pbkdf2@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.5.0.tgz#e25032cdf02f31505d47afbf9c3e000d95c4a050" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.0.tgz#04fcc2d7c6bff88393f5b4237d906a192426685a"
integrity sha512-SaDvQFvXPnz1QGpzr6/HToLifftSXGoXrbpZ6BvoZhmx4bNLHrxDe8MZisuecyOziP1aVEwzC2Hasj+86TgWVg== integrity sha512-Wu1AxTgJo3T3H6MIu/eejLFok9TYoSdgwRr5oGY1LTLfmGesDoSx05pemsbrPT2gG4cQME+baTSCp5sEo2erZQ==
dependencies: dependencies:
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/sha2" "^5.5.0" "@ethersproject/sha2" "^5.6.0"
"@ethersproject/properties@5.5.0", "@ethersproject/properties@^5.5.0": "@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.5.0.tgz#61f00f2bb83376d2071baab02245f92070c59995" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04"
integrity sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA== integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg==
dependencies: dependencies:
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/providers@5.5.3": "@ethersproject/providers@5.6.0":
version "5.5.3" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.5.3.tgz#56c2b070542ac44eb5de2ed3cf6784acd60a3130" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.0.tgz#08ec8e2666771e3a347e66c8f664a2af97366534"
integrity sha512-ZHXxXXXWHuwCQKrgdpIkbzMNJMvs+9YWemanwp1fA7XZEv7QlilseysPvQe0D7Q7DlkJX/w/bGA1MdgK2TbGvA== integrity sha512-6+5PKXTWAttJWFWF8+xCDTCa2/dtq9BNrdKQHGl0IyIOwj99vM6OeThmIRcsIAzIOb8m0XS6w+1KFZwrf3j9nw==
dependencies: dependencies:
"@ethersproject/abstract-provider" "^5.5.0" "@ethersproject/abstract-provider" "^5.6.0"
"@ethersproject/abstract-signer" "^5.5.0" "@ethersproject/abstract-signer" "^5.6.0"
"@ethersproject/address" "^5.5.0" "@ethersproject/address" "^5.6.0"
"@ethersproject/basex" "^5.5.0" "@ethersproject/basex" "^5.6.0"
"@ethersproject/bignumber" "^5.5.0" "@ethersproject/bignumber" "^5.6.0"
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/constants" "^5.5.0" "@ethersproject/constants" "^5.6.0"
"@ethersproject/hash" "^5.5.0" "@ethersproject/hash" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/networks" "^5.5.0" "@ethersproject/networks" "^5.6.0"
"@ethersproject/properties" "^5.5.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/random" "^5.5.0" "@ethersproject/random" "^5.6.0"
"@ethersproject/rlp" "^5.5.0" "@ethersproject/rlp" "^5.6.0"
"@ethersproject/sha2" "^5.5.0" "@ethersproject/sha2" "^5.6.0"
"@ethersproject/strings" "^5.5.0" "@ethersproject/strings" "^5.6.0"
"@ethersproject/transactions" "^5.5.0" "@ethersproject/transactions" "^5.6.0"
"@ethersproject/web" "^5.5.0" "@ethersproject/web" "^5.6.0"
bech32 "1.1.4" bech32 "1.1.4"
ws "7.4.6" ws "7.4.6"
"@ethersproject/random@5.5.1", "@ethersproject/random@^5.5.0": "@ethersproject/random@5.6.0", "@ethersproject/random@^5.6.0":
version "5.5.1" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.5.1.tgz#7cdf38ea93dc0b1ed1d8e480ccdaf3535c555415" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.0.tgz#1505d1ab6a250e0ee92f436850fa3314b2cb5ae6"
integrity sha512-YaU2dQ7DuhL5Au7KbcQLHxcRHfgyNgvFV4sQOo0HrtW3Zkrc9ctWNz8wXQ4uCSfSDsqX2vcjhroxU5RQRV0nqA== integrity sha512-si0PLcLjq+NG/XHSZz90asNf+YfKEqJGVdxoEkSukzbnBgC8rydbgbUgBbBGLeHN4kAJwUFEKsu3sCXT93YMsw==
dependencies: dependencies:
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/rlp@5.5.0", "@ethersproject/rlp@^5.5.0": "@ethersproject/rlp@5.6.0", "@ethersproject/rlp@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.5.0.tgz#530f4f608f9ca9d4f89c24ab95db58ab56ab99a0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.0.tgz#55a7be01c6f5e64d6e6e7edb6061aa120962a717"
integrity sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA== integrity sha512-dz9WR1xpcTL+9DtOT/aDO+YyxSSdO8YIS0jyZwHHSlAmnxA6cKU3TrTd4Xc/bHayctxTgGLYNuVVoiXE4tTq1g==
dependencies: dependencies:
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/sha2@5.5.0", "@ethersproject/sha2@^5.5.0": "@ethersproject/sha2@5.6.0", "@ethersproject/sha2@^5.5.0", "@ethersproject/sha2@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.0.tgz#364c4c11cc753bda36f31f001628706ebadb64d9"
integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA== integrity sha512-1tNWCPFLu1n3JM9t4/kytz35DkuF9MxqkGGEHNauEbaARdm2fafnOyw1s0tIQDPKF/7bkP1u3dbrmjpn5CelyA==
dependencies: dependencies:
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
hash.js "1.1.7" hash.js "1.1.7"
"@ethersproject/signing-key@5.5.0", "@ethersproject/signing-key@^5.5.0": "@ethersproject/signing-key@5.6.0", "@ethersproject/signing-key@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.5.0.tgz#2aa37169ce7e01e3e80f2c14325f624c29cedbe0" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.0.tgz#4f02e3fb09e22b71e2e1d6dc4bcb5dafa69ce042"
integrity sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng== integrity sha512-S+njkhowmLeUu/r7ir8n78OUKx63kBdMCPssePS89So1TH4hZqnWFsThEd/GiXYp9qMxVrydf7KdM9MTGPFukA==
dependencies: dependencies:
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.5.0" "@ethersproject/properties" "^5.6.0"
bn.js "^4.11.9" bn.js "^4.11.9"
elliptic "6.5.4" elliptic "6.5.4"
hash.js "1.1.7" hash.js "1.1.7"
"@ethersproject/solidity@5.5.0": "@ethersproject/solidity@5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.5.0.tgz#2662eb3e5da471b85a20531e420054278362f93f" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.0.tgz#64657362a596bf7f5630bdc921c07dd78df06dc3"
integrity sha512-9NgZs9LhGMj6aCtHXhtmFQ4AN4sth5HuFXVvAQtzmm0jpSCNOTGtrHZJAeYTh7MBjRR8brylWZxBZR9zDStXbw== integrity sha512-YwF52vTNd50kjDzqKaoNNbC/r9kMDPq3YzDWmsjFTRBcIF1y4JCQJ8gB30wsTfHbaxgxelI5BfxQSxD/PbJOww==
dependencies: dependencies:
"@ethersproject/bignumber" "^5.5.0" "@ethersproject/bignumber" "^5.6.0"
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/keccak256" "^5.5.0" "@ethersproject/keccak256" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/sha2" "^5.5.0" "@ethersproject/sha2" "^5.6.0"
"@ethersproject/strings" "^5.5.0" "@ethersproject/strings" "^5.6.0"
"@ethersproject/strings@5.5.0", "@ethersproject/strings@^5.5.0": "@ethersproject/strings@5.6.0", "@ethersproject/strings@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.0.tgz#9891b26709153d996bf1303d39a7f4bc047878fd"
integrity sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ== integrity sha512-uv10vTtLTZqrJuqBZR862ZQjTIa724wGPWQqZrofaPI/kUsf53TBG0I0D+hQ1qyNtllbNzaW+PDPHHUI6/65Mg==
dependencies: dependencies:
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/constants" "^5.5.0" "@ethersproject/constants" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/transactions@5.5.0", "@ethersproject/transactions@^5.5.0": "@ethersproject/transactions@5.6.0", "@ethersproject/transactions@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.5.0.tgz#7e9bf72e97bcdf69db34fe0d59e2f4203c7a2908" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.0.tgz#4b594d73a868ef6e1529a2f8f94a785e6791ae4e"
integrity sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA== integrity sha512-4HX+VOhNjXHZyGzER6E/LVI2i6lf9ejYeWD6l4g50AdmimyuStKc39kvKf1bXWQMg7QNVh+uC7dYwtaZ02IXeg==
dependencies: dependencies:
"@ethersproject/address" "^5.5.0" "@ethersproject/address" "^5.6.0"
"@ethersproject/bignumber" "^5.5.0" "@ethersproject/bignumber" "^5.6.0"
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/constants" "^5.5.0" "@ethersproject/constants" "^5.6.0"
"@ethersproject/keccak256" "^5.5.0" "@ethersproject/keccak256" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.5.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/rlp" "^5.5.0" "@ethersproject/rlp" "^5.6.0"
"@ethersproject/signing-key" "^5.5.0" "@ethersproject/signing-key" "^5.6.0"
"@ethersproject/units@5.5.0": "@ethersproject/units@5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.5.0.tgz#104d02db5b5dc42cc672cc4587bafb87a95ee45e" resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.0.tgz#e5cbb1906988f5740254a21b9ded6bd51e826d9c"
integrity sha512-7+DpjiZk4v6wrikj+TCyWWa9dXLNU73tSTa7n0TSJDxkYbV3Yf1eRh9ToMLlZtuctNYu9RDNNy2USq3AdqSbag== integrity sha512-tig9x0Qmh8qbo1w8/6tmtyrm/QQRviBh389EQ+d8fP4wDsBrJBf08oZfoiz1/uenKK9M78yAP4PoR7SsVoTjsw==
dependencies: dependencies:
"@ethersproject/bignumber" "^5.5.0" "@ethersproject/bignumber" "^5.6.0"
"@ethersproject/constants" "^5.5.0" "@ethersproject/constants" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/wallet@5.5.0": "@ethersproject/wallet@5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.5.0.tgz#322a10527a440ece593980dca6182f17d54eae75" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.0.tgz#33d11a806d783864208f348709a5a3badac8e22a"
integrity sha512-Mlu13hIctSYaZmUOo7r2PhNSd8eaMPVXe1wxrz4w4FCE4tDYBywDH+bAR1Xz2ADyXGwqYMwstzTrtUVIsKDO0Q== integrity sha512-qMlSdOSTyp0MBeE+r7SUhr1jjDlC1zAXB8VD84hCnpijPQiSNbxr6GdiLXxpUs8UKzkDiNYYC5DRI3MZr+n+tg==
dependencies: dependencies:
"@ethersproject/abstract-provider" "^5.5.0" "@ethersproject/abstract-provider" "^5.6.0"
"@ethersproject/abstract-signer" "^5.5.0" "@ethersproject/abstract-signer" "^5.6.0"
"@ethersproject/address" "^5.5.0" "@ethersproject/address" "^5.6.0"
"@ethersproject/bignumber" "^5.5.0" "@ethersproject/bignumber" "^5.6.0"
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/hash" "^5.5.0" "@ethersproject/hash" "^5.6.0"
"@ethersproject/hdnode" "^5.5.0" "@ethersproject/hdnode" "^5.6.0"
"@ethersproject/json-wallets" "^5.5.0" "@ethersproject/json-wallets" "^5.6.0"
"@ethersproject/keccak256" "^5.5.0" "@ethersproject/keccak256" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.5.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/random" "^5.5.0" "@ethersproject/random" "^5.6.0"
"@ethersproject/signing-key" "^5.5.0" "@ethersproject/signing-key" "^5.6.0"
"@ethersproject/transactions" "^5.5.0" "@ethersproject/transactions" "^5.6.0"
"@ethersproject/wordlists" "^5.5.0" "@ethersproject/wordlists" "^5.6.0"
"@ethersproject/web@5.5.1", "@ethersproject/web@^5.5.0": "@ethersproject/web@5.6.0", "@ethersproject/web@^5.6.0":
version "5.5.1" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.5.1.tgz#cfcc4a074a6936c657878ac58917a61341681316" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.0.tgz#4bf8b3cbc17055027e1a5dd3c357e37474eaaeb8"
integrity sha512-olvLvc1CB12sREc1ROPSHTdFCdvMh0J5GSJYiQg2D0hdD4QmJDy8QYDb1CvoqD/bF1c++aeKv2sR5uduuG9dQg== integrity sha512-G/XHj0hV1FxI2teHRfCGvfBUHFmU+YOSbCxlAMqJklxSa7QMiHFQfAxvwY2PFqgvdkxEKwRNr/eCjfAPEm2Ctg==
dependencies: dependencies:
"@ethersproject/base64" "^5.5.0" "@ethersproject/base64" "^5.6.0"
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.5.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/strings" "^5.5.0" "@ethersproject/strings" "^5.6.0"
"@ethersproject/wordlists@5.5.0", "@ethersproject/wordlists@^5.5.0": "@ethersproject/wordlists@5.6.0", "@ethersproject/wordlists@^5.6.0":
version "5.5.0" version "5.6.0"
resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.5.0.tgz#aac74963aa43e643638e5172353d931b347d584f" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.0.tgz#79e62c5276e091d8575f6930ba01a29218ded032"
integrity sha512-bL0UTReWDiaQJJYOC9sh/XcRu/9i2jMrzf8VLRmPKx58ckSlOJiohODkECCO50dtLZHcGU6MLXQ4OOrgBwP77Q== integrity sha512-q0bxNBfIX3fUuAo9OmjlEYxP40IB8ABgb7HjEZCL5IKubzV3j30CWi2rqQbjTS2HfoyQbfINoKcTVWP4ejwR7Q==
dependencies: dependencies:
"@ethersproject/bytes" "^5.5.0" "@ethersproject/bytes" "^5.6.0"
"@ethersproject/hash" "^5.5.0" "@ethersproject/hash" "^5.6.0"
"@ethersproject/logger" "^5.5.0" "@ethersproject/logger" "^5.6.0"
"@ethersproject/properties" "^5.5.0" "@ethersproject/properties" "^5.6.0"
"@ethersproject/strings" "^5.5.0" "@ethersproject/strings" "^5.6.0"
"@graphql-tools/merge@^8.2.3": "@graphql-tools/merge@^8.2.3":
version "8.2.3" version "8.2.3"
@@ -1744,10 +1744,10 @@ apollo-server-caching@^3.3.0:
dependencies: dependencies:
lru-cache "^6.0.0" lru-cache "^6.0.0"
apollo-server-core@^3.6.3: apollo-server-core@^3.6.4:
version "3.6.3" version "3.6.4"
resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.6.3.tgz#6b12ffa1af8bc8799930f72360090834915033d1" resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-3.6.4.tgz#dcf3925173a8e9a501ed3975654cb2ed58af3710"
integrity sha512-TFJmAlI6vPp1MHOSXqYkE6leAyMekWv/D/3ma11uETkcd3EPjERGmxtTXPJElMVEkOK9BEElYKthCrH7bjYLuw== integrity sha512-zttpu/3IeDGhRgIGK84z9HwTgvETDl9zntXiQ0G1tBJgOhDvehSkMiOmy+FKR1HW9+94ao1Olz6ZIyhP0dvzSg==
dependencies: dependencies:
"@apollographql/apollo-tools" "^0.5.1" "@apollographql/apollo-tools" "^0.5.1"
"@apollographql/graphql-playground-html" "1.6.29" "@apollographql/graphql-playground-html" "1.6.29"
@@ -1783,9 +1783,9 @@ apollo-server-errors@^3.3.1:
integrity sha512-xnZJ5QWs6FixHICXHxUfm+ZWqqxrNuPlQ+kj5m6RtEgIpekOPssH/SD9gf2B4HuWV0QozorrygwZnux8POvyPA== integrity sha512-xnZJ5QWs6FixHICXHxUfm+ZWqqxrNuPlQ+kj5m6RtEgIpekOPssH/SD9gf2B4HuWV0QozorrygwZnux8POvyPA==
apollo-server-koa@^3.6.2: apollo-server-koa@^3.6.2:
version "3.6.3" version "3.6.4"
resolved "https://registry.yarnpkg.com/apollo-server-koa/-/apollo-server-koa-3.6.3.tgz#4027cdfd82175548e42a5ef01c055c733b1487c1" resolved "https://registry.yarnpkg.com/apollo-server-koa/-/apollo-server-koa-3.6.4.tgz#affda3eae5e90e20ecf801f62c85a4c36d30cf99"
integrity sha512-KDKRjS3i6dQhtXGatRa0ftJQDa+o7Zt5+T0P1HSxGz4FA+w8GJ5Nn0V6PXh6QKNtLPzYu13DGQl6i8dSo6BMQQ== integrity sha512-zG6VpD37WnyX8ycoBjFCoY8d1yKp/MPahyX73rVu8RWKDz6eCLUE/YopOPc2RC/DtxGc039Sv9yo4md5jAKNJw==
dependencies: dependencies:
"@koa/cors" "^3.1.0" "@koa/cors" "^3.1.0"
"@types/accepts" "^1.3.5" "@types/accepts" "^1.3.5"
@@ -1794,7 +1794,7 @@ apollo-server-koa@^3.6.2:
"@types/koa-compose" "^3.2.5" "@types/koa-compose" "^3.2.5"
"@types/koa__cors" "^3.0.1" "@types/koa__cors" "^3.0.1"
accepts "^1.3.7" accepts "^1.3.7"
apollo-server-core "^3.6.3" apollo-server-core "^3.6.4"
apollo-server-types "^3.5.1" apollo-server-types "^3.5.1"
koa-bodyparser "^4.3.0" koa-bodyparser "^4.3.0"
koa-compose "^4.1.0" koa-compose "^4.1.0"
@@ -1882,10 +1882,10 @@ argparse@^1.0.7:
dependencies: dependencies:
sprintf-js "~1.0.2" sprintf-js "~1.0.2"
arlocal@1.1.22: arlocal@1.1.26:
version "1.1.22" version "1.1.26"
resolved "https://registry.yarnpkg.com/arlocal/-/arlocal-1.1.22.tgz#75ee7c4f8c7e54f8756f9df35439b764b5486404" resolved "https://registry.yarnpkg.com/arlocal/-/arlocal-1.1.26.tgz#8193fc7792507c2038dc720e69b8d9bf64ec3c33"
integrity sha512-7p+Ic35ZagEOJRSnxpeJ6Gv6xsUVeBpn50ku1xA6m0eMM3ke+eBdoEVpaSsdaR8sAo840Vn/94Q5AHblw6Jt8Q== integrity sha512-5rY7z777o5D1sJ+OtanZOPsuJwgeONKLy7PWr4fAWS72q0RAP4JaoTsFk99nhZZcDd4BZJQhtpnbpUih1fs4Aw==
dependencies: dependencies:
"@koa/cors" "^3.1.0" "@koa/cors" "^3.1.0"
apollo-server-koa "^3.6.2" apollo-server-koa "^3.6.2"
@@ -1902,6 +1902,7 @@ arlocal@1.1.22:
koa-logger "^3.2.1" koa-logger "^3.2.1"
koa-router "^10.1.1" koa-router "^10.1.1"
lodash "^4.17.21" lodash "^4.17.21"
mime "^3.0.0"
minimist "^1.2.5" minimist "^1.2.5"
moment "^2.29.1" moment "^2.29.1"
rfc4648 "^1.5.1" rfc4648 "^1.5.1"
@@ -3433,40 +3434,40 @@ etag@~1.8.1:
integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
ethers@^5.5.1: ethers@^5.5.1:
version "5.5.4" version "5.6.0"
resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.5.4.tgz#e1155b73376a2f5da448e4a33351b57a885f4352" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.0.tgz#924eb965dc03963fad0a09ce687efdf49aca3b45"
integrity sha512-N9IAXsF8iKhgHIC6pquzRgPBJEzc9auw3JoRkaKe+y4Wl/LFBtDDunNe7YmdomontECAcC5APaAgWZBiu1kirw== integrity sha512-00FP71jt6bW3ndO5DhgH9mLIZhoCGnAKFLu8qig5KmV03ubEChKf2ilB3g6fX512tTYo+tSMDJ5WpCJWdBHkBQ==
dependencies: dependencies:
"@ethersproject/abi" "5.5.0" "@ethersproject/abi" "5.6.0"
"@ethersproject/abstract-provider" "5.5.1" "@ethersproject/abstract-provider" "5.6.0"
"@ethersproject/abstract-signer" "5.5.0" "@ethersproject/abstract-signer" "5.6.0"
"@ethersproject/address" "5.5.0" "@ethersproject/address" "5.6.0"
"@ethersproject/base64" "5.5.0" "@ethersproject/base64" "5.6.0"
"@ethersproject/basex" "5.5.0" "@ethersproject/basex" "5.6.0"
"@ethersproject/bignumber" "5.5.0" "@ethersproject/bignumber" "5.6.0"
"@ethersproject/bytes" "5.5.0" "@ethersproject/bytes" "5.6.0"
"@ethersproject/constants" "5.5.0" "@ethersproject/constants" "5.6.0"
"@ethersproject/contracts" "5.5.0" "@ethersproject/contracts" "5.6.0"
"@ethersproject/hash" "5.5.0" "@ethersproject/hash" "5.6.0"
"@ethersproject/hdnode" "5.5.0" "@ethersproject/hdnode" "5.6.0"
"@ethersproject/json-wallets" "5.5.0" "@ethersproject/json-wallets" "5.6.0"
"@ethersproject/keccak256" "5.5.0" "@ethersproject/keccak256" "5.6.0"
"@ethersproject/logger" "5.5.0" "@ethersproject/logger" "5.6.0"
"@ethersproject/networks" "5.5.2" "@ethersproject/networks" "5.6.0"
"@ethersproject/pbkdf2" "5.5.0" "@ethersproject/pbkdf2" "5.6.0"
"@ethersproject/properties" "5.5.0" "@ethersproject/properties" "5.6.0"
"@ethersproject/providers" "5.5.3" "@ethersproject/providers" "5.6.0"
"@ethersproject/random" "5.5.1" "@ethersproject/random" "5.6.0"
"@ethersproject/rlp" "5.5.0" "@ethersproject/rlp" "5.6.0"
"@ethersproject/sha2" "5.5.0" "@ethersproject/sha2" "5.6.0"
"@ethersproject/signing-key" "5.5.0" "@ethersproject/signing-key" "5.6.0"
"@ethersproject/solidity" "5.5.0" "@ethersproject/solidity" "5.6.0"
"@ethersproject/strings" "5.5.0" "@ethersproject/strings" "5.6.0"
"@ethersproject/transactions" "5.5.0" "@ethersproject/transactions" "5.6.0"
"@ethersproject/units" "5.5.0" "@ethersproject/units" "5.6.0"
"@ethersproject/wallet" "5.5.0" "@ethersproject/wallet" "5.6.0"
"@ethersproject/web" "5.5.1" "@ethersproject/web" "5.6.0"
"@ethersproject/wordlists" "5.5.0" "@ethersproject/wordlists" "5.6.0"
event-emitter@~0.3.4: event-emitter@~0.3.4:
version "0.3.5" version "0.3.5"
@@ -5400,6 +5401,11 @@ mime@^2.4.6:
resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367"
integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
mime@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7"
integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==
mimic-fn@^2.1.0: mimic-fn@^2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
@@ -7081,9 +7087,9 @@ tsc-alias@1.3.10:
normalize-path "^3.0.0" normalize-path "^3.0.0"
tsc-watch@^4.6.0: tsc-watch@^4.6.0:
version "4.6.0" version "4.6.2"
resolved "https://registry.yarnpkg.com/tsc-watch/-/tsc-watch-4.6.0.tgz#a0eba1300cbe3048ab6d3a3e06de47141b613beb" resolved "https://registry.yarnpkg.com/tsc-watch/-/tsc-watch-4.6.2.tgz#4267ee6acddb608356573ba96024fa250eb22cac"
integrity sha512-DRMADjFe44EDWb+YMIOj4b83UrU6le27L3/o0/9FlmA01ikFd5Dl9RD5h1hpeh0mQdIqXvwfHZszCcjhH3bAmQ== integrity sha512-eHWzZGkPmzXVGQKbqQgf3BFpGiZZw1jQ29ZOJeaSe8JfyUvphbd221NfXmmsJUGGPGA/nnaSS01tXipUcyxAxg==
dependencies: dependencies:
cross-spawn "^7.0.3" cross-spawn "^7.0.3"
node-cleanup "^2.1.2" node-cleanup "^2.1.2"