diff --git a/contracts/registrar/ZNSRootRegistrar.sol b/contracts/registrar/ZNSRootRegistrar.sol index 30de690a..fc744202 100644 --- a/contracts/registrar/ZNSRootRegistrar.sol +++ b/contracts/registrar/ZNSRootRegistrar.sol @@ -281,7 +281,9 @@ contract ZNSRootRegistrar is bool stakeRefunded = false; // send the stake back if it exists if (stakedAmount > 0) { - treasury.unstakeForDomain(domainHash, owner); + uint256 protocolFee = rootPricer.getFeeForPrice(0x0, stakedAmount); + + treasury.unstakeForDomain(domainHash, owner, protocolFee); stakeRefunded = true; } diff --git a/contracts/treasury/IZNSTreasury.sol b/contracts/treasury/IZNSTreasury.sol index 26c17f8e..28acd846 100644 --- a/contracts/treasury/IZNSTreasury.sol +++ b/contracts/treasury/IZNSTreasury.sol @@ -121,7 +121,11 @@ interface IZNSTreasury { uint256 protocolFee ) external; - function unstakeForDomain(bytes32 domainHash, address owner) external; + function unstakeForDomain( + bytes32 domainHash, + address owner, + uint256 protocolFee + ) external; function processDirectPayment( bytes32 parentHash, diff --git a/contracts/treasury/ZNSTreasury.sol b/contracts/treasury/ZNSTreasury.sol index 46350608..b9d8dfb4 100644 --- a/contracts/treasury/ZNSTreasury.sol +++ b/contracts/treasury/ZNSTreasury.sol @@ -156,14 +156,24 @@ contract ZNSTreasury is AAccessControlled, ARegistryWired, UUPSUpgradeable, IZNS * Since we are clearing storage, gas refund from this operation makes Revoke transactions cheaper. * @param domainHash The hash of the domain for which the stake is being withdrawn. * @param owner The address of the user who is withdrawing the stake. + * @param protocolFee The protocol fee paid by the user to Zero. */ function unstakeForDomain( bytes32 domainHash, - address owner + address owner, + uint256 protocolFee ) external override onlyRegistrar { Stake memory stakeData = stakedForDomain[domainHash]; delete stakedForDomain[domainHash]; + if (protocolFee > 0) { + stakeData.token.safeTransferFrom( + owner, + paymentConfigs[0x0].beneficiary, + protocolFee + ); + } + stakeData.token.safeTransfer(owner, stakeData.amount); emit StakeWithdrawn( diff --git a/test/ZNSRootRegistrar.test.ts b/test/ZNSRootRegistrar.test.ts index bbb3f2c9..35e425dd 100644 --- a/test/ZNSRootRegistrar.test.ts +++ b/test/ZNSRootRegistrar.test.ts @@ -30,7 +30,7 @@ import { IDistributionConfig } from "./helpers/types"; import * as ethers from "ethers"; import { defaultRootRegistration } from "./helpers/register-setup"; import { checkBalance } from "./helpers/balances"; -import { getPriceObject } from "./helpers/pricing"; +import { getPriceObject, getStakingOrProtocolFee } from "./helpers/pricing"; import { getDomainHashFromEvent } from "./helpers/events"; import { IDeployCampaignConfig, TZNSContractState } from "../src/deploy/campaign/types"; import { ADMIN_ROLE, GOVERNOR_ROLE } from "../src/deploy/constants"; @@ -92,7 +92,7 @@ describe("ZNSRootRegistrar", () => { ethers.MaxUint256 ); - userBalanceInitial = ethers.parseEther("100000000000"); + userBalanceInitial = ethers.parseEther("1000000000000000000"); // Give funds to user await zns.meowToken.connect(user).approve(await zns.treasury.getAddress(), ethers.MaxUint256); await zns.meowToken.mint(user.address, userBalanceInitial); @@ -984,14 +984,46 @@ describe("ZNSRootRegistrar", () => { expect(finalstaked).to.equal(BigInt("0")); expect(finalToken).to.equal(ethers.ZeroAddress); + const protocolFee = getStakingOrProtocolFee(staked); + // Verify final balances - const computedFinalBalance = balance + staked; + const computedFinalBalance = balance + staked - protocolFee; const finalBalance = await zns.meowToken.balanceOf(user.address); expect(computedFinalBalance).to.equal(finalBalance); }); }); describe("Revoking Domains", () => { + it("Charges a protocol fee to the owner as part of the revoke flow", async () => { + await defaultRootRegistration({ + user, + zns, + domainName: defaultDomain, + distrConfig: { + pricerContract: await zns.curvePricer.getAddress(), + paymentType: PaymentType.STAKE, + accessType: AccessType.OPEN, + }, + }); + + const domainHash = await getDomainHashFromEvent({ + zns, + user, + }); + + const price = await zns.curvePricer.getPrice(ethers.ZeroHash, defaultDomain, false); + const protocolFee = await zns.curvePricer.getFeeForPrice(ethers.ZeroHash, price); + + const balanceBefore = await zns.meowToken.balanceOf(user.address); + + // is revoke meant to be free if owner of parent? register subdomain is + await zns.rootRegistrar.connect(user).revokeDomain(domainHash); + + const balanceAfter = await zns.meowToken.balanceOf(user.address); + + expect(balanceAfter).to.eq(balanceBefore + price - protocolFee); + }); + it("Revokes a Top level Domain, locks distribution and removes mintlist", async () => { // Register Top level await defaultRootRegistration({ @@ -1095,17 +1127,20 @@ describe("ZNSRootRegistrar", () => { // Revoke the domain await zns.rootRegistrar.connect(user).revokeDomain(domainHash); + // Validated funds are unstaked const { amount: finalstaked, token: finalToken } = await zns.treasury.stakedForDomain(domainHash); expect(finalstaked).to.equal(BigInt("0")); expect(finalToken).to.equal(ethers.ZeroAddress); + const protocolFee = getStakingOrProtocolFee(staked); + // Verify final balances const computedBalanceAfterStaking = balanceAfterStaking + staked; const balanceMinusFee = balance - expectedStakeFee; expect(computedBalanceAfterStaking).to.equal(balanceMinusFee); const finalBalance = await zns.meowToken.balanceOf(user.address); - expect(computedBalanceAfterStaking).to.equal(finalBalance); + expect(computedBalanceAfterStaking - protocolFee).to.equal(finalBalance); }); it("Cannot revoke if Name is owned by another user", async () => { diff --git a/test/ZNSSubRegistrar.test.ts b/test/ZNSSubRegistrar.test.ts index cf1592bd..72623bd1 100644 --- a/test/ZNSSubRegistrar.test.ts +++ b/test/ZNSSubRegistrar.test.ts @@ -966,6 +966,11 @@ describe("ZNSSubRegistrar", () => { const parentBalBefore = await zns.meowToken.balanceOf(lvl4SubOwner.address); const paymentContractBalBefore = await zns.meowToken.balanceOf(await zns.treasury.getAddress()); + const stake = await zns.treasury.stakedForDomain(domainHash); + const protocolFee = getStakingOrProtocolFee(stake.amount); + + await zns.meowToken.connect(lvl5SubOwner).approve(await zns.treasury.getAddress(), protocolFee); + await zns.rootRegistrar.connect(lvl5SubOwner).revokeDomain(domainHash); const userBalAfter = await zns.meowToken.balanceOf(lvl5SubOwner.address); @@ -977,7 +982,7 @@ describe("ZNSSubRegistrar", () => { expect( userBalAfter - userBalanceBefore ).to.eq( - expectedPrice + expectedPrice - protocolFee ); expect( parentBalBefore - parentBalAfter @@ -1080,6 +1085,11 @@ describe("ZNSSubRegistrar", () => { const childExists = await zns.registry.exists(lvl3Hash); assert.ok(childExists); + const stake = await zns.treasury.stakedForDomain(lvl2Hash); + const protocolFee = getStakingOrProtocolFee(stake.amount); + + await zns.meowToken.connect(lvl2SubOwner).approve(await zns.treasury.getAddress(), protocolFee); + // revoke parent await zns.rootRegistrar.connect(lvl2SubOwner).revokeDomain( lvl2Hash, @@ -1126,6 +1136,11 @@ describe("ZNSSubRegistrar", () => { const userBalBefore = await zns.meowToken.balanceOf(lvl3SubOwner.address); + const subStake = await zns.treasury.stakedForDomain(lvl3Hash); + const subProtocolFee = getStakingOrProtocolFee(subStake.amount); + + await zns.meowToken.connect(lvl3SubOwner).approve(await zns.treasury.getAddress(), subProtocolFee); + // revoke child await zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain( lvl3Hash, @@ -1133,7 +1148,7 @@ describe("ZNSSubRegistrar", () => { const userBalAfter = await zns.meowToken.balanceOf(lvl3SubOwner.address); - expect(userBalAfter - userBalBefore).to.eq(expectedPrice); + expect(userBalAfter - userBalBefore).to.eq(expectedPrice - subProtocolFee); const childExistsAfter = await zns.registry.exists(lvl3Hash); assert.ok(!childExistsAfter); @@ -1479,7 +1494,7 @@ describe("ZNSSubRegistrar", () => { ); // send future child some tokens - await token5.connect(deployer).transfer(lvl3SubOwner.address, expectedPrice + stakeFee + protocolFee); + await token5.connect(deployer).transfer(lvl3SubOwner.address, expectedPrice + stakeFee + (protocolFee * 2n)); const contractBalBefore = await token5.balanceOf(await zns.treasury.getAddress()); const parentBalBefore = await token5.balanceOf(lvl2SubOwner.address); @@ -1504,6 +1519,11 @@ describe("ZNSSubRegistrar", () => { expect(contractBalAfter - contractBalBefore).to.eq(expectedPrice); expect(zeroVaultBalanceAfter - zeroVaultBalanceBefore).to.eq(protocolFee); + const stake = await zns.treasury.stakedForDomain(childHash); + const protocolFeeOut = getStakingOrProtocolFee(stake.amount); + + await token5.connect(lvl3SubOwner).approve(await zns.treasury.getAddress(), ethers.MaxUint256); + // revoke await zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain( childHash, @@ -1516,9 +1536,25 @@ describe("ZNSSubRegistrar", () => { const zeroVaultBalanceAfterRevoke = await token5.balanceOf(zeroVault.address); expect(contractBalAfter - contractBalAfterRevoke).to.eq(expectedPrice); - expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice); + expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice - protocolFeeOut); expect(parentBalAfterRevoke - parentBalAfter).to.eq(0); - expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter).to.eq(0); + expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter - protocolFeeOut).to.eq(0); + }); + + it("Does not charge the owner of a parent domain when they revoke a subdomain", async () => { + const subdomainHash = await registrationWithSetup({ + zns, + user: rootOwner, + parentHash: rootHash, + domainLabel: "subdomain", + }); + + const balanceBefore = await zns.meowToken.balanceOf(rootOwner.address); + + await zns.rootRegistrar.connect(rootOwner).revokeDomain(subdomainHash); + + const balanceAfter = await zns.meowToken.balanceOf(rootOwner.address); + expect(balanceBefore).to.eq(balanceAfter); }); it("FixedPricer - StakePayment - no fee - 18 decimals", async () => { @@ -1554,7 +1590,7 @@ describe("ZNSSubRegistrar", () => { // send future child some tokens await token18.connect(deployer).transfer( lvl3SubOwner.address, - expectedPrice + protocolFee + expectedPrice + (protocolFee * 2n) ); const contractBalBefore = await token18.balanceOf(await zns.treasury.getAddress()); @@ -1579,6 +1615,8 @@ describe("ZNSSubRegistrar", () => { expect(contractBalAfter - contractBalBefore).to.eq(expectedPrice); expect(zeroVaultBalanceAfter - zeroVaultBalanceBefore).to.eq(protocolFee); + await token18.connect(lvl3SubOwner).approve(await zns.treasury.getAddress(), protocolFee); + // revoke await zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain( childHash, @@ -1591,9 +1629,9 @@ describe("ZNSSubRegistrar", () => { const zeroVaultBalanceAfterRevoke = await token18.balanceOf(zeroVault.address); expect(contractBalAfter - contractBalAfterRevoke).to.eq(expectedPrice); - expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice); + expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice - protocolFee); expect(parentBalAfterRevoke - parentBalAfter).to.eq(0); - expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter).to.eq(0); + expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter - protocolFee).to.eq(0); }); it("FixedPricer - DirectPayment - no fee - 8 decimals", async () => { @@ -1718,7 +1756,7 @@ describe("ZNSSubRegistrar", () => { // send future child some tokens await token13.connect(deployer).transfer( lvl3SubOwner.address, - expectedPrice + stakeFee + protocolFee + expectedPrice + stakeFee + (protocolFee * 2n) ); const contractBalBefore = await token13.balanceOf(await zns.treasury.getAddress()); @@ -1744,10 +1782,11 @@ describe("ZNSSubRegistrar", () => { expect(contractBalAfter - contractBalBefore).to.eq(expectedPrice); expect(zeroVaultBalanceAfter - zeroVaultBalanceBefore).to.eq(protocolFee); + const protocolFeeOut = getStakingOrProtocolFee(expectedPrice); + await token13.connect(lvl3SubOwner).approve(await zns.treasury.getAddress(), protocolFeeOut); + // revoke - await zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain( - childHash, - ); + await zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain(childHash); // should offer refund ! const contractBalAfterRevoke = await token13.balanceOf(await zns.treasury.getAddress()); @@ -1756,9 +1795,9 @@ describe("ZNSSubRegistrar", () => { const zeroVaultBalanceAfterRevoke = await token13.balanceOf(zeroVault.address); expect(contractBalAfter - contractBalAfterRevoke).to.eq(expectedPrice); - expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice); + expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice - protocolFeeOut); expect(parentBalAfterRevoke - parentBalAfter).to.eq(0); - expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter).to.eq(0); + expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter - protocolFeeOut).to.eq(0); }); it("CurvePricer - StakePayment - no fee - 2 decimals", async () => { @@ -1799,7 +1838,7 @@ describe("ZNSSubRegistrar", () => { // send future child some tokens await token2.connect(deployer).transfer( lvl3SubOwner.address, - expectedPrice + protocolFee + expectedPrice + (protocolFee * 2n) ); const contractBalBefore = await token2.balanceOf(await zns.treasury.getAddress()); @@ -1824,6 +1863,8 @@ describe("ZNSSubRegistrar", () => { expect(contractBalAfter - contractBalBefore).to.eq(expectedPrice); expect(zeroVaultBalanceAfter - zeroVaultBalanceBefore).to.eq(protocolFee); + await token2.connect(lvl3SubOwner).approve(await zns.treasury.getAddress(), protocolFee); + // revoke await zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain( childHash, @@ -1836,9 +1877,9 @@ describe("ZNSSubRegistrar", () => { const zeroVaultBalanceAfterRevoke = await token2.balanceOf(zeroVault.address); expect(contractBalAfter - contractBalAfterRevoke).to.eq(expectedPrice); - expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice); + expect(childBalAfterRevoke - childBalAfter).to.eq(expectedPrice - protocolFee); expect(parentBalAfterRevoke - parentBalAfter).to.eq(0); - expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter).to.eq(0); + expect(zeroVaultBalanceAfterRevoke - zeroVaultBalanceAfter - protocolFee).to.eq(0); }); it("CurvePricer - DirectPayment - no fee - 18 decimals", async () => { @@ -3281,6 +3322,9 @@ describe("ZNSSubRegistrar", () => { const userBalbefore = await zns.meowToken.balanceOf(lvl3SubOwner.address); + const protocolFee = getStakingOrProtocolFee(stakedAfter); + + await zns.meowToken.connect(lvl3SubOwner).approve(await zns.treasury.getAddress(), protocolFee); // try revoking await zns.rootRegistrar.connect(lvl3SubOwner).revokeDomain( regResults[1].domainHash, @@ -3288,7 +3332,7 @@ describe("ZNSSubRegistrar", () => { // verify that refund has been acquired by the new owner const userBalAfter = await zns.meowToken.balanceOf(lvl3SubOwner.address); - expect(userBalAfter - userBalbefore).to.eq(fixedPrice); + expect(userBalAfter - userBalbefore).to.eq(fixedPrice - protocolFee); }); }); diff --git a/test/ZNSTreasury.test.ts b/test/ZNSTreasury.test.ts index a223487d..b281ac03 100644 --- a/test/ZNSTreasury.test.ts +++ b/test/ZNSTreasury.test.ts @@ -10,7 +10,9 @@ import { NOT_AUTHORIZED_REG_WIRED_ERR, INITIALIZED_ERR, DEFAULT_PRICE_CONFIG, - validateUpgrade, NOT_AUTHORIZED_TREASURY_ERR, + validateUpgrade, + NOT_AUTHORIZED_TREASURY_ERR, + getStakingOrProtocolFee, } from "./helpers"; import { DeployZNSParams, IZNSContracts } from "./helpers/types"; import * as ethers from "ethers"; @@ -247,23 +249,26 @@ describe("ZNSTreasury", () => { const balanceBeforeUnstake = await zns.meowToken.balanceOf(user.address); const { token, amount: stake } = await zns.treasury.stakedForDomain(domainHash); - await zns.treasury.connect(mockRegistrar).unstakeForDomain(domainHash, user.address); + await zns.treasury.connect(mockRegistrar).unstakeForDomain(domainHash, user.address, protocolFee); await checkBalance({ token: zns.meowToken, balanceBefore: balanceBeforeUnstake, userAddress: user.address, - target: stake, + target: stake - protocolFee, shouldDecrease: false, }); expect(token).to.eq(await zns.meowToken.getAddress()); }); it("Should revert if called from an address without REGISTRAR_ROLE", async () => { + const { amount } = await zns.treasury.stakedForDomain(domainHash); + const protocolFee = getStakingOrProtocolFee(amount); await expect( zns.treasury.connect(user).unstakeForDomain( domainHash, - user.address + user.address, + protocolFee ) ).to.be.revertedWith( getAccessRevertMsg(user.address, REGISTRAR_ROLE) diff --git a/yarn.lock b/yarn.lock index 9a1d1987..5e138147 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31,11 +31,11 @@ tslib "^1.11.1" "@aws-sdk/types@^3.1.0": - version "3.468.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.468.0.tgz#f97b34fc92a800d1d8b866f47693ae8f3d46517b" - integrity sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA== + version "3.485.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.485.0.tgz#9ffebb602bba4b6b75e2b037ee93a8735c06da3e" + integrity sha512-+QW32YQdvZRDOwrAQPo/qCyXoSjgXB6RwJwCwkd8ebJXRXw6tmGKIHaZqYHt/LtBymvnaBgBBADNa4+qFvlOFw== dependencies: - "@smithy/types" "^2.7.0" + "@smithy/types" "^2.8.0" tslib "^2.5.0" "@aws-sdk/util-utf8-browser@^3.0.0": @@ -68,9 +68,9 @@ js-tokens "^4.0.0" "@babel/runtime@^7.4.4": - version "7.23.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.6.tgz#c05e610dc228855dc92ef1b53d07389ed8ab521d" - integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ== + version "7.23.8" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.8.tgz#8ee6fe1ac47add7122902f257b8ddf55c898f650" + integrity sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw== dependencies: regenerator-runtime "^0.14.0" @@ -652,9 +652,9 @@ tweetnacl-util "^0.15.1" "@mongodb-js/saslprep@^1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.1.tgz#9a6c2516bc9188672c4d953ec99760ba49970da7" - integrity sha512-t7c5K033joZZMspnHg/gWPE4kandgc2OxE74aYOtGKfgB9VPuVJPix0H6fhmm2erj5PBJ21mqcx34lpIGtUCsQ== + version "1.1.3" + resolved "https://registry.yarnpkg.com/@mongodb-js/saslprep/-/saslprep-1.1.3.tgz#ef77edae4061cdc856ea2d355d582e9b49fae8fe" + integrity sha512-SyCxhJfmK6MoLNV5SbDpNdUy9SDv5H7y9/9rl3KpnwgTHWuNNMc87zWqbcIZXNWY+aUjxLGLEcvHoLagG4tWCg== dependencies: sparse-bitfield "^3.0.3" @@ -853,9 +853,9 @@ rustbn.js "~0.2.0" "@nomicfoundation/hardhat-chai-matchers@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.2.tgz#a0e5dbca43ba9560c096da162c0e3245303479d1" - integrity sha512-9Wu9mRtkj0U9ohgXYFbB/RQDa+PcEdyBm2suyEtsJf3PqzZEEjLUZgWnMjlFhATMk/fp3BjmnYVPrwl+gr8oEw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.3.tgz#f4c074d39b74bd283c99e2c2bf143e3cef51ae18" + integrity sha512-A40s7EAK4Acr8UP1Yudgi9GGD9Cca/K3LHt3DzmRIje14lBfHtg9atGQ7qK56vdPcTwKmeaGn30FzxMUfPGEMw== dependencies: "@types/chai-as-promised" "^7.1.3" chai-as-promised "^7.1.1" @@ -1522,9 +1522,9 @@ p-reduce "^2.0.0" "@semantic-release/github@^9.0.0": - version "9.2.5" - resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-9.2.5.tgz#69fd50759a2bb80dc1c38fded7f79e524a32c546" - integrity sha512-XWumFEOHiWllekymZjeVgkQCJ4YnD8020ZspAHYIIBNX8O4d/1ldeU5iNXu6NGkKlOCokyXh13KwVP0UEMm5kw== + version "9.2.6" + resolved "https://registry.yarnpkg.com/@semantic-release/github/-/github-9.2.6.tgz#0b0b00ab3ab0486cd3aecb4ae2f9f9cf2edd8eae" + integrity sha512-shi+Lrf6exeNZF+sBhK+P011LSbhmIAoUEgEY6SsxF8irJ+J2stwI5jkyDQ+4gzYyDImzV6LCKdYB9FXnQRWKA== dependencies: "@octokit/core" "^5.0.0" "@octokit/plugin-paginate-rest" "^9.0.0" @@ -1540,7 +1540,7 @@ issue-parser "^6.0.0" lodash-es "^4.17.21" mime "^4.0.0" - p-filter "^3.0.0" + p-filter "^4.0.0" url-join "^5.0.0" "@semantic-release/npm@^10.0.2": @@ -1685,10 +1685,10 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/merge-streams/-/merge-streams-1.0.0.tgz#9cd84cc15bc865a5ca35fcaae198eb899f7b5c90" integrity sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw== -"@smithy/types@^2.7.0": - version "2.7.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.7.0.tgz#6ed9ba5bff7c4d28c980cff967e6d8456840a4f3" - integrity sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw== +"@smithy/types@^2.8.0": + version "2.8.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.8.0.tgz#bdbaa0a54c9c3538d6c763c6f32d3e4f76fe0df9" + integrity sha512-h9sz24cFgt/W1Re22OlhQKmUZkNh244ApgRsUDYinqF8R+QgcsBIX344u2j61TPshsTz3CvL6HYU1DnQdsSrHA== dependencies: tslib "^2.5.0" @@ -1866,9 +1866,9 @@ integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== "@types/node@*": - version "20.10.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.5.tgz#47ad460b514096b7ed63a1dae26fad0914ed3ab2" - integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw== + version "20.10.8" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.8.tgz#f1e223cbde9e25696661d167a5b93a9b2a5d57c7" + integrity sha512-f8nQs3cLxbAFc00vEU59yf9UyGUftkPaLGfvbVOIDdx2i1b8epBqj2aNGyP19fiyXWvlmZ7qC1XLjAzw/OKIeA== dependencies: undici-types "~5.26.4" @@ -1883,9 +1883,9 @@ integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== "@types/node@^18.15.11": - version "18.19.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.3.tgz#e4723c4cb385641d61b983f6fe0b716abd5f8fc0" - integrity sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg== + version "18.19.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.6.tgz#537beece2c8ad4d9abdaa3b0f428e601eb57dac8" + integrity sha512-X36s5CXMrrJOs2lQCdDF68apW4Rfx9ixYMawlepwmE4Anezv/AV2LSpKD1Ub8DAc+urp5bk0BGZ6NtmBitfnsg== dependencies: undici-types "~5.26.4" @@ -1947,9 +1947,9 @@ integrity sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA== "@types/whatwg-url@^11.0.2": - version "11.0.3" - resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-11.0.3.tgz#9f584c9a9421f0971029ee504dd62a831cb8f3aa" - integrity sha512-z1ELvMijRL1QmU7QuzDkeYXSF2+dXI0ITKoQsIoVKcNBOiK5RMmWy+pYYxJTHFt8vkpZe7UsvRErQwcxZkjoUw== + version "11.0.4" + resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-11.0.4.tgz#ffed0dc8d89d91f62e3f368fcbda222a487c4f63" + integrity sha512-lXCmTWSHJvf0TRSO58nm978b8HJ/EdsSsEKLd3ODHFjo+3VGAyyTp4v50nWvwtzBxSMQrVOK7tcuN0zGPLICMw== dependencies: "@types/webidl-conversions" "*" @@ -2085,13 +2085,6 @@ abbrev@^2.0.0: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" @@ -2116,9 +2109,9 @@ acorn-walk@^8.1.1: integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== acorn@^8.4.1, acorn@^8.9.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + version "8.11.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== address@^1.0.1: version "1.2.2" @@ -2169,14 +2162,6 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -aggregate-error@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-4.0.1.tgz#25091fe1573b9e0be892aeda15c7c66a545f758e" - integrity sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w== - dependencies: - clean-stack "^4.0.0" - indent-string "^5.0.0" - aggregate-error@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-5.0.0.tgz#ffe15045d7521c51c9d618e3d7f37c13f29b3fd3" @@ -2326,12 +2311,9 @@ are-we-there-yet@^3.0.0: readable-stream "^3.6.0" are-we-there-yet@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-4.0.1.tgz#05a6fc0e5f70771b673e82b0f915616e0ace8fd3" - integrity sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA== - dependencies: - delegates "^1.0.0" - readable-stream "^4.1.0" + version "4.0.2" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-4.0.2.tgz#aed25dd0eae514660d49ac2b2366b175c614785a" + integrity sha512-ncSWAawFhKMJDTdoAeOV+jyW1VCMj5QIAwULIBV0SSR7B/RLPPEQiknKcg/RIIZlUQrxELpsxMiTUoAQ4sIUyg== arg@^4.1.0: version "4.1.3" @@ -2527,11 +2509,11 @@ axios@^0.27.2: form-data "^4.0.0" axios@^1.4.0, axios@^1.5.1: - version "1.6.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.2.tgz#de67d42c755b571d3e698df1b6504cde9b0ee9f2" - integrity sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A== + version "1.6.5" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.5.tgz#2c090da14aeeab3770ad30c3a1461bc970fb0cd8" + integrity sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg== dependencies: - follow-redirects "^1.15.0" + follow-redirects "^1.15.4" form-data "^4.0.0" proxy-from-env "^1.1.0" @@ -2882,9 +2864,9 @@ chai-as-promised@^7.1.1: check-error "^1.0.2" chai@^4.3.10: - version "4.3.10" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384" - integrity sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g== + version "4.4.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.0.tgz#f9ac79f26726a867ac9d90a9b382120479d5f55b" + integrity sha512-x9cHNq1uvkCdU+5xTkNh5WtgD4e4yDFCsp9jVc7N7qVeKeftv3gO/ZrviX5d+3ZfxdYnZXZYujjRInu1RogU6A== dependencies: assertion-error "^1.1.0" check-error "^1.0.3" @@ -3005,13 +2987,6 @@ clean-stack@^2.0.0: resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== -clean-stack@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-4.2.0.tgz#c464e4cde4ac789f4e0735c5d75beb49d7b30b31" - integrity sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg== - dependencies: - escape-string-regexp "5.0.0" - clean-stack@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-5.2.0.tgz#c7a0c91939c7caace30a3bf254e8a8ac276d1189" @@ -4110,9 +4085,9 @@ ethers@^5.0.13, ethers@^5.7.0, ethers@^5.7.1, ethers@^5.7.2: "@ethersproject/wordlists" "5.7.0" ethers@^6.8.1, ethers@^6.9.0: - version "6.9.1" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.9.1.tgz#4d50c77b46b6661e00f5cc6292e6bcd933fe4cba" - integrity sha512-kuV8fGd4/8Gj7wkurbsuUsm1DCG6N5gKGYdw3fnWG/7QGknhy1xtHD7kbkCWQAcbAYmzLCLqCPedS3FYncFkKQ== + version "6.9.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-6.9.2.tgz#6f4632f62e2350fa8354ff28624027a175ef85a4" + integrity sha512-YpkrtILnMQz5jSEsJQRTpduaGT/CXuLnUIuOYzHA0v/7c8IX91m2J48wSKjzGL5L9J/Us3tLoUdb+OwE3U+FFQ== dependencies: "@adraffy/ens-normalize" "1.10.0" "@noble/curves" "1.2.0" @@ -4138,16 +4113,6 @@ ethjs-util@0.1.6, ethjs-util@^0.1.6: is-hex-prefixed "1.0.0" strip-hex-prefix "1.0.0" -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -events@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -4372,10 +4337,10 @@ fn.name@1.x.x: resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0: - version "1.15.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" - integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== +follow-redirects@^1.12.1, follow-redirects@^1.14.0, follow-redirects@^1.14.9, follow-redirects@^1.15.4: + version "1.15.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.4.tgz#cdc7d308bf6493126b17ea2191ea0ccf3e535adf" + integrity sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw== for-each@^0.3.3: version "0.3.3" @@ -4892,9 +4857,9 @@ hardhat-gas-reporter@^1.0.9: sha1 "^1.1.1" hardhat@^2.19.1: - version "2.19.3" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.19.3.tgz#fe3b28b889e34a074ea5b740c227e3c8d4ce56e8" - integrity sha512-zUvfILiu1O7W1a+t5E1nCJ6z1danRLNizQkSEQCCgDYcRx13AGXtH1MVZajKmdLmXIjKAPReTp/8JQQ4ZHaX3g== + version "2.19.4" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.19.4.tgz#5112c30295d8be2e18e55d847373c50483ed1902" + integrity sha512-fTQJpqSt3Xo9Mn/WrdblNGAfcANM6XC3tAEi6YogB4s02DmTf93A8QsGb8uR0KR8TFcpcS8lgiW4ugAIYpnbrQ== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" @@ -6700,9 +6665,9 @@ node-fetch@^2.6.0, node-fetch@^2.6.1: whatwg-url "^5.0.0" node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.7.1" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.7.1.tgz#cd7d2eb48e594874053150a9418ac85af83ca8f7" - integrity sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg== + version "4.8.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" + integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== node-gyp@^9.0.0, node-gyp@^9.4.0: version "9.4.1" @@ -7152,12 +7117,12 @@ p-each-series@^3.0.0: resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-3.0.0.tgz#d1aed5e96ef29864c897367a7d2a628fdc960806" integrity sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw== -p-filter@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-3.0.0.tgz#ce50e03b24b23930e11679ab8694bd09a2d7ed35" - integrity sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg== +p-filter@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-filter/-/p-filter-4.1.0.tgz#fe0aa794e2dfad8ecf595a39a245484fcd09c6e4" + integrity sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw== dependencies: - p-map "^5.1.0" + p-map "^7.0.1" p-is-promise@^3.0.0: version "3.0.0" @@ -7227,12 +7192,10 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" -p-map@^5.1.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-5.5.0.tgz#054ca8ca778dfa4cf3f8db6638ccb5b937266715" - integrity sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg== - dependencies: - aggregate-error "^4.0.0" +p-map@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-7.0.1.tgz#1faf994e597160f7851882926bfccabc1d226f80" + integrity sha512-2wnaR0XL/FDOj+TgpDuRb2KTjLnu3Fma6b1ZUwGY7LcqenMcvP/YFpjpbPKY6WVGsbuJZRuoUz8iPrt8ORnAFw== p-reduce@^2.0.0: version "2.1.0" @@ -7481,9 +7444,9 @@ pluralize@^8.0.0: integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== postcss-selector-parser@^6.0.10: - version "6.0.13" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + version "6.0.15" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" + integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -7513,11 +7476,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - promise-all-reject-late@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" @@ -7753,17 +7711,6 @@ readable-stream@^3.4.0, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.1.tgz#3f2e4e66eab45606ac8f31597b9edb80c13b12ab" - integrity sha512-uQjbf34vmf/asGnOHQEw07Q4llgMACQZTWWa4MmICS0IKJoHbLwKCy71H3eR99Dw5iYejc6W+pqZZEeqRtUFAw== - dependencies: - abort-controller "^3.0.0" - buffer "^6.0.3" - events "^3.3.0" - process "^0.11.10" - string_decoder "^1.3.0" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -8004,12 +7951,12 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.1.tgz#207369b445fd007e534864635b28b2ae7b105783" + integrity sha512-Y5NejJTTliTyY4H7sipGqY+RX5P87i3F7c4Rcepy72nq+mNLhIsD0W4c7kEmduMDQCSqtPsXPlSTsFhh2LQv+g== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.5" + get-intrinsic "^1.2.2" is-regex "^1.1.4" safe-stable-stringify@^2.3.1: @@ -8323,9 +8270,9 @@ solc@^0.4.20: yargs "^4.7.1" solhint@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/solhint/-/solhint-4.0.0.tgz#fbd27ec9c8348b4fea90b5b469a5c95d625d2e59" - integrity sha512-bFViMcFvhqVd/HK3Roo7xZXX5nbujS7Bxeg5vnZc9QvH0yCWCrQ38Yrn1pbAY9tlKROc6wFr+rK1mxYgYrjZgA== + version "4.1.1" + resolved "https://registry.yarnpkg.com/solhint/-/solhint-4.1.1.tgz#137c935ef028f01ba13687a1f237288d94dae1bf" + integrity sha512-7G4iF8H5hKHc0tR+/uyZesSKtfppFIMvPSW+Ku6MSL25oVRuyFeqNhOsXHfkex64wYJyXs4fe+pvhB069I19Tw== dependencies: "@solidity-parser/parser" "^0.16.0" ajv "^6.12.6" @@ -8577,7 +8524,7 @@ string.prototype.trimstart@^1.0.7: define-properties "^1.2.0" es-abstract "^1.22.1" -string_decoder@^1.1.1, string_decoder@^1.3.0: +string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -9073,9 +9020,9 @@ type-fest@^3.0.0, type-fest@^3.8.0: integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== type-fest@^4.2.0: - version "4.8.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.8.3.tgz#6db08d9f44d596cd953f83020c7c56310c368d1c" - integrity sha512-//BaTm14Q/gHBn09xlnKNqfI8t6bmdzx2DXYfPBNofN0WUybCEUDcbCWcTa0oF09lzLjZgPphXAsvRiMK0V6Bw== + version "4.9.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.9.0.tgz#d29c8efe5b1e703feeb29cef23d887b2f479844d" + integrity sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg== typechain@^8.3.2: version "8.3.2"