@0xsequence/relayer
Advanced tools
Comparing version 0.0.0-20240807210827 to 0.0.0-20240812142652
@@ -25,3 +25,3 @@ 'use strict'; | ||
const DEFAULT_GAS_LIMIT = ethers.ethers.BigNumber.from(800000); | ||
const DEFAULT_GAS_LIMIT = 800000n; | ||
const ProviderRelayerDefaults = { | ||
@@ -33,3 +33,3 @@ waitPollRate: 1000, | ||
function isProviderRelayerOptions(obj) { | ||
return obj.provider !== undefined && ethers.providers.Provider.isProvider(obj.provider); | ||
return typeof obj === 'object' && obj.provider instanceof ethers.ethers.AbstractProvider; | ||
} | ||
@@ -52,3 +52,3 @@ class ProviderRelayer { | ||
// Respect gasLimit request of the transaction (as long as its not 0) | ||
if (tx.gasLimit && !ethers.ethers.BigNumber.from(tx.gasLimit || 0).eq(ethers.ethers.constants.Zero)) { | ||
if (tx.gasLimit && BigInt(tx.gasLimit || 0) !== 0n) { | ||
return tx.gasLimit; | ||
@@ -63,3 +63,3 @@ } | ||
// Fee can't be estimated for self-called if wallet hasn't been deployed | ||
if (tx.to === wallet && (await _this.provider.getCode(wallet).then(code => ethers.ethers.utils.arrayify(code).length === 0))) { | ||
if (tx.to === wallet && (await _this.provider.getCode(wallet).then(code => ethers.ethers.getBytes(code).length === 0))) { | ||
return DEFAULT_GAS_LIMIT; | ||
@@ -82,4 +82,4 @@ } | ||
succeeded: true, | ||
gasUsed: ethers.ethers.BigNumber.from(gasLimit).toNumber(), | ||
gasLimit: ethers.ethers.BigNumber.from(gasLimit).toNumber() | ||
gasUsed: Number(gasLimit), | ||
gasLimit: Number(gasLimit) | ||
})); | ||
@@ -155,3 +155,3 @@ } | ||
// Find a transaction with a TxExecuted log | ||
const found = txs.find(tx => tx.logs.find(l => l.topics.length === 0 && l.data.replace('0x', '') === normalMetaTxnId || l.topics.length === 1 && | ||
const found = txs.find(tx => tx == null ? void 0 : tx.logs.find(l => l.topics.length === 0 && l.data.replace('0x', '') === normalMetaTxnId || l.topics.length === 1 && | ||
// TxFailed event topic | ||
@@ -162,5 +162,13 @@ l.topics[0] === '0x3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd7' && l.data.length >= 64 && l.data.replace('0x', '').startsWith(normalMetaTxnId))); | ||
if (found) { | ||
return _extends({ | ||
receipt: found | ||
}, await retry(() => _this2.provider.getTransaction(found.transactionHash), `unable to get transaction ${found.transactionHash}`)); | ||
const response = await retry(() => _this2.provider.getTransaction(found.hash), `unable to get transaction ${found.hash}`); | ||
if (!response) { | ||
throw new Error(`Transaction response not found for ${metaTxnId}`); | ||
} | ||
// NOTE: we have to do this, because ethers-v6 uses private fields | ||
// and we can't just extend the class and override the method, so | ||
// we just modify the response object directly by adding the receipt to it. | ||
const out = response; | ||
out.receipt = found; | ||
return out; | ||
} | ||
@@ -187,7 +195,7 @@ | ||
function isLocalRelayerOptions(obj) { | ||
return obj.signer !== undefined && ethers.Signer.isSigner(obj.signer); | ||
return typeof obj === 'object' && obj.signer instanceof ethers.ethers.AbstractSigner; | ||
} | ||
class LocalRelayer extends ProviderRelayer { | ||
constructor(options) { | ||
super(ethers.Signer.isSigner(options) ? { | ||
super(options instanceof ethers.ethers.AbstractSigner ? { | ||
provider: options.provider | ||
@@ -199,3 +207,3 @@ } : _extends({}, options, { | ||
this.txnOptions = void 0; | ||
this.signer = ethers.Signer.isSigner(options) ? options : options.signer; | ||
this.signer = options instanceof ethers.ethers.AbstractSigner ? options : options.signer; | ||
if (!this.signer.provider) throw new Error('Signer must have a provider'); | ||
@@ -230,3 +238,3 @@ } | ||
// NOTE: we expect that all txns have set their gasLimit ahead of time through proper estimation | ||
// const gasLimit = signedTxs.transactions.reduce((sum, tx) => sum.add(tx.gasLimit), ethers.BigNumber.from(0)) | ||
// const gasLimit = signedTxs.transactions.reduce((sum, tx) => sum + tx.gasLimit, 0n) | ||
// txRequest.gasLimit = gasLimit | ||
@@ -979,3 +987,3 @@ | ||
function isRpcRelayerOptions(obj) { | ||
return obj.url !== undefined && typeof obj.url === 'string' && obj.provider !== undefined && ethers.ethers.providers.Provider.isProvider(obj.provider); | ||
return obj.url !== undefined && typeof obj.url === 'string' && obj.provider !== undefined && obj.provider instanceof ethers.ethers.AbstractProvider; | ||
} | ||
@@ -1010,3 +1018,3 @@ const fetch = globalThis.fetch; | ||
this.service = new Relayer(options.url, this._fetch); | ||
if (ethers.ethers.providers.Provider.isProvider(options.provider)) { | ||
if (options.provider instanceof ethers.ethers.AbstractProvider) { | ||
this.provider = options.provider; | ||
@@ -1018,4 +1026,6 @@ } else { | ||
} = this.options; | ||
const providerConnectionInfo = utils.getEthersConnectionInfo(options.provider.url, projectAccessKey, jwtAuth); | ||
this.provider = new ethers.ethers.providers.StaticJsonRpcProvider(providerConnectionInfo); | ||
const fetchRequest = utils.getFetchRequest(options.provider.url, projectAccessKey, jwtAuth); | ||
this.provider = new ethers.ethers.JsonRpcProvider(fetchRequest, undefined, { | ||
staticNetwork: true | ||
}); | ||
} | ||
@@ -1054,3 +1064,3 @@ } | ||
async simulate(wallet, ...transactions) { | ||
const coder = ethers.ethers.utils.defaultAbiCoder; | ||
const coder = ethers.ethers.AbiCoder.defaultAbiCoder(); | ||
const encoded = coder.encode([core.commons.transaction.MetaTransactionsType], [core.commons.transaction.sequenceTxAbiEncode(transactions)]); | ||
@@ -1109,3 +1119,3 @@ return (await this.service.simulate({ | ||
to: entrypoint, | ||
data: ethers.ethers.utils.hexlify(data), | ||
data: ethers.ethers.hexlify(data), | ||
simulate: options == null ? void 0 : options.simulate | ||
@@ -1129,3 +1139,3 @@ }); | ||
utils.logger.info(`[rpc-relayer/getNonce] get nonce for wallet ${address} space: ${space}`); | ||
const encodedNonce = space !== undefined ? ethers.ethers.BigNumber.from(space).toHexString() : undefined; | ||
const encodedNonce = space !== undefined ? utils.toHexString(BigInt(space)) : undefined; | ||
const resp = await this.service.getMetaTxnNonce({ | ||
@@ -1135,3 +1145,3 @@ walletContractAddress: address, | ||
}); | ||
const nonce = ethers.ethers.BigNumber.from(resp.nonce); | ||
const nonce = BigInt(resp.nonce); | ||
const [decodedSpace, decodedNonce] = core.commons.transaction.decodeNonce(nonce); | ||
@@ -1189,2 +1199,6 @@ utils.logger.info(`[rpc-relayer/getNonce] got next nonce for wallet ${address} ${decodedNonce} space: ${decodedSpace}`); | ||
response.wait = wait; | ||
// NOTE: we just ignore these errors which come from the private fields | ||
// of ethers-v6 .. but, we should probably rework this instead.. | ||
// @ts-ignore | ||
return response; | ||
@@ -1206,5 +1220,9 @@ } | ||
const txReceipt = JSON.parse(receipt.txnReceipt); | ||
// NOTE: we just ignore these errors which come from the private fields | ||
// of ethers-v6 .. but, we should probably rework this instead.. | ||
// @ts-ignore | ||
return { | ||
blockHash: txReceipt.blockHash, | ||
blockNumber: ethers.ethers.BigNumber.from(txReceipt.blockNumber).toNumber(), | ||
blockNumber: Number(txReceipt.blockNumber), | ||
confirmations: 1, | ||
@@ -1211,0 +1229,0 @@ from: typeof metaTxnId === 'string' ? undefined : metaTxnId.intent.wallet, |
@@ -25,3 +25,3 @@ 'use strict'; | ||
const DEFAULT_GAS_LIMIT = ethers.ethers.BigNumber.from(800000); | ||
const DEFAULT_GAS_LIMIT = 800000n; | ||
const ProviderRelayerDefaults = { | ||
@@ -33,3 +33,3 @@ waitPollRate: 1000, | ||
function isProviderRelayerOptions(obj) { | ||
return obj.provider !== undefined && ethers.providers.Provider.isProvider(obj.provider); | ||
return typeof obj === 'object' && obj.provider instanceof ethers.ethers.AbstractProvider; | ||
} | ||
@@ -52,3 +52,3 @@ class ProviderRelayer { | ||
// Respect gasLimit request of the transaction (as long as its not 0) | ||
if (tx.gasLimit && !ethers.ethers.BigNumber.from(tx.gasLimit || 0).eq(ethers.ethers.constants.Zero)) { | ||
if (tx.gasLimit && BigInt(tx.gasLimit || 0) !== 0n) { | ||
return tx.gasLimit; | ||
@@ -63,3 +63,3 @@ } | ||
// Fee can't be estimated for self-called if wallet hasn't been deployed | ||
if (tx.to === wallet && (await _this.provider.getCode(wallet).then(code => ethers.ethers.utils.arrayify(code).length === 0))) { | ||
if (tx.to === wallet && (await _this.provider.getCode(wallet).then(code => ethers.ethers.getBytes(code).length === 0))) { | ||
return DEFAULT_GAS_LIMIT; | ||
@@ -82,4 +82,4 @@ } | ||
succeeded: true, | ||
gasUsed: ethers.ethers.BigNumber.from(gasLimit).toNumber(), | ||
gasLimit: ethers.ethers.BigNumber.from(gasLimit).toNumber() | ||
gasUsed: Number(gasLimit), | ||
gasLimit: Number(gasLimit) | ||
})); | ||
@@ -155,3 +155,3 @@ } | ||
// Find a transaction with a TxExecuted log | ||
const found = txs.find(tx => tx.logs.find(l => l.topics.length === 0 && l.data.replace('0x', '') === normalMetaTxnId || l.topics.length === 1 && | ||
const found = txs.find(tx => tx == null ? void 0 : tx.logs.find(l => l.topics.length === 0 && l.data.replace('0x', '') === normalMetaTxnId || l.topics.length === 1 && | ||
// TxFailed event topic | ||
@@ -162,5 +162,13 @@ l.topics[0] === '0x3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd7' && l.data.length >= 64 && l.data.replace('0x', '').startsWith(normalMetaTxnId))); | ||
if (found) { | ||
return _extends({ | ||
receipt: found | ||
}, await retry(() => _this2.provider.getTransaction(found.transactionHash), `unable to get transaction ${found.transactionHash}`)); | ||
const response = await retry(() => _this2.provider.getTransaction(found.hash), `unable to get transaction ${found.hash}`); | ||
if (!response) { | ||
throw new Error(`Transaction response not found for ${metaTxnId}`); | ||
} | ||
// NOTE: we have to do this, because ethers-v6 uses private fields | ||
// and we can't just extend the class and override the method, so | ||
// we just modify the response object directly by adding the receipt to it. | ||
const out = response; | ||
out.receipt = found; | ||
return out; | ||
} | ||
@@ -187,7 +195,7 @@ | ||
function isLocalRelayerOptions(obj) { | ||
return obj.signer !== undefined && ethers.Signer.isSigner(obj.signer); | ||
return typeof obj === 'object' && obj.signer instanceof ethers.ethers.AbstractSigner; | ||
} | ||
class LocalRelayer extends ProviderRelayer { | ||
constructor(options) { | ||
super(ethers.Signer.isSigner(options) ? { | ||
super(options instanceof ethers.ethers.AbstractSigner ? { | ||
provider: options.provider | ||
@@ -199,3 +207,3 @@ } : _extends({}, options, { | ||
this.txnOptions = void 0; | ||
this.signer = ethers.Signer.isSigner(options) ? options : options.signer; | ||
this.signer = options instanceof ethers.ethers.AbstractSigner ? options : options.signer; | ||
if (!this.signer.provider) throw new Error('Signer must have a provider'); | ||
@@ -230,3 +238,3 @@ } | ||
// NOTE: we expect that all txns have set their gasLimit ahead of time through proper estimation | ||
// const gasLimit = signedTxs.transactions.reduce((sum, tx) => sum.add(tx.gasLimit), ethers.BigNumber.from(0)) | ||
// const gasLimit = signedTxs.transactions.reduce((sum, tx) => sum + tx.gasLimit, 0n) | ||
// txRequest.gasLimit = gasLimit | ||
@@ -979,3 +987,3 @@ | ||
function isRpcRelayerOptions(obj) { | ||
return obj.url !== undefined && typeof obj.url === 'string' && obj.provider !== undefined && ethers.ethers.providers.Provider.isProvider(obj.provider); | ||
return obj.url !== undefined && typeof obj.url === 'string' && obj.provider !== undefined && obj.provider instanceof ethers.ethers.AbstractProvider; | ||
} | ||
@@ -1010,3 +1018,3 @@ const fetch = globalThis.fetch; | ||
this.service = new Relayer(options.url, this._fetch); | ||
if (ethers.ethers.providers.Provider.isProvider(options.provider)) { | ||
if (options.provider instanceof ethers.ethers.AbstractProvider) { | ||
this.provider = options.provider; | ||
@@ -1018,4 +1026,6 @@ } else { | ||
} = this.options; | ||
const providerConnectionInfo = utils.getEthersConnectionInfo(options.provider.url, projectAccessKey, jwtAuth); | ||
this.provider = new ethers.ethers.providers.StaticJsonRpcProvider(providerConnectionInfo); | ||
const fetchRequest = utils.getFetchRequest(options.provider.url, projectAccessKey, jwtAuth); | ||
this.provider = new ethers.ethers.JsonRpcProvider(fetchRequest, undefined, { | ||
staticNetwork: true | ||
}); | ||
} | ||
@@ -1054,3 +1064,3 @@ } | ||
async simulate(wallet, ...transactions) { | ||
const coder = ethers.ethers.utils.defaultAbiCoder; | ||
const coder = ethers.ethers.AbiCoder.defaultAbiCoder(); | ||
const encoded = coder.encode([core.commons.transaction.MetaTransactionsType], [core.commons.transaction.sequenceTxAbiEncode(transactions)]); | ||
@@ -1109,3 +1119,3 @@ return (await this.service.simulate({ | ||
to: entrypoint, | ||
data: ethers.ethers.utils.hexlify(data), | ||
data: ethers.ethers.hexlify(data), | ||
simulate: options == null ? void 0 : options.simulate | ||
@@ -1129,3 +1139,3 @@ }); | ||
utils.logger.info(`[rpc-relayer/getNonce] get nonce for wallet ${address} space: ${space}`); | ||
const encodedNonce = space !== undefined ? ethers.ethers.BigNumber.from(space).toHexString() : undefined; | ||
const encodedNonce = space !== undefined ? utils.toHexString(BigInt(space)) : undefined; | ||
const resp = await this.service.getMetaTxnNonce({ | ||
@@ -1135,3 +1145,3 @@ walletContractAddress: address, | ||
}); | ||
const nonce = ethers.ethers.BigNumber.from(resp.nonce); | ||
const nonce = BigInt(resp.nonce); | ||
const [decodedSpace, decodedNonce] = core.commons.transaction.decodeNonce(nonce); | ||
@@ -1189,2 +1199,6 @@ utils.logger.info(`[rpc-relayer/getNonce] got next nonce for wallet ${address} ${decodedNonce} space: ${decodedSpace}`); | ||
response.wait = wait; | ||
// NOTE: we just ignore these errors which come from the private fields | ||
// of ethers-v6 .. but, we should probably rework this instead.. | ||
// @ts-ignore | ||
return response; | ||
@@ -1206,5 +1220,9 @@ } | ||
const txReceipt = JSON.parse(receipt.txnReceipt); | ||
// NOTE: we just ignore these errors which come from the private fields | ||
// of ethers-v6 .. but, we should probably rework this instead.. | ||
// @ts-ignore | ||
return { | ||
blockHash: txReceipt.blockHash, | ||
blockNumber: ethers.ethers.BigNumber.from(txReceipt.blockNumber).toNumber(), | ||
blockNumber: Number(txReceipt.blockNumber), | ||
confirmations: 1, | ||
@@ -1211,0 +1229,0 @@ from: typeof metaTxnId === 'string' ? undefined : metaTxnId.intent.wallet, |
@@ -1,3 +0,3 @@ | ||
import { ethers, providers, Signer } from 'ethers'; | ||
import { logger, getEthersConnectionInfo } from '@0xsequence/utils'; | ||
import { ethers } from 'ethers'; | ||
import { logger, getFetchRequest, toHexString } from '@0xsequence/utils'; | ||
import { walletContracts } from '@0xsequence/abi'; | ||
@@ -21,3 +21,3 @@ import { commons } from '@0xsequence/core'; | ||
const DEFAULT_GAS_LIMIT = ethers.BigNumber.from(800000); | ||
const DEFAULT_GAS_LIMIT = 800000n; | ||
const ProviderRelayerDefaults = { | ||
@@ -29,3 +29,3 @@ waitPollRate: 1000, | ||
function isProviderRelayerOptions(obj) { | ||
return obj.provider !== undefined && providers.Provider.isProvider(obj.provider); | ||
return typeof obj === 'object' && obj.provider instanceof ethers.AbstractProvider; | ||
} | ||
@@ -48,3 +48,3 @@ class ProviderRelayer { | ||
// Respect gasLimit request of the transaction (as long as its not 0) | ||
if (tx.gasLimit && !ethers.BigNumber.from(tx.gasLimit || 0).eq(ethers.constants.Zero)) { | ||
if (tx.gasLimit && BigInt(tx.gasLimit || 0) !== 0n) { | ||
return tx.gasLimit; | ||
@@ -59,3 +59,3 @@ } | ||
// Fee can't be estimated for self-called if wallet hasn't been deployed | ||
if (tx.to === wallet && (await _this.provider.getCode(wallet).then(code => ethers.utils.arrayify(code).length === 0))) { | ||
if (tx.to === wallet && (await _this.provider.getCode(wallet).then(code => ethers.getBytes(code).length === 0))) { | ||
return DEFAULT_GAS_LIMIT; | ||
@@ -78,4 +78,4 @@ } | ||
succeeded: true, | ||
gasUsed: ethers.BigNumber.from(gasLimit).toNumber(), | ||
gasLimit: ethers.BigNumber.from(gasLimit).toNumber() | ||
gasUsed: Number(gasLimit), | ||
gasLimit: Number(gasLimit) | ||
})); | ||
@@ -151,3 +151,3 @@ } | ||
// Find a transaction with a TxExecuted log | ||
const found = txs.find(tx => tx.logs.find(l => l.topics.length === 0 && l.data.replace('0x', '') === normalMetaTxnId || l.topics.length === 1 && | ||
const found = txs.find(tx => tx == null ? void 0 : tx.logs.find(l => l.topics.length === 0 && l.data.replace('0x', '') === normalMetaTxnId || l.topics.length === 1 && | ||
// TxFailed event topic | ||
@@ -158,5 +158,13 @@ l.topics[0] === '0x3dbd1590ea96dd3253a91f24e64e3a502e1225d602a5731357bc12643070ccd7' && l.data.length >= 64 && l.data.replace('0x', '').startsWith(normalMetaTxnId))); | ||
if (found) { | ||
return _extends({ | ||
receipt: found | ||
}, await retry(() => _this2.provider.getTransaction(found.transactionHash), `unable to get transaction ${found.transactionHash}`)); | ||
const response = await retry(() => _this2.provider.getTransaction(found.hash), `unable to get transaction ${found.hash}`); | ||
if (!response) { | ||
throw new Error(`Transaction response not found for ${metaTxnId}`); | ||
} | ||
// NOTE: we have to do this, because ethers-v6 uses private fields | ||
// and we can't just extend the class and override the method, so | ||
// we just modify the response object directly by adding the receipt to it. | ||
const out = response; | ||
out.receipt = found; | ||
return out; | ||
} | ||
@@ -183,7 +191,7 @@ | ||
function isLocalRelayerOptions(obj) { | ||
return obj.signer !== undefined && Signer.isSigner(obj.signer); | ||
return typeof obj === 'object' && obj.signer instanceof ethers.AbstractSigner; | ||
} | ||
class LocalRelayer extends ProviderRelayer { | ||
constructor(options) { | ||
super(Signer.isSigner(options) ? { | ||
super(options instanceof ethers.AbstractSigner ? { | ||
provider: options.provider | ||
@@ -195,3 +203,3 @@ } : _extends({}, options, { | ||
this.txnOptions = void 0; | ||
this.signer = Signer.isSigner(options) ? options : options.signer; | ||
this.signer = options instanceof ethers.AbstractSigner ? options : options.signer; | ||
if (!this.signer.provider) throw new Error('Signer must have a provider'); | ||
@@ -226,3 +234,3 @@ } | ||
// NOTE: we expect that all txns have set their gasLimit ahead of time through proper estimation | ||
// const gasLimit = signedTxs.transactions.reduce((sum, tx) => sum.add(tx.gasLimit), ethers.BigNumber.from(0)) | ||
// const gasLimit = signedTxs.transactions.reduce((sum, tx) => sum + tx.gasLimit, 0n) | ||
// txRequest.gasLimit = gasLimit | ||
@@ -975,3 +983,3 @@ | ||
function isRpcRelayerOptions(obj) { | ||
return obj.url !== undefined && typeof obj.url === 'string' && obj.provider !== undefined && ethers.providers.Provider.isProvider(obj.provider); | ||
return obj.url !== undefined && typeof obj.url === 'string' && obj.provider !== undefined && obj.provider instanceof ethers.AbstractProvider; | ||
} | ||
@@ -1006,3 +1014,3 @@ const fetch = globalThis.fetch; | ||
this.service = new Relayer(options.url, this._fetch); | ||
if (ethers.providers.Provider.isProvider(options.provider)) { | ||
if (options.provider instanceof ethers.AbstractProvider) { | ||
this.provider = options.provider; | ||
@@ -1014,4 +1022,6 @@ } else { | ||
} = this.options; | ||
const providerConnectionInfo = getEthersConnectionInfo(options.provider.url, projectAccessKey, jwtAuth); | ||
this.provider = new ethers.providers.StaticJsonRpcProvider(providerConnectionInfo); | ||
const fetchRequest = getFetchRequest(options.provider.url, projectAccessKey, jwtAuth); | ||
this.provider = new ethers.JsonRpcProvider(fetchRequest, undefined, { | ||
staticNetwork: true | ||
}); | ||
} | ||
@@ -1050,3 +1060,3 @@ } | ||
async simulate(wallet, ...transactions) { | ||
const coder = ethers.utils.defaultAbiCoder; | ||
const coder = ethers.AbiCoder.defaultAbiCoder(); | ||
const encoded = coder.encode([commons.transaction.MetaTransactionsType], [commons.transaction.sequenceTxAbiEncode(transactions)]); | ||
@@ -1105,3 +1115,3 @@ return (await this.service.simulate({ | ||
to: entrypoint, | ||
data: ethers.utils.hexlify(data), | ||
data: ethers.hexlify(data), | ||
simulate: options == null ? void 0 : options.simulate | ||
@@ -1125,3 +1135,3 @@ }); | ||
logger.info(`[rpc-relayer/getNonce] get nonce for wallet ${address} space: ${space}`); | ||
const encodedNonce = space !== undefined ? ethers.BigNumber.from(space).toHexString() : undefined; | ||
const encodedNonce = space !== undefined ? toHexString(BigInt(space)) : undefined; | ||
const resp = await this.service.getMetaTxnNonce({ | ||
@@ -1131,3 +1141,3 @@ walletContractAddress: address, | ||
}); | ||
const nonce = ethers.BigNumber.from(resp.nonce); | ||
const nonce = BigInt(resp.nonce); | ||
const [decodedSpace, decodedNonce] = commons.transaction.decodeNonce(nonce); | ||
@@ -1185,2 +1195,6 @@ logger.info(`[rpc-relayer/getNonce] got next nonce for wallet ${address} ${decodedNonce} space: ${decodedSpace}`); | ||
response.wait = wait; | ||
// NOTE: we just ignore these errors which come from the private fields | ||
// of ethers-v6 .. but, we should probably rework this instead.. | ||
// @ts-ignore | ||
return response; | ||
@@ -1202,5 +1216,9 @@ } | ||
const txReceipt = JSON.parse(receipt.txnReceipt); | ||
// NOTE: we just ignore these errors which come from the private fields | ||
// of ethers-v6 .. but, we should probably rework this instead.. | ||
// @ts-ignore | ||
return { | ||
blockHash: txReceipt.blockHash, | ||
blockNumber: ethers.BigNumber.from(txReceipt.blockNumber).toNumber(), | ||
blockNumber: Number(txReceipt.blockNumber), | ||
confirmations: 1, | ||
@@ -1207,0 +1225,0 @@ from: typeof metaTxnId === 'string' ? undefined : metaTxnId.intent.wallet, |
@@ -1,2 +0,2 @@ | ||
import { ethers, providers } from 'ethers'; | ||
import { ethers } from 'ethers'; | ||
import { proto } from "./rpc-relayer/index.js"; | ||
@@ -10,3 +10,3 @@ import { commons } from '@0xsequence/core'; | ||
}>; | ||
getFeeOptionsRaw(entrypoint: string, data: ethers.utils.BytesLike, options?: { | ||
getFeeOptionsRaw(entrypoint: string, data: ethers.BytesLike, options?: { | ||
simulate?: boolean; | ||
@@ -18,3 +18,3 @@ }): Promise<{ | ||
gasRefundOptions(address: string, ...transactions: commons.transaction.Transaction[]): Promise<FeeOption[]>; | ||
getNonce(address: string, space?: ethers.BigNumberish, blockTag?: providers.BlockTag): Promise<ethers.BigNumberish>; | ||
getNonce(address: string, space?: ethers.BigNumberish, blockTag?: ethers.BlockTag): Promise<ethers.BigNumberish>; | ||
relay(signedTxs: commons.transaction.IntendedTransactionBundle, quote?: FeeQuote, waitForReceipt?: boolean): Promise<commons.transaction.TransactionResponse>; | ||
@@ -21,0 +21,0 @@ wait(metaTxnId: string | commons.transaction.SignedTransactionBundle, timeout?: number, delay?: number, maxFails?: number): Promise<commons.transaction.TransactionResponse>; |
@@ -1,2 +0,2 @@ | ||
import { Signer as AbstractSigner, providers, BytesLike } from 'ethers'; | ||
import { ethers } from 'ethers'; | ||
import { FeeOption, FeeQuote, Relayer } from "./index.js"; | ||
@@ -6,3 +6,3 @@ import { ProviderRelayer, ProviderRelayerOptions } from "./provider-relayer.js"; | ||
export type LocalRelayerOptions = Omit<ProviderRelayerOptions, 'provider'> & { | ||
signer: AbstractSigner; | ||
signer: ethers.Signer; | ||
}; | ||
@@ -13,7 +13,7 @@ export declare function isLocalRelayerOptions(obj: any): obj is LocalRelayerOptions; | ||
private txnOptions; | ||
constructor(options: LocalRelayerOptions | AbstractSigner); | ||
constructor(options: LocalRelayerOptions | ethers.AbstractSigner); | ||
getFeeOptions(_address: string, ..._transactions: commons.transaction.Transaction[]): Promise<{ | ||
options: FeeOption[]; | ||
}>; | ||
getFeeOptionsRaw(_entrypoint: string, _data: BytesLike, _options?: { | ||
getFeeOptionsRaw(_entrypoint: string, _data: ethers.BytesLike, _options?: { | ||
simulate?: boolean; | ||
@@ -24,4 +24,4 @@ }): Promise<{ | ||
gasRefundOptions(address: string, ...transactions: commons.transaction.Transaction[]): Promise<FeeOption[]>; | ||
setTransactionOptions(transactionRequest: providers.TransactionRequest): void; | ||
relay(signedTxs: commons.transaction.IntendedTransactionBundle, quote?: FeeQuote, waitForReceipt?: boolean): Promise<commons.transaction.TransactionResponse<providers.TransactionReceipt>>; | ||
setTransactionOptions(transactionRequest: ethers.TransactionRequest): void; | ||
relay(signedTxs: commons.transaction.IntendedTransactionBundle, quote?: FeeQuote, waitForReceipt?: boolean): Promise<commons.transaction.TransactionResponse<ethers.TransactionReceipt>>; | ||
} |
@@ -1,2 +0,2 @@ | ||
import { ethers, providers } from 'ethers'; | ||
import { ethers } from 'ethers'; | ||
import { FeeOption, FeeQuote, Relayer, SimulateResult } from "./index.js"; | ||
@@ -6,3 +6,3 @@ import { Optionals } from '@0xsequence/utils'; | ||
export interface ProviderRelayerOptions { | ||
provider: providers.Provider; | ||
provider: ethers.Provider; | ||
waitPollRate?: number; | ||
@@ -15,3 +15,3 @@ deltaBlocksLog?: number; | ||
export declare abstract class ProviderRelayer implements Relayer { | ||
provider: providers.Provider; | ||
provider: ethers.Provider; | ||
waitPollRate: number; | ||
@@ -25,3 +25,3 @@ deltaBlocksLog: number; | ||
}>; | ||
abstract getFeeOptionsRaw(entrypoint: string, data: ethers.utils.BytesLike, options?: { | ||
abstract getFeeOptionsRaw(entrypoint: string, data: ethers.BytesLike, options?: { | ||
simulate?: boolean; | ||
@@ -35,6 +35,6 @@ }): Promise<{ | ||
simulate(wallet: string, ...transactions: commons.transaction.Transaction[]): Promise<SimulateResult[]>; | ||
getNonce(address: string, space?: ethers.BigNumberish, blockTag?: providers.BlockTag): Promise<ethers.BigNumberish>; | ||
wait(metaTxnId: string | commons.transaction.SignedTransactionBundle, timeoutDuration?: number, delay?: number, maxFails?: number): Promise<providers.TransactionResponse & { | ||
receipt: providers.TransactionReceipt; | ||
getNonce(address: string, space?: ethers.BigNumberish, blockTag?: ethers.BlockTag): Promise<ethers.BigNumberish>; | ||
wait(metaTxnId: string | commons.transaction.SignedTransactionBundle, timeoutDuration?: number, delay?: number, maxFails?: number): Promise<ethers.TransactionResponse & { | ||
receipt: ethers.TransactionReceipt; | ||
}>; | ||
} |
@@ -7,3 +7,3 @@ import { ethers } from 'ethers'; | ||
export interface RpcRelayerOptions { | ||
provider: ethers.providers.Provider | { | ||
provider: ethers.AbstractProvider | { | ||
url: string; | ||
@@ -19,3 +19,3 @@ }; | ||
private readonly service; | ||
readonly provider: ethers.providers.Provider; | ||
readonly provider: ethers.Provider; | ||
constructor(options: RpcRelayerOptions); | ||
@@ -29,3 +29,3 @@ _fetch: (input: RequestInfo, init?: RequestInit) => Promise<Response>; | ||
}>; | ||
getFeeOptionsRaw(entrypoint: string, data: ethers.utils.BytesLike, options?: { | ||
getFeeOptionsRaw(entrypoint: string, data: ethers.BytesLike, options?: { | ||
simulate?: boolean; | ||
@@ -32,0 +32,0 @@ }): Promise<{ |
{ | ||
"name": "@0xsequence/relayer", | ||
"version": "0.0.0-20240807210827", | ||
"version": "0.0.0-20240812142652", | ||
"description": "relayer sub-package for Sequence", | ||
@@ -12,14 +12,14 @@ "repository": "https://github.com/0xsequence/sequence.js/tree/master/packages/relayer", | ||
"dependencies": { | ||
"@0xsequence/abi": "0.0.0-20240807210827", | ||
"@0xsequence/core": "0.0.0-20240807210827", | ||
"@0xsequence/utils": "0.0.0-20240807210827" | ||
"@0xsequence/abi": "0.0.0-20240812142652", | ||
"@0xsequence/core": "0.0.0-20240812142652", | ||
"@0xsequence/utils": "0.0.0-20240812142652" | ||
}, | ||
"peerDependencies": { | ||
"ethers": ">=5.5 < 6" | ||
"ethers": ">=6" | ||
}, | ||
"devDependencies": { | ||
"@0xsequence/wallet-contracts": "^1.10.0", | ||
"ethers": "^5.7.2", | ||
"@0xsequence/signhub": "0.0.0-20240807210827", | ||
"@0xsequence/tests": "0.0.0-20240807210827" | ||
"@0xsequence/wallet-contracts": "^3.0.1", | ||
"ethers": "^6.13.0", | ||
"@0xsequence/signhub": "0.0.0-20240812142652", | ||
"@0xsequence/tests": "0.0.0-20240812142652" | ||
}, | ||
@@ -33,3 +33,3 @@ "files": [ | ||
"test:run": "pnpm test:file tests/**/*.spec.ts", | ||
"test:file": "NODE_OPTIONS='--import tsx' mocha --timeout 30000", | ||
"test:file": "NODE_OPTIONS='--import tsx' mocha --timeout 60000", | ||
"test:concurrently": "concurrently -k --success first 'pnpm start:hardhat > /dev/null' ", | ||
@@ -36,0 +36,0 @@ "start:hardhat": "pnpm hardhat node --port 9547", |
@@ -1,2 +0,2 @@ | ||
import { ethers, providers } from 'ethers' | ||
import { ethers } from 'ethers' | ||
import { proto } from './rpc-relayer' | ||
@@ -22,3 +22,3 @@ | ||
entrypoint: string, | ||
data: ethers.utils.BytesLike, | ||
data: ethers.BytesLike, | ||
options?: { | ||
@@ -36,3 +36,3 @@ simulate?: boolean | ||
// Otherwise, the relayer must return a nonce encoded for the given nonce space. | ||
getNonce(address: string, space?: ethers.BigNumberish, blockTag?: providers.BlockTag): Promise<ethers.BigNumberish> | ||
getNonce(address: string, space?: ethers.BigNumberish, blockTag?: ethers.BlockTag): Promise<ethers.BigNumberish> | ||
@@ -39,0 +39,0 @@ // relayer will submit the transaction(s) to the network and return the transaction response. |
@@ -1,2 +0,2 @@ | ||
import { Signer as AbstractSigner, providers, BytesLike } from 'ethers' | ||
import { ethers } from 'ethers' | ||
import { logger } from '@0xsequence/utils' | ||
@@ -8,16 +8,20 @@ import { FeeOption, FeeQuote, Relayer } from '.' | ||
export type LocalRelayerOptions = Omit<ProviderRelayerOptions, 'provider'> & { | ||
signer: AbstractSigner | ||
signer: ethers.Signer | ||
} | ||
export function isLocalRelayerOptions(obj: any): obj is LocalRelayerOptions { | ||
return obj.signer !== undefined && AbstractSigner.isSigner(obj.signer) | ||
return typeof obj === 'object' && obj.signer instanceof ethers.AbstractSigner | ||
} | ||
export class LocalRelayer extends ProviderRelayer implements Relayer { | ||
private signer: AbstractSigner | ||
private txnOptions: providers.TransactionRequest | ||
private signer: ethers.Signer | ||
private txnOptions: ethers.TransactionRequest | ||
constructor(options: LocalRelayerOptions | AbstractSigner) { | ||
super(AbstractSigner.isSigner(options) ? { provider: options.provider! } : { ...options, provider: options.signer.provider! }) | ||
this.signer = AbstractSigner.isSigner(options) ? options : options.signer | ||
constructor(options: LocalRelayerOptions | ethers.AbstractSigner) { | ||
super( | ||
options instanceof ethers.AbstractSigner | ||
? { provider: options.provider! } | ||
: { ...options, provider: options.signer.provider! } | ||
) | ||
this.signer = options instanceof ethers.AbstractSigner ? options : options.signer | ||
if (!this.signer.provider) throw new Error('Signer must have a provider') | ||
@@ -32,3 +36,3 @@ } | ||
_entrypoint: string, | ||
_data: BytesLike, | ||
_data: ethers.BytesLike, | ||
_options?: { | ||
@@ -46,3 +50,3 @@ simulate?: boolean | ||
setTransactionOptions(transactionRequest: providers.TransactionRequest) { | ||
setTransactionOptions(transactionRequest: ethers.TransactionRequest) { | ||
this.txnOptions = transactionRequest | ||
@@ -55,3 +59,3 @@ } | ||
waitForReceipt: boolean = true | ||
): Promise<commons.transaction.TransactionResponse<providers.TransactionReceipt>> { | ||
): Promise<commons.transaction.TransactionResponse<ethers.TransactionReceipt>> { | ||
if (quote !== undefined) { | ||
@@ -65,3 +69,3 @@ logger.warn(`LocalRelayer doesn't accept fee quotes`) | ||
// NOTE: we expect that all txns have set their gasLimit ahead of time through proper estimation | ||
// const gasLimit = signedTxs.transactions.reduce((sum, tx) => sum.add(tx.gasLimit), ethers.BigNumber.from(0)) | ||
// const gasLimit = signedTxs.transactions.reduce((sum, tx) => sum + tx.gasLimit, 0n) | ||
// txRequest.gasLimit = gasLimit | ||
@@ -68,0 +72,0 @@ |
@@ -1,2 +0,2 @@ | ||
import { ethers, providers } from 'ethers' | ||
import { ethers } from 'ethers' | ||
import { walletContracts } from '@0xsequence/abi' | ||
@@ -7,6 +7,6 @@ import { FeeOption, FeeQuote, Relayer, SimulateResult } from '.' | ||
const DEFAULT_GAS_LIMIT = ethers.BigNumber.from(800000) | ||
const DEFAULT_GAS_LIMIT = 800000n | ||
export interface ProviderRelayerOptions { | ||
provider: providers.Provider | ||
provider: ethers.Provider | ||
waitPollRate?: number | ||
@@ -24,7 +24,7 @@ deltaBlocksLog?: number | ||
export function isProviderRelayerOptions(obj: any): obj is ProviderRelayerOptions { | ||
return obj.provider !== undefined && providers.Provider.isProvider(obj.provider) | ||
return typeof obj === 'object' && obj.provider instanceof ethers.AbstractProvider | ||
} | ||
export abstract class ProviderRelayer implements Relayer { | ||
public provider: providers.Provider | ||
public provider: ethers.Provider | ||
public waitPollRate: number | ||
@@ -50,3 +50,3 @@ public deltaBlocksLog: number | ||
entrypoint: string, | ||
data: ethers.utils.BytesLike, | ||
data: ethers.BytesLike, | ||
options?: { | ||
@@ -70,3 +70,3 @@ simulate?: boolean | ||
// Respect gasLimit request of the transaction (as long as its not 0) | ||
if (tx.gasLimit && !ethers.BigNumber.from(tx.gasLimit || 0).eq(ethers.constants.Zero)) { | ||
if (tx.gasLimit && BigInt(tx.gasLimit || 0) !== 0n) { | ||
return tx.gasLimit | ||
@@ -81,3 +81,3 @@ } | ||
// Fee can't be estimated for self-called if wallet hasn't been deployed | ||
if (tx.to === wallet && (await this.provider.getCode(wallet).then(code => ethers.utils.arrayify(code).length === 0))) { | ||
if (tx.to === wallet && (await this.provider.getCode(wallet).then(code => ethers.getBytes(code).length === 0))) { | ||
return DEFAULT_GAS_LIMIT | ||
@@ -103,8 +103,8 @@ } | ||
succeeded: true, | ||
gasUsed: ethers.BigNumber.from(gasLimit).toNumber(), | ||
gasLimit: ethers.BigNumber.from(gasLimit).toNumber() | ||
gasUsed: Number(gasLimit), | ||
gasLimit: Number(gasLimit) | ||
})) | ||
} | ||
async getNonce(address: string, space?: ethers.BigNumberish, blockTag?: providers.BlockTag): Promise<ethers.BigNumberish> { | ||
async getNonce(address: string, space?: ethers.BigNumberish, blockTag?: ethers.BlockTag): Promise<ethers.BigNumberish> { | ||
if (!this.provider) { | ||
@@ -132,3 +132,3 @@ throw new Error('provider is not set') | ||
maxFails: number = 5 | ||
): Promise<providers.TransactionResponse & { receipt: providers.TransactionReceipt }> { | ||
): Promise<ethers.TransactionResponse & { receipt: ethers.TransactionReceipt }> { | ||
if (typeof metaTxnId !== 'string') { | ||
@@ -165,3 +165,3 @@ metaTxnId = commons.transaction.intendedTransactionID(metaTxnId) | ||
const waitReceipt = async (): Promise<providers.TransactionResponse & { receipt: providers.TransactionReceipt }> => { | ||
const waitReceipt = async (): Promise<ethers.TransactionResponse & { receipt: ethers.TransactionReceipt }> => { | ||
// Transactions can only get executed on nonce change | ||
@@ -210,3 +210,3 @@ // get all nonce changes and look for metaTxnIds in between logs | ||
const found = txs.find(tx => | ||
tx.logs.find( | ||
tx?.logs.find( | ||
l => | ||
@@ -224,9 +224,13 @@ (l.topics.length === 0 && l.data.replace('0x', '') === normalMetaTxnId) || | ||
if (found) { | ||
return { | ||
receipt: found, | ||
...(await retry( | ||
() => this.provider.getTransaction(found.transactionHash), | ||
`unable to get transaction ${found.transactionHash}` | ||
)) | ||
const response = await retry(() => this.provider.getTransaction(found.hash), `unable to get transaction ${found.hash}`) | ||
if (!response) { | ||
throw new Error(`Transaction response not found for ${metaTxnId}`) | ||
} | ||
// NOTE: we have to do this, because ethers-v6 uses private fields | ||
// and we can't just extend the class and override the method, so | ||
// we just modify the response object directly by adding the receipt to it. | ||
const out: any = response | ||
out.receipt = found | ||
return out | ||
} | ||
@@ -246,3 +250,3 @@ | ||
waitReceipt(), | ||
new Promise<providers.TransactionResponse & { receipt: providers.TransactionReceipt }>((_, reject) => | ||
new Promise<ethers.TransactionResponse & { receipt: ethers.TransactionReceipt }>((_, reject) => | ||
setTimeout(() => { | ||
@@ -249,0 +253,0 @@ timedOut = true |
@@ -5,3 +5,3 @@ import { ethers } from 'ethers' | ||
import { commons } from '@0xsequence/core' | ||
import { getEthersConnectionInfo, logger } from '@0xsequence/utils' | ||
import { getFetchRequest, logger, toHexString } from '@0xsequence/utils' | ||
@@ -20,3 +20,3 @@ export { proto } | ||
export interface RpcRelayerOptions { | ||
provider: ethers.providers.Provider | { url: string } | ||
provider: ethers.AbstractProvider | { url: string } | ||
url: string | ||
@@ -32,3 +32,3 @@ projectAccessKey?: string | ||
obj.provider !== undefined && | ||
ethers.providers.Provider.isProvider(obj.provider) | ||
obj.provider instanceof ethers.AbstractProvider | ||
) | ||
@@ -42,3 +42,3 @@ } | ||
private readonly service: proto.Relayer | ||
public readonly provider: ethers.providers.Provider | ||
public readonly provider: ethers.Provider | ||
@@ -48,8 +48,8 @@ constructor(public options: RpcRelayerOptions) { | ||
if (ethers.providers.Provider.isProvider(options.provider)) { | ||
if (options.provider instanceof ethers.AbstractProvider) { | ||
this.provider = options.provider | ||
} else { | ||
const { jwtAuth, projectAccessKey } = this.options | ||
const providerConnectionInfo = getEthersConnectionInfo(options.provider.url, projectAccessKey, jwtAuth) | ||
this.provider = new ethers.providers.StaticJsonRpcProvider(providerConnectionInfo) | ||
const fetchRequest = getFetchRequest(options.provider.url, projectAccessKey, jwtAuth) | ||
this.provider = new ethers.JsonRpcProvider(fetchRequest, undefined, { staticNetwork: true }) | ||
} | ||
@@ -122,3 +122,3 @@ } | ||
async simulate(wallet: string, ...transactions: commons.transaction.Transaction[]): Promise<SimulateResult[]> { | ||
const coder = ethers.utils.defaultAbiCoder | ||
const coder = ethers.AbiCoder.defaultAbiCoder() | ||
const encoded = coder.encode( | ||
@@ -171,3 +171,3 @@ [commons.transaction.MetaTransactionsType], | ||
entrypoint: string, | ||
data: ethers.utils.BytesLike, | ||
data: ethers.BytesLike, | ||
options?: { | ||
@@ -180,3 +180,3 @@ simulate?: boolean | ||
to: entrypoint, | ||
data: ethers.utils.hexlify(data), | ||
data: ethers.hexlify(data), | ||
simulate: options?.simulate | ||
@@ -195,5 +195,5 @@ }) | ||
logger.info(`[rpc-relayer/getNonce] get nonce for wallet ${address} space: ${space}`) | ||
const encodedNonce = space !== undefined ? ethers.BigNumber.from(space).toHexString() : undefined | ||
const encodedNonce = space !== undefined ? toHexString(BigInt(space)) : undefined | ||
const resp = await this.service.getMetaTxnNonce({ walletContractAddress: address, space: encodedNonce }) | ||
const nonce = ethers.BigNumber.from(resp.nonce) | ||
const nonce = BigInt(resp.nonce) | ||
const [decodedSpace, decodedNonce] = commons.transaction.decodeNonce(nonce) | ||
@@ -246,6 +246,6 @@ logger.info(`[rpc-relayer/getNonce] got next nonce for wallet ${address} ${decodedNonce} space: ${decodedSpace}`) | ||
from: signedTxs.intent.wallet, | ||
wait: (_confirmations?: number): Promise<ethers.providers.TransactionReceipt> => Promise.reject(new Error('impossible')) | ||
wait: (_confirmations?: number): Promise<ethers.TransactionReceipt | null> => Promise.reject(new Error('impossible')) | ||
} | ||
const wait = async (confirmations?: number): Promise<ethers.providers.TransactionReceipt> => { | ||
const wait = async (confirmations?: number): Promise<ethers.TransactionReceipt | null> => { | ||
if (!this.provider) { | ||
@@ -269,2 +269,5 @@ throw new Error('cannot wait for receipt, relayer has no provider set') | ||
// NOTE: we just ignore these errors which come from the private fields | ||
// of ethers-v6 .. but, we should probably rework this instead.. | ||
// @ts-ignore | ||
return response as commons.transaction.TransactionResponse | ||
@@ -300,5 +303,8 @@ } | ||
// NOTE: we just ignore these errors which come from the private fields | ||
// of ethers-v6 .. but, we should probably rework this instead.. | ||
// @ts-ignore | ||
return { | ||
blockHash: txReceipt.blockHash, | ||
blockNumber: ethers.BigNumber.from(txReceipt.blockNumber).toNumber(), | ||
blockNumber: Number(txReceipt.blockNumber), | ||
confirmations: 1, | ||
@@ -305,0 +311,0 @@ from: typeof metaTxnId === 'string' ? undefined : metaTxnId.intent.wallet, |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
244880
6364
+ Added@0xsequence/abi@0.0.0-20240812142652(transitive)
+ Added@0xsequence/core@0.0.0-20240812142652(transitive)
+ Added@0xsequence/utils@0.0.0-20240812142652(transitive)
+ Added@adraffy/ens-normalize@1.10.1(transitive)
+ Added@noble/curves@1.2.0(transitive)
+ Added@noble/hashes@1.3.2(transitive)
+ Added@types/node@18.15.13(transitive)
+ Addedaes-js@4.0.0-beta.5(transitive)
+ Addedethers@6.13.2(transitive)
+ Addedtslib@2.4.0(transitive)
+ Addedws@8.17.1(transitive)
- Removed@0xsequence/abi@0.0.0-20240807210827(transitive)
- Removed@0xsequence/core@0.0.0-20240807210827(transitive)
- Removed@0xsequence/utils@0.0.0-20240807210827(transitive)
- Removed@ethersproject/abi@5.7.0(transitive)
- Removed@ethersproject/abstract-provider@5.7.0(transitive)
- Removed@ethersproject/abstract-signer@5.7.0(transitive)
- Removed@ethersproject/address@5.7.0(transitive)
- Removed@ethersproject/base64@5.7.0(transitive)
- Removed@ethersproject/basex@5.7.0(transitive)
- Removed@ethersproject/bignumber@5.7.0(transitive)
- Removed@ethersproject/bytes@5.7.0(transitive)
- Removed@ethersproject/constants@5.7.0(transitive)
- Removed@ethersproject/contracts@5.7.0(transitive)
- Removed@ethersproject/hash@5.7.0(transitive)
- Removed@ethersproject/hdnode@5.7.0(transitive)
- Removed@ethersproject/json-wallets@5.7.0(transitive)
- Removed@ethersproject/keccak256@5.7.0(transitive)
- Removed@ethersproject/logger@5.7.0(transitive)
- Removed@ethersproject/networks@5.7.1(transitive)
- Removed@ethersproject/pbkdf2@5.7.0(transitive)
- Removed@ethersproject/properties@5.7.0(transitive)
- Removed@ethersproject/providers@5.7.2(transitive)
- Removed@ethersproject/random@5.7.0(transitive)
- Removed@ethersproject/rlp@5.7.0(transitive)
- Removed@ethersproject/sha2@5.7.0(transitive)
- Removed@ethersproject/signing-key@5.7.0(transitive)
- Removed@ethersproject/solidity@5.7.0(transitive)
- Removed@ethersproject/strings@5.7.0(transitive)
- Removed@ethersproject/transactions@5.7.0(transitive)
- Removed@ethersproject/units@5.7.0(transitive)
- Removed@ethersproject/wallet@5.7.0(transitive)
- Removed@ethersproject/web@5.7.1(transitive)
- Removed@ethersproject/wordlists@5.7.0(transitive)
- Removedaes-js@3.0.0(transitive)
- Removedbech32@1.1.4(transitive)
- Removedbn.js@4.12.05.2.1(transitive)
- Removedbrorand@1.1.0(transitive)
- Removedelliptic@6.5.4(transitive)
- Removedethers@5.7.2(transitive)
- Removedhash.js@1.1.7(transitive)
- Removedhmac-drbg@1.0.1(transitive)
- Removedinherits@2.0.4(transitive)
- Removedjs-sha3@0.8.0(transitive)
- Removedminimalistic-assert@1.0.1(transitive)
- Removedminimalistic-crypto-utils@1.0.1(transitive)
- Removedscrypt-js@3.0.1(transitive)
- Removedws@7.4.6(transitive)