Rc/evm signature (#249)
* feat: allow signing function only for bundled txs * fix: after ppe review * feat: add transaction verification * feat: warp plugins system * chore: removing lodash dep * feat: isEvmSigned verification * chore: useFastCopy fix in tests * feat: evm signature - minor fixes * fix: try-catch for evm sig verification * v1.2.14-beta.5 * fix: await for sig verification * v1.2.14-beta.6 * chore: restore original package version Co-authored-by: asiaziola <ziola.jm@gmail.com>
This commit is contained in:
13
bundle.js
13
bundle.js
@@ -1,5 +1,6 @@
|
|||||||
const { build } = require('esbuild');
|
const { build } = require('esbuild');
|
||||||
const rimraf = require('rimraf');
|
const rimraf = require('rimraf');
|
||||||
|
const fs = require("fs");
|
||||||
|
|
||||||
const clean = async () => {
|
const clean = async () => {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
@@ -20,17 +21,23 @@ const runBuild = async () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
console.log('Building web bundle esm.');
|
console.log('Building web bundle esm.');
|
||||||
build({
|
const result = await build({
|
||||||
...buildConfig,
|
...buildConfig,
|
||||||
minify: true,
|
minify: true,
|
||||||
outfile: './bundles/web.bundle.min.js'
|
outfile: './bundles/web.bundle.min.js',
|
||||||
|
metafile: true
|
||||||
}).catch((e) => {
|
}).catch((e) => {
|
||||||
console.log(e);
|
console.log(e);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
fs.writeFileSync('metadata.json', JSON.stringify({
|
||||||
|
inputs: result.metafile.inputs,
|
||||||
|
outputs: result.metafile.outputs
|
||||||
|
}));
|
||||||
|
|
||||||
console.log('Building web bundle iife.');
|
console.log('Building web bundle iife.');
|
||||||
build({
|
await build({
|
||||||
...buildConfig,
|
...buildConfig,
|
||||||
minify: true,
|
minify: true,
|
||||||
target: ['esnext'],
|
target: ['esnext'],
|
||||||
|
|||||||
@@ -64,13 +64,11 @@
|
|||||||
"@idena/vrf-js": "^1.0.1",
|
"@idena/vrf-js": "^1.0.1",
|
||||||
"archiver": "^5.3.0",
|
"archiver": "^5.3.0",
|
||||||
"arweave": "1.11.6",
|
"arweave": "1.11.6",
|
||||||
"bignumber.js": "^9.0.1",
|
|
||||||
"elliptic": "^6.5.4",
|
"elliptic": "^6.5.4",
|
||||||
"events": "3.3.0",
|
"events": "3.3.0",
|
||||||
"fast-copy": "^2.1.1",
|
"fast-copy": "^2.1.1",
|
||||||
"knex": "^0.95.14",
|
"knex": "^0.95.14",
|
||||||
"level": "^8.0.0",
|
"level": "^8.0.0",
|
||||||
"lodash": "^4.17.21",
|
|
||||||
"memory-level": "^1.0.0",
|
"memory-level": "^1.0.0",
|
||||||
"redstone-isomorphic": "1.1.8",
|
"redstone-isomorphic": "1.1.8",
|
||||||
"redstone-wasm-metering": "1.0.3",
|
"redstone-wasm-metering": "1.0.3",
|
||||||
@@ -89,7 +87,7 @@
|
|||||||
"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",
|
||||||
"esbuild": "0.15.5",
|
"esbuild": "0.15.12",
|
||||||
"eslint": "^7.32.0",
|
"eslint": "^7.32.0",
|
||||||
"eslint-config-prettier": "^8.3.0",
|
"eslint-config-prettier": "^8.3.0",
|
||||||
"eslint-plugin-prettier": "^3.4.1",
|
"eslint-plugin-prettier": "^3.4.1",
|
||||||
|
|||||||
@@ -70,7 +70,6 @@ describe.each(chunked)('v1 compare.suite %#', (contracts: string[]) => {
|
|||||||
.build()
|
.build()
|
||||||
.contract(contractTxId)
|
.contract(contractTxId)
|
||||||
.setEvaluationOptions({
|
.setEvaluationOptions({
|
||||||
useFastCopy: true,
|
|
||||||
allowUnsafeClient: true,
|
allowUnsafeClient: true,
|
||||||
allowBigInt: true
|
allowBigInt: true
|
||||||
})
|
})
|
||||||
@@ -113,7 +112,6 @@ describe.each(chunkedVm)('v1 compare.suite (VM2) %#', (contracts: string[]) => {
|
|||||||
.build()
|
.build()
|
||||||
.contract(contractTxId)
|
.contract(contractTxId)
|
||||||
.setEvaluationOptions({
|
.setEvaluationOptions({
|
||||||
useFastCopy: true,
|
|
||||||
useVM2: true,
|
useVM2: true,
|
||||||
allowUnsafeClient: true,
|
allowUnsafeClient: true,
|
||||||
allowBigInt: true
|
allowBigInt: true
|
||||||
@@ -153,7 +151,6 @@ describe.each(chunkedGw)('gateways compare.suite %#', (contracts: string[]) => {
|
|||||||
const result = await warpR
|
const result = await warpR
|
||||||
.contract(contractTxId)
|
.contract(contractTxId)
|
||||||
.setEvaluationOptions({
|
.setEvaluationOptions({
|
||||||
useFastCopy: true,
|
|
||||||
allowUnsafeClient: true,
|
allowUnsafeClient: true,
|
||||||
allowBigInt: true
|
allowBigInt: true
|
||||||
})
|
})
|
||||||
@@ -173,7 +170,6 @@ describe.each(chunkedGw)('gateways compare.suite %#', (contracts: string[]) => {
|
|||||||
.build()
|
.build()
|
||||||
.contract(contractTxId)
|
.contract(contractTxId)
|
||||||
.setEvaluationOptions({
|
.setEvaluationOptions({
|
||||||
useFastCopy: true,
|
|
||||||
allowUnsafeClient: true,
|
allowUnsafeClient: true,
|
||||||
allowBigInt: true
|
allowBigInt: true
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ export type CurrentTx = { interactionTxId: string; contractTxId: string };
|
|||||||
export type BenchmarkStats = { gatewayCommunication: number; stateEvaluation: number; total: number };
|
export type BenchmarkStats = { gatewayCommunication: number; stateEvaluation: number; total: number };
|
||||||
|
|
||||||
export type SigningFunction = (tx: Transaction) => Promise<void>;
|
export type SigningFunction = (tx: Transaction) => Promise<void>;
|
||||||
|
export type Signature = { signer: SigningFunction; signatureType: 'arweave' | 'ethereum' };
|
||||||
export class ContractError extends Error {
|
export class ContractError extends Error {
|
||||||
constructor(message) {
|
constructor(message) {
|
||||||
super(message);
|
super(message);
|
||||||
@@ -85,7 +85,7 @@ export interface Contract<State = unknown> extends Source {
|
|||||||
*
|
*
|
||||||
* @param signer - either {@link ArWallet} that will be connected to this contract or custom {@link SigningFunction}
|
* @param signer - either {@link ArWallet} that will be connected to this contract or custom {@link SigningFunction}
|
||||||
*/
|
*/
|
||||||
connect(signer: ArWallet | SigningFunction): Contract<State>;
|
connect(signature: ArWallet | Signature): Contract<State>;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows to set ({@link EvaluationOptions})
|
* Allows to set ({@link EvaluationOptions})
|
||||||
|
|||||||
@@ -26,11 +26,11 @@ import { sleep } from '../utils/utils';
|
|||||||
import {
|
import {
|
||||||
Contract,
|
Contract,
|
||||||
BenchmarkStats,
|
BenchmarkStats,
|
||||||
SigningFunction,
|
|
||||||
CurrentTx,
|
CurrentTx,
|
||||||
WriteInteractionOptions,
|
WriteInteractionOptions,
|
||||||
WriteInteractionResponse,
|
WriteInteractionResponse,
|
||||||
InnerCallData
|
InnerCallData,
|
||||||
|
Signature
|
||||||
} from './Contract';
|
} from './Contract';
|
||||||
import { Tags, ArTransfer, emptyTransfer, ArWallet } from './deploy/CreateContract';
|
import { Tags, ArTransfer, emptyTransfer, ArWallet } from './deploy/CreateContract';
|
||||||
import { SourceData, SourceImpl } from './deploy/impl/SourceImpl';
|
import { SourceData, SourceImpl } from './deploy/impl/SourceImpl';
|
||||||
@@ -58,7 +58,7 @@ export class HandlerBasedContract<State> implements Contract<State> {
|
|||||||
/**
|
/**
|
||||||
* wallet connected to this contract
|
* wallet connected to this contract
|
||||||
*/
|
*/
|
||||||
protected signer?: SigningFunction;
|
protected signature?: Signature;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private readonly _contractTxId: string,
|
private readonly _contractTxId: string,
|
||||||
@@ -207,7 +207,7 @@ export class HandlerBasedContract<State> implements Contract<State> {
|
|||||||
options?: WriteInteractionOptions
|
options?: WriteInteractionOptions
|
||||||
): Promise<WriteInteractionResponse | null> {
|
): Promise<WriteInteractionResponse | null> {
|
||||||
this.logger.info('Write interaction', { input, options });
|
this.logger.info('Write interaction', { input, options });
|
||||||
if (!this.signer) {
|
if (!this.signature) {
|
||||||
throw new Error("Wallet not connected. Use 'connect' method first.");
|
throw new Error("Wallet not connected. Use 'connect' method first.");
|
||||||
}
|
}
|
||||||
const { arweave, interactionsLoader, environment } = this.warp;
|
const { arweave, interactionsLoader, environment } = this.warp;
|
||||||
@@ -221,6 +221,12 @@ export class HandlerBasedContract<State> implements Contract<State> {
|
|||||||
|
|
||||||
const bundleInteraction = interactionsLoader.type() == 'warp' && !effectiveDisableBundling;
|
const bundleInteraction = interactionsLoader.type() == 'warp' && !effectiveDisableBundling;
|
||||||
|
|
||||||
|
if (this.signature.signatureType !== 'arweave' && !bundleInteraction) {
|
||||||
|
throw new Error(
|
||||||
|
`Unable to use signing function of type: ${this.signature.signatureType} when not in mainnet environment or bundling is disabled.`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
bundleInteraction &&
|
bundleInteraction &&
|
||||||
effectiveTransfer.target != emptyTransfer.target &&
|
effectiveTransfer.target != emptyTransfer.target &&
|
||||||
@@ -369,7 +375,7 @@ export class HandlerBasedContract<State> implements Contract<State> {
|
|||||||
|
|
||||||
const interactionTx = await createInteractionTx(
|
const interactionTx = await createInteractionTx(
|
||||||
this.warp.arweave,
|
this.warp.arweave,
|
||||||
this.signer,
|
this.signature.signer,
|
||||||
this._contractTxId,
|
this._contractTxId,
|
||||||
input,
|
input,
|
||||||
tags,
|
tags,
|
||||||
@@ -389,12 +395,27 @@ export class HandlerBasedContract<State> implements Contract<State> {
|
|||||||
return this._callStack;
|
return this._callStack;
|
||||||
}
|
}
|
||||||
|
|
||||||
connect(signer: ArWallet | SigningFunction): Contract<State> {
|
connect(signature: ArWallet | Signature): Contract<State> {
|
||||||
if (typeof signer == 'function') {
|
if (this.isSignatureType(signature)) {
|
||||||
this.signer = signer;
|
if (
|
||||||
|
signature.signatureType !== 'arweave' &&
|
||||||
|
(!(this.warp.environment == 'mainnet') || !(this.warp.interactionsLoader.type() == 'warp'))
|
||||||
|
) {
|
||||||
|
throw new Error(
|
||||||
|
`Unable to use signing function of type: ${signature.signatureType} when not in mainnet environment or bundling is disabled.`
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
this.signature = {
|
||||||
|
signer: signature.signer,
|
||||||
|
signatureType: signature.signatureType
|
||||||
|
};
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
this.signer = async (tx: Transaction) => {
|
this.signature = {
|
||||||
await this.warp.arweave.transactions.sign(tx, signer);
|
signer: async (tx: Transaction) => {
|
||||||
|
await this.warp.arweave.transactions.sign(tx, signature);
|
||||||
|
},
|
||||||
|
signatureType: 'arweave'
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
@@ -539,7 +560,7 @@ export class HandlerBasedContract<State> implements Contract<State> {
|
|||||||
): Promise<InteractionResult<State, View>> {
|
): Promise<InteractionResult<State, View>> {
|
||||||
this.logger.info('Call contract input', input);
|
this.logger.info('Call contract input', input);
|
||||||
this.maybeResetRootContract();
|
this.maybeResetRootContract();
|
||||||
if (!this.signer) {
|
if (!this.signature) {
|
||||||
this.logger.warn('Wallet not set.');
|
this.logger.warn('Wallet not set.');
|
||||||
}
|
}
|
||||||
const { arweave, stateEvaluator } = this.warp;
|
const { arweave, stateEvaluator } = this.warp;
|
||||||
@@ -553,7 +574,7 @@ export class HandlerBasedContract<State> implements Contract<State> {
|
|||||||
let effectiveCaller;
|
let effectiveCaller;
|
||||||
if (caller) {
|
if (caller) {
|
||||||
effectiveCaller = caller;
|
effectiveCaller = caller;
|
||||||
} else if (this.signer) {
|
} else if (this.signature) {
|
||||||
// we're creating this transaction just to call the signing function on it
|
// we're creating this transaction just to call the signing function on it
|
||||||
// - and retrieve the caller/owner
|
// - and retrieve the caller/owner
|
||||||
const dummyTx = await arweave.createTransaction({
|
const dummyTx = await arweave.createTransaction({
|
||||||
@@ -561,7 +582,7 @@ export class HandlerBasedContract<State> implements Contract<State> {
|
|||||||
reward: '72600854',
|
reward: '72600854',
|
||||||
last_tx: 'p7vc1iSP6bvH_fCeUFa9LqoV5qiyW-jdEKouAT0XMoSwrNraB9mgpi29Q10waEpO'
|
last_tx: 'p7vc1iSP6bvH_fCeUFa9LqoV5qiyW-jdEKouAT0XMoSwrNraB9mgpi29Q10waEpO'
|
||||||
});
|
});
|
||||||
await this.signer(dummyTx);
|
await this.signature.signer(dummyTx);
|
||||||
effectiveCaller = await arweave.wallets.ownerToAddress(dummyTx.owner);
|
effectiveCaller = await arweave.wallets.ownerToAddress(dummyTx.owner);
|
||||||
} else {
|
} else {
|
||||||
effectiveCaller = '';
|
effectiveCaller = '';
|
||||||
@@ -586,7 +607,7 @@ export class HandlerBasedContract<State> implements Contract<State> {
|
|||||||
this.logger.debug('interaction', interaction);
|
this.logger.debug('interaction', interaction);
|
||||||
const tx = await createInteractionTx(
|
const tx = await createInteractionTx(
|
||||||
arweave,
|
arweave,
|
||||||
this.signer,
|
this.signature?.signer,
|
||||||
this._contractTxId,
|
this._contractTxId,
|
||||||
input,
|
input,
|
||||||
tags,
|
tags,
|
||||||
@@ -746,13 +767,13 @@ export class HandlerBasedContract<State> implements Contract<State> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async save(sourceData: SourceData): Promise<any> {
|
async save(sourceData: SourceData): Promise<any> {
|
||||||
if (!this.signer) {
|
if (!this.signature) {
|
||||||
throw new Error("Wallet not connected. Use 'connect' method first.");
|
throw new Error("Wallet not connected. Use 'connect' method first.");
|
||||||
}
|
}
|
||||||
const { arweave } = this.warp;
|
const { arweave } = this.warp;
|
||||||
const source = new SourceImpl(arweave);
|
const source = new SourceImpl(arweave);
|
||||||
|
|
||||||
const srcTx = await source.save(sourceData, this.signer);
|
const srcTx = await source.save(sourceData, this.signature.signer);
|
||||||
|
|
||||||
return srcTx.id;
|
return srcTx.id;
|
||||||
}
|
}
|
||||||
@@ -760,4 +781,8 @@ export class HandlerBasedContract<State> implements Contract<State> {
|
|||||||
get rootSortKey(): string {
|
get rootSortKey(): string {
|
||||||
return this._rootSortKey;
|
return this._rootSortKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private isSignatureType(signature: ArWallet | Signature): signature is Signature {
|
||||||
|
return (signature as Signature).signer !== undefined;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,5 +16,6 @@ export enum SmartWeaveTags {
|
|||||||
WASM_LANG = 'Wasm-Lang',
|
WASM_LANG = 'Wasm-Lang',
|
||||||
WASM_LANG_VERSION = 'Wasm-Lang-Version',
|
WASM_LANG_VERSION = 'Wasm-Lang-Version',
|
||||||
WASM_META = 'Wasm-Meta',
|
WASM_META = 'Wasm-Meta',
|
||||||
REQUEST_VRF = 'Request-Vrf'
|
REQUEST_VRF = 'Request-Vrf',
|
||||||
|
SIGNATURE_TYPE = 'Signature-Type'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import { HandlerApi } from './modules/impl/HandlerExecutorFactory';
|
|||||||
import { InteractionsLoader } from './modules/InteractionsLoader';
|
import { InteractionsLoader } from './modules/InteractionsLoader';
|
||||||
import { EvalStateResult, StateEvaluator } from './modules/StateEvaluator';
|
import { EvalStateResult, StateEvaluator } from './modules/StateEvaluator';
|
||||||
import { WarpBuilder } from './WarpBuilder';
|
import { WarpBuilder } from './WarpBuilder';
|
||||||
|
import { WarpPluginType, WarpPlugin, knownWarpPlugins } from './WarpPlugin';
|
||||||
|
|
||||||
export type WarpEnvironment = 'local' | 'testnet' | 'mainnet' | 'custom';
|
export type WarpEnvironment = 'local' | 'testnet' | 'mainnet' | 'custom';
|
||||||
|
|
||||||
@@ -31,6 +32,8 @@ export class Warp {
|
|||||||
readonly migrationTool: MigrationTool;
|
readonly migrationTool: MigrationTool;
|
||||||
readonly testing: Testing;
|
readonly testing: Testing;
|
||||||
|
|
||||||
|
private readonly plugins: Map<WarpPluginType, WarpPlugin<unknown, unknown>> = new Map();
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
readonly arweave: Arweave,
|
readonly arweave: Arweave,
|
||||||
readonly levelDb: LevelDbCache<EvalStateResult<unknown>>,
|
readonly levelDb: LevelDbCache<EvalStateResult<unknown>>,
|
||||||
@@ -69,4 +72,26 @@ export class Warp {
|
|||||||
pst(contractTxId: string): PstContract {
|
pst(contractTxId: string): PstContract {
|
||||||
return new PstContractImpl(contractTxId, this);
|
return new PstContractImpl(contractTxId, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use(plugin: WarpPlugin<unknown, unknown>): Warp {
|
||||||
|
const pluginType = plugin.type();
|
||||||
|
if (!knownWarpPlugins.some((p) => p == pluginType)) {
|
||||||
|
throw new Error(`Unknown plugin type ${pluginType}.`);
|
||||||
|
}
|
||||||
|
this.plugins.set(pluginType, plugin);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
hasPlugin(type: WarpPluginType): boolean {
|
||||||
|
return this.plugins.has(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
loadPlugin<P, Q>(type: WarpPluginType): WarpPlugin<P, Q> {
|
||||||
|
if (!this.hasPlugin(type)) {
|
||||||
|
throw new Error(`Plugin ${type} not registered.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.plugins.get(type) as WarpPlugin<P, Q>;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
8
src/core/WarpPlugin.ts
Normal file
8
src/core/WarpPlugin.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
export const knownWarpPlugins = ['evm-signature-verification'] as const;
|
||||||
|
export type WarpPluginType = typeof knownWarpPlugins[number];
|
||||||
|
|
||||||
|
export interface WarpPlugin<T, R> {
|
||||||
|
type(): WarpPluginType;
|
||||||
|
|
||||||
|
process(input: T): R;
|
||||||
|
}
|
||||||
@@ -121,8 +121,6 @@ export class DefaultEvaluationOptions implements EvaluationOptions {
|
|||||||
|
|
||||||
gasLimit = Number.MAX_SAFE_INTEGER;
|
gasLimit = Number.MAX_SAFE_INTEGER;
|
||||||
|
|
||||||
useFastCopy = true;
|
|
||||||
|
|
||||||
useVM2 = false;
|
useVM2 = false;
|
||||||
|
|
||||||
allowUnsafeClient = false;
|
allowUnsafeClient = false;
|
||||||
@@ -182,12 +180,6 @@ export interface EvaluationOptions {
|
|||||||
|
|
||||||
gasLimit: number;
|
gasLimit: number;
|
||||||
|
|
||||||
// Whether fast-copy library should be used during the state evaluation
|
|
||||||
// https://github.com/planttheidea/fast-copy#isstrict
|
|
||||||
// it's much faster (e.g. almost twice for the SJ3l7474UHh3Dw6dWVT1bzsJ-8JvOewtGoDdOecWIZo contract)
|
|
||||||
// currently defaults to true
|
|
||||||
useFastCopy: boolean;
|
|
||||||
|
|
||||||
// Whether js contracts' code should be run within vm2 sandbox (https://github.com/patriksimek/vm2#vm2-----)
|
// Whether js contracts' code should be run within vm2 sandbox (https://github.com/patriksimek/vm2#vm2-----)
|
||||||
// it greatly enhances security - at a cost of performance.
|
// it greatly enhances security - at a cost of performance.
|
||||||
// use for contracts that you cannot trust.
|
// use for contracts that you cannot trust.
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import Arweave from 'arweave';
|
import Arweave from 'arweave';
|
||||||
import Transaction from 'arweave/web/lib/transaction';
|
import Transaction from 'arweave/node/lib/transaction';
|
||||||
import { ContractType } from '../../../contract/deploy/CreateContract';
|
import { ContractType } from '../../../contract/deploy/CreateContract';
|
||||||
import { WarpCache } from '../../../cache/WarpCache';
|
|
||||||
import { ContractDefinition, ContractSource } from '../../../core/ContractDefinition';
|
import { ContractDefinition, ContractSource } from '../../../core/ContractDefinition';
|
||||||
import { SmartWeaveTags } from '../../../core/SmartWeaveTags';
|
import { SmartWeaveTags } from '../../../core/SmartWeaveTags';
|
||||||
import { getTag } from '../../../legacy/utils';
|
import { getTag } from '../../../legacy/utils';
|
||||||
|
|||||||
@@ -7,12 +7,12 @@ import { CurrentTx } from '../../../contract/Contract';
|
|||||||
import { InteractionCall } from '../../ContractCallRecord';
|
import { InteractionCall } from '../../ContractCallRecord';
|
||||||
import { ExecutionContext } from '../../../core/ExecutionContext';
|
import { ExecutionContext } from '../../../core/ExecutionContext';
|
||||||
import { ExecutionContextModifier } from '../../../core/ExecutionContextModifier';
|
import { ExecutionContextModifier } from '../../../core/ExecutionContextModifier';
|
||||||
import { GQLNodeInterface, VrfData, GQLTagInterface } from '../../../legacy/gqlResult';
|
import { GQLNodeInterface, GQLTagInterface, VrfData } from '../../../legacy/gqlResult';
|
||||||
import { Benchmark } from '../../../logging/Benchmark';
|
import { Benchmark } from '../../../logging/Benchmark';
|
||||||
import { LoggerFactory } from '../../../logging/LoggerFactory';
|
import { LoggerFactory } from '../../../logging/LoggerFactory';
|
||||||
import { indent } from '../../../utils/utils';
|
import { indent } from '../../../utils/utils';
|
||||||
import { StateEvaluator, EvalStateResult } from '../StateEvaluator';
|
import { EvalStateResult, StateEvaluator } from '../StateEvaluator';
|
||||||
import { HandlerApi, ContractInteraction, InteractionResult } from './HandlerExecutorFactory';
|
import { ContractInteraction, HandlerApi, InteractionResult } from './HandlerExecutorFactory';
|
||||||
import { canBeCached } from './StateCache';
|
import { canBeCached } from './StateCache';
|
||||||
import { TagsParser } from './TagsParser';
|
import { TagsParser } from './TagsParser';
|
||||||
|
|
||||||
@@ -54,7 +54,7 @@ export abstract class DefaultStateEvaluator implements StateEvaluator {
|
|||||||
currentTx: CurrentTx[]
|
currentTx: CurrentTx[]
|
||||||
): Promise<SortKeyCacheResult<EvalStateResult<State>>> {
|
): Promise<SortKeyCacheResult<EvalStateResult<State>>> {
|
||||||
const { ignoreExceptions, stackTrace, internalWrites } = executionContext.evaluationOptions;
|
const { ignoreExceptions, stackTrace, internalWrites } = executionContext.evaluationOptions;
|
||||||
const { contract, contractDefinition, sortedInteractions } = executionContext;
|
const { contract, contractDefinition, sortedInteractions, warp } = executionContext;
|
||||||
|
|
||||||
let currentState = baseState.state;
|
let currentState = baseState.state;
|
||||||
let currentSortKey = null;
|
let currentSortKey = null;
|
||||||
@@ -77,6 +77,10 @@ export abstract class DefaultStateEvaluator implements StateEvaluator {
|
|||||||
const missingInteractionsLength = missingInteractions.length;
|
const missingInteractionsLength = missingInteractions.length;
|
||||||
executionContext.handler.initState(currentState);
|
executionContext.handler.initState(currentState);
|
||||||
|
|
||||||
|
const evmSignatureVerificationPlugin = warp.hasPlugin('evm-signature-verification')
|
||||||
|
? warp.loadPlugin<GQLNodeInterface, Promise<boolean>>('evm-signature-verification')
|
||||||
|
: null;
|
||||||
|
|
||||||
for (let i = 0; i < missingInteractionsLength; i++) {
|
for (let i = 0; i < missingInteractionsLength; i++) {
|
||||||
const missingInteraction = missingInteractions[i];
|
const missingInteraction = missingInteractions[i];
|
||||||
const singleInteractionBenchmark = Benchmark.measure();
|
const singleInteractionBenchmark = Benchmark.measure();
|
||||||
@@ -88,6 +92,18 @@ export abstract class DefaultStateEvaluator implements StateEvaluator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (evmSignatureVerificationPlugin && this.tagsParser.isEvmSigned(missingInteraction)) {
|
||||||
|
try {
|
||||||
|
if (!(await evmSignatureVerificationPlugin.process(missingInteraction))) {
|
||||||
|
this.logger.warn(`Interaction ${missingInteraction.id} was not verified, skipping.`);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
this.logger.error(e);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.logger.debug(
|
this.logger.debug(
|
||||||
`${indent(depth)}[${contractDefinition.txId}][${missingInteraction.id}][${missingInteraction.block.height}]: ${
|
`${indent(depth)}[${contractDefinition.txId}][${missingInteraction.id}][${missingInteraction.block.height}]: ${
|
||||||
missingInteractions.indexOf(missingInteraction) + 1
|
missingInteractions.indexOf(missingInteraction) + 1
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import loader from '@assemblyscript/loader';
|
|||||||
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';
|
import { Go } from './wasm/go-wasm-imports';
|
||||||
import BigNumber from 'bignumber.js';
|
|
||||||
import * as vm2 from 'vm2';
|
import * as vm2 from 'vm2';
|
||||||
import { WarpCache } from '../../../cache/WarpCache';
|
import { WarpCache } from '../../../cache/WarpCache';
|
||||||
import { ContractDefinition } from '../../../core/ContractDefinition';
|
import { ContractDefinition } from '../../../core/ContractDefinition';
|
||||||
@@ -18,6 +17,7 @@ import { JsHandlerApi } from './handler/JsHandlerApi';
|
|||||||
import { WasmHandlerApi } from './handler/WasmHandlerApi';
|
import { WasmHandlerApi } from './handler/WasmHandlerApi';
|
||||||
import { normalizeContractSource } from './normalize-source';
|
import { normalizeContractSource } from './normalize-source';
|
||||||
import { MemCache } from '../../../cache/impl/MemCache';
|
import { MemCache } from '../../../cache/impl/MemCache';
|
||||||
|
import BigNumber from '../../../legacy/bignumber';
|
||||||
|
|
||||||
class ContractError extends Error {
|
class ContractError extends Error {
|
||||||
constructor(message) {
|
constructor(message) {
|
||||||
|
|||||||
@@ -69,6 +69,12 @@ export class TagsParser {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isEvmSigned(interactionTransaction: GQLNodeInterface): boolean {
|
||||||
|
return interactionTransaction.tags.some(
|
||||||
|
(tag) => tag.name === SmartWeaveTags.SIGNATURE_TYPE && tag.value === 'ethereum'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
static hasMultipleInteractions(interactionTransaction: GQLNodeInterface): boolean {
|
static hasMultipleInteractions(interactionTransaction: GQLNodeInterface): boolean {
|
||||||
return interactionTransaction.tags.filter((tag) => tag.name === SmartWeaveTags.CONTRACT_TX_ID).length > 1;
|
return interactionTransaction.tags.filter((tag) => tag.name === SmartWeaveTags.CONTRACT_TX_ID).length > 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import { LoggerFactory } from '../../../logging/LoggerFactory';
|
|||||||
import { ArweaveWrapper } from '../../../utils/ArweaveWrapper';
|
import { ArweaveWrapper } from '../../../utils/ArweaveWrapper';
|
||||||
import { stripTrailingSlash } from '../../../utils/utils';
|
import { stripTrailingSlash } from '../../../utils/utils';
|
||||||
import { DefinitionLoader } from '../DefinitionLoader';
|
import { DefinitionLoader } from '../DefinitionLoader';
|
||||||
import { WarpCache } from '../../../cache/WarpCache';
|
|
||||||
import { WasmSrc } from './wasm/WasmSrc';
|
import { WasmSrc } from './wasm/WasmSrc';
|
||||||
import { CacheOptions } from '../../WarpFactory';
|
import { CacheOptions } from '../../WarpFactory';
|
||||||
import { MemoryLevel } from 'memory-level';
|
import { MemoryLevel } from 'memory-level';
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ export class JsHandlerApi<State> extends AbstractContractHandler<State> {
|
|||||||
try {
|
try {
|
||||||
const { interaction, interactionTx, currentTx } = interactionData;
|
const { interaction, interactionTx, currentTx } = interactionData;
|
||||||
|
|
||||||
const stateCopy = deepCopy(currentResult.state, executionContext.evaluationOptions.useFastCopy);
|
const stateCopy = deepCopy(currentResult.state);
|
||||||
this.swGlobal._activeTx = interactionTx;
|
this.swGlobal._activeTx = interactionTx;
|
||||||
this.swGlobal.caller = interaction.caller; // either contract tx id (for internal writes) or transaction.owner
|
this.swGlobal.caller = interaction.caller; // either contract tx id (for internal writes) or transaction.owner
|
||||||
this.assignReadContractState<Input>(executionContext, currentTx, currentResult, interactionTx);
|
this.assignReadContractState<Input>(executionContext, currentTx, currentResult, interactionTx);
|
||||||
|
|||||||
2927
src/legacy/bignumber.js
Normal file
2927
src/legacy/bignumber.js
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,4 @@
|
|||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
import cloneDeep from 'lodash/cloneDeep';
|
|
||||||
import copy from 'fast-copy';
|
import copy from 'fast-copy';
|
||||||
import { Buffer } from 'redstone-isomorphic';
|
import { Buffer } from 'redstone-isomorphic';
|
||||||
import { randomUUID } from 'crypto';
|
import { randomUUID } from 'crypto';
|
||||||
@@ -8,8 +7,8 @@ export const sleep = (ms: number): Promise<void> => {
|
|||||||
return new Promise((resolve) => setTimeout(resolve, ms));
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||||
};
|
};
|
||||||
|
|
||||||
export const deepCopy = (input: unknown, useFastCopy = false): any => {
|
export const deepCopy = (input: unknown): any => {
|
||||||
return useFastCopy ? copy(input) : cloneDeep(input);
|
return copy(input);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const mapReplacer = (key: unknown, value: unknown) => {
|
export const mapReplacer = (key: unknown, value: unknown) => {
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
import Arweave from 'arweave';
|
import Arweave from 'arweave';
|
||||||
import {defaultCacheOptions, LoggerFactory, WarpFactory} from '../src';
|
import {defaultCacheOptions, LexicographicalInteractionsSorter, LoggerFactory, WarpFactory} from '../src';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import knex from 'knex';
|
import knex from 'knex';
|
||||||
import os from 'os';
|
import os from 'os';
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import stringify from "safe-stable-stringify";
|
import stringify from "safe-stable-stringify";
|
||||||
|
import {WarpPlugin, WarpPluginType} from "../src/core/WarpPlugin";
|
||||||
|
import {GQLNodeInterface} from "smartweave/lib/interfaces/gqlResult";
|
||||||
|
|
||||||
const logger = LoggerFactory.INST.create('Contract');
|
const logger = LoggerFactory.INST.create('Contract');
|
||||||
|
|
||||||
@@ -31,7 +33,20 @@ async function main() {
|
|||||||
logging: false // Enable network request logging
|
logging: false // Enable network request logging
|
||||||
});
|
});
|
||||||
|
|
||||||
const warp = WarpFactory.forMainnet({...defaultCacheOptions, inMemory: true});
|
class ExamplePlugin implements WarpPlugin<GQLNodeInterface, boolean> {
|
||||||
|
process(input: GQLNodeInterface): boolean {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
type(): WarpPluginType {
|
||||||
|
return 'evm-signature-verification';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const warp = WarpFactory
|
||||||
|
.forMainnet({...defaultCacheOptions, inMemory: true})
|
||||||
|
.use(new ExamplePlugin())
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const contract = warp.contract("Ws9hhYckc-zSnVmbBep6q_kZD5zmzYzDmgMC50nMiuE");
|
const contract = warp.contract("Ws9hhYckc-zSnVmbBep6q_kZD5zmzYzDmgMC50nMiuE");
|
||||||
const cacheResult = await contract
|
const cacheResult = await contract
|
||||||
@@ -84,6 +99,11 @@ function printTestInfo() {
|
|||||||
console.log(' ', 'CPU ', cpus);
|
console.log(' ', 'CPU ', cpus);
|
||||||
console.log(' ', 'Memory ', (os.totalmem() / 1024 / 1024 / 1024).toFixed(0), 'GB');
|
console.log(' ', 'Memory ', (os.totalmem() / 1024 / 1024 / 1024).toFixed(0), 'GB');
|
||||||
console.log('===============');
|
console.log('===============');
|
||||||
|
|
||||||
|
|
||||||
|
const sorter = new LexicographicalInteractionsSorter(arweave);
|
||||||
|
|
||||||
|
warp.interactionsLoader.load(contractId, sorter.generateLastSortKey(666), sorter.generateLastSortKey(777));
|
||||||
}
|
}
|
||||||
|
|
||||||
main().catch((e) => console.error(e));
|
main().catch((e) => console.error(e));
|
||||||
|
|||||||
@@ -66,12 +66,18 @@ async function main() {
|
|||||||
});*/
|
});*/
|
||||||
|
|
||||||
const contract = warp.contract(contractTxId)
|
const contract = warp.contract(contractTxId)
|
||||||
/*.setEvaluationOptions({
|
.setEvaluationOptions({
|
||||||
bundlerUrl: "http://13.53.39.138:5666/"
|
bundlerUrl: "http://localhost:5666/"
|
||||||
})*/
|
})
|
||||||
.connect(wallet);
|
.connect(wallet);
|
||||||
|
|
||||||
await contract.writeInteraction<any>({
|
await contract.writeInteraction<any>({
|
||||||
|
function: "transfer",
|
||||||
|
target: "M-mpNeJbg9h7mZ-uHaNsa5jwFFRAq0PsTkNWXJ-ojwI",
|
||||||
|
qty: 10000
|
||||||
|
}, {tags: [{name: 'Signature-Type', value: 'ethereum'}]});
|
||||||
|
|
||||||
|
/*await contract.writeInteraction<any>({
|
||||||
function: "storeBalance",
|
function: "storeBalance",
|
||||||
target: "M-mpNeJbg9h7mZ-uHaNsa5jwFFRAq0PsTkNWXJ-ojwI",
|
target: "M-mpNeJbg9h7mZ-uHaNsa5jwFFRAq0PsTkNWXJ-ojwI",
|
||||||
});
|
});
|
||||||
@@ -79,12 +85,7 @@ async function main() {
|
|||||||
await contract.writeInteraction<any>({
|
await contract.writeInteraction<any>({
|
||||||
function: "storeBalance",
|
function: "storeBalance",
|
||||||
target: "M-mpNeJbg9h7mZ-uHaNsa5jwFFRAq0PsTkNWXJ-ojwI",
|
target: "M-mpNeJbg9h7mZ-uHaNsa5jwFFRAq0PsTkNWXJ-ojwI",
|
||||||
});
|
});*/
|
||||||
|
|
||||||
await contract.writeInteraction<any>({
|
|
||||||
function: "storeBalance",
|
|
||||||
target: "M-mpNeJbg9h7mZ-uHaNsa5jwFFRAq0PsTkNWXJ-ojwI",
|
|
||||||
});
|
|
||||||
|
|
||||||
const {cachedValue} = await contract.readState();
|
const {cachedValue} = await contract.readState();
|
||||||
|
|
||||||
|
|||||||
224
yarn.lock
224
yarn.lock
@@ -392,10 +392,15 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@jridgewell/trace-mapping" "0.3.9"
|
"@jridgewell/trace-mapping" "0.3.9"
|
||||||
|
|
||||||
"@esbuild/linux-loong64@0.15.5":
|
"@esbuild/android-arm@0.15.12":
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz#91aef76d332cdc7c8942b600fa2307f3387e6f82"
|
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.12.tgz#e548b10a5e55b9e10537a049ebf0bc72c453b769"
|
||||||
integrity sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==
|
integrity sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==
|
||||||
|
|
||||||
|
"@esbuild/linux-loong64@0.15.12":
|
||||||
|
version "0.15.12"
|
||||||
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz#475b33a2631a3d8ca8aa95ee127f9a61d95bf9c1"
|
||||||
|
integrity sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==
|
||||||
|
|
||||||
"@eslint/eslintrc@^0.4.3":
|
"@eslint/eslintrc@^0.4.3":
|
||||||
version "0.4.3"
|
version "0.4.3"
|
||||||
@@ -3165,132 +3170,133 @@ es6-weak-map@~0.1.4:
|
|||||||
es6-iterator "~0.1.3"
|
es6-iterator "~0.1.3"
|
||||||
es6-symbol "~2.0.1"
|
es6-symbol "~2.0.1"
|
||||||
|
|
||||||
esbuild-android-64@0.15.5:
|
esbuild-android-64@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz#3c7b2f2a59017dab3f2c0356188a8dd9cbdc91c8"
|
resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz#5e8151d5f0a748c71a7fbea8cee844ccf008e6fc"
|
||||||
integrity sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==
|
integrity sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==
|
||||||
|
|
||||||
esbuild-android-arm64@0.15.5:
|
esbuild-android-arm64@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz#e301db818c5a67b786bf3bb7320e414ac0fcf193"
|
resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz#5ee72a6baa444bc96ffcb472a3ba4aba2cc80666"
|
||||||
integrity sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==
|
integrity sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==
|
||||||
|
|
||||||
esbuild-darwin-64@0.15.5:
|
esbuild-darwin-64@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz#11726de5d0bf5960b92421ef433e35871c091f8d"
|
resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz#70047007e093fa1b3ba7ef86f9b3fa63db51fe25"
|
||||||
integrity sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==
|
integrity sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==
|
||||||
|
|
||||||
esbuild-darwin-arm64@0.15.5:
|
esbuild-darwin-arm64@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz#ad89dafebb3613fd374f5a245bb0ce4132413997"
|
resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz#41c951f23d9a70539bcca552bae6e5196696ae04"
|
||||||
integrity sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==
|
integrity sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==
|
||||||
|
|
||||||
esbuild-freebsd-64@0.15.5:
|
esbuild-freebsd-64@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz#6bfb52b4a0d29c965aa833e04126e95173289c8a"
|
resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz#a761b5afd12bbedb7d56c612e9cfa4d2711f33f0"
|
||||||
integrity sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==
|
integrity sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==
|
||||||
|
|
||||||
esbuild-freebsd-arm64@0.15.5:
|
esbuild-freebsd-arm64@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz#38a3fed8c6398072f9914856c7c3e3444f9ef4dd"
|
resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz#6b0839d4d58deabc6cbd96276eb8cbf94f7f335e"
|
||||||
integrity sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==
|
integrity sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==
|
||||||
|
|
||||||
esbuild-linux-32@0.15.5:
|
esbuild-linux-32@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz#942dc70127f0c0a7ea91111baf2806e61fc81b32"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz#bd50bfe22514d434d97d5150977496e2631345b4"
|
||||||
integrity sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==
|
integrity sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==
|
||||||
|
|
||||||
esbuild-linux-64@0.15.5:
|
esbuild-linux-64@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz#6d748564492d5daaa7e62420862c31ac3a44aed9"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz#074bb2b194bf658245f8490f29c01ffcdfa8c931"
|
||||||
integrity sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==
|
integrity sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==
|
||||||
|
|
||||||
esbuild-linux-arm64@0.15.5:
|
esbuild-linux-arm64@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz#28cd899beb2d2b0a3870fd44f4526835089a318d"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz#3bf789c4396dc032875a122988efd6f3733f28f5"
|
||||||
integrity sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==
|
integrity sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==
|
||||||
|
|
||||||
esbuild-linux-arm@0.15.5:
|
esbuild-linux-arm@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz#6441c256225564d8794fdef5b0a69bc1a43051b5"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz#b91b5a8d470053f6c2c9c8a5e67ec10a71fe4a67"
|
||||||
integrity sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==
|
integrity sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==
|
||||||
|
|
||||||
esbuild-linux-mips64le@0.15.5:
|
esbuild-linux-mips64le@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz#d4927f817290eaffc062446896b2a553f0e11981"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz#2fb54099ada3c950a7536dfcba46172c61e580e2"
|
||||||
integrity sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==
|
integrity sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==
|
||||||
|
|
||||||
esbuild-linux-ppc64le@0.15.5:
|
esbuild-linux-ppc64le@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz#b6d660dc6d5295f89ac51c675f1a2f639e2fb474"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz#9e3b8c09825fb27886249dfb3142a750df29a1b7"
|
||||||
integrity sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==
|
integrity sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==
|
||||||
|
|
||||||
esbuild-linux-riscv64@0.15.5:
|
esbuild-linux-riscv64@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz#2801bf18414dc3d3ad58d1ea83084f00d9d84896"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz#923d0f5b6e12ee0d1fe116b08e4ae4478fe40693"
|
||||||
integrity sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==
|
integrity sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==
|
||||||
|
|
||||||
esbuild-linux-s390x@0.15.5:
|
esbuild-linux-s390x@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz#12a634ae6d3384cacc2b8f4201047deafe596eae"
|
resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz#3b1620220482b96266a0c6d9d471d451a1eab86f"
|
||||||
integrity sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==
|
integrity sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==
|
||||||
|
|
||||||
esbuild-netbsd-64@0.15.5:
|
esbuild-netbsd-64@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz#951bbf87600512dfcfbe3b8d9d117d684d26c1b8"
|
resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz#276730f80da646859b1af5a740e7802d8cd73e42"
|
||||||
integrity sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==
|
integrity sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==
|
||||||
|
|
||||||
esbuild-openbsd-64@0.15.5:
|
esbuild-openbsd-64@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz#26705b61961d525d79a772232e8b8f211fdbb035"
|
resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz#bd0eea1dd2ca0722ed489d88c26714034429f8ae"
|
||||||
integrity sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==
|
integrity sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==
|
||||||
|
|
||||||
esbuild-sunos-64@0.15.5:
|
esbuild-sunos-64@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz#d794da1ae60e6e2f6194c44d7b3c66bf66c7a141"
|
resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz#5e56bf9eef3b2d92360d6d29dcde7722acbecc9e"
|
||||||
integrity sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==
|
integrity sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==
|
||||||
|
|
||||||
esbuild-windows-32@0.15.5:
|
esbuild-windows-32@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz#0670326903f421424be86bc03b7f7b3ff86a9db7"
|
resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz#a4f1a301c1a2fa7701fcd4b91ef9d2620cf293d0"
|
||||||
integrity sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==
|
integrity sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==
|
||||||
|
|
||||||
esbuild-windows-64@0.15.5:
|
esbuild-windows-64@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz#64f32acb7341f3f0a4d10e8ff1998c2d1ebfc0a9"
|
resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz#bc2b467541744d653be4fe64eaa9b0dbbf8e07f6"
|
||||||
integrity sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==
|
integrity sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==
|
||||||
|
|
||||||
esbuild-windows-arm64@0.15.5:
|
esbuild-windows-arm64@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz#4fe7f333ce22a922906b10233c62171673a3854b"
|
resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz#9a7266404334a86be800957eaee9aef94c3df328"
|
||||||
integrity sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==
|
integrity sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==
|
||||||
|
|
||||||
esbuild@0.15.5:
|
esbuild@0.15.12:
|
||||||
version "0.15.5"
|
version "0.15.12"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.5.tgz#5effd05666f621d4ff2fe2c76a67c198292193ff"
|
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.12.tgz#6c8e22d6d3b7430d165c33848298d3fc9a1f251c"
|
||||||
integrity sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==
|
integrity sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@esbuild/linux-loong64" "0.15.5"
|
"@esbuild/android-arm" "0.15.12"
|
||||||
esbuild-android-64 "0.15.5"
|
"@esbuild/linux-loong64" "0.15.12"
|
||||||
esbuild-android-arm64 "0.15.5"
|
esbuild-android-64 "0.15.12"
|
||||||
esbuild-darwin-64 "0.15.5"
|
esbuild-android-arm64 "0.15.12"
|
||||||
esbuild-darwin-arm64 "0.15.5"
|
esbuild-darwin-64 "0.15.12"
|
||||||
esbuild-freebsd-64 "0.15.5"
|
esbuild-darwin-arm64 "0.15.12"
|
||||||
esbuild-freebsd-arm64 "0.15.5"
|
esbuild-freebsd-64 "0.15.12"
|
||||||
esbuild-linux-32 "0.15.5"
|
esbuild-freebsd-arm64 "0.15.12"
|
||||||
esbuild-linux-64 "0.15.5"
|
esbuild-linux-32 "0.15.12"
|
||||||
esbuild-linux-arm "0.15.5"
|
esbuild-linux-64 "0.15.12"
|
||||||
esbuild-linux-arm64 "0.15.5"
|
esbuild-linux-arm "0.15.12"
|
||||||
esbuild-linux-mips64le "0.15.5"
|
esbuild-linux-arm64 "0.15.12"
|
||||||
esbuild-linux-ppc64le "0.15.5"
|
esbuild-linux-mips64le "0.15.12"
|
||||||
esbuild-linux-riscv64 "0.15.5"
|
esbuild-linux-ppc64le "0.15.12"
|
||||||
esbuild-linux-s390x "0.15.5"
|
esbuild-linux-riscv64 "0.15.12"
|
||||||
esbuild-netbsd-64 "0.15.5"
|
esbuild-linux-s390x "0.15.12"
|
||||||
esbuild-openbsd-64 "0.15.5"
|
esbuild-netbsd-64 "0.15.12"
|
||||||
esbuild-sunos-64 "0.15.5"
|
esbuild-openbsd-64 "0.15.12"
|
||||||
esbuild-windows-32 "0.15.5"
|
esbuild-sunos-64 "0.15.12"
|
||||||
esbuild-windows-64 "0.15.5"
|
esbuild-windows-32 "0.15.12"
|
||||||
esbuild-windows-arm64 "0.15.5"
|
esbuild-windows-64 "0.15.12"
|
||||||
|
esbuild-windows-arm64 "0.15.12"
|
||||||
|
|
||||||
escalade@^3.1.1:
|
escalade@^3.1.1:
|
||||||
version "3.1.1"
|
version "3.1.1"
|
||||||
|
|||||||
Reference in New Issue
Block a user