diff --git a/examples/call/commands/common.ts b/examples/call/commands/common.ts new file mode 100644 index 00000000..396c290a --- /dev/null +++ b/examples/call/commands/common.ts @@ -0,0 +1,105 @@ +import path from "path"; +import fs from "fs"; +import { ethers } from "ethers"; +import { Command } from "commander"; +import ZRC20ABI from "@zetachain/protocol-contracts/abi/ZRC20.sol/ZRC20.json"; + +export const getAbi = (name: string) => { + const abiPath = path.resolve( + __dirname, + path.join("..", "artifacts", "contracts", `${name}.sol`, `${name}.json`) + ); + return JSON.parse(fs.readFileSync(abiPath, "utf8")); +}; + +export const createRevertOptions = (options: { + abortAddress: string; + callOnRevert: boolean; + onRevertGasLimit: string; + revertAddress: string; + revertMessage: string; +}) => { + return { + abortAddress: options.abortAddress, + callOnRevert: options.callOnRevert, + onRevertGasLimit: BigInt(options.onRevertGasLimit), + revertAddress: options.revertAddress, + revertMessage: ethers.hexlify(ethers.toUtf8Bytes(options.revertMessage)), + }; +}; + +export const approveZRC20 = async ( + zrc20Address: string, + contract: string, + amount: string, + signer: ethers.Wallet, + gasLimit?: number +) => { + const zrc20 = new ethers.Contract(zrc20Address, ZRC20ABI.abi, signer); + const [gasZRC20, gasFee] = gasLimit + ? await zrc20.withdrawGasFeeWithGasLimit(gasLimit) + : await zrc20.withdrawGasFee(); + + const zrc20TransferTx = await zrc20.approve(contract, gasFee); + await zrc20TransferTx.wait(); + + const decimals = await zrc20.decimals(); + if (gasZRC20 === zrc20.target) { + const targetTokenApprove = await zrc20.approve( + contract, + gasFee + ethers.parseUnits(amount, decimals) + ); + await targetTokenApprove.wait(); + } else { + const targetTokenApprove = await zrc20.approve( + contract, + ethers.parseUnits(amount, decimals) + ); + await targetTokenApprove.wait(); + const gasZRC20Contract = new ethers.Contract( + gasZRC20, + ZRC20ABI.abi, + signer + ); + const gasFeeApprove = await gasZRC20Contract.approve(contract, gasFee); + await gasFeeApprove.wait(); + } + return { decimals }; +}; + +export const createCommand = (name: string) => { + return new Command(name) + .requiredOption( + "-c, --contract
", + "The address of the deployed contract" + ) + .requiredOption( + "-r, --receiver
", + "The address of the receiver contract" + ) + .option("--call-on-revert", "Whether to call on revert", false) + .option( + "--revert-address
", + "Revert address", + "0x0000000000000000000000000000000000000000" + ) + .option( + "--abort-address
", + "Abort address", + "0x0000000000000000000000000000000000000000" + ) + .option("--revert-message ", "Revert message", "0x") + .option( + "--on-revert-gas-limit ", + "Gas limit for revert tx", + "500000" + ) + .option("-n, --name ", "Contract name") + .option( + "--rpc ", + "RPC endpoint", + "https://zetachain-athens-evm.blockpi.network/v1/rpc/public" + ) + .option("--gas-limit ", "Gas limit for the transaction", "1000000") + .option("--private-key ", "Private key to sign the transaction"); +}; diff --git a/examples/call/commands/connected/call.ts b/examples/call/commands/connected/call.ts new file mode 100644 index 00000000..e6ca4cc4 --- /dev/null +++ b/examples/call/commands/connected/call.ts @@ -0,0 +1,31 @@ +import { ethers } from "ethers"; + +import { createCommand, createRevertOptions, getAbi } from "../common"; + +const main = async (options: any) => { + const provider = new ethers.JsonRpcProvider(options.rpc); + const signer = new ethers.Wallet(options.privateKey, provider); + + const message = ethers.AbiCoder.defaultAbiCoder().encode( + options.types, + options.values + ); + + const { abi } = getAbi(options.name); + const contract = new ethers.Contract(options.contract, abi, signer); + + const tx = await contract.call( + options.receiver, + message, + createRevertOptions(options), + { gasLimit: options.gasLimit } + ); + await tx.wait(); + + console.log(`✅ Transaction sent: ${tx.hash}`); +}; + +export const connectedCallCommand = createCommand("connected-call") + .requiredOption("-t, --types ", "Parameter types as JSON string") + .requiredOption("-v, --values ", "The values of the parameters") + .action(main); diff --git a/examples/call/commands/connected/deposit.ts b/examples/call/commands/connected/deposit.ts new file mode 100644 index 00000000..f124446e --- /dev/null +++ b/examples/call/commands/connected/deposit.ts @@ -0,0 +1,24 @@ +import { ethers } from "ethers"; + +import { createCommand, createRevertOptions, getAbi } from "../common"; + +const main = async (options: any) => { + const provider = new ethers.JsonRpcProvider(options.rpc); + const signer = new ethers.Wallet(options.privateKey, provider); + + const { abi } = getAbi(options.name); + const contract = new ethers.Contract(options.contract, abi, signer); + + const tx = await contract.deposit( + options.receiver, + createRevertOptions(options), + { value: ethers.parseEther(options.amount), gasLimit: options.gasLimit } + ); + await tx.wait(); + + console.log(`✅ Transaction sent: ${tx.hash}`); +}; + +export const connectedDepositCommand = createCommand("connected-deposit") + .requiredOption("-a, --amount ", "Amount to deposit") + .action(main); diff --git a/examples/call/commands/connected/depositAndCall.ts b/examples/call/commands/connected/depositAndCall.ts new file mode 100644 index 00000000..e861eb09 --- /dev/null +++ b/examples/call/commands/connected/depositAndCall.ts @@ -0,0 +1,34 @@ +import { ethers } from "ethers"; + +import { createCommand, createRevertOptions, getAbi } from "../common"; + +const main = async (options: any) => { + const provider = new ethers.JsonRpcProvider(options.rpc); + const signer = new ethers.Wallet(options.privateKey, provider); + + const message = ethers.AbiCoder.defaultAbiCoder().encode( + options.types, + options.values + ); + + const { abi } = getAbi(options.name); + const contract = new ethers.Contract(options.contract, abi, signer); + + const tx = await contract.depositAndCall( + options.receiver, + message, + createRevertOptions(options), + { value: ethers.parseEther(options.amount), gasLimit: options.gasLimit } + ); + await tx.wait(); + + console.log(`✅ Transaction sent: ${tx.hash}`); +}; + +export const connectedDepositAndCallCommand = createCommand( + "connected-deposit-and-call" +) + .requiredOption("-t, --types ", "Parameter types as JSON string") + .requiredOption("-v, --values ", "The values of the parameters") + .requiredOption("-a, --amount ", "Amount to deposit") + .action(main); diff --git a/examples/call/commands/index.ts b/examples/call/commands/index.ts new file mode 100755 index 00000000..0447ef09 --- /dev/null +++ b/examples/call/commands/index.ts @@ -0,0 +1,22 @@ +#!/usr/bin/env npx tsx +import { Command } from "commander"; + +import { connectedCallCommand } from "./connected/call"; +import { connectedDepositCommand } from "./connected/deposit"; +import { connectedDepositAndCallCommand } from "./connected/depositAndCall"; +import { universalCallCommand } from "./universal/call"; +import { universalWithdrawCommand } from "./universal/withdraw"; +import { universalWithdrawAndCallCommand } from "./universal/withdrawAndCall"; + +const program = new Command() + .helpCommand(false) + .addCommand(connectedCallCommand) + .addCommand(connectedDepositCommand) + .addCommand(connectedDepositAndCallCommand) + .addCommand(universalCallCommand) + .addCommand(universalWithdrawCommand) + .addCommand(universalWithdrawAndCallCommand); + +if (require.main === module) program.parse(); + +export default program; diff --git a/examples/call/commands/universal/call.ts b/examples/call/commands/universal/call.ts new file mode 100644 index 00000000..68f19df4 --- /dev/null +++ b/examples/call/commands/universal/call.ts @@ -0,0 +1,56 @@ +import { ethers } from "ethers"; + +import { createCommand, createRevertOptions, getAbi } from "../common"; +import ZRC20ABI from "@zetachain/protocol-contracts/abi/ZRC20.sol/ZRC20.json"; + +const main = async (options: any) => { + const provider = new ethers.JsonRpcProvider(options.rpc); + const signer = new ethers.Wallet(options.privateKey, provider); + + const message = ethers.AbiCoder.defaultAbiCoder().encode( + options.types, + options.values + ); + + const functionSignature = ethers.id(options.function).slice(0, 10); + + const payload = ethers.hexlify(ethers.concat([functionSignature, message])); + + const { abi } = getAbi(options.name); + const contract = new ethers.Contract(options.contract, abi, signer); + + const zrc20 = new ethers.Contract(options.zrc20, ZRC20ABI.abi, signer); + const [, gasFee] = await zrc20.withdrawGasFeeWithGasLimit( + options.callOptionsGasLimit + ); + const zrc20TransferTx = await zrc20.approve(options.contract, gasFee); + + await zrc20TransferTx.wait(); + + const tx = await contract.call( + options.receiver, + options.zrc20, + payload, + { + gasLimit: options.callOptionsGasLimit, + isArbitraryCall: options.callOptionsIsArbitraryCall, + }, + createRevertOptions(options), + { gasLimit: options.gasLimit } + ); + await tx.wait(); + + console.log(`✅ Transaction sent: ${tx.hash}`); +}; + +export const universalCallCommand = createCommand("universal-call") + .requiredOption("-t, --types ", "Parameter types as JSON string") + .requiredOption("-v, --values ", "The values of the parameters") + .option("--call-options-is-arbitrary-call", "Call any function", false) + .option("--call-options-gas-limit", "The gas limit for the call", "500000") + .option( + "--function ", + `Function to call (example: "hello(string)")` + ) + .option("--zrc20
", "The address of ZRC-20 to pay fees") + .action(main); diff --git a/examples/call/commands/universal/withdraw.ts b/examples/call/commands/universal/withdraw.ts new file mode 100644 index 00000000..e4acb223 --- /dev/null +++ b/examples/call/commands/universal/withdraw.ts @@ -0,0 +1,39 @@ +import { ethers } from "ethers"; + +import { + approveZRC20, + createCommand, + createRevertOptions, + getAbi, +} from "../common"; + +const main = async (options: any) => { + const provider = new ethers.JsonRpcProvider(options.rpc); + const signer = new ethers.Wallet(options.privateKey, provider); + + const { abi } = getAbi(options.name); + const contract = new ethers.Contract(options.contract, abi, signer); + + const { decimals } = await approveZRC20( + options.zrc20, + options.contract, + options.amount, + signer + ); + + const tx = await contract.withdraw( + options.receiver, + ethers.parseUnits(options.amount, decimals), + options.zrc20, + createRevertOptions(options), + { gasLimit: options.gasLimit } + ); + await tx.wait(); + + console.log(`✅ Transaction sent: ${tx.hash}`); +}; + +export const universalWithdrawCommand = createCommand("universal-withdraw") + .requiredOption("--amount ", "Amount to withdraw") + .option("--zrc20
", "The address of ZRC-20 to pay fees") + .action(main); diff --git a/examples/call/commands/universal/withdrawAndCall.ts b/examples/call/commands/universal/withdrawAndCall.ts new file mode 100644 index 00000000..d3729562 --- /dev/null +++ b/examples/call/commands/universal/withdrawAndCall.ts @@ -0,0 +1,64 @@ +import { ethers } from "ethers"; + +import { + approveZRC20, + createCommand, + createRevertOptions, + getAbi, +} from "../common"; + +const main = async (options: any) => { + const provider = new ethers.JsonRpcProvider(options.rpc); + const signer = new ethers.Wallet(options.privateKey, provider); + + const message = ethers.AbiCoder.defaultAbiCoder().encode( + options.types, + options.values + ); + + const functionSignature = ethers.id(options.function).slice(0, 10); + + const payload = ethers.hexlify(ethers.concat([functionSignature, message])); + + const { abi } = getAbi(options.name); + const contract = new ethers.Contract(options.contract, abi, signer); + + const { decimals } = await approveZRC20( + options.zrc20, + options.contract, + options.amount, + signer, + options.callOptionsGasLimit + ); + + const tx = await contract.withdrawAndCall( + options.receiver, + ethers.parseUnits(options.amount, decimals), + options.zrc20, + payload, + { + gasLimit: options.callOptionsGasLimit, + isArbitraryCall: options.callOptionsIsArbitraryCall, + }, + createRevertOptions(options), + { gasLimit: options.gasLimit } + ); + await tx.wait(); + + console.log(`✅ Transaction sent: ${tx.hash}`); +}; + +export const universalWithdrawAndCallCommand = createCommand( + "universal-withdraw-and-call" +) + .requiredOption("-t, --types ", "Parameter types as JSON string") + .requiredOption("-v, --values ", "The values of the parameters") + .option("--call-options-is-arbitrary-call", "Call any function", false) + .option("--call-options-gas-limit", "The gas limit for the call", "500000") + .option( + "--function ", + `Function to call (example: "hello(string)")` + ) + .requiredOption("--amount ", "Amount to withdraw") + .option("--zrc20
", "The address of ZRC-20 to pay fees") + .action(main); diff --git a/examples/call/package.json b/examples/call/package.json index 8723deba..0afbf917 100644 --- a/examples/call/package.json +++ b/examples/call/package.json @@ -42,12 +42,13 @@ "eslint-plugin-simple-import-sort": "^10.0.0", "eslint-plugin-sort-keys-fix": "^1.1.2", "eslint-plugin-typescript-sort-keys": "^2.3.0", - "ethers": "^5.4.7", + "ethers": "^6.14.4", "hardhat": "^2.17.2", "hardhat-gas-reporter": "^1.0.8", "prettier": "^2.8.8", "solidity-coverage": "^0.8.0", "ts-node": ">=8.0.0", + "tsx": "^4.20.3", "typechain": "^8.1.0", "typescript": ">=4.5.0" }, diff --git a/examples/call/yarn.lock b/examples/call/yarn.lock index a944412a..15db6fcd 100644 --- a/examples/call/yarn.lock +++ b/examples/call/yarn.lock @@ -133,6 +133,132 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +<<<<<<< HEAD +"@esbuild/aix-ppc64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz#4e0f91776c2b340e75558f60552195f6fad09f18" + integrity sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA== + +"@esbuild/android-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz#bc766407f1718923f6b8079c8c61bf86ac3a6a4f" + integrity sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg== + +"@esbuild/android-arm@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz#4290d6d3407bae3883ad2cded1081a234473ce26" + integrity sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA== + +"@esbuild/android-x64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz#40c11d9cbca4f2406548c8a9895d321bc3b35eff" + integrity sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw== + +"@esbuild/darwin-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz#49d8bf8b1df95f759ac81eb1d0736018006d7e34" + integrity sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ== + +"@esbuild/darwin-x64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz#e27a5d92a14886ef1d492fd50fc61a2d4d87e418" + integrity sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ== + +"@esbuild/freebsd-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz#97cede59d638840ca104e605cdb9f1b118ba0b1c" + integrity sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw== + +"@esbuild/freebsd-x64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz#71c77812042a1a8190c3d581e140d15b876b9c6f" + integrity sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw== + +"@esbuild/linux-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz#f7b7c8f97eff8ffd2e47f6c67eb5c9765f2181b8" + integrity sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg== + +"@esbuild/linux-arm@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz#2a0be71b6cd8201fa559aea45598dffabc05d911" + integrity sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw== + +"@esbuild/linux-ia32@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz#763414463cd9ea6fa1f96555d2762f9f84c61783" + integrity sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA== + +"@esbuild/linux-loong64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz#428cf2213ff786a502a52c96cf29d1fcf1eb8506" + integrity sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg== + +"@esbuild/linux-mips64el@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz#5cbcc7fd841b4cd53358afd33527cd394e325d96" + integrity sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg== + +"@esbuild/linux-ppc64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz#0d954ab39ce4f5e50f00c4f8c4fd38f976c13ad9" + integrity sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ== + +"@esbuild/linux-riscv64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz#0e7dd30730505abd8088321e8497e94b547bfb1e" + integrity sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA== + +"@esbuild/linux-s390x@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz#5669af81327a398a336d7e40e320b5bbd6e6e72d" + integrity sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ== + +"@esbuild/linux-x64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz#b2357dd153aa49038967ddc1ffd90c68a9d2a0d4" + integrity sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw== + +"@esbuild/netbsd-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz#53b4dfb8fe1cee93777c9e366893bd3daa6ba63d" + integrity sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw== + +"@esbuild/netbsd-x64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz#a0206f6314ce7dc8713b7732703d0f58de1d1e79" + integrity sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ== + +"@esbuild/openbsd-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz#2a796c87c44e8de78001d808c77d948a21ec22fd" + integrity sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw== + +"@esbuild/openbsd-x64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz#28d0cd8909b7fa3953af998f2b2ed34f576728f0" + integrity sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg== + +"@esbuild/sunos-x64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz#a28164f5b997e8247d407e36c90d3fd5ddbe0dc5" + integrity sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA== + +"@esbuild/win32-arm64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz#6eadbead38e8bd12f633a5190e45eff80e24007e" + integrity sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw== + +"@esbuild/win32-ia32@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz#bab6288005482f9ed2adb9ded7e88eba9a62cc0d" + integrity sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ== + +"@esbuild/win32-x64@0.25.5": + version "0.25.5" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz#7fc114af5f6563f19f73324b5d5ff36ece0803d1" + integrity sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g== +======= "@emnapi/core@^1.4.3": version "1.4.4" resolved "https://registry.npmjs.org/@emnapi/core/-/core-1.4.4.tgz#76620673f3033626c6d79b1420d69f06a6bb153c" @@ -154,6 +280,7 @@ integrity sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw== dependencies: tslib "^2.4.0" +>>>>>>> update-cli "@eslint-community/eslint-utils@^4.2.0": version "4.7.0" @@ -5229,6 +5356,37 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +esbuild@~0.25.0: + version "0.25.5" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz#71075054993fdfae76c66586f9b9c1f8d7edd430" + integrity sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ== + optionalDependencies: + "@esbuild/aix-ppc64" "0.25.5" + "@esbuild/android-arm" "0.25.5" + "@esbuild/android-arm64" "0.25.5" + "@esbuild/android-x64" "0.25.5" + "@esbuild/darwin-arm64" "0.25.5" + "@esbuild/darwin-x64" "0.25.5" + "@esbuild/freebsd-arm64" "0.25.5" + "@esbuild/freebsd-x64" "0.25.5" + "@esbuild/linux-arm" "0.25.5" + "@esbuild/linux-arm64" "0.25.5" + "@esbuild/linux-ia32" "0.25.5" + "@esbuild/linux-loong64" "0.25.5" + "@esbuild/linux-mips64el" "0.25.5" + "@esbuild/linux-ppc64" "0.25.5" + "@esbuild/linux-riscv64" "0.25.5" + "@esbuild/linux-s390x" "0.25.5" + "@esbuild/linux-x64" "0.25.5" + "@esbuild/netbsd-arm64" "0.25.5" + "@esbuild/netbsd-x64" "0.25.5" + "@esbuild/openbsd-arm64" "0.25.5" + "@esbuild/openbsd-x64" "0.25.5" + "@esbuild/sunos-x64" "0.25.5" + "@esbuild/win32-arm64" "0.25.5" + "@esbuild/win32-ia32" "0.25.5" + "@esbuild/win32-x64" "0.25.5" + escalade@^3.1.1: version "3.2.0" resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" @@ -5677,10 +5835,17 @@ ethers@^5.4.7, ethers@^5.7.2: "@ethersproject/web" "5.8.0" "@ethersproject/wordlists" "5.8.0" +<<<<<<< HEAD +ethers@^6.14.4: + version "6.14.4" + resolved "https://registry.npmjs.org/ethers/-/ethers-6.14.4.tgz#0f6fbc562a8425c7c888da307fa71ef796be0c04" + integrity sha512-Jm/dzRs2Z9iBrT6e9TvGxyb5YVKAPLlpna7hjxH7KH/++DSh2T/JVmQUv7iHI5E55hDbp/gEVvstWYXVxXFzsA== +======= ethers@^6.13.2: version "6.15.0" resolved "https://registry.npmjs.org/ethers/-/ethers-6.15.0.tgz#2980f2a3baf0509749b7e21f8692fa8a8349c0e3" integrity sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ== +>>>>>>> update-cli dependencies: "@adraffy/ens-normalize" "1.10.1" "@noble/curves" "1.2.0" @@ -5972,7 +6137,7 @@ fs.realpath@^1.0.0: resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== -fsevents@~2.3.2: +fsevents@~2.3.2, fsevents@~2.3.3: version "2.3.3" resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== @@ -6054,6 +6219,13 @@ get-tsconfig@^4.10.0: dependencies: resolve-pkg-maps "^1.0.0" +get-tsconfig@^4.7.5: + version "4.10.1" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz#d34c1c01f47d65a606c37aa7a177bc3e56ab4b2e" + integrity sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ== + dependencies: + resolve-pkg-maps "^1.0.0" + ghost-testrpc@^0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" @@ -8887,7 +9059,26 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" +<<<<<<< HEAD +tsx@^4.20.3: + version "4.20.3" + resolved "https://registry.npmjs.org/tsx/-/tsx-4.20.3.tgz#f913e4911d59ad177c1bcee19d1035ef8dd6e2fb" + integrity sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ== + dependencies: + esbuild "~0.25.0" + get-tsconfig "^4.7.5" + optionalDependencies: + fsevents "~2.3.3" + +tweetnacl-util@^0.15.1: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@1.0.3, tweetnacl@^1.0.3: +======= tweetnacl@1.0.3: +>>>>>>> update-cli version "1.0.3" resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==