From 1954b76cdc3cf5a5e7625de578486e49495e9c62 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Thu, 29 Jun 2023 09:40:25 +0100 Subject: [PATCH 01/43] Rename ParameterType.AbiEncoded to ParameterType.Calldata --- packages/evm/contracts/Decoder.sol | 2 +- packages/evm/contracts/Integrity.sol | 8 +- packages/evm/contracts/Topology.sol | 2 +- packages/evm/contracts/Types.sol | 2 +- packages/evm/contracts/packers/Packer.sol | 2 +- packages/evm/test/Allowance.spec.ts | 40 +++---- packages/evm/test/Decoder.spec.ts | 76 ++++++------ packages/evm/test/EmitsEvent.spec.ts | 2 +- packages/evm/test/Integrity.spec.ts | 108 +++++++++--------- packages/evm/test/OldTests.spec.ts | 14 +-- packages/evm/test/OnlyOwner.spec.ts | 4 +- packages/evm/test/Operator.spec.ts | 28 ++--- packages/evm/test/Roles.spec.ts | 18 +-- packages/evm/test/operators/00Pass.spec.ts | 2 +- packages/evm/test/operators/01And.spec.ts | 4 +- packages/evm/test/operators/02Or.spec.ts | 4 +- packages/evm/test/operators/03Nor.spec.ts | 4 +- packages/evm/test/operators/05Matches.spec.ts | 10 +- .../evm/test/operators/06ArraySome.spec.ts | 2 +- .../evm/test/operators/07ArrayEvery.spec.ts | 4 +- .../evm/test/operators/08ArraySubset.spec.ts | 10 +- .../test/operators/15EqualToAvatar.spec.ts | 2 +- packages/evm/test/operators/16EqualTo.spec.ts | 36 +++--- .../evm/test/operators/17GreaterThan.spec.ts | 6 +- .../evm/test/operators/18LessThan.spec.ts | 6 +- .../operators/19SignedIntGreaterThan.spec.ts | 8 +- .../operators/20SignedIntLessThan.spec.ts | 8 +- packages/evm/test/operators/21Bitmask.spec.ts | 18 +-- packages/evm/test/operators/22Custom.spec.ts | 6 +- .../test/operators/28WithinAllowance.spec.ts | 24 ++-- .../operators/29EtherWithinAllowance.spec.ts | 6 +- .../operators/30CallWithinAllowance.spec.ts | 6 +- packages/evm/test/utils.ts | 2 +- 33 files changed, 237 insertions(+), 237 deletions(-) diff --git a/packages/evm/contracts/Decoder.sol b/packages/evm/contracts/Decoder.sol index 02018926a..73cba1bd2 100644 --- a/packages/evm/contracts/Decoder.sol +++ b/packages/evm/contracts/Decoder.sol @@ -76,7 +76,7 @@ library Decoder { result ); result.size += 32; - } else if (paramType == ParameterType.AbiEncoded) { + } else if (paramType == ParameterType.Calldata) { __block__( data, location + 32 + 4, diff --git a/packages/evm/contracts/Integrity.sol b/packages/evm/contracts/Integrity.sol index 9af1673a4..f048fc530 100644 --- a/packages/evm/contracts/Integrity.sol +++ b/packages/evm/contracts/Integrity.sol @@ -63,7 +63,7 @@ library Integrity { if ( paramType != ParameterType.Tuple && paramType != ParameterType.Array && - paramType != ParameterType.AbiEncoded + paramType != ParameterType.Calldata ) { revert UnsuitableParameterType(index); } @@ -162,7 +162,7 @@ library Integrity { (conditions[i].operator == Operator.EtherWithinAllowance || conditions[i].operator == Operator.CallWithinAllowance) && conditions[conditions[i].parent].paramType != - ParameterType.AbiEncoded + ParameterType.Calldata ) { revert UnsuitableParent(i); } @@ -201,7 +201,7 @@ library Integrity { } } else if ( condition.paramType == ParameterType.Tuple || - condition.paramType == ParameterType.AbiEncoded + condition.paramType == ParameterType.Calldata ) { if (childBounds.length == 0) { revert UnsuitableChildCount(i); @@ -246,7 +246,7 @@ library Integrity { childrenBounds ); - if (typeTree.paramType != ParameterType.AbiEncoded) { + if (typeTree.paramType != ParameterType.Calldata) { revert UnsuitableRootNode(); } } diff --git a/packages/evm/contracts/Topology.sol b/packages/evm/contracts/Topology.sol index 1ca3bba86..708f93a0e 100644 --- a/packages/evm/contracts/Topology.sol +++ b/packages/evm/contracts/Topology.sol @@ -52,7 +52,7 @@ library Topology { } else if ( paramType == ParameterType.Dynamic || paramType == ParameterType.Array || - paramType == ParameterType.AbiEncoded + paramType == ParameterType.Calldata ) { return false; } else { diff --git a/packages/evm/contracts/Types.sol b/packages/evm/contracts/Types.sol index e9b12767e..abc653112 100644 --- a/packages/evm/contracts/Types.sol +++ b/packages/evm/contracts/Types.sol @@ -13,7 +13,7 @@ enum ParameterType { Dynamic, Tuple, Array, - AbiEncoded + Calldata } enum Operator { diff --git a/packages/evm/contracts/packers/Packer.sol b/packages/evm/contracts/packers/Packer.sol index a364ce11a..50191e500 100644 --- a/packages/evm/contracts/packers/Packer.sol +++ b/packages/evm/contracts/packers/Packer.sol @@ -73,7 +73,7 @@ library Packer { } else if ( paramType == ParameterType.Dynamic || paramType == ParameterType.Array || - paramType == ParameterType.AbiEncoded + paramType == ParameterType.Calldata ) { return false; } else { diff --git a/packages/evm/test/Allowance.spec.ts b/packages/evm/test/Allowance.spec.ts index b5eb9c05b..356572267 100644 --- a/packages/evm/test/Allowance.spec.ts +++ b/packages/evm/test/Allowance.spec.ts @@ -32,7 +32,7 @@ describe("Allowance", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -66,7 +66,7 @@ describe("Allowance", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -112,7 +112,7 @@ describe("Allowance", async () => { await scopeFunction( toConditionsFlat({ - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", children: [ @@ -177,7 +177,7 @@ describe("Allowance", async () => { await roles.connect(owner).setAllowance(allowanceKey, 1000, 0, 0, 0, 0); const conditionsFlat = toConditionsFlat({ - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", children: [ @@ -240,7 +240,7 @@ describe("Allowance", async () => { await roles.connect(owner).setAllowance(allowanceKey, 1000, 0, 0, 0, 0); const conditionsFlat = toConditionsFlat({ - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", children: [ @@ -312,7 +312,7 @@ describe("Allowance", async () => { await roles.connect(owner).setAllowance(allowanceKey3, 100, 0, 0, 0, 0); const conditionsFlat = toConditionsFlat({ - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", children: [ @@ -407,7 +407,7 @@ describe("Allowance", async () => { await roles.connect(owner).setAllowance(allowanceKey2, 100, 0, 0, 0, 0); const conditionsFlat = toConditionsFlat({ - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", children: [ @@ -467,7 +467,7 @@ describe("Allowance", async () => { await roles.connect(owner).setAllowance(allowanceKey2, 100, 0, 0, 0, 0); const conditionsFlat = toConditionsFlat({ - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", children: [ @@ -534,7 +534,7 @@ describe("Allowance", async () => { await roles.connect(owner).setAllowance(allowanceKey2, 100, 0, 0, 0, 0); const conditionsFlat = toConditionsFlat({ - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", children: [ @@ -694,7 +694,7 @@ describe("Allowance", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -717,7 +717,7 @@ describe("Allowance", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -818,7 +818,7 @@ describe("Allowance", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -841,7 +841,7 @@ describe("Allowance", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -930,7 +930,7 @@ describe("Allowance", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -953,7 +953,7 @@ describe("Allowance", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -1046,7 +1046,7 @@ describe("Allowance", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -1080,7 +1080,7 @@ describe("Allowance", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -1190,7 +1190,7 @@ describe("Allowance", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -1213,7 +1213,7 @@ describe("Allowance", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -1236,7 +1236,7 @@ describe("Allowance", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/Decoder.spec.ts b/packages/evm/test/Decoder.spec.ts index 9a4729446..3c56c43d2 100644 --- a/packages/evm/test/Decoder.spec.ts +++ b/packages/evm/test/Decoder.spec.ts @@ -36,7 +36,7 @@ describe("Decoder library", async () => { }); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -82,7 +82,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -120,7 +120,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -170,7 +170,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, children: [ { @@ -228,7 +228,7 @@ describe("Decoder library", async () => { ]); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -296,7 +296,7 @@ describe("Decoder library", async () => { ); const nestedLayout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, children: [ { @@ -313,7 +313,7 @@ describe("Decoder library", async () => { }; const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, children: [nestedLayout], }; @@ -348,7 +348,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -394,7 +394,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -430,7 +430,7 @@ describe("Decoder library", async () => { ]); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -484,7 +484,7 @@ describe("Decoder library", async () => { }); const nestedLayout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -512,7 +512,7 @@ describe("Decoder library", async () => { }; const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -548,7 +548,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -630,7 +630,7 @@ describe("Decoder library", async () => { operator: Operator.Or, children: [ { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -646,7 +646,7 @@ describe("Decoder library", async () => { ], }, { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -662,7 +662,7 @@ describe("Decoder library", async () => { ], }, { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -705,7 +705,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -745,7 +745,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -825,7 +825,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -895,7 +895,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -931,7 +931,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -967,7 +967,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -1034,7 +1034,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -1103,7 +1103,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -1166,7 +1166,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -1215,7 +1215,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -1280,7 +1280,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -1348,7 +1348,7 @@ describe("Decoder library", async () => { ); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -1429,7 +1429,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -1569,7 +1569,7 @@ describe("Decoder library", async () => { assert(data); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -1654,7 +1654,7 @@ describe("Decoder library", async () => { ]); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -1757,7 +1757,7 @@ describe("Decoder library", async () => { ]); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -1876,7 +1876,7 @@ describe("Decoder library", async () => { ); const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -1885,7 +1885,7 @@ describe("Decoder library", async () => { children: [], }, { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, children: [ { @@ -1938,7 +1938,7 @@ describe("Decoder library", async () => { }); const nestedLayout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -1972,7 +1972,7 @@ describe("Decoder library", async () => { }; const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -2059,7 +2059,7 @@ describe("Decoder library", async () => { ]); const nestedLayout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { @@ -2087,7 +2087,7 @@ describe("Decoder library", async () => { }; const layout = { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, children: [ { diff --git a/packages/evm/test/EmitsEvent.spec.ts b/packages/evm/test/EmitsEvent.spec.ts index 02109295d..862d82a8f 100644 --- a/packages/evm/test/EmitsEvent.spec.ts +++ b/packages/evm/test/EmitsEvent.spec.ts @@ -85,7 +85,7 @@ describe("EmitsEvent", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/Integrity.spec.ts b/packages/evm/test/Integrity.spec.ts index 744d8e541..5f265a1e2 100644 --- a/packages/evm/test/Integrity.spec.ts +++ b/packages/evm/test/Integrity.spec.ts @@ -35,7 +35,7 @@ describe("Integrity", async () => { enforce([ { parent: 1, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -52,7 +52,7 @@ describe("Integrity", async () => { enforce([ { parent: 1, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -69,7 +69,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -91,7 +91,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x00", }, @@ -106,7 +106,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.And, compValue: "0x", }, @@ -147,7 +147,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x00", }, @@ -216,7 +216,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -235,7 +235,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -254,7 +254,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -273,13 +273,13 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.EqualTo, compValue: "0x", }, @@ -292,7 +292,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -311,7 +311,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -330,7 +330,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -349,7 +349,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -368,7 +368,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -387,7 +387,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -406,7 +406,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -425,7 +425,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -444,7 +444,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -463,7 +463,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -482,7 +482,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -501,7 +501,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -522,7 +522,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -541,7 +541,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -561,7 +561,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -580,7 +580,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -599,7 +599,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -619,7 +619,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -638,7 +638,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -657,7 +657,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -676,7 +676,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -696,7 +696,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -721,7 +721,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -751,7 +751,7 @@ describe("Integrity", async () => { const conditions = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -784,7 +784,7 @@ describe("Integrity", async () => { let conditions = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -817,7 +817,7 @@ describe("Integrity", async () => { const conditions = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -844,7 +844,7 @@ describe("Integrity", async () => { const conditions = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -877,7 +877,7 @@ describe("Integrity", async () => { const conditions = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -904,7 +904,7 @@ describe("Integrity", async () => { const conditions = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -919,7 +919,7 @@ describe("Integrity", async () => { let conditions = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -952,7 +952,7 @@ describe("Integrity", async () => { const conditions = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -993,7 +993,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -1021,7 +1021,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -1046,7 +1046,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -1089,7 +1089,7 @@ describe("Integrity", async () => { const conditions = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -1127,7 +1127,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -1164,7 +1164,7 @@ describe("Integrity", async () => { const conditions = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -1220,7 +1220,7 @@ describe("Integrity", async () => { enforce([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -1275,7 +1275,7 @@ describe("Integrity", async () => { const conditions = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -1326,7 +1326,7 @@ describe("Integrity", async () => { const conditions = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -1392,7 +1392,7 @@ describe("Integrity", async () => { const conditions = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -1459,7 +1459,7 @@ describe("Integrity", async () => { const conditions = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, @@ -1521,7 +1521,7 @@ describe("Integrity", async () => { const conditions = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", }, diff --git a/packages/evm/test/OldTests.spec.ts b/packages/evm/test/OldTests.spec.ts index ca7abde5f..5451f2e5e 100644 --- a/packages/evm/test/OldTests.spec.ts +++ b/packages/evm/test/OldTests.spec.ts @@ -142,7 +142,7 @@ describe("OldTests", async () => { const conditionTree = [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -369,7 +369,7 @@ describe("OldTests", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -440,7 +440,7 @@ describe("OldTests", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -629,7 +629,7 @@ describe("OldTests", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -723,7 +723,7 @@ describe("OldTests", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -807,7 +807,7 @@ describe("OldTests", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -1157,7 +1157,7 @@ describe("OldTests", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/OnlyOwner.spec.ts b/packages/evm/test/OnlyOwner.spec.ts index ed3618814..a1591a353 100644 --- a/packages/evm/test/OnlyOwner.spec.ts +++ b/packages/evm/test/OnlyOwner.spec.ts @@ -101,7 +101,7 @@ describe("OnlyOwner", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -124,7 +124,7 @@ describe("OnlyOwner", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/Operator.spec.ts b/packages/evm/test/Operator.spec.ts index ca2c55065..8fc327595 100644 --- a/packages/evm/test/Operator.spec.ts +++ b/packages/evm/test/Operator.spec.ts @@ -80,7 +80,7 @@ describe("Operator", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -146,13 +146,13 @@ describe("Operator", async () => { }, { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -213,7 +213,7 @@ describe("Operator", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -280,7 +280,7 @@ describe("Operator", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -360,7 +360,7 @@ describe("Operator", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -456,7 +456,7 @@ describe("Operator", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -604,7 +604,7 @@ describe("Operator", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -701,7 +701,7 @@ describe("Operator", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -761,7 +761,7 @@ describe("Operator", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -849,7 +849,7 @@ describe("Operator", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -991,21 +991,21 @@ describe("Operator", async () => { // 1 { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, // 2 { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, // 3 { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/Roles.spec.ts b/packages/evm/test/Roles.spec.ts index 2fd813619..fd6101a5a 100644 --- a/packages/evm/test/Roles.spec.ts +++ b/packages/evm/test/Roles.spec.ts @@ -70,7 +70,7 @@ describe("Roles", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -637,7 +637,7 @@ describe("Roles", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -658,7 +658,7 @@ describe("Roles", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -705,12 +705,12 @@ describe("Roles", async () => { testContract.interface.getFunction("dynamic") ), toConditionsFlat({ - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", children: [ { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", children: [ @@ -776,7 +776,7 @@ describe("Roles", async () => { testContract.interface.getFunction("dynamic") ), toConditionsFlat({ - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", children: [ @@ -787,7 +787,7 @@ describe("Roles", async () => { "0x0000000000000000000000000000000000000000000000000000000000000011", children: [ { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", children: [ @@ -817,7 +817,7 @@ describe("Roles", async () => { testContract.interface.getFunction("dynamic") ), toConditionsFlat({ - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", children: [ @@ -828,7 +828,7 @@ describe("Roles", async () => { "0x0000000000000000000000000000000000000000000000000000000000000011", children: [ { - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Pass, compValue: "0x", children: [ diff --git a/packages/evm/test/operators/00Pass.spec.ts b/packages/evm/test/operators/00Pass.spec.ts index 9c556d25b..c6be9d186 100644 --- a/packages/evm/test/operators/00Pass.spec.ts +++ b/packages/evm/test/operators/00Pass.spec.ts @@ -10,7 +10,7 @@ describe("Operator - Pass", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/01And.spec.ts b/packages/evm/test/operators/01And.spec.ts index 9462960f9..3e91aed29 100644 --- a/packages/evm/test/operators/01And.spec.ts +++ b/packages/evm/test/operators/01And.spec.ts @@ -19,7 +19,7 @@ describe("Operator - And", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -51,7 +51,7 @@ describe("Operator - And", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/02Or.spec.ts b/packages/evm/test/operators/02Or.spec.ts index b6dada3b4..fbf727c8e 100644 --- a/packages/evm/test/operators/02Or.spec.ts +++ b/packages/evm/test/operators/02Or.spec.ts @@ -19,7 +19,7 @@ describe("Operator - Or", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -52,7 +52,7 @@ describe("Operator - Or", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/03Nor.spec.ts b/packages/evm/test/operators/03Nor.spec.ts index 9c13b1fb8..681964934 100644 --- a/packages/evm/test/operators/03Nor.spec.ts +++ b/packages/evm/test/operators/03Nor.spec.ts @@ -19,7 +19,7 @@ describe("Operator - Nor", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -52,7 +52,7 @@ describe("Operator - Nor", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/05Matches.spec.ts b/packages/evm/test/operators/05Matches.spec.ts index e4afce802..015709b2c 100644 --- a/packages/evm/test/operators/05Matches.spec.ts +++ b/packages/evm/test/operators/05Matches.spec.ts @@ -24,7 +24,7 @@ describe("Operator - Matches", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -68,7 +68,7 @@ describe("Operator - Matches", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -107,7 +107,7 @@ describe("Operator - Matches", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -151,7 +151,7 @@ describe("Operator - Matches", async () => { scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -173,7 +173,7 @@ describe("Operator - Matches", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/06ArraySome.spec.ts b/packages/evm/test/operators/06ArraySome.spec.ts index 255a27173..0535ce0fe 100644 --- a/packages/evm/test/operators/06ArraySome.spec.ts +++ b/packages/evm/test/operators/06ArraySome.spec.ts @@ -20,7 +20,7 @@ describe("Operator - ArraySome", async () => { scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/07ArrayEvery.spec.ts b/packages/evm/test/operators/07ArrayEvery.spec.ts index 34c318d83..e25de3d6f 100644 --- a/packages/evm/test/operators/07ArrayEvery.spec.ts +++ b/packages/evm/test/operators/07ArrayEvery.spec.ts @@ -23,7 +23,7 @@ describe("Operator - ArrayEvery", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -94,7 +94,7 @@ describe("Operator - ArrayEvery", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/08ArraySubset.spec.ts b/packages/evm/test/operators/08ArraySubset.spec.ts index 551455871..09e279153 100644 --- a/packages/evm/test/operators/08ArraySubset.spec.ts +++ b/packages/evm/test/operators/08ArraySubset.spec.ts @@ -19,7 +19,7 @@ describe("Operator - ArraySubset", async () => { scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -65,7 +65,7 @@ describe("Operator - ArraySubset", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -113,7 +113,7 @@ describe("Operator - ArraySubset", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -165,7 +165,7 @@ describe("Operator - ArraySubset", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -205,7 +205,7 @@ describe("Operator - ArraySubset", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/15EqualToAvatar.spec.ts b/packages/evm/test/operators/15EqualToAvatar.spec.ts index 5c8f6c7d0..1707a8d06 100644 --- a/packages/evm/test/operators/15EqualToAvatar.spec.ts +++ b/packages/evm/test/operators/15EqualToAvatar.spec.ts @@ -23,7 +23,7 @@ describe("Operator - EqualToAvatar", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/16EqualTo.spec.ts b/packages/evm/test/operators/16EqualTo.spec.ts index c41fd71de..aee1bb094 100644 --- a/packages/evm/test/operators/16EqualTo.spec.ts +++ b/packages/evm/test/operators/16EqualTo.spec.ts @@ -34,7 +34,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -59,7 +59,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -84,7 +84,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -109,7 +109,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -138,7 +138,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -163,7 +163,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -188,7 +188,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -213,7 +213,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -240,7 +240,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -269,7 +269,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -300,7 +300,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -328,7 +328,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -356,7 +356,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -390,7 +390,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -425,7 +425,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -476,7 +476,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -529,7 +529,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -573,7 +573,7 @@ describe("Operator - EqualTo", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/17GreaterThan.spec.ts b/packages/evm/test/operators/17GreaterThan.spec.ts index 6bf52cfd2..2e97214a1 100644 --- a/packages/evm/test/operators/17GreaterThan.spec.ts +++ b/packages/evm/test/operators/17GreaterThan.spec.ts @@ -24,7 +24,7 @@ describe("Operator - GreaterThan", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -52,7 +52,7 @@ describe("Operator - GreaterThan", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -82,7 +82,7 @@ describe("Operator - GreaterThan", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/18LessThan.spec.ts b/packages/evm/test/operators/18LessThan.spec.ts index 062b06453..25684e81c 100644 --- a/packages/evm/test/operators/18LessThan.spec.ts +++ b/packages/evm/test/operators/18LessThan.spec.ts @@ -24,7 +24,7 @@ describe("Operator - LessThan", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -58,7 +58,7 @@ describe("Operator - LessThan", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -102,7 +102,7 @@ describe("Operator - LessThan", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/19SignedIntGreaterThan.spec.ts b/packages/evm/test/operators/19SignedIntGreaterThan.spec.ts index ab4daa984..7dbdf31ba 100644 --- a/packages/evm/test/operators/19SignedIntGreaterThan.spec.ts +++ b/packages/evm/test/operators/19SignedIntGreaterThan.spec.ts @@ -20,7 +20,7 @@ describe("Operator - SignedIntGreaterThan", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -49,7 +49,7 @@ describe("Operator - SignedIntGreaterThan", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -80,7 +80,7 @@ describe("Operator - SignedIntGreaterThan", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -110,7 +110,7 @@ describe("Operator - SignedIntGreaterThan", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/20SignedIntLessThan.spec.ts b/packages/evm/test/operators/20SignedIntLessThan.spec.ts index 477fa5bce..67558f3fe 100644 --- a/packages/evm/test/operators/20SignedIntLessThan.spec.ts +++ b/packages/evm/test/operators/20SignedIntLessThan.spec.ts @@ -20,7 +20,7 @@ describe("Operator - SignedIntLessThan", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -61,7 +61,7 @@ describe("Operator - SignedIntLessThan", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -105,7 +105,7 @@ describe("Operator - SignedIntLessThan", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -146,7 +146,7 @@ describe("Operator - SignedIntLessThan", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/21Bitmask.spec.ts b/packages/evm/test/operators/21Bitmask.spec.ts index 2d3c9ef77..f8f61b65c 100644 --- a/packages/evm/test/operators/21Bitmask.spec.ts +++ b/packages/evm/test/operators/21Bitmask.spec.ts @@ -25,7 +25,7 @@ describe("Operator - Bitmask", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -76,7 +76,7 @@ describe("Operator - Bitmask", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -125,7 +125,7 @@ describe("Operator - Bitmask", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -175,7 +175,7 @@ describe("Operator - Bitmask", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -209,7 +209,7 @@ describe("Operator - Bitmask", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -241,7 +241,7 @@ describe("Operator - Bitmask", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -273,7 +273,7 @@ describe("Operator - Bitmask", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -302,7 +302,7 @@ describe("Operator - Bitmask", async () => { scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -325,7 +325,7 @@ describe("Operator - Bitmask", async () => { scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/22Custom.spec.ts b/packages/evm/test/operators/22Custom.spec.ts index 262363a57..99a85e20a 100644 --- a/packages/evm/test/operators/22Custom.spec.ts +++ b/packages/evm/test/operators/22Custom.spec.ts @@ -31,7 +31,7 @@ describe("Operator - Custom", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -55,7 +55,7 @@ describe("Operator - Custom", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -81,7 +81,7 @@ describe("Operator - Custom", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/28WithinAllowance.spec.ts b/packages/evm/test/operators/28WithinAllowance.spec.ts index 538af1287..7c0995602 100644 --- a/packages/evm/test/operators/28WithinAllowance.spec.ts +++ b/packages/evm/test/operators/28WithinAllowance.spec.ts @@ -55,7 +55,7 @@ describe("Operator - WithinAllowance", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -87,7 +87,7 @@ describe("Operator - WithinAllowance", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -126,7 +126,7 @@ describe("Operator - WithinAllowance", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -165,7 +165,7 @@ describe("Operator - WithinAllowance", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -206,7 +206,7 @@ describe("Operator - WithinAllowance", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -243,7 +243,7 @@ describe("Operator - WithinAllowance", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -284,7 +284,7 @@ describe("Operator - WithinAllowance", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -332,7 +332,7 @@ describe("Operator - WithinAllowance", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -378,7 +378,7 @@ describe("Operator - WithinAllowance", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -419,7 +419,7 @@ describe("Operator - WithinAllowance", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -455,7 +455,7 @@ describe("Operator - WithinAllowance", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -494,7 +494,7 @@ describe("Operator - WithinAllowance", async () => { await scopeFunction([ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/29EtherWithinAllowance.spec.ts b/packages/evm/test/operators/29EtherWithinAllowance.spec.ts index 914b83112..774e56dbe 100644 --- a/packages/evm/test/operators/29EtherWithinAllowance.spec.ts +++ b/packages/evm/test/operators/29EtherWithinAllowance.spec.ts @@ -84,7 +84,7 @@ describe("Operator - EtherWithinAllowance", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -245,13 +245,13 @@ describe("Operator - EtherWithinAllowance", async () => { }, { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/operators/30CallWithinAllowance.spec.ts b/packages/evm/test/operators/30CallWithinAllowance.spec.ts index 9653a951e..0aa3ed75f 100644 --- a/packages/evm/test/operators/30CallWithinAllowance.spec.ts +++ b/packages/evm/test/operators/30CallWithinAllowance.spec.ts @@ -79,7 +79,7 @@ describe("Operator - CallWithinAllowance", async () => { [ { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, @@ -266,13 +266,13 @@ describe("Operator - CallWithinAllowance", async () => { }, { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, { parent: 0, - paramType: ParameterType.AbiEncoded, + paramType: ParameterType.Calldata, operator: Operator.Matches, compValue: "0x", }, diff --git a/packages/evm/test/utils.ts b/packages/evm/test/utils.ts index f89997d89..fc23e82af 100644 --- a/packages/evm/test/utils.ts +++ b/packages/evm/test/utils.ts @@ -43,7 +43,7 @@ export enum ParameterType { Dynamic, Tuple, Array, - AbiEncoded, + Calldata, } export enum Operator { From b064fb86ef6501969ac9599f31c98c1c67f5e55a Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Thu, 29 Jun 2023 13:18:27 +0100 Subject: [PATCH 02/43] Diving Decoder tests in several files --- packages/evm/test/decoder/Decoder.spec.ts | 930 ++++++++++++++++++ .../OldTests.spec.ts} | 899 +---------------- 2 files changed, 931 insertions(+), 898 deletions(-) create mode 100644 packages/evm/test/decoder/Decoder.spec.ts rename packages/evm/test/{Decoder.spec.ts => decoder/OldTests.spec.ts} (58%) diff --git a/packages/evm/test/decoder/Decoder.spec.ts b/packages/evm/test/decoder/Decoder.spec.ts new file mode 100644 index 000000000..807fc1aac --- /dev/null +++ b/packages/evm/test/decoder/Decoder.spec.ts @@ -0,0 +1,930 @@ +import hre from "hardhat"; +import assert from "assert"; +import { expect } from "chai"; +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; + +import { AddressOne } from "@gnosis.pm/safe-contracts"; +import { BigNumber } from "ethers"; +import { defaultAbiCoder } from "ethers/lib/utils"; + +import { Operator, ParameterType } from "../utils"; + +const YesRemoveOffset = true; +const DontRemoveOffset = false; + +describe("Decoder library", async () => { + async function setup() { + const TestEncoder = await hre.ethers.getContractFactory("TestEncoder"); + const testEncoder = await TestEncoder.deploy(); + + const MockDecoder = await hre.ethers.getContractFactory("MockDecoder"); + const decoder = await MockDecoder.deploy(); + + return { + testEncoder, + decoder, + }; + } + + it("pluck fails if calldata is too short", async () => { + const { testEncoder, decoder } = await loadFixture(setup); + + const { data } = await testEncoder.populateTransaction.dynamicTuple({ + dynamic: "0xaabbccdd", + _static: 234, + dynamic32: [], + }); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Tuple, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Array, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }, + ], + }; + + await expect(decoder.inspect((data as string).slice(0, -64), layout)).to.be + .reverted; + }); + it("pluck fails with param scoped out of bounds", async () => { + const { testEncoder, decoder } = await loadFixture(setup); + + const { data } = await testEncoder.populateTransaction.staticFn( + "0xaabbccdd" + ); + + assert(data); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }; + + const result = await decoder.inspect(data, layout); + + await expect( + decoder.pluck(data, result.children[1].location, result.children[1].size) + ).to.be.reverted; + }); + + it("plucks Static from top level", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + // (bytes2[],string,uint32) + + const { data } = + await testEncoder.populateTransaction.dynamic32DynamicStatic( + ["0xaabb", "0x1234", "0xff33"], + "Hello World!", + 123456789 + ); + + assert(data); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Array, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }; + + const result = await decoder.inspect(data, layout); + expect( + await decoder.pluck( + data, + result.children[2].location, + result.children[2].size + ) + ).to.equal(BigNumber.from(123456789)); + }); + it("plucks Static from Tuple", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const { data } = await testEncoder.populateTransaction.staticTuple( + { + a: 1999, + b: AddressOne, + }, + 2000 + ); + + assert(data); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }; + + const result = await decoder.inspect(data as string, layout); + + expect( + await decoder.pluck( + data, + result.children[0].location, + result.children[0].size + ) + ).to.equal(encode(["uint256"], [1999])); + + expect( + await decoder.pluck( + data, + result.children[1].location, + result.children[1].size + ) + ).to.equal( + encode(["address"], ["0x0000000000000000000000000000000000000001"]) + ); + }); + it("plucks Static from Array", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + // function arrayStaticTupleItems(tuple(uint256 a, address b)[]) + const { data } = + await testEncoder.populateTransaction.arrayStaticTupleItems([ + { + a: 95623, + b: "0x00000000219ab540356cbb839cbe05303d7705fa", + }, + { + a: 11542, + b: "0x0716a17fbaee714f1e6ab0f9d59edbc5f09815c0", + }, + ]); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Array, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Tuple, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }, + ], + }; + const result = await decoder.inspect(data as string, layout); + const arrayEntry2 = result.children[0].children[1]; + expect( + await decoder.pluck( + data as string, + arrayEntry2.children[0].location, + arrayEntry2.children[0].size + ) + ).to.equal(encode(["uint256"], [11542], DontRemoveOffset)); + + expect( + await decoder.pluck( + data as string, + arrayEntry2.children[1].location, + arrayEntry2.children[1].size + ) + ).to.equal( + encode( + ["address"], + ["0x0716a17fbaee714f1e6ab0f9d59edbc5f09815c0"], + DontRemoveOffset + ) + ); + }); + it("plucks Static from nested AbiEncoded", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const staticValue = 98712; + const bytesValue = "0xaa22330d5a"; + + const { data: nestedData } = + await testEncoder.populateTransaction.staticDynamic( + staticValue, + bytesValue + ); + + const { data } = await testEncoder.populateTransaction.dynamic( + nestedData as string + ); + + const nestedLayout = { + paramType: ParameterType.Calldata, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + ], + }; + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Pass, + children: [nestedLayout], + }; + + const result = await decoder.inspect(data as string, layout); + + const staticNode = result.children[0].children[0]; + expect( + await decoder.pluck(data as string, staticNode.location, staticNode.size) + ).to.equal(encode(["uint256"], [staticValue], DontRemoveOffset)); + + const dynamicNode = result.children[0].children[1]; + expect( + await decoder.pluck( + data as string, + dynamicNode.location, + dynamicNode.size + ) + ).to.equal(encode(["bytes"], [bytesValue], YesRemoveOffset)); + }); + + it("plucks Dynamic from top level", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const { data } = + await testEncoder.populateTransaction.dynamic32DynamicStatic( + [], + "Hello World!", + 123456789 + ); + + assert(data); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Array, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }; + + const result = await decoder.inspect(data, layout); + + expect( + await decoder.pluck( + data, + result.children[1].location, + result.children[1].size + ) + ).to.equal(encode(["string"], ["Hello World!"], YesRemoveOffset)); + }); + it("plucks Dynamic from Tuple", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const { data } = await testEncoder.populateTransaction._dynamicTuple({ + dynamic: "0xabcd0011", + }); + + assert(data); + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Tuple, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data, layout); + + expect( + await decoder.pluck( + data, + result.children[0].location, + result.children[0].size + ) + ).to.equal(encode(["tuple(bytes)"], [["0xabcd0011"]], YesRemoveOffset)); + }); + it("plucks Dynamic from Array", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const { data } = await testEncoder.populateTransaction.dynamicArray([ + "0xaabbccdd", + "0x004466ff", + ]); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Array, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data as string, layout); + + const arrayElement0 = result.children[0].children[0]; + const arrayElement1 = result.children[0].children[1]; + expect( + await decoder.pluck( + data as string, + arrayElement0.location, + arrayElement0.size + ) + ).to.equal(encode(["bytes"], ["0xaabbccdd"], YesRemoveOffset)); + + expect( + await decoder.pluck( + data as string, + arrayElement1.location, + arrayElement1.size + ) + ).to.equal(encode(["bytes"], ["0x004466ff"], YesRemoveOffset)); + }); + it("plucks Dynamic from nested AbiEncoded", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const { data: nestedData } = + await testEncoder.populateTransaction.dynamicStaticDynamic32( + "0xbadfed", + true, + ["0xccdd"] + ); + + assert(nestedData); + + const { data } = await testEncoder.populateTransaction._dynamicTuple({ + dynamic: nestedData, + }); + + const nestedLayout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Array, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }; + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Tuple, + operator: Operator.Pass, + children: [nestedLayout], + }, + ], + }; + + const result = await decoder.inspect(data as string, layout); + + const tupleField = result.children[0].children[0].children[0]; + expect( + await decoder.pluck(data as string, tupleField.location, tupleField.size) + ).to.equal(encode(["bytes"], ["0xbadfed"], YesRemoveOffset)); + }); + + it.skip("plucks Tuple from top level"); + it.skip("plucks Tuple from Tuple"); + it.skip("plucks Tuple from Array"); + it.skip("plucks Tuple from nested AbiEncoded"); + it("plucks Tuple with multiple dynamic fields", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const { data } = await testEncoder.populateTransaction.multiDynamicTuple({ + a: "0xaa", + b: 123, + c: "0xbadfed", + d: [2, 3, 4], + }); + + assert(data); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Tuple, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Array, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data as string, layout); + + const field1 = result.children[0].children[0]; + const field2 = result.children[0].children[1]; + const field3 = result.children[0].children[2]; + const field4 = result.children[0].children[3]; + + expect( + await decoder.pluck(data as string, field1.location, field1.size) + ).to.equal(encode(["bytes"], ["0xaa"], YesRemoveOffset)); + + expect( + await decoder.pluck(data as string, field2.location, field2.size) + ).to.equal(encode(["uint256"], [123], DontRemoveOffset)); + + expect( + await decoder.pluck(data as string, field3.location, field3.size) + ).to.equal(encode(["bytes"], ["0xbadfed"], YesRemoveOffset)); + + expect( + await decoder.pluck(data as string, field4.location, field4.size) + ).to.equal(encode(["uint256[]"], [[2, 3, 4]], YesRemoveOffset)); + }); + + it.skip("plucks Array from top level"); + it.skip("plucks Array from Tuple"); + it.skip("plucks Array from Array"); + it.skip("plucks Array from nested AbiEncoded"); + + describe("TypeTree", async () => { + it("top level variants get unfolded to its entrypoint form", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const { data } = await testEncoder.populateTransaction.staticDynamic( + 123, + "0xaabbccddeeff" + ); + assert(data); + + const layout = { + paramType: ParameterType.None, + operator: Operator.Or, + children: [ + { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Dynamic, + operator: Operator.EqualTo, + children: [], + }, + ], + }, + { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.EqualTo, + children: [], + }, + { + paramType: ParameterType.Dynamic, + operator: Operator.EqualTo, + children: [], + }, + ], + }, + { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.EqualTo, + children: [], + }, + { + paramType: ParameterType.Dynamic, + operator: Operator.EqualTo, + children: [], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data, layout); + expect(await decoder.pluck(data, result.location, result.size)).to.equal( + data + ); + + const firstParam = result.children[0]; + expect( + await decoder.pluck(data, firstParam.location, firstParam.size) + ).to.equal(encode(["uint256"], [123])); + + const secondParam = result.children[1]; + expect( + await decoder.pluck(data, secondParam.location, secondParam.size) + ).to.equal(encode(["bytes"], ["0xaabbccddeeff"], YesRemoveOffset)); + }); + it("And gets unfolded to Static", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const { data } = await testEncoder.populateTransaction.staticFn( + "0xeeff3344" + ); + + assert(data); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.None, + operator: Operator.And, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.EqualTo, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.EqualTo, + children: [], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data, layout); + const staticField = result.children[0]; + expect( + await decoder.pluck(data, staticField.location, staticField.size) + ).to.equal(encode(["bytes4"], ["0xeeff3344"], DontRemoveOffset)); + }); + it("Or gets unfolded to Array - From Tuple", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const { data } = await testEncoder.populateTransaction.dynamicTuple({ + dynamic: "0xaabb", + _static: 88221, + dynamic32: [1, 2, 3, 4, 5], + }); + + assert(data); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Tuple, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.None, + operator: Operator.Or, + children: [ + { + paramType: ParameterType.Array, + operator: Operator.EqualTo, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.EqualTo, + children: [], + }, + ], + }, + { + paramType: ParameterType.Array, + operator: Operator.EqualTo, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.EqualTo, + children: [], + }, + ], + }, + ], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data, layout); + + const tupleField = result.children[0]; + expect( + await decoder.pluck(data, tupleField.location, tupleField.size) + ).to.equal( + encode( + ["tuple(bytes,uint256,uint256[])"], + [["0xaabb", 88221, [1, 2, 3, 4, 5]]], + YesRemoveOffset + ) + ); + + const arrayField = result.children[0].children[2]; + expect( + await decoder.pluck(data, arrayField.location, arrayField.size) + ).to.equal(encode(["uint256[]"], [[1, 2, 3, 4, 5]], YesRemoveOffset)); + }); + it("Or gets unfolded to Static - From Array", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const { data } = await testEncoder.populateTransaction.dynamicTuple({ + dynamic: "0xaabb", + _static: 88221, + dynamic32: [7, 8, 9], + }); + + assert(data); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Tuple, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Array, + operator: Operator.EqualTo, + children: [ + { + paramType: ParameterType.None, + operator: Operator.Or, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.EqualTo, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.EqualTo, + children: [], + }, + ], + }, + ], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data, layout); + + const tupleField = result.children[0]; + expect( + await decoder.pluck(data, tupleField.location, tupleField.size) + ).to.equal( + encode( + ["tuple(bytes,uint256,uint256[])"], + [["0xaabb", 88221, [7, 8, 9]]], + YesRemoveOffset + ) + ); + + const arrayField = result.children[0].children[2]; + expect( + await decoder.pluck(data, arrayField.location, arrayField.size) + ).to.equal(encode(["uint256[]"], [[7, 8, 9]], YesRemoveOffset)); + }); + it("extraneous Value in AbiEncoded gets inspected as None", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + const { data } = await testEncoder.populateTransaction.staticFn( + "0xeeff3344" + ); + assert(data); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.None, + operator: Operator.EtherWithinAllowance, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.EqualTo, + children: [], + }, + ], + }; + + const result = await decoder.inspect(data, layout); + + const extraneousField = result.children[0]; + expect(extraneousField.location).to.equal(4); + expect(extraneousField.size).to.equal(0); + + const staticField = result.children[1]; + expect(staticField.location).to.equal(4); + expect(staticField.size).to.equal(32); + }); + }); +}); + +function encode(types: any, values: any, removeOffset = false) { + const result = defaultAbiCoder.encode(types, values); + return removeOffset ? `0x${result.slice(66)}` : result; +} diff --git a/packages/evm/test/Decoder.spec.ts b/packages/evm/test/decoder/OldTests.spec.ts similarity index 58% rename from packages/evm/test/Decoder.spec.ts rename to packages/evm/test/decoder/OldTests.spec.ts index 3c56c43d2..36771de45 100644 --- a/packages/evm/test/Decoder.spec.ts +++ b/packages/evm/test/decoder/OldTests.spec.ts @@ -7,7 +7,7 @@ import { AddressOne } from "@gnosis.pm/safe-contracts"; import { BigNumber } from "ethers"; import { defaultAbiCoder } from "ethers/lib/utils"; -import { Operator, ParameterType } from "./utils"; +import { Operator, ParameterType } from "../utils"; const YesRemoveOffset = true; const DontRemoveOffset = false; @@ -26,903 +26,6 @@ describe("Decoder library", async () => { }; } - it("pluck fails if calldata is too short", async () => { - const { testEncoder, decoder } = await loadFixture(setup); - - const { data } = await testEncoder.populateTransaction.dynamicTuple({ - dynamic: "0xaabbccdd", - _static: 234, - dynamic32: [], - }); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Tuple, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Array, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }, - ], - }, - ], - }; - - await expect(decoder.inspect((data as string).slice(0, -64), layout)).to.be - .reverted; - }); - it("pluck fails with param scoped out of bounds", async () => { - const { testEncoder, decoder } = await loadFixture(setup); - - const { data } = await testEncoder.populateTransaction.staticFn( - "0xaabbccdd" - ); - - assert(data); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }; - - const result = await decoder.inspect(data, layout); - - await expect( - decoder.pluck(data, result.children[1].location, result.children[1].size) - ).to.be.reverted; - }); - - it("plucks Static from top level", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - // (bytes2[],string,uint32) - - const { data } = - await testEncoder.populateTransaction.dynamic32DynamicStatic( - ["0xaabb", "0x1234", "0xff33"], - "Hello World!", - 123456789 - ); - - assert(data); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Array, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }, - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }; - - const result = await decoder.inspect(data, layout); - expect( - await decoder.pluck( - data, - result.children[2].location, - result.children[2].size - ) - ).to.equal(BigNumber.from(123456789)); - }); - it("plucks Static from Tuple", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const { data } = await testEncoder.populateTransaction.staticTuple( - { - a: 1999, - b: AddressOne, - }, - 2000 - ); - - assert(data); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }; - - const result = await decoder.inspect(data as string, layout); - - expect( - await decoder.pluck( - data, - result.children[0].location, - result.children[0].size - ) - ).to.equal(encode(["uint256"], [1999])); - - expect( - await decoder.pluck( - data, - result.children[1].location, - result.children[1].size - ) - ).to.equal( - encode(["address"], ["0x0000000000000000000000000000000000000001"]) - ); - }); - it("plucks Static from Array", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - // function arrayStaticTupleItems(tuple(uint256 a, address b)[]) - const { data } = - await testEncoder.populateTransaction.arrayStaticTupleItems([ - { - a: 95623, - b: "0x00000000219ab540356cbb839cbe05303d7705fa", - }, - { - a: 11542, - b: "0x0716a17fbaee714f1e6ab0f9d59edbc5f09815c0", - }, - ]); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Array, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Tuple, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }, - ], - }, - ], - }; - const result = await decoder.inspect(data as string, layout); - const arrayEntry2 = result.children[0].children[1]; - expect( - await decoder.pluck( - data as string, - arrayEntry2.children[0].location, - arrayEntry2.children[0].size - ) - ).to.equal(encode(["uint256"], [11542], DontRemoveOffset)); - - expect( - await decoder.pluck( - data as string, - arrayEntry2.children[1].location, - arrayEntry2.children[1].size - ) - ).to.equal( - encode( - ["address"], - ["0x0716a17fbaee714f1e6ab0f9d59edbc5f09815c0"], - DontRemoveOffset - ) - ); - }); - it("plucks Static from nested AbiEncoded", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const staticValue = 98712; - const bytesValue = "0xaa22330d5a"; - - const { data: nestedData } = - await testEncoder.populateTransaction.staticDynamic( - staticValue, - bytesValue - ); - - const { data } = await testEncoder.populateTransaction.dynamic( - nestedData as string - ); - - const nestedLayout = { - paramType: ParameterType.Calldata, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - ], - }; - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Pass, - children: [nestedLayout], - }; - - const result = await decoder.inspect(data as string, layout); - - const staticNode = result.children[0].children[0]; - expect( - await decoder.pluck(data as string, staticNode.location, staticNode.size) - ).to.equal(encode(["uint256"], [staticValue], DontRemoveOffset)); - - const dynamicNode = result.children[0].children[1]; - expect( - await decoder.pluck( - data as string, - dynamicNode.location, - dynamicNode.size - ) - ).to.equal(encode(["bytes"], [bytesValue], YesRemoveOffset)); - }); - - it("plucks Dynamic from top level", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const { data } = - await testEncoder.populateTransaction.dynamic32DynamicStatic( - [], - "Hello World!", - 123456789 - ); - - assert(data); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Array, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }, - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }; - - const result = await decoder.inspect(data, layout); - - expect( - await decoder.pluck( - data, - result.children[1].location, - result.children[1].size - ) - ).to.equal(encode(["string"], ["Hello World!"], YesRemoveOffset)); - }); - it("plucks Dynamic from Tuple", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const { data } = await testEncoder.populateTransaction._dynamicTuple({ - dynamic: "0xabcd0011", - }); - - assert(data); - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Tuple, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - ], - }, - ], - }; - - const result = await decoder.inspect(data, layout); - - expect( - await decoder.pluck( - data, - result.children[0].location, - result.children[0].size - ) - ).to.equal(encode(["tuple(bytes)"], [["0xabcd0011"]], YesRemoveOffset)); - }); - it("plucks Dynamic from Array", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const { data } = await testEncoder.populateTransaction.dynamicArray([ - "0xaabbccdd", - "0x004466ff", - ]); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Array, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - ], - }, - ], - }; - - const result = await decoder.inspect(data as string, layout); - - const arrayElement0 = result.children[0].children[0]; - const arrayElement1 = result.children[0].children[1]; - expect( - await decoder.pluck( - data as string, - arrayElement0.location, - arrayElement0.size - ) - ).to.equal(encode(["bytes"], ["0xaabbccdd"], YesRemoveOffset)); - - expect( - await decoder.pluck( - data as string, - arrayElement1.location, - arrayElement1.size - ) - ).to.equal(encode(["bytes"], ["0x004466ff"], YesRemoveOffset)); - }); - it("plucks Dynamic from nested AbiEncoded", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const { data: nestedData } = - await testEncoder.populateTransaction.dynamicStaticDynamic32( - "0xbadfed", - true, - ["0xccdd"] - ); - - assert(nestedData); - - const { data } = await testEncoder.populateTransaction._dynamicTuple({ - dynamic: nestedData, - }); - - const nestedLayout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Array, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }, - ], - }; - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Tuple, - operator: Operator.Pass, - children: [nestedLayout], - }, - ], - }; - - const result = await decoder.inspect(data as string, layout); - - const tupleField = result.children[0].children[0].children[0]; - expect( - await decoder.pluck(data as string, tupleField.location, tupleField.size) - ).to.equal(encode(["bytes"], ["0xbadfed"], YesRemoveOffset)); - }); - - it.skip("plucks Tuple from top level"); - it.skip("plucks Tuple from Tuple"); - it.skip("plucks Tuple from Array"); - it.skip("plucks Tuple from nested AbiEncoded"); - it("plucks Tuple with multiple dynamic fields", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const { data } = await testEncoder.populateTransaction.multiDynamicTuple({ - a: "0xaa", - b: 123, - c: "0xbadfed", - d: [2, 3, 4], - }); - - assert(data); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Tuple, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Array, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }, - ], - }, - ], - }; - - const result = await decoder.inspect(data as string, layout); - - const field1 = result.children[0].children[0]; - const field2 = result.children[0].children[1]; - const field3 = result.children[0].children[2]; - const field4 = result.children[0].children[3]; - - expect( - await decoder.pluck(data as string, field1.location, field1.size) - ).to.equal(encode(["bytes"], ["0xaa"], YesRemoveOffset)); - - expect( - await decoder.pluck(data as string, field2.location, field2.size) - ).to.equal(encode(["uint256"], [123], DontRemoveOffset)); - - expect( - await decoder.pluck(data as string, field3.location, field3.size) - ).to.equal(encode(["bytes"], ["0xbadfed"], YesRemoveOffset)); - - expect( - await decoder.pluck(data as string, field4.location, field4.size) - ).to.equal(encode(["uint256[]"], [[2, 3, 4]], YesRemoveOffset)); - }); - - it.skip("plucks Array from top level"); - it.skip("plucks Array from Tuple"); - it.skip("plucks Array from Array"); - it.skip("plucks Array from nested AbiEncoded"); - - describe("TypeTree", async () => { - it("top level variants get unfolded to its entrypoint form", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const { data } = await testEncoder.populateTransaction.staticDynamic( - 123, - "0xaabbccddeeff" - ); - assert(data); - - const layout = { - paramType: ParameterType.None, - operator: Operator.Or, - children: [ - { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Dynamic, - operator: Operator.EqualTo, - children: [], - }, - ], - }, - { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.EqualTo, - children: [], - }, - { - paramType: ParameterType.Dynamic, - operator: Operator.EqualTo, - children: [], - }, - ], - }, - { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.EqualTo, - children: [], - }, - { - paramType: ParameterType.Dynamic, - operator: Operator.EqualTo, - children: [], - }, - ], - }, - ], - }; - - const result = await decoder.inspect(data, layout); - expect(await decoder.pluck(data, result.location, result.size)).to.equal( - data - ); - - const firstParam = result.children[0]; - expect( - await decoder.pluck(data, firstParam.location, firstParam.size) - ).to.equal(encode(["uint256"], [123])); - - const secondParam = result.children[1]; - expect( - await decoder.pluck(data, secondParam.location, secondParam.size) - ).to.equal(encode(["bytes"], ["0xaabbccddeeff"], YesRemoveOffset)); - }); - it("And gets unfolded to Static", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const { data } = await testEncoder.populateTransaction.staticFn( - "0xeeff3344" - ); - - assert(data); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.None, - operator: Operator.And, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.EqualTo, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.EqualTo, - children: [], - }, - ], - }, - ], - }; - - const result = await decoder.inspect(data, layout); - const staticField = result.children[0]; - expect( - await decoder.pluck(data, staticField.location, staticField.size) - ).to.equal(encode(["bytes4"], ["0xeeff3344"], DontRemoveOffset)); - }); - it("Or gets unfolded to Array - From Tuple", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const { data } = await testEncoder.populateTransaction.dynamicTuple({ - dynamic: "0xaabb", - _static: 88221, - dynamic32: [1, 2, 3, 4, 5], - }); - - assert(data); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Tuple, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.None, - operator: Operator.Or, - children: [ - { - paramType: ParameterType.Array, - operator: Operator.EqualTo, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.EqualTo, - children: [], - }, - ], - }, - { - paramType: ParameterType.Array, - operator: Operator.EqualTo, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.EqualTo, - children: [], - }, - ], - }, - ], - }, - ], - }, - ], - }; - - const result = await decoder.inspect(data, layout); - - const tupleField = result.children[0]; - expect( - await decoder.pluck(data, tupleField.location, tupleField.size) - ).to.equal( - encode( - ["tuple(bytes,uint256,uint256[])"], - [["0xaabb", 88221, [1, 2, 3, 4, 5]]], - YesRemoveOffset - ) - ); - - const arrayField = result.children[0].children[2]; - expect( - await decoder.pluck(data, arrayField.location, arrayField.size) - ).to.equal(encode(["uint256[]"], [[1, 2, 3, 4, 5]], YesRemoveOffset)); - }); - it("Or gets unfolded to Static - From Array", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const { data } = await testEncoder.populateTransaction.dynamicTuple({ - dynamic: "0xaabb", - _static: 88221, - dynamic32: [7, 8, 9], - }); - - assert(data); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Tuple, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Array, - operator: Operator.EqualTo, - children: [ - { - paramType: ParameterType.None, - operator: Operator.Or, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.EqualTo, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.EqualTo, - children: [], - }, - ], - }, - ], - }, - ], - }, - ], - }; - - const result = await decoder.inspect(data, layout); - - const tupleField = result.children[0]; - expect( - await decoder.pluck(data, tupleField.location, tupleField.size) - ).to.equal( - encode( - ["tuple(bytes,uint256,uint256[])"], - [["0xaabb", 88221, [7, 8, 9]]], - YesRemoveOffset - ) - ); - - const arrayField = result.children[0].children[2]; - expect( - await decoder.pluck(data, arrayField.location, arrayField.size) - ).to.equal(encode(["uint256[]"], [[7, 8, 9]], YesRemoveOffset)); - }); - it("extraneous Value in AbiEncoded gets inspected as None", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - const { data } = await testEncoder.populateTransaction.staticFn( - "0xeeff3344" - ); - assert(data); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.None, - operator: Operator.EtherWithinAllowance, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.EqualTo, - children: [], - }, - ], - }; - - const result = await decoder.inspect(data, layout); - - const extraneousField = result.children[0]; - expect(extraneousField.location).to.equal(4); - expect(extraneousField.size).to.equal(0); - - const staticField = result.children[1]; - expect(staticField.location).to.equal(4); - expect(staticField.size).to.equal(32); - }); - }); - describe("old decoder tests", async () => { it("plucks (dynamic) empty buffer from encoded caldata", async () => { const { testEncoder, decoder } = await loadFixture(setup); From 300546dd1a2197668a1435a6969dda70436c4dc7 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Thu, 29 Jun 2023 17:24:44 +0100 Subject: [PATCH 03/43] Separate Static decoder tests --- packages/evm/test/decoder/Decoder.spec.ts | 230 ---------------- .../test/decoder/ParameterTypeStatic.spec.ts | 249 ++++++++++++++++++ 2 files changed, 249 insertions(+), 230 deletions(-) create mode 100644 packages/evm/test/decoder/ParameterTypeStatic.spec.ts diff --git a/packages/evm/test/decoder/Decoder.spec.ts b/packages/evm/test/decoder/Decoder.spec.ts index 807fc1aac..28e88ce0c 100644 --- a/packages/evm/test/decoder/Decoder.spec.ts +++ b/packages/evm/test/decoder/Decoder.spec.ts @@ -105,236 +105,6 @@ describe("Decoder library", async () => { ).to.be.reverted; }); - it("plucks Static from top level", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - // (bytes2[],string,uint32) - - const { data } = - await testEncoder.populateTransaction.dynamic32DynamicStatic( - ["0xaabb", "0x1234", "0xff33"], - "Hello World!", - 123456789 - ); - - assert(data); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Array, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }, - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }; - - const result = await decoder.inspect(data, layout); - expect( - await decoder.pluck( - data, - result.children[2].location, - result.children[2].size - ) - ).to.equal(BigNumber.from(123456789)); - }); - it("plucks Static from Tuple", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const { data } = await testEncoder.populateTransaction.staticTuple( - { - a: 1999, - b: AddressOne, - }, - 2000 - ); - - assert(data); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }; - - const result = await decoder.inspect(data as string, layout); - - expect( - await decoder.pluck( - data, - result.children[0].location, - result.children[0].size - ) - ).to.equal(encode(["uint256"], [1999])); - - expect( - await decoder.pluck( - data, - result.children[1].location, - result.children[1].size - ) - ).to.equal( - encode(["address"], ["0x0000000000000000000000000000000000000001"]) - ); - }); - it("plucks Static from Array", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - // function arrayStaticTupleItems(tuple(uint256 a, address b)[]) - const { data } = - await testEncoder.populateTransaction.arrayStaticTupleItems([ - { - a: 95623, - b: "0x00000000219ab540356cbb839cbe05303d7705fa", - }, - { - a: 11542, - b: "0x0716a17fbaee714f1e6ab0f9d59edbc5f09815c0", - }, - ]); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Array, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Tuple, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }, - ], - }, - ], - }; - const result = await decoder.inspect(data as string, layout); - const arrayEntry2 = result.children[0].children[1]; - expect( - await decoder.pluck( - data as string, - arrayEntry2.children[0].location, - arrayEntry2.children[0].size - ) - ).to.equal(encode(["uint256"], [11542], DontRemoveOffset)); - - expect( - await decoder.pluck( - data as string, - arrayEntry2.children[1].location, - arrayEntry2.children[1].size - ) - ).to.equal( - encode( - ["address"], - ["0x0716a17fbaee714f1e6ab0f9d59edbc5f09815c0"], - DontRemoveOffset - ) - ); - }); - it("plucks Static from nested AbiEncoded", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const staticValue = 98712; - const bytesValue = "0xaa22330d5a"; - - const { data: nestedData } = - await testEncoder.populateTransaction.staticDynamic( - staticValue, - bytesValue - ); - - const { data } = await testEncoder.populateTransaction.dynamic( - nestedData as string - ); - - const nestedLayout = { - paramType: ParameterType.Calldata, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - ], - }; - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Pass, - children: [nestedLayout], - }; - - const result = await decoder.inspect(data as string, layout); - - const staticNode = result.children[0].children[0]; - expect( - await decoder.pluck(data as string, staticNode.location, staticNode.size) - ).to.equal(encode(["uint256"], [staticValue], DontRemoveOffset)); - - const dynamicNode = result.children[0].children[1]; - expect( - await decoder.pluck( - data as string, - dynamicNode.location, - dynamicNode.size - ) - ).to.equal(encode(["bytes"], [bytesValue], YesRemoveOffset)); - }); - it("plucks Dynamic from top level", async () => { const { decoder, testEncoder } = await loadFixture(setup); diff --git a/packages/evm/test/decoder/ParameterTypeStatic.spec.ts b/packages/evm/test/decoder/ParameterTypeStatic.spec.ts new file mode 100644 index 000000000..dbea344e2 --- /dev/null +++ b/packages/evm/test/decoder/ParameterTypeStatic.spec.ts @@ -0,0 +1,249 @@ +import hre from "hardhat"; +import assert from "assert"; +import { expect } from "chai"; +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; + +import { AddressOne } from "@gnosis.pm/safe-contracts"; +import { BigNumber } from "ethers"; +import { Interface, defaultAbiCoder } from "ethers/lib/utils"; + +import { Operator, ParameterType } from "../utils"; + +const DontRemoveOffset = false; + +describe("Decoder library", async () => { + async function setup() { + const TestEncoder = await hre.ethers.getContractFactory("TestEncoder"); + const testEncoder = await TestEncoder.deploy(); + + const MockDecoder = await hre.ethers.getContractFactory("MockDecoder"); + const decoder = await MockDecoder.deploy(); + + return { + testEncoder, + decoder, + }; + } + + describe.only("Static", () => { + it("plucks Static from top level", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + // (bytes2[],string,uint32) + + const { data } = + await testEncoder.populateTransaction.dynamic32DynamicStatic( + ["0xaabb", "0x1234", "0xff33"], + "Hello World!", + 123456789 + ); + + assert(data); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Array, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }; + + const result = await decoder.inspect(data, layout); + expect( + await decoder.pluck( + data, + result.children[2].location, + result.children[2].size + ) + ).to.equal(BigNumber.from(123456789)); + }); + it("plucks Static from Tuple", async () => { + const { decoder } = await loadFixture(setup); + + const iface = new Interface([ + "function fn(tuple(uint256 a, address b) staticTupleValue)", + ]); + const data = iface.encodeFunctionData("fn", [[1999, AddressOne]]); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Tuple, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data as string, layout); + + expect( + await decoder.pluck( + data, + result.children[0].location, + result.children[0].children[0].size + ) + ).to.equal(encode(["uint256"], [1999])); + + expect( + await decoder.pluck( + data, + result.children[0].children[1].location, + result.children[0].children[1].size + ) + ).to.equal( + encode(["address"], ["0x0000000000000000000000000000000000000001"]) + ); + }); + it("plucks Static from Array", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + // function arrayStaticTupleItems(tuple(uint256 a, address b)[]) + const { data } = + await testEncoder.populateTransaction.arrayStaticTupleItems([ + { + a: 95623, + b: "0x00000000219ab540356cbb839cbe05303d7705fa", + }, + { + a: 11542, + b: "0x0716a17fbaee714f1e6ab0f9d59edbc5f09815c0", + }, + ]); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Array, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Tuple, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }, + ], + }; + const result = await decoder.inspect(data as string, layout); + const arrayEntry2 = result.children[0].children[1]; + expect( + await decoder.pluck( + data as string, + arrayEntry2.children[0].location, + arrayEntry2.children[0].size + ) + ).to.equal(encode(["uint256"], [11542], DontRemoveOffset)); + + expect( + await decoder.pluck( + data as string, + arrayEntry2.children[1].location, + arrayEntry2.children[1].size + ) + ).to.equal( + encode( + ["address"], + ["0x0716a17fbaee714f1e6ab0f9d59edbc5f09815c0"], + DontRemoveOffset + ) + ); + }); + it("plucks Static from embedded AbiEncoded", async () => { + const { decoder } = await loadFixture(setup); + + const iface = new Interface([ + "function a(bytes embedded)", + "function b(uint256 staticValue)", + ]); + + const staticValue = 98712; + + const data = iface.encodeFunctionData("a", [ + iface.encodeFunctionData("b", [staticValue]), + ]); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Pass, + children: [ + { + // Embedded starts here + paramType: ParameterType.Calldata, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data as string, layout); + + const staticNode = result.children[0].children[0]; + expect( + await decoder.pluck( + data as string, + staticNode.location, + staticNode.size + ) + ).to.equal(encode(["uint256"], [staticValue], DontRemoveOffset)); + }); + }); +}); + +function encode(types: any, values: any, removeOffset = false) { + const result = defaultAbiCoder.encode(types, values); + return removeOffset ? `0x${result.slice(66)}` : result; +} From 5ccfa01f9a270db6c56a5583a5bafc84fe979942 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Thu, 29 Jun 2023 19:10:19 +0100 Subject: [PATCH 04/43] Extract Decoder Dynamic tests --- packages/evm/test/decoder/Decoder.spec.ts | 198 ------------ .../test/decoder/ParameterTypeDynamic.spec.ts | 298 ++++++++++++++++++ .../test/decoder/ParameterTypeStatic.spec.ts | 4 +- 3 files changed, 301 insertions(+), 199 deletions(-) create mode 100644 packages/evm/test/decoder/ParameterTypeDynamic.spec.ts diff --git a/packages/evm/test/decoder/Decoder.spec.ts b/packages/evm/test/decoder/Decoder.spec.ts index 28e88ce0c..cda0d10c0 100644 --- a/packages/evm/test/decoder/Decoder.spec.ts +++ b/packages/evm/test/decoder/Decoder.spec.ts @@ -3,8 +3,6 @@ import assert from "assert"; import { expect } from "chai"; import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; -import { AddressOne } from "@gnosis.pm/safe-contracts"; -import { BigNumber } from "ethers"; import { defaultAbiCoder } from "ethers/lib/utils"; import { Operator, ParameterType } from "../utils"; @@ -105,202 +103,6 @@ describe("Decoder library", async () => { ).to.be.reverted; }); - it("plucks Dynamic from top level", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const { data } = - await testEncoder.populateTransaction.dynamic32DynamicStatic( - [], - "Hello World!", - 123456789 - ); - - assert(data); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Array, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }, - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }; - - const result = await decoder.inspect(data, layout); - - expect( - await decoder.pluck( - data, - result.children[1].location, - result.children[1].size - ) - ).to.equal(encode(["string"], ["Hello World!"], YesRemoveOffset)); - }); - it("plucks Dynamic from Tuple", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const { data } = await testEncoder.populateTransaction._dynamicTuple({ - dynamic: "0xabcd0011", - }); - - assert(data); - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Tuple, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - ], - }, - ], - }; - - const result = await decoder.inspect(data, layout); - - expect( - await decoder.pluck( - data, - result.children[0].location, - result.children[0].size - ) - ).to.equal(encode(["tuple(bytes)"], [["0xabcd0011"]], YesRemoveOffset)); - }); - it("plucks Dynamic from Array", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const { data } = await testEncoder.populateTransaction.dynamicArray([ - "0xaabbccdd", - "0x004466ff", - ]); - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Array, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - ], - }, - ], - }; - - const result = await decoder.inspect(data as string, layout); - - const arrayElement0 = result.children[0].children[0]; - const arrayElement1 = result.children[0].children[1]; - expect( - await decoder.pluck( - data as string, - arrayElement0.location, - arrayElement0.size - ) - ).to.equal(encode(["bytes"], ["0xaabbccdd"], YesRemoveOffset)); - - expect( - await decoder.pluck( - data as string, - arrayElement1.location, - arrayElement1.size - ) - ).to.equal(encode(["bytes"], ["0x004466ff"], YesRemoveOffset)); - }); - it("plucks Dynamic from nested AbiEncoded", async () => { - const { decoder, testEncoder } = await loadFixture(setup); - - const { data: nestedData } = - await testEncoder.populateTransaction.dynamicStaticDynamic32( - "0xbadfed", - true, - ["0xccdd"] - ); - - assert(nestedData); - - const { data } = await testEncoder.populateTransaction._dynamicTuple({ - dynamic: nestedData, - }); - - const nestedLayout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - { - paramType: ParameterType.Array, - operator: Operator.Pass, - children: [ - { - paramType: ParameterType.Static, - operator: Operator.Pass, - children: [], - }, - ], - }, - ], - }; - - const layout = { - paramType: ParameterType.Calldata, - operator: Operator.Matches, - children: [ - { - paramType: ParameterType.Tuple, - operator: Operator.Pass, - children: [nestedLayout], - }, - ], - }; - - const result = await decoder.inspect(data as string, layout); - - const tupleField = result.children[0].children[0].children[0]; - expect( - await decoder.pluck(data as string, tupleField.location, tupleField.size) - ).to.equal(encode(["bytes"], ["0xbadfed"], YesRemoveOffset)); - }); - it.skip("plucks Tuple from top level"); it.skip("plucks Tuple from Tuple"); it.skip("plucks Tuple from Array"); diff --git a/packages/evm/test/decoder/ParameterTypeDynamic.spec.ts b/packages/evm/test/decoder/ParameterTypeDynamic.spec.ts new file mode 100644 index 000000000..bd6465dda --- /dev/null +++ b/packages/evm/test/decoder/ParameterTypeDynamic.spec.ts @@ -0,0 +1,298 @@ +import hre from "hardhat"; +import assert from "assert"; +import { expect } from "chai"; +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; + +import { Interface, defaultAbiCoder } from "ethers/lib/utils"; + +import { Operator, ParameterType } from "../utils"; + +const YesRemoveOffset = true; + +describe("Decoder library", async () => { + async function setup() { + const TestEncoder = await hre.ethers.getContractFactory("TestEncoder"); + const testEncoder = await TestEncoder.deploy(); + + const MockDecoder = await hre.ethers.getContractFactory("MockDecoder"); + const decoder = await MockDecoder.deploy(); + + return { + testEncoder, + decoder, + }; + } + + it("plucks Dynamic from top level", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const { data } = + await testEncoder.populateTransaction.dynamic32DynamicStatic( + [], + "Hello World!", + 123456789 + ); + + assert(data); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Array, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }; + + const result = await decoder.inspect(data, layout); + + expect( + await decoder.pluck( + data, + result.children[1].location, + result.children[1].size + ) + ).to.equal(encode(["string"], ["Hello World!"], YesRemoveOffset)); + }); + it("plucks Dynamic from Tuple", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const { data } = await testEncoder.populateTransaction._dynamicTuple({ + dynamic: "0xabcd0011", + }); + + assert(data); + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Tuple, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data, layout); + + expect( + await decoder.pluck( + data, + result.children[0].location, + result.children[0].size + ) + ).to.equal(encode(["tuple(bytes)"], [["0xabcd0011"]], YesRemoveOffset)); + }); + it("plucks Dynamic from Array", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const { data } = await testEncoder.populateTransaction.dynamicArray([ + "0xaabbccdd", + "0x004466ff", + ]); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Array, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data as string, layout); + + const arrayElement0 = result.children[0].children[0]; + const arrayElement1 = result.children[0].children[1]; + expect( + await decoder.pluck( + data as string, + arrayElement0.location, + arrayElement0.size + ) + ).to.equal(encode(["bytes"], ["0xaabbccdd"], YesRemoveOffset)); + + expect( + await decoder.pluck( + data as string, + arrayElement1.location, + arrayElement1.size + ) + ).to.equal(encode(["bytes"], ["0x004466ff"], YesRemoveOffset)); + }); + it("plucks Dynamic from embedded AbiEncoded", async () => { + const { decoder } = await loadFixture(setup); + + const iface = new Interface([ + "function fnOut(tuple(bytes) a)", + "function fnIn(bytes a, bool b, bytes2[] c)", + ]); + const embedded = iface.encodeFunctionData("fnIn", [ + "0xbadfed", + true, + ["0xccdd"], + ]); + + const dynamicTupleValue = [embedded]; + const data = iface.encodeFunctionData("fnOut", [dynamicTupleValue]); + + const condition = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Tuple, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Array, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data as string, condition); + + const tupleField = result.children[0].children[0].children[0]; + expect( + await decoder.pluck(data as string, tupleField.location, tupleField.size) + ).to.equal(encode(["bytes"], ["0xbadfed"], YesRemoveOffset)); + }); + it("plucks Dynamic from type equivalent branch", async () => { + const { decoder } = await loadFixture(setup); + + const iface = new Interface([ + "function fnOut(bytes a)", + "function fnIn(uint256 a, uint256 b)", + ]); + + const data = iface.encodeFunctionData("fnOut", [ + iface.encodeFunctionData("fnIn", [1234, 9876]), + ]); + + const condition = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.None, + operator: Operator.And, + children: [ + { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + { + paramType: ParameterType.Dynamic, + operator: Operator.Bitmask, + children: [], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data as string, condition); + + const all = result; + const embedded = result.children[0]; + const arg1 = result.children[0].children[0]; + const arg2 = result.children[0].children[1]; + + expect( + await decoder.pluck(data as string, all.location, all.size) + ).to.equal(data); + + expect( + await decoder.pluck(data as string, embedded.location, embedded.size) + ).to.equal( + encode(["bytes"], [iface.encodeFunctionData("fnIn", [1234, 9876])]) + ); + + expect( + await decoder.pluck(data as string, arg1.location, arg1.size) + ).to.equal(encode(["uint256"], [1234], false)); + + expect( + await decoder.pluck(data as string, arg2.location, arg2.size) + ).to.equal(encode(["uint256"], [9876], false)); + }); +}); + +function encode(types: any, values: any, removeTrailingOffset = true) { + const result = defaultAbiCoder.encode(types, values); + // should not remove for inline types + return removeTrailingOffset ? `0x${result.slice(66)}` : result; +} diff --git a/packages/evm/test/decoder/ParameterTypeStatic.spec.ts b/packages/evm/test/decoder/ParameterTypeStatic.spec.ts index dbea344e2..a3c5c48d2 100644 --- a/packages/evm/test/decoder/ParameterTypeStatic.spec.ts +++ b/packages/evm/test/decoder/ParameterTypeStatic.spec.ts @@ -25,7 +25,7 @@ describe("Decoder library", async () => { }; } - describe.only("Static", () => { + describe("Static", () => { it("plucks Static from top level", async () => { const { decoder, testEncoder } = await loadFixture(setup); @@ -77,6 +77,7 @@ describe("Decoder library", async () => { ) ).to.equal(BigNumber.from(123456789)); }); + it("plucks Static from Tuple", async () => { const { decoder } = await loadFixture(setup); @@ -196,6 +197,7 @@ describe("Decoder library", async () => { ) ); }); + it("plucks Static from embedded AbiEncoded", async () => { const { decoder } = await loadFixture(setup); From 370259101de6844809f5a2045660a046146191e7 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Fri, 30 Jun 2023 12:10:31 +0100 Subject: [PATCH 05/43] Introducing the concept of Sibling Type Match and Compatibility --- packages/evm/contracts/Integrity.sol | 35 ++++- packages/evm/test/Integrity.spec.ts | 63 +++++++++ packages/evm/test/operators/Misc.spec.ts | 158 +++++++++++++++++++++++ 3 files changed, 249 insertions(+), 7 deletions(-) create mode 100644 packages/evm/test/operators/Misc.spec.ts diff --git a/packages/evm/contracts/Integrity.sol b/packages/evm/contracts/Integrity.sol index f048fc530..ecaaba070 100644 --- a/packages/evm/contracts/Integrity.sol +++ b/packages/evm/contracts/Integrity.sol @@ -236,7 +236,7 @@ library Integrity { condition.paramType == ParameterType.Array) && childrenBounds[i].length > 1 ) { - compatiblechildTypeTree(conditions, i, childrenBounds); + _compatibleSiblingTypes(conditions, i, childrenBounds); } } @@ -251,7 +251,7 @@ library Integrity { } } - function compatiblechildTypeTree( + function _compatibleSiblingTypes( ConditionFlat[] memory conditions, uint256 index, Topology.Bounds[] memory childrenBounds @@ -259,19 +259,40 @@ library Integrity { uint256 start = childrenBounds[index].start; uint256 end = childrenBounds[index].end; - bytes32 id = typeTreeId( - Topology.typeTree(conditions, start, childrenBounds) - ); for (uint256 j = start + 1; j < end; ++j) { if ( - id != - typeTreeId(Topology.typeTree(conditions, j, childrenBounds)) + !_isTypeMatch(conditions, start, j, childrenBounds) && + !_isTypeEquivalent(conditions, start, j, childrenBounds) ) { revert UnsuitableChildTypeTree(index); } } } + function _isTypeMatch( + ConditionFlat[] memory conditions, + uint256 i, + uint256 j, + Topology.Bounds[] memory childrenBounds + ) private pure returns (bool) { + return + typeTreeId(Topology.typeTree(conditions, i, childrenBounds)) == + typeTreeId(Topology.typeTree(conditions, j, childrenBounds)); + } + + function _isTypeEquivalent( + ConditionFlat[] memory conditions, + uint256 i, + uint256 j, + Topology.Bounds[] memory childrenBounds + ) private pure returns (bool) { + return + Topology.typeTree(conditions, i, childrenBounds).paramType == + ParameterType.Calldata && + Topology.typeTree(conditions, j, childrenBounds).paramType == + ParameterType.Dynamic; + } + function typeTreeId( Topology.TypeTree memory node ) private pure returns (bytes32) { diff --git a/packages/evm/test/Integrity.spec.ts b/packages/evm/test/Integrity.spec.ts index 5f265a1e2..085aa922a 100644 --- a/packages/evm/test/Integrity.spec.ts +++ b/packages/evm/test/Integrity.spec.ts @@ -1565,6 +1565,69 @@ describe("Integrity", async () => { conditions[conditions.length - 1].paramType = ParameterType.Static; await expect(enforce(conditions)).to.not.be.reverted; }); + it("sibling type equivalence - ok", async () => { + const { integrity, enforce } = await loadFixture(setup); + + const conditions = [ + { + parent: 0, + paramType: ParameterType.None, + operator: Operator.Or, + compValue: "0x", + }, + { + parent: 0, + paramType: ParameterType.Calldata, + operator: Operator.Pass, + compValue: "0x", + }, + { + parent: 0, + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + compValue: "0x", + }, + { + parent: 1, + paramType: ParameterType.Static, + operator: Operator.Pass, + compValue: "0x", + }, + ]; + await expect(enforce(conditions)).to.not.be.reverted; + + // Dynamic should not come first for EquvialentSiblingTypeTrees + await expect( + enforce([ + { + parent: 0, + paramType: ParameterType.None, + operator: Operator.Or, + compValue: "0x", + }, + { + parent: 0, + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + compValue: "0x", + }, + { + parent: 0, + paramType: ParameterType.Calldata, + operator: Operator.Pass, + compValue: "0x", + }, + { + parent: 2, + paramType: ParameterType.Static, + operator: Operator.Pass, + compValue: "0x", + }, + ]) + ) + .to.be.revertedWithCustomError(integrity, "UnsuitableChildTypeTree") + .withArgs(0); + }); }); }); }); diff --git a/packages/evm/test/operators/Misc.spec.ts b/packages/evm/test/operators/Misc.spec.ts new file mode 100644 index 000000000..64f1a0333 --- /dev/null +++ b/packages/evm/test/operators/Misc.spec.ts @@ -0,0 +1,158 @@ +import { expect } from "chai"; +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; + +import { + BYTES32_ZERO, + Operator, + ParameterType, + PermissionCheckerStatus, +} from "../utils"; +import { setupOneParamBytes } from "./setup"; +import { Interface, defaultAbiCoder } from "@ethersproject/abi"; + +describe("Operator - Misc", async () => { + it("evaluates operator Bitmask and EqualsTo with type equivalent tree", async () => { + const { roles, scopeFunction, invoke } = await loadFixture( + setupOneParamBytes + ); + + const maskCompValue = (selector: string) => { + const shift = "0000"; + const mask = "ffffffff".padEnd(30, "0"); + const expected = selector.slice(2).padEnd(30, "0"); + return `0x${shift}${mask}${expected}`; + }; + + const iface = new Interface([ + "function fnOut(bytes a)", + "function fnAllowed1(uint256 a)", + "function fnAllowed2(uint256 a)", + "function fnOther(uint256 a)", + ]); + + await scopeFunction([ + { + parent: 0, + paramType: ParameterType.Calldata, + operator: Operator.Matches, + compValue: "0x", + }, + { + parent: 0, + paramType: ParameterType.None, + operator: Operator.And, + compValue: "0x", + }, + { + parent: 1, + paramType: ParameterType.Calldata, + operator: Operator.Matches, + compValue: "0x", + }, + { + parent: 1, + paramType: ParameterType.None, + operator: Operator.Or, + compValue: "0x", + }, + { + parent: 2, + paramType: ParameterType.Static, + operator: Operator.EqualTo, + compValue: defaultAbiCoder.encode(["uint256"], [123456]), + }, + + { + parent: 3, // ?? + paramType: ParameterType.Dynamic, + operator: Operator.Bitmask, + compValue: maskCompValue(iface.getSighash("fnAllowed1")), + }, + { + parent: 3, // ?? + paramType: ParameterType.Dynamic, + operator: Operator.Bitmask, + compValue: maskCompValue(iface.getSighash("fnAllowed2")), + }, + ]); + + await expect(invoke(iface.encodeFunctionData("fnAllowed1", [123456]))).to + .not.be.reverted; + + await expect(invoke(iface.encodeFunctionData("fnAllowed2", [123456]))).to + .not.be.reverted; + + await expect(invoke(iface.encodeFunctionData("fnOther", [123456]))) + .to.be.revertedWithCustomError(roles, "ConditionViolation") + .withArgs(PermissionCheckerStatus.OrViolation, BYTES32_ZERO); + + await expect(invoke(iface.encodeFunctionData("fnAllowed1", [1]))) + .to.be.revertedWithCustomError(roles, "ConditionViolation") + .withArgs(PermissionCheckerStatus.ParameterNotAllowed, BYTES32_ZERO); + }); + + it("Cannot setup sibling TypeEquivalence when the first element is Dynamic", async () => { + const { scopeFunction } = await loadFixture(setupOneParamBytes); + + const maskCompValue = (selector: string) => { + const shift = "0000"; + const mask = "ffffffff".padEnd(30, "0"); + const expected = selector.slice(2).padEnd(30, "0"); + return `0x${shift}${mask}${expected}`; + }; + + const iface = new Interface([ + "function fnOut(bytes a)", + "function fnAllowed1(uint256 a)", + "function fnAllowed2(uint256 a)", + "function fnOther(uint256 a)", + ]); + + await expect( + scopeFunction([ + { + parent: 0, + paramType: ParameterType.Calldata, + operator: Operator.Matches, + compValue: "0x", + }, + { + parent: 0, + paramType: ParameterType.None, + operator: Operator.And, + compValue: "0x", + }, + { + parent: 1, + paramType: ParameterType.None, + operator: Operator.Or, + compValue: "0x", + }, + { + parent: 1, + paramType: ParameterType.Calldata, + operator: Operator.Matches, + compValue: "0x", + }, + { + parent: 2, + paramType: ParameterType.Dynamic, + operator: Operator.Bitmask, + compValue: maskCompValue(iface.getSighash("fnAllowed1")), + }, + { + parent: 2, + paramType: ParameterType.Dynamic, + operator: Operator.Bitmask, + compValue: maskCompValue(iface.getSighash("fnAllowed2")), + }, + { + parent: 3, + paramType: ParameterType.Static, + operator: Operator.EqualTo, + compValue: defaultAbiCoder.encode(["uint256"], [123456]), + }, + ]) + ).to.be.reverted; + }); +}); From 5b26f7cd821fcc2039eaa01e9aab004689cfdcb9 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Fri, 30 Jun 2023 12:15:33 +0100 Subject: [PATCH 06/43] Rename AbiEncoded in comments to Calldata --- packages/evm/contracts/Types.sol | 2 +- packages/evm/test/Integrity.spec.ts | 6 ++--- packages/evm/test/Operator.spec.ts | 2 +- packages/evm/test/Roles.spec.ts | 2 +- packages/evm/test/decoder/Decoder.spec.ts | 6 ++--- packages/evm/test/decoder/OldTests.spec.ts | 26 +++++++++---------- .../test/decoder/ParameterTypeDynamic.spec.ts | 2 +- .../test/decoder/ParameterTypeStatic.spec.ts | 2 +- packages/evm/test/operators/05Matches.spec.ts | 2 +- packages/evm/test/utils.ts | 2 +- 10 files changed, 26 insertions(+), 26 deletions(-) diff --git a/packages/evm/contracts/Types.sol b/packages/evm/contracts/Types.sol index abc653112..03f5ab935 100644 --- a/packages/evm/contracts/Types.sol +++ b/packages/evm/contracts/Types.sol @@ -33,7 +33,7 @@ enum Operator { /* 04: */ _Placeholder04, // ------------------------------------------------------------ // 05-14: COMPLEX EXPRESSIONS - // paramType: AbiEncoded / Tuple / Array, + // paramType: Calldata / Tuple / Array, // ✅ children // 🚫 compValue /* 05: */ Matches, diff --git a/packages/evm/test/Integrity.spec.ts b/packages/evm/test/Integrity.spec.ts index 085aa922a..58a9fe13c 100644 --- a/packages/evm/test/Integrity.spec.ts +++ b/packages/evm/test/Integrity.spec.ts @@ -746,7 +746,7 @@ describe("Integrity", async () => { ]) ).to.be.revertedWithCustomError(integrity, "NotBFS"); }); - it("enforces (Ether/Call)WithinAllowance to be child of AbiEncoded", async () => { + it("enforces (Ether/Call)WithinAllowance to be child of Calldata", async () => { const { integrity, enforce } = await loadFixture(setup); const conditions = [ { @@ -898,7 +898,7 @@ describe("Integrity", async () => { .to.be.revertedWithCustomError(integrity, "UnsuitableChildCount") .withArgs(2); }); - it("enforces abiEncoded to have at least one child", async () => { + it("enforces Calldata to have at least one child", async () => { const { integrity, enforce } = await loadFixture(setup); const conditions = [ @@ -1067,7 +1067,7 @@ describe("Integrity", async () => { .to.be.revertedWithCustomError(integrity, "UnsuitableChildCount") .withArgs(1); }); - it("enforces resolved root type to be AbiEncoded", async () => { + it("enforces resolved root type to be Calldata", async () => { const { integrity, enforce } = await loadFixture(setup); await expect( diff --git a/packages/evm/test/Operator.spec.ts b/packages/evm/test/Operator.spec.ts index 8fc327595..ca1544b2c 100644 --- a/packages/evm/test/Operator.spec.ts +++ b/packages/evm/test/Operator.spec.ts @@ -113,7 +113,7 @@ describe("Operator", async () => { .withArgs(PermissionCheckerStatus.OrViolation, BYTES32_ZERO); }); - it("checks operator And over AbiEncoded", async () => { + it("checks operator And over Calldata", async () => { const { modifier, testContract, owner, invoker } = await loadFixture(setup); const SELECTOR = testContract.interface.getSighash( diff --git a/packages/evm/test/Roles.spec.ts b/packages/evm/test/Roles.spec.ts index fd6101a5a..a73b1abbd 100644 --- a/packages/evm/test/Roles.spec.ts +++ b/packages/evm/test/Roles.spec.ts @@ -689,7 +689,7 @@ describe("Roles", async () => { await expect(invoke(testContract2.address, 0)).to.be.reverted; }); - it("a permission with fields insided a nested AbiEncoded", async () => { + it("a permission with fields insided a nested Calldata", async () => { const { roles, testContract, owner, invoker } = await loadFixture(setup); await roles diff --git a/packages/evm/test/decoder/Decoder.spec.ts b/packages/evm/test/decoder/Decoder.spec.ts index cda0d10c0..38a0451c6 100644 --- a/packages/evm/test/decoder/Decoder.spec.ts +++ b/packages/evm/test/decoder/Decoder.spec.ts @@ -106,7 +106,7 @@ describe("Decoder library", async () => { it.skip("plucks Tuple from top level"); it.skip("plucks Tuple from Tuple"); it.skip("plucks Tuple from Array"); - it.skip("plucks Tuple from nested AbiEncoded"); + it.skip("plucks Tuple from nested Calldata"); it("plucks Tuple with multiple dynamic fields", async () => { const { decoder, testEncoder } = await loadFixture(setup); @@ -185,7 +185,7 @@ describe("Decoder library", async () => { it.skip("plucks Array from top level"); it.skip("plucks Array from Tuple"); it.skip("plucks Array from Array"); - it.skip("plucks Array from nested AbiEncoded"); + it.skip("plucks Array from nested Calldata"); describe("TypeTree", async () => { it("top level variants get unfolded to its entrypoint form", async () => { @@ -459,7 +459,7 @@ describe("Decoder library", async () => { await decoder.pluck(data, arrayField.location, arrayField.size) ).to.equal(encode(["uint256[]"], [[7, 8, 9]], YesRemoveOffset)); }); - it("extraneous Value in AbiEncoded gets inspected as None", async () => { + it("extraneous Value in Calldata gets inspected as None", async () => { const { decoder, testEncoder } = await loadFixture(setup); const { data } = await testEncoder.populateTransaction.staticFn( "0xeeff3344" diff --git a/packages/evm/test/decoder/OldTests.spec.ts b/packages/evm/test/decoder/OldTests.spec.ts index 36771de45..1d77eb933 100644 --- a/packages/evm/test/decoder/OldTests.spec.ts +++ b/packages/evm/test/decoder/OldTests.spec.ts @@ -961,20 +961,20 @@ describe("Decoder library", async () => { await decoder.pluck(data, arrayField.location, arrayField.size) ).to.equal(encode(["uint256[]"], [[4, 5, 6]], YesRemoveOffset)); }); - it("plucks AbiEncoded from top level param", async () => { + it("plucks Calldata from top level param", async () => { const { decoder, testEncoder } = await loadFixture(setup); const number = 123456789; const address = "0x0000000000000000000000000000000000000001"; - const { data: nestedData } = await testEncoder.populateTransaction.simple( + const { data: embedded } = await testEncoder.populateTransaction.simple( number ); const { data } = await testEncoder.populateTransaction.staticDynamicDynamic32( address, - nestedData as string, + embedded as string, [] ); @@ -1015,16 +1015,16 @@ describe("Decoder library", async () => { const result = await decoder.inspect(data as string, layout); // check the nested uint - // const nestedUintField = result.children[1].children[0]; - // expect( - // await decoder.pluck( - // data as string, - // nestedUintField.location, - // nestedUintField.size - // ) - // ).to.equal(encode(["uint256"], [number])); + const nestedUintField = result.children[1].children[0]; + expect( + await decoder.pluck( + data as string, + nestedUintField.location, + nestedUintField.size + ) + ).to.equal(encode(["uint256"], [number])); }); - it("plucks nested AbiEncoded from within a tuple", async () => { + it("plucks nested Calldata from within a tuple", async () => { const { decoder, testEncoder } = await loadFixture(setup); const { data: nestedData } = @@ -1137,7 +1137,7 @@ describe("Decoder library", async () => { ) ).to.equal(encode(["uint256[]"], [[55, 66, 88]], YesRemoveOffset)); }); - it("plucks nested AbiEncoded from within an array", async () => { + it("plucks nested Calldata from within an array", async () => { const { decoder, testEncoder } = await loadFixture(setup); const { data: nestedData1 } = diff --git a/packages/evm/test/decoder/ParameterTypeDynamic.spec.ts b/packages/evm/test/decoder/ParameterTypeDynamic.spec.ts index bd6465dda..baeb76972 100644 --- a/packages/evm/test/decoder/ParameterTypeDynamic.spec.ts +++ b/packages/evm/test/decoder/ParameterTypeDynamic.spec.ts @@ -155,7 +155,7 @@ describe("Decoder library", async () => { ) ).to.equal(encode(["bytes"], ["0x004466ff"], YesRemoveOffset)); }); - it("plucks Dynamic from embedded AbiEncoded", async () => { + it("plucks Dynamic from embedded Calldata", async () => { const { decoder } = await loadFixture(setup); const iface = new Interface([ diff --git a/packages/evm/test/decoder/ParameterTypeStatic.spec.ts b/packages/evm/test/decoder/ParameterTypeStatic.spec.ts index a3c5c48d2..f75ad0869 100644 --- a/packages/evm/test/decoder/ParameterTypeStatic.spec.ts +++ b/packages/evm/test/decoder/ParameterTypeStatic.spec.ts @@ -198,7 +198,7 @@ describe("Decoder library", async () => { ); }); - it("plucks Static from embedded AbiEncoded", async () => { + it("plucks Static from embedded Calldata", async () => { const { decoder } = await loadFixture(setup); const iface = new Interface([ diff --git a/packages/evm/test/operators/05Matches.spec.ts b/packages/evm/test/operators/05Matches.spec.ts index 015709b2c..df1b2d1c8 100644 --- a/packages/evm/test/operators/05Matches.spec.ts +++ b/packages/evm/test/operators/05Matches.spec.ts @@ -165,7 +165,7 @@ describe("Operator - Matches", async () => { ).to.be.reverted; // "UnsuitableChildrenCount" }); - it("evaluates operator Matches for AbiEncoded", async () => { + it("evaluates operator Matches for Calldata", async () => { const { roles, invoke, scopeFunction } = await loadFixture( setupTwoParamsStatic ); diff --git a/packages/evm/test/utils.ts b/packages/evm/test/utils.ts index fc23e82af..a0eaf0233 100644 --- a/packages/evm/test/utils.ts +++ b/packages/evm/test/utils.ts @@ -63,7 +63,7 @@ export enum Operator { /* 04: */ _Placeholder04, // ------------------------------------------------------------ // 05-14: COMPLEX EXPRESSIONS - // paramType: AbiEncoded / Tuple / Array, + // paramType: Calldata / Tuple / Array, // ✅ children // 🚫 compValue /* 05: */ Matches, From f7737f5828d600face747060c046802e35800ff5 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Fri, 30 Jun 2023 12:57:13 +0100 Subject: [PATCH 07/43] Introducing the new AbiEncoded node. Expanding TypeEquivalent to include AbiEncoded (in addition to Calldata) --- packages/evm/contracts/Decoder.sol | 7 +- packages/evm/contracts/Integrity.sol | 13 +- packages/evm/contracts/Types.sol | 5 +- packages/evm/test/Integrity.spec.ts | 152 ++++++++++++++---- .../test/decoder/ParameterTypeDynamic.spec.ts | 63 ++++++++ packages/evm/test/utils.ts | 1 + 6 files changed, 202 insertions(+), 39 deletions(-) diff --git a/packages/evm/contracts/Decoder.sol b/packages/evm/contracts/Decoder.sol index 73cba1bd2..00df57bff 100644 --- a/packages/evm/contracts/Decoder.sol +++ b/packages/evm/contracts/Decoder.sol @@ -76,10 +76,13 @@ library Decoder { result ); result.size += 32; - } else if (paramType == ParameterType.Calldata) { + } else if ( + paramType == ParameterType.Calldata || + paramType == ParameterType.AbiEncoded + ) { __block__( data, - location + 32 + 4, + location + 32 + (paramType == ParameterType.Calldata ? 4 : 0), node, node.children.length, false, diff --git a/packages/evm/contracts/Integrity.sol b/packages/evm/contracts/Integrity.sol index ecaaba070..e061feb8c 100644 --- a/packages/evm/contracts/Integrity.sol +++ b/packages/evm/contracts/Integrity.sol @@ -63,7 +63,8 @@ library Integrity { if ( paramType != ParameterType.Tuple && paramType != ParameterType.Array && - paramType != ParameterType.Calldata + paramType != ParameterType.Calldata && + paramType != ParameterType.AbiEncoded ) { revert UnsuitableParameterType(index); } @@ -201,7 +202,8 @@ library Integrity { } } else if ( condition.paramType == ParameterType.Tuple || - condition.paramType == ParameterType.Calldata + condition.paramType == ParameterType.Calldata || + condition.paramType == ParameterType.AbiEncoded ) { if (childBounds.length == 0) { revert UnsuitableChildCount(i); @@ -286,9 +288,12 @@ library Integrity { uint256 j, Topology.Bounds[] memory childrenBounds ) private pure returns (bool) { + ParameterType leftParamType = Topology + .typeTree(conditions, i, childrenBounds) + .paramType; return - Topology.typeTree(conditions, i, childrenBounds).paramType == - ParameterType.Calldata && + (leftParamType == ParameterType.Calldata || + leftParamType == ParameterType.AbiEncoded) && Topology.typeTree(conditions, j, childrenBounds).paramType == ParameterType.Dynamic; } diff --git a/packages/evm/contracts/Types.sol b/packages/evm/contracts/Types.sol index 03f5ab935..ef4c3e387 100644 --- a/packages/evm/contracts/Types.sol +++ b/packages/evm/contracts/Types.sol @@ -13,7 +13,8 @@ enum ParameterType { Dynamic, Tuple, Array, - Calldata + Calldata, + AbiEncoded } enum Operator { @@ -33,7 +34,7 @@ enum Operator { /* 04: */ _Placeholder04, // ------------------------------------------------------------ // 05-14: COMPLEX EXPRESSIONS - // paramType: Calldata / Tuple / Array, + // paramType: Calldata / AbiEncoded / Tuple / Array, // ✅ children // 🚫 compValue /* 05: */ Matches, diff --git a/packages/evm/test/Integrity.spec.ts b/packages/evm/test/Integrity.spec.ts index 58a9fe13c..f79065e31 100644 --- a/packages/evm/test/Integrity.spec.ts +++ b/packages/evm/test/Integrity.spec.ts @@ -1568,49 +1568,120 @@ describe("Integrity", async () => { it("sibling type equivalence - ok", async () => { const { integrity, enforce } = await loadFixture(setup); - const conditions = [ - { - parent: 0, - paramType: ParameterType.None, - operator: Operator.Or, - compValue: "0x", - }, - { - parent: 0, - paramType: ParameterType.Calldata, - operator: Operator.Pass, - compValue: "0x", - }, - { - parent: 0, - paramType: ParameterType.Dynamic, - operator: Operator.Pass, - compValue: "0x", - }, - { - parent: 1, - paramType: ParameterType.Static, - operator: Operator.Pass, - compValue: "0x", - }, - ]; - await expect(enforce(conditions)).to.not.be.reverted; + // A function with a dynamic argument, which is also an embedded Calldata encoded field + await expect( + enforce([ + { + parent: 0, + paramType: ParameterType.Calldata, + operator: Operator.Pass, + compValue: "0x", + }, + { + parent: 0, + paramType: ParameterType.None, + operator: Operator.And, + compValue: "0x", + }, + { + parent: 1, + paramType: ParameterType.Calldata, + operator: Operator.Pass, + compValue: "0x", + }, + { + parent: 1, + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + compValue: "0x", + }, + { + parent: 2, + paramType: ParameterType.Static, + operator: Operator.Pass, + compValue: "0x", + }, + ]) + ).to.not.be.reverted; - // Dynamic should not come first for EquvialentSiblingTypeTrees + // A function with a dynamic argument, which is also an embedded AbiEncoded encoded field await expect( enforce([ + { + parent: 0, + paramType: ParameterType.Calldata, + operator: Operator.Pass, + compValue: "0x", + }, { parent: 0, paramType: ParameterType.None, - operator: Operator.Or, + operator: Operator.And, compValue: "0x", }, + { + parent: 1, + paramType: ParameterType.AbiEncoded, + operator: Operator.Pass, + compValue: "0x", + }, + { + parent: 1, + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + compValue: "0x", + }, + { + parent: 2, + paramType: ParameterType.Static, + operator: Operator.Pass, + compValue: "0x", + }, + ]) + ).to.not.be.reverted; + + // Dynamic can't come before the Calldata node that actually defines the type tree and should be the Anchor + await expect( + enforce([ { parent: 0, + paramType: ParameterType.Calldata, + operator: Operator.Pass, + compValue: "0x", + }, + { + parent: 0, + paramType: ParameterType.None, + operator: Operator.And, + compValue: "0x", + }, + { + parent: 1, paramType: ParameterType.Dynamic, operator: Operator.Pass, compValue: "0x", }, + { + parent: 1, + paramType: ParameterType.Calldata, + operator: Operator.Pass, + compValue: "0x", + }, + + { + parent: 3, + paramType: ParameterType.Static, + operator: Operator.Pass, + compValue: "0x", + }, + ]) + ) + .to.be.revertedWithCustomError(integrity, "UnsuitableChildTypeTree") + .withArgs(1); + + // Dynamic can't come before the AbiEncoded node that actually defines the type tree and should be the Anchor + await expect( + enforce([ { parent: 0, paramType: ParameterType.Calldata, @@ -1618,7 +1689,26 @@ describe("Integrity", async () => { compValue: "0x", }, { - parent: 2, + parent: 0, + paramType: ParameterType.None, + operator: Operator.And, + compValue: "0x", + }, + { + parent: 1, + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + compValue: "0x", + }, + { + parent: 1, + paramType: ParameterType.Calldata, + operator: Operator.Pass, + compValue: "0x", + }, + + { + parent: 3, paramType: ParameterType.Static, operator: Operator.Pass, compValue: "0x", @@ -1626,7 +1716,7 @@ describe("Integrity", async () => { ]) ) .to.be.revertedWithCustomError(integrity, "UnsuitableChildTypeTree") - .withArgs(0); + .withArgs(1); }); }); }); diff --git a/packages/evm/test/decoder/ParameterTypeDynamic.spec.ts b/packages/evm/test/decoder/ParameterTypeDynamic.spec.ts index baeb76972..faca60de5 100644 --- a/packages/evm/test/decoder/ParameterTypeDynamic.spec.ts +++ b/packages/evm/test/decoder/ParameterTypeDynamic.spec.ts @@ -218,6 +218,69 @@ describe("Decoder library", async () => { await decoder.pluck(data as string, tupleField.location, tupleField.size) ).to.equal(encode(["bytes"], ["0xbadfed"], YesRemoveOffset)); }); + it("plucks Dynamic from embedded AbiEncoded", async () => { + const { decoder } = await loadFixture(setup); + + const iface = new Interface(["function fn(bytes a)"]); + const embedded = defaultAbiCoder.encode( + ["bytes", "bool", "bytes2[]"], + ["0xbadfed", true, ["0xccdd", "0x3333"]] + ); + + const data = iface.encodeFunctionData("fn", [embedded]); + + const condition = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.AbiEncoded, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Array, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data as string, condition); + + const field1 = result.children[0].children[0]; + expect( + await decoder.pluck(data as string, field1.location, field1.size) + ).to.equal(encode(["bytes"], ["0xbadfed"])); + + const field2 = result.children[0].children[1]; + expect( + await decoder.pluck(data as string, field2.location, field2.size) + ).to.equal(encode(["bool"], ["false"], false)); + + const field3 = result.children[0].children[2]; + expect( + await decoder.pluck(data as string, field3.location, field3.size) + ).to.equal(encode(["bytes2[]"], [["0xccdd", "0x3333"]])); + }); + it("plucks Dynamic from type equivalent branch", async () => { const { decoder } = await loadFixture(setup); diff --git a/packages/evm/test/utils.ts b/packages/evm/test/utils.ts index a0eaf0233..85529e414 100644 --- a/packages/evm/test/utils.ts +++ b/packages/evm/test/utils.ts @@ -44,6 +44,7 @@ export enum ParameterType { Tuple, Array, Calldata, + AbiEncoded, } export enum Operator { From f2ad9ddfb272e7f7ee9e8d9e3383dd564b1ec73b Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Sun, 2 Jul 2023 22:55:20 +0100 Subject: [PATCH 08/43] Introduce more checker information via context --- packages/evm/contracts/PermissionChecker.sol | 257 ++++++++++--------- 1 file changed, 136 insertions(+), 121 deletions(-) diff --git a/packages/evm/contracts/PermissionChecker.sol b/packages/evm/contracts/PermissionChecker.sol index 03cfc233c..7edb2d2fc 100644 --- a/packages/evm/contracts/PermissionChecker.sol +++ b/packages/evm/contracts/PermissionChecker.sol @@ -123,41 +123,51 @@ abstract contract PermissionChecker is Core, Periphery { revert FunctionSignatureTooShort(); } - TargetAddress storage target = role.targets[to]; - if (target.clearance == Clearance.Target) { + if (role.targets[to].clearance == Clearance.Target) { return ( - _executionOptions(value, operation, target.options), + _executionOptions(value, operation, role.targets[to].options), Result({consumptions: consumptions, info: 0}) ); - } else if (target.clearance == Clearance.Function) { + } else if (role.targets[to].clearance == Clearance.Function) { bytes32 key = _key(to, bytes4(data)); - bytes32 header = role.scopeConfig[key]; - if (header == 0) { - return ( - Status.FunctionNotAllowed, - Result({ - consumptions: consumptions, - info: bytes32(bytes4(data)) - }) - ); - } + { + bytes32 header = role.scopeConfig[key]; + if (header == 0) { + return ( + Status.FunctionNotAllowed, + Result({ + consumptions: consumptions, + info: bytes32(bytes4(data)) + }) + ); + } - (bool isWildcarded, ExecutionOptions options) = BufferPacker - .unpackOptions(header); + (bool isWildcarded, ExecutionOptions options) = BufferPacker + .unpackOptions(header); - Status status = _executionOptions(value, operation, options); - if (status != Status.Ok) { - return (status, Result({consumptions: consumptions, info: 0})); - } + Status status = _executionOptions(value, operation, options); + if (status != Status.Ok) { + return ( + status, + Result({consumptions: consumptions, info: 0}) + ); + } - if (isWildcarded) { - return ( - Status.Ok, - Result({consumptions: consumptions, info: 0}) - ); + if (isWildcarded) { + return ( + Status.Ok, + Result({consumptions: consumptions, info: 0}) + ); + } } - return _scopedFunction(role, key, value, data, consumptions); + return + _scopedFunction( + role, + key, + data, + Context({to: to, value: value, consumptions: consumptions}) + ); } else { return ( Status.TargetAddressNotAllowed, @@ -199,9 +209,8 @@ abstract contract PermissionChecker is Core, Periphery { function _scopedFunction( Role storage role, bytes32 key, - uint256 value, bytes calldata data, - Consumption[] memory prevConsumptions + Context memory ctx ) private view returns (Status, Result memory) { (Condition memory condition, Consumption[] memory consumptions) = _load( role, @@ -209,24 +218,18 @@ abstract contract PermissionChecker is Core, Periphery { ); ParameterPayload memory payload = Decoder.inspect(data, condition); - return - _walk( - value, - data, - condition, - payload, - prevConsumptions.length == 0 - ? consumptions - : Consumptions.merge(prevConsumptions, consumptions) - ); + ctx.consumptions = ctx.consumptions.length > 0 + ? Consumptions.merge(ctx.consumptions, consumptions) + : consumptions; + + return _walk(data, condition, payload, ctx); } function _walk( - uint256 value, bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Consumption[] memory consumptions + Context memory ctx ) private pure returns (Status, Result memory) { Operator operator = condition.operator; @@ -234,64 +237,60 @@ abstract contract PermissionChecker is Core, Periphery { if (operator == Operator.Pass) { return ( Status.Ok, - Result({consumptions: consumptions, info: 0}) + Result({consumptions: ctx.consumptions, info: 0}) ); } else if (operator == Operator.Matches) { - return _matches(value, data, condition, payload, consumptions); + return _matches(data, condition, payload, ctx); } else if (operator == Operator.And) { - return _and(value, data, condition, payload, consumptions); + return _and(data, condition, payload, ctx); } else if (operator == Operator.Or) { - return _or(value, data, condition, payload, consumptions); + return _or(data, condition, payload, ctx); } else if (operator == Operator.Nor) { - return _nor(value, data, condition, payload, consumptions); + return _nor(data, condition, payload, ctx); } else if (operator == Operator.ArraySome) { - return - _arraySome(value, data, condition, payload, consumptions); + return _arraySome(data, condition, payload, ctx); } else if (operator == Operator.ArrayEvery) { - return - _arrayEvery(value, data, condition, payload, consumptions); + return _arrayEvery(data, condition, payload, ctx); } else { assert(operator == Operator.ArraySubset); - return - _arraySubset(value, data, condition, payload, consumptions); + return _arraySubset(data, condition, payload, ctx); } } else { if (operator <= Operator.LessThan) { return ( _compare(data, condition, payload), - Result({consumptions: consumptions, info: 0}) + Result({consumptions: ctx.consumptions, info: 0}) ); } else if (operator <= Operator.SignedIntLessThan) { return ( _compareSignedInt(data, condition, payload), - Result({consumptions: consumptions, info: 0}) + Result({consumptions: ctx.consumptions, info: 0}) ); } else if (operator == Operator.Bitmask) { return ( _bitmask(data, condition, payload), - Result({consumptions: consumptions, info: 0}) + Result({consumptions: ctx.consumptions, info: 0}) ); } else if (operator == Operator.Custom) { - return _custom(value, data, condition, payload, consumptions); + return _custom(data, condition, payload, ctx); } else if (operator == Operator.WithinAllowance) { - return _withinAllowance(data, condition, payload, consumptions); + return _withinAllowance(data, condition, payload, ctx); } else if (operator == Operator.EtherWithinAllowance) { - return _etherWithinAllowance(value, condition, consumptions); + return _etherWithinAllowance(condition, ctx); } else { assert(operator == Operator.CallWithinAllowance); - return _callWithinAllowance(condition, consumptions); + return _callWithinAllowance(condition, ctx); } } } function _matches( - uint256 value, bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Consumption[] memory consumptions - ) private pure returns (Status status, Result memory) { - Result memory result = Result({consumptions: consumptions, info: 0}); + Context memory ctx + ) private pure returns (Status status, Result memory result) { + result.consumptions = ctx.consumptions; if (condition.children.length != payload.children.length) { return (Status.ParameterNotAMatch, result); @@ -299,16 +298,19 @@ abstract contract PermissionChecker is Core, Periphery { for (uint256 i; i < condition.children.length; ) { (status, result) = _walk( - value, data, condition.children[i], payload.children[i], - result.consumptions + Context({ + to: ctx.to, + value: ctx.value, + consumptions: result.consumptions + }) ); if (status != Status.Ok) { return ( status, - Result({consumptions: consumptions, info: result.info}) + Result({consumptions: ctx.consumptions, info: result.info}) ); } unchecked { @@ -320,26 +322,28 @@ abstract contract PermissionChecker is Core, Periphery { } function _and( - uint256 value, bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Consumption[] memory consumptions + Context memory ctx ) private pure returns (Status status, Result memory result) { - result = Result({consumptions: consumptions, info: 0}); + result.consumptions = ctx.consumptions; for (uint256 i; i < condition.children.length; ) { (status, result) = _walk( - value, data, condition.children[i], payload, - result.consumptions + Context({ + to: ctx.to, + value: ctx.value, + consumptions: result.consumptions + }) ); if (status != Status.Ok) { return ( status, - Result({consumptions: consumptions, info: result.info}) + Result({consumptions: ctx.consumptions, info: result.info}) ); } unchecked { @@ -350,19 +354,23 @@ abstract contract PermissionChecker is Core, Periphery { } function _or( - uint256 value, bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Consumption[] memory consumptions - ) private pure returns (Status, Result memory) { + Context memory ctx + ) private pure returns (Status status, Result memory result) { + result.consumptions = ctx.consumptions; + for (uint256 i; i < condition.children.length; ) { - (Status status, Result memory result) = _walk( - value, + (status, result) = _walk( data, condition.children[i], payload, - consumptions + Context({ + to: ctx.to, + value: ctx.value, + consumptions: result.consumptions + }) ); if (status == Status.Ok) { return (status, result); @@ -374,52 +382,50 @@ abstract contract PermissionChecker is Core, Periphery { return ( Status.OrViolation, - Result({consumptions: consumptions, info: 0}) + Result({consumptions: ctx.consumptions, info: 0}) ); } function _nor( - uint256 value, bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Consumption[] memory consumptions - ) private pure returns (Status, Result memory) { + Context memory ctx + ) private pure returns (Status status, Result memory) { for (uint256 i; i < condition.children.length; ) { - (Status status, ) = _walk( - value, - data, - condition.children[i], - payload, - consumptions - ); + (status, ) = _walk(data, condition.children[i], payload, ctx); if (status == Status.Ok) { return ( Status.NorViolation, - Result({consumptions: consumptions, info: 0}) + Result({consumptions: ctx.consumptions, info: 0}) ); } unchecked { ++i; } } - return (Status.Ok, Result({consumptions: consumptions, info: 0})); + return (Status.Ok, Result({consumptions: ctx.consumptions, info: 0})); } function _arraySome( - uint256 value, bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Consumption[] memory consumptions - ) private pure returns (Status, Result memory) { - for (uint256 i; i < payload.children.length; ) { - (Status status, Result memory result) = _walk( - value, + Context memory ctx + ) private pure returns (Status status, Result memory result) { + result.consumptions = ctx.consumptions; + + uint256 length = condition.children.length; + for (uint256 i; i < length; ) { + (status, result) = _walk( data, condition.children[0], payload.children[i], - consumptions + Context({ + to: ctx.to, + value: ctx.value, + consumptions: result.consumptions + }) ); if (status == Status.Ok) { return (status, result); @@ -430,30 +436,33 @@ abstract contract PermissionChecker is Core, Periphery { } return ( Status.NoArrayElementPasses, - Result({consumptions: consumptions, info: 0}) + Result({consumptions: ctx.consumptions, info: 0}) ); } function _arrayEvery( - uint256 value, bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Consumption[] memory consumptions + Context memory ctx ) private pure returns (Status status, Result memory result) { - result = Result({consumptions: consumptions, info: 0}); + result.consumptions = ctx.consumptions; + for (uint256 i; i < payload.children.length; ) { (status, result) = _walk( - value, data, condition.children[0], payload.children[i], - result.consumptions + Context({ + to: ctx.to, + value: ctx.value, + consumptions: result.consumptions + }) ); if (status != Status.Ok) { return ( Status.NotEveryArrayElementPasses, - Result({consumptions: consumptions, info: 0}) + Result({consumptions: ctx.consumptions, info: 0}) ); } unchecked { @@ -464,13 +473,12 @@ abstract contract PermissionChecker is Core, Periphery { } function _arraySubset( - uint256 value, bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Consumption[] memory consumptions + Context memory ctx ) private pure returns (Status, Result memory result) { - result = Result({consumptions: consumptions, info: 0}); + result.consumptions = ctx.consumptions; if ( payload.children.length == 0 || @@ -486,11 +494,14 @@ abstract contract PermissionChecker is Core, Periphery { if (taken & (1 << j) != 0) continue; (Status status, Result memory _result) = _walk( - value, data, condition.children[j], payload.children[i], - result.consumptions + Context({ + to: ctx.to, + value: ctx.value, + consumptions: result.consumptions + }) ); if (status == Status.Ok) { found = true; @@ -502,7 +513,7 @@ abstract contract PermissionChecker is Core, Periphery { if (!found) { return ( Status.ParameterNotSubsetOfAllowed, - Result({consumptions: consumptions, info: 0}) + Result({consumptions: ctx.consumptions, info: 0}) ); } } @@ -590,11 +601,10 @@ abstract contract PermissionChecker is Core, Periphery { } function _custom( - uint256 value, bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Consumption[] memory consumptions + Context memory ctx ) private pure returns (Status, Result memory) { // 20 bytes on the left ICustomCondition adapter = ICustomCondition( @@ -604,7 +614,7 @@ abstract contract PermissionChecker is Core, Periphery { bytes12 extra = bytes12(uint96(uint256(condition.compValue))); (bool success, bytes32 info) = adapter.check( - value, + ctx.value, data, payload.location, payload.size, @@ -612,7 +622,7 @@ abstract contract PermissionChecker is Core, Periphery { ); return ( success ? Status.Ok : Status.CustomConditionViolation, - Result({consumptions: consumptions, info: info}) + Result({consumptions: ctx.consumptions, info: info}) ); } @@ -620,18 +630,17 @@ abstract contract PermissionChecker is Core, Periphery { bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Consumption[] memory consumptions + Context memory ctx ) private pure returns (Status, Result memory) { uint256 value = uint256(Decoder.word(data, payload.location)); - return __consume(value, condition, consumptions); + return __consume(value, condition, ctx.consumptions); } function _etherWithinAllowance( - uint256 value, Condition memory condition, - Consumption[] memory consumptions + Context memory ctx ) private pure returns (Status status, Result memory result) { - (status, result) = __consume(value, condition, consumptions); + (status, result) = __consume(ctx.value, condition, ctx.consumptions); return ( status == Status.Ok ? Status.Ok : Status.EtherAllowanceExceeded, result @@ -640,9 +649,9 @@ abstract contract PermissionChecker is Core, Periphery { function _callWithinAllowance( Condition memory condition, - Consumption[] memory consumptions + Context memory ctx ) private pure returns (Status status, Result memory result) { - (status, result) = __consume(1, condition, consumptions); + (status, result) = __consume(1, condition, ctx.consumptions); return ( status == Status.Ok ? Status.Ok : Status.CallAllowanceExceeded, result @@ -677,6 +686,12 @@ abstract contract PermissionChecker is Core, Periphery { } } + struct Context { + address to; + uint256 value; + Consumption[] consumptions; + } + struct Result { Consumption[] consumptions; bytes32 info; From 3b5fda62b6a98ce6196de423164619e3e2321c80 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Sun, 2 Jul 2023 22:59:29 +0100 Subject: [PATCH 09/43] Rename --- packages/evm/contracts/PermissionChecker.sol | 139 ++++++++++--------- 1 file changed, 76 insertions(+), 63 deletions(-) diff --git a/packages/evm/contracts/PermissionChecker.sol b/packages/evm/contracts/PermissionChecker.sol index 7edb2d2fc..39186f1e4 100644 --- a/packages/evm/contracts/PermissionChecker.sol +++ b/packages/evm/contracts/PermissionChecker.sol @@ -210,7 +210,7 @@ abstract contract PermissionChecker is Core, Periphery { Role storage role, bytes32 key, bytes calldata data, - Context memory ctx + Context memory context ) private view returns (Status, Result memory) { (Condition memory condition, Consumption[] memory consumptions) = _load( role, @@ -218,18 +218,18 @@ abstract contract PermissionChecker is Core, Periphery { ); ParameterPayload memory payload = Decoder.inspect(data, condition); - ctx.consumptions = ctx.consumptions.length > 0 - ? Consumptions.merge(ctx.consumptions, consumptions) + context.consumptions = context.consumptions.length > 0 + ? Consumptions.merge(context.consumptions, consumptions) : consumptions; - return _walk(data, condition, payload, ctx); + return _walk(data, condition, payload, context); } function _walk( bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Context memory ctx + Context memory context ) private pure returns (Status, Result memory) { Operator operator = condition.operator; @@ -237,49 +237,49 @@ abstract contract PermissionChecker is Core, Periphery { if (operator == Operator.Pass) { return ( Status.Ok, - Result({consumptions: ctx.consumptions, info: 0}) + Result({consumptions: context.consumptions, info: 0}) ); } else if (operator == Operator.Matches) { - return _matches(data, condition, payload, ctx); + return _matches(data, condition, payload, context); } else if (operator == Operator.And) { - return _and(data, condition, payload, ctx); + return _and(data, condition, payload, context); } else if (operator == Operator.Or) { - return _or(data, condition, payload, ctx); + return _or(data, condition, payload, context); } else if (operator == Operator.Nor) { - return _nor(data, condition, payload, ctx); + return _nor(data, condition, payload, context); } else if (operator == Operator.ArraySome) { - return _arraySome(data, condition, payload, ctx); + return _arraySome(data, condition, payload, context); } else if (operator == Operator.ArrayEvery) { - return _arrayEvery(data, condition, payload, ctx); + return _arrayEvery(data, condition, payload, context); } else { assert(operator == Operator.ArraySubset); - return _arraySubset(data, condition, payload, ctx); + return _arraySubset(data, condition, payload, context); } } else { if (operator <= Operator.LessThan) { return ( _compare(data, condition, payload), - Result({consumptions: ctx.consumptions, info: 0}) + Result({consumptions: context.consumptions, info: 0}) ); } else if (operator <= Operator.SignedIntLessThan) { return ( _compareSignedInt(data, condition, payload), - Result({consumptions: ctx.consumptions, info: 0}) + Result({consumptions: context.consumptions, info: 0}) ); } else if (operator == Operator.Bitmask) { return ( _bitmask(data, condition, payload), - Result({consumptions: ctx.consumptions, info: 0}) + Result({consumptions: context.consumptions, info: 0}) ); } else if (operator == Operator.Custom) { - return _custom(data, condition, payload, ctx); + return _custom(data, condition, payload, context); } else if (operator == Operator.WithinAllowance) { - return _withinAllowance(data, condition, payload, ctx); + return _withinAllowance(data, condition, payload, context); } else if (operator == Operator.EtherWithinAllowance) { - return _etherWithinAllowance(condition, ctx); + return _etherWithinAllowance(condition, context); } else { assert(operator == Operator.CallWithinAllowance); - return _callWithinAllowance(condition, ctx); + return _callWithinAllowance(condition, context); } } } @@ -288,9 +288,9 @@ abstract contract PermissionChecker is Core, Periphery { bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Context memory ctx + Context memory context ) private pure returns (Status status, Result memory result) { - result.consumptions = ctx.consumptions; + result.consumptions = context.consumptions; if (condition.children.length != payload.children.length) { return (Status.ParameterNotAMatch, result); @@ -302,15 +302,18 @@ abstract contract PermissionChecker is Core, Periphery { condition.children[i], payload.children[i], Context({ - to: ctx.to, - value: ctx.value, + to: context.to, + value: context.value, consumptions: result.consumptions }) ); if (status != Status.Ok) { return ( status, - Result({consumptions: ctx.consumptions, info: result.info}) + Result({ + consumptions: context.consumptions, + info: result.info + }) ); } unchecked { @@ -325,9 +328,9 @@ abstract contract PermissionChecker is Core, Periphery { bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Context memory ctx + Context memory context ) private pure returns (Status status, Result memory result) { - result.consumptions = ctx.consumptions; + result.consumptions = context.consumptions; for (uint256 i; i < condition.children.length; ) { (status, result) = _walk( @@ -335,15 +338,18 @@ abstract contract PermissionChecker is Core, Periphery { condition.children[i], payload, Context({ - to: ctx.to, - value: ctx.value, + to: context.to, + value: context.value, consumptions: result.consumptions }) ); if (status != Status.Ok) { return ( status, - Result({consumptions: ctx.consumptions, info: result.info}) + Result({ + consumptions: context.consumptions, + info: result.info + }) ); } unchecked { @@ -357,9 +363,9 @@ abstract contract PermissionChecker is Core, Periphery { bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Context memory ctx + Context memory context ) private pure returns (Status status, Result memory result) { - result.consumptions = ctx.consumptions; + result.consumptions = context.consumptions; for (uint256 i; i < condition.children.length; ) { (status, result) = _walk( @@ -367,8 +373,8 @@ abstract contract PermissionChecker is Core, Periphery { condition.children[i], payload, Context({ - to: ctx.to, - value: ctx.value, + to: context.to, + value: context.value, consumptions: result.consumptions }) ); @@ -382,7 +388,7 @@ abstract contract PermissionChecker is Core, Periphery { return ( Status.OrViolation, - Result({consumptions: ctx.consumptions, info: 0}) + Result({consumptions: context.consumptions, info: 0}) ); } @@ -390,30 +396,33 @@ abstract contract PermissionChecker is Core, Periphery { bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Context memory ctx + Context memory context ) private pure returns (Status status, Result memory) { for (uint256 i; i < condition.children.length; ) { - (status, ) = _walk(data, condition.children[i], payload, ctx); + (status, ) = _walk(data, condition.children[i], payload, context); if (status == Status.Ok) { return ( Status.NorViolation, - Result({consumptions: ctx.consumptions, info: 0}) + Result({consumptions: context.consumptions, info: 0}) ); } unchecked { ++i; } } - return (Status.Ok, Result({consumptions: ctx.consumptions, info: 0})); + return ( + Status.Ok, + Result({consumptions: context.consumptions, info: 0}) + ); } function _arraySome( bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Context memory ctx + Context memory context ) private pure returns (Status status, Result memory result) { - result.consumptions = ctx.consumptions; + result.consumptions = context.consumptions; uint256 length = condition.children.length; for (uint256 i; i < length; ) { @@ -422,8 +431,8 @@ abstract contract PermissionChecker is Core, Periphery { condition.children[0], payload.children[i], Context({ - to: ctx.to, - value: ctx.value, + to: context.to, + value: context.value, consumptions: result.consumptions }) ); @@ -436,7 +445,7 @@ abstract contract PermissionChecker is Core, Periphery { } return ( Status.NoArrayElementPasses, - Result({consumptions: ctx.consumptions, info: 0}) + Result({consumptions: context.consumptions, info: 0}) ); } @@ -444,9 +453,9 @@ abstract contract PermissionChecker is Core, Periphery { bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Context memory ctx + Context memory context ) private pure returns (Status status, Result memory result) { - result.consumptions = ctx.consumptions; + result.consumptions = context.consumptions; for (uint256 i; i < payload.children.length; ) { (status, result) = _walk( @@ -454,15 +463,15 @@ abstract contract PermissionChecker is Core, Periphery { condition.children[0], payload.children[i], Context({ - to: ctx.to, - value: ctx.value, + to: context.to, + value: context.value, consumptions: result.consumptions }) ); if (status != Status.Ok) { return ( Status.NotEveryArrayElementPasses, - Result({consumptions: ctx.consumptions, info: 0}) + Result({consumptions: context.consumptions, info: 0}) ); } unchecked { @@ -476,9 +485,9 @@ abstract contract PermissionChecker is Core, Periphery { bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Context memory ctx + Context memory context ) private pure returns (Status, Result memory result) { - result.consumptions = ctx.consumptions; + result.consumptions = context.consumptions; if ( payload.children.length == 0 || @@ -498,8 +507,8 @@ abstract contract PermissionChecker is Core, Periphery { condition.children[j], payload.children[i], Context({ - to: ctx.to, - value: ctx.value, + to: context.to, + value: context.value, consumptions: result.consumptions }) ); @@ -513,7 +522,7 @@ abstract contract PermissionChecker is Core, Periphery { if (!found) { return ( Status.ParameterNotSubsetOfAllowed, - Result({consumptions: ctx.consumptions, info: 0}) + Result({consumptions: context.consumptions, info: 0}) ); } } @@ -604,7 +613,7 @@ abstract contract PermissionChecker is Core, Periphery { bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Context memory ctx + Context memory context ) private pure returns (Status, Result memory) { // 20 bytes on the left ICustomCondition adapter = ICustomCondition( @@ -614,7 +623,7 @@ abstract contract PermissionChecker is Core, Periphery { bytes12 extra = bytes12(uint96(uint256(condition.compValue))); (bool success, bytes32 info) = adapter.check( - ctx.value, + context.value, data, payload.location, payload.size, @@ -622,7 +631,7 @@ abstract contract PermissionChecker is Core, Periphery { ); return ( success ? Status.Ok : Status.CustomConditionViolation, - Result({consumptions: ctx.consumptions, info: info}) + Result({consumptions: context.consumptions, info: info}) ); } @@ -630,17 +639,21 @@ abstract contract PermissionChecker is Core, Periphery { bytes calldata data, Condition memory condition, ParameterPayload memory payload, - Context memory ctx + Context memory context ) private pure returns (Status, Result memory) { uint256 value = uint256(Decoder.word(data, payload.location)); - return __consume(value, condition, ctx.consumptions); + return __consume(value, condition, context.consumptions); } function _etherWithinAllowance( Condition memory condition, - Context memory ctx + Context memory context ) private pure returns (Status status, Result memory result) { - (status, result) = __consume(ctx.value, condition, ctx.consumptions); + (status, result) = __consume( + context.value, + condition, + context.consumptions + ); return ( status == Status.Ok ? Status.Ok : Status.EtherAllowanceExceeded, result @@ -649,9 +662,9 @@ abstract contract PermissionChecker is Core, Periphery { function _callWithinAllowance( Condition memory condition, - Context memory ctx + Context memory context ) private pure returns (Status status, Result memory result) { - (status, result) = __consume(1, condition, ctx.consumptions); + (status, result) = __consume(1, condition, context.consumptions); return ( status == Status.Ok ? Status.Ok : Status.CallAllowanceExceeded, result From 540f72d8a851404397f02c4eb3d3922bc16e5457 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Mon, 3 Jul 2023 19:39:50 +0100 Subject: [PATCH 10/43] Introduce custom checker adaptar for ERC721IsOwnedByAvatar --- packages/evm/contracts/PermissionChecker.sol | 19 +-- .../adapters/ERC721IsOwnedByAvatar.sol | 26 ++++ packages/evm/contracts/adapters/Types.sol | 3 +- packages/evm/contracts/test/MockERC721.sol | 15 ++ .../evm/contracts/test/TestCustomChecker.sol | 1 + .../adapters/ERC721IsOwnedByAvatar.spec.ts | 130 ++++++++++++++++++ 6 files changed, 184 insertions(+), 10 deletions(-) create mode 100644 packages/evm/contracts/adapters/ERC721IsOwnedByAvatar.sol create mode 100644 packages/evm/contracts/test/MockERC721.sol create mode 100644 packages/evm/test/adapters/ERC721IsOwnedByAvatar.spec.ts diff --git a/packages/evm/contracts/PermissionChecker.sol b/packages/evm/contracts/PermissionChecker.sol index 39186f1e4..7fbad1aa4 100644 --- a/packages/evm/contracts/PermissionChecker.sol +++ b/packages/evm/contracts/PermissionChecker.sol @@ -230,7 +230,7 @@ abstract contract PermissionChecker is Core, Periphery { Condition memory condition, ParameterPayload memory payload, Context memory context - ) private pure returns (Status, Result memory) { + ) private view returns (Status, Result memory) { Operator operator = condition.operator; if (operator < Operator.EqualTo) { @@ -289,7 +289,7 @@ abstract contract PermissionChecker is Core, Periphery { Condition memory condition, ParameterPayload memory payload, Context memory context - ) private pure returns (Status status, Result memory result) { + ) private view returns (Status status, Result memory result) { result.consumptions = context.consumptions; if (condition.children.length != payload.children.length) { @@ -329,7 +329,7 @@ abstract contract PermissionChecker is Core, Periphery { Condition memory condition, ParameterPayload memory payload, Context memory context - ) private pure returns (Status status, Result memory result) { + ) private view returns (Status status, Result memory result) { result.consumptions = context.consumptions; for (uint256 i; i < condition.children.length; ) { @@ -364,7 +364,7 @@ abstract contract PermissionChecker is Core, Periphery { Condition memory condition, ParameterPayload memory payload, Context memory context - ) private pure returns (Status status, Result memory result) { + ) private view returns (Status status, Result memory result) { result.consumptions = context.consumptions; for (uint256 i; i < condition.children.length; ) { @@ -397,7 +397,7 @@ abstract contract PermissionChecker is Core, Periphery { Condition memory condition, ParameterPayload memory payload, Context memory context - ) private pure returns (Status status, Result memory) { + ) private view returns (Status status, Result memory) { for (uint256 i; i < condition.children.length; ) { (status, ) = _walk(data, condition.children[i], payload, context); if (status == Status.Ok) { @@ -421,7 +421,7 @@ abstract contract PermissionChecker is Core, Periphery { Condition memory condition, ParameterPayload memory payload, Context memory context - ) private pure returns (Status status, Result memory result) { + ) private view returns (Status status, Result memory result) { result.consumptions = context.consumptions; uint256 length = condition.children.length; @@ -454,7 +454,7 @@ abstract contract PermissionChecker is Core, Periphery { Condition memory condition, ParameterPayload memory payload, Context memory context - ) private pure returns (Status status, Result memory result) { + ) private view returns (Status status, Result memory result) { result.consumptions = context.consumptions; for (uint256 i; i < payload.children.length; ) { @@ -486,7 +486,7 @@ abstract contract PermissionChecker is Core, Periphery { Condition memory condition, ParameterPayload memory payload, Context memory context - ) private pure returns (Status, Result memory result) { + ) private view returns (Status, Result memory result) { result.consumptions = context.consumptions; if ( @@ -614,7 +614,7 @@ abstract contract PermissionChecker is Core, Periphery { Condition memory condition, ParameterPayload memory payload, Context memory context - ) private pure returns (Status, Result memory) { + ) private view returns (Status, Result memory) { // 20 bytes on the left ICustomCondition adapter = ICustomCondition( address(bytes20(condition.compValue)) @@ -623,6 +623,7 @@ abstract contract PermissionChecker is Core, Periphery { bytes12 extra = bytes12(uint96(uint256(condition.compValue))); (bool success, bytes32 info) = adapter.check( + context.to, context.value, data, payload.location, diff --git a/packages/evm/contracts/adapters/ERC721IsOwnedByAvatar.sol b/packages/evm/contracts/adapters/ERC721IsOwnedByAvatar.sol new file mode 100644 index 000000000..8b2057036 --- /dev/null +++ b/packages/evm/contracts/adapters/ERC721IsOwnedByAvatar.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: LGPL-3.0-only +pragma solidity >=0.8.17 <0.9.0; + +import "@openzeppelin/contracts/interfaces/IERC721.sol"; +import "./Types.sol"; + +interface IModifier { + function avatar() external view returns (address); + + function target() external view returns (address); +} + +contract ERC721IsOwnedByAvatar is ICustomCondition { + function check( + address to, + uint256 /* value */, + bytes calldata data, + uint256 location, + uint256 size, + bytes12 + ) public view returns (bool success, bytes32 reason) { + address avatar = IModifier(msg.sender).avatar(); + uint256 tokenId = uint256(bytes32(data[location:location + size])); + return (IERC721(to).ownerOf(tokenId) == avatar, 0); + } +} diff --git a/packages/evm/contracts/adapters/Types.sol b/packages/evm/contracts/adapters/Types.sol index 8dbb3333f..f27b5648c 100644 --- a/packages/evm/contracts/adapters/Types.sol +++ b/packages/evm/contracts/adapters/Types.sol @@ -27,10 +27,11 @@ interface ITransactionUnwrapper { interface ICustomCondition { function check( + address to, uint256 value, bytes calldata data, uint256 location, uint256 size, bytes12 extra - ) external pure returns (bool success, bytes32 reason); + ) external view returns (bool success, bytes32 reason); } diff --git a/packages/evm/contracts/test/MockERC721.sol b/packages/evm/contracts/test/MockERC721.sol new file mode 100644 index 000000000..55e7d96f6 --- /dev/null +++ b/packages/evm/contracts/test/MockERC721.sol @@ -0,0 +1,15 @@ +// contracts/GameItem.sol +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; + +contract MockERC721 is ERC721 { + constructor() ERC721("MockErc721", "NFTPOS") {} + + function mint(address to, uint256 tokenId) external { + _mint(to, tokenId); + } + + function doSomething(uint256 tokenId, uint256 someParam) external {} +} diff --git a/packages/evm/contracts/test/TestCustomChecker.sol b/packages/evm/contracts/test/TestCustomChecker.sol index cb8d8b16a..8f5de1639 100644 --- a/packages/evm/contracts/test/TestCustomChecker.sol +++ b/packages/evm/contracts/test/TestCustomChecker.sol @@ -5,6 +5,7 @@ import "../adapters/Types.sol"; contract TestCustomChecker is ICustomCondition { function check( + address, uint256, bytes calldata data, uint256 location, diff --git a/packages/evm/test/adapters/ERC721IsOwnedByAvatar.spec.ts b/packages/evm/test/adapters/ERC721IsOwnedByAvatar.spec.ts new file mode 100644 index 000000000..185342116 --- /dev/null +++ b/packages/evm/test/adapters/ERC721IsOwnedByAvatar.spec.ts @@ -0,0 +1,130 @@ +import hre from "hardhat"; + +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import { expect } from "chai"; + +import { + BYTES32_ZERO, + ExecutionOptions, + Operator, + ParameterType, + PermissionCheckerStatus, + deployRolesMod, +} from "../utils"; +import { AddressOne } from "@gnosis.pm/safe-contracts"; +import { ConditionFlatStruct } from "../../typechain-types/contracts/Integrity"; + +describe("ERC721IsOwnedByAvatar", async () => { + async function setup() { + const ROLE_KEY = + "0x0000000000000000000000000000000000000000000000000000000000000001"; + + const [owner, invoker] = await hre.ethers.getSigners(); + + const Avatar = await hre.ethers.getContractFactory("TestAvatar"); + const avatar = await Avatar.deploy(); + + const roles = await deployRolesMod( + hre, + owner.address, + avatar.address, + avatar.address + ); + await roles.enableModule(invoker.address); + + await roles.connect(owner).assignRoles(invoker.address, [ROLE_KEY], [true]); + await roles.connect(owner).setDefaultRole(invoker.address, ROLE_KEY); + + const MockERC721 = await hre.ethers.getContractFactory("MockERC721"); + const mockERC721 = await MockERC721.deploy(); + + const SELECTOR = mockERC721.interface.getSighash( + mockERC721.interface.getFunction("doSomething") + ); + + await roles.connect(owner).scopeTarget(ROLE_KEY, mockERC721.address); + + const CustomChecker = await hre.ethers.getContractFactory( + "ERC721IsOwnedByAvatar" + ); + const customChecker = await CustomChecker.deploy(); + + async function scopeFunction( + conditions: ConditionFlatStruct[], + options: ExecutionOptions = ExecutionOptions.None + ) { + await roles + .connect(owner) + .scopeFunction( + ROLE_KEY, + mockERC721.address, + SELECTOR, + conditions, + options + ); + } + + async function invoke(tokenId: number, someParam: number) { + return roles + .connect(invoker) + .execTransactionFromModule( + mockERC721.address, + 0, + (await mockERC721.populateTransaction.doSomething(tokenId, someParam)) + .data as string, + 0 + ); + } + + return { + owner, + invoker, + avatar, + roles, + mockERC721, + customChecker, + scopeFunction, + invoke, + }; + } + + it("evaluates operator Custom - result is check pass", async () => { + const { roles, avatar, mockERC721, customChecker, scopeFunction, invoke } = + await loadFixture(setup); + + const extra = "000000000000000000000000"; + await scopeFunction([ + { + parent: 0, + paramType: ParameterType.Calldata, + operator: Operator.Matches, + compValue: "0x", + }, + { + parent: 0, + paramType: ParameterType.Static, + operator: Operator.Custom, + compValue: `${customChecker.address}${extra}`, + }, + { + parent: 0, + paramType: ParameterType.Static, + operator: Operator.Pass, + compValue: `0x`, + }, + ]); + + const notOwnedByAvatar = 12345; + const ownedByAvatar = 6789; + const someParam = 123; + + await mockERC721.mint(AddressOne, notOwnedByAvatar); + await mockERC721.mint(avatar.address, ownedByAvatar); + + await expect(invoke(notOwnedByAvatar, someParam)) + .to.be.revertedWithCustomError(roles, "ConditionViolation") + .withArgs(PermissionCheckerStatus.CustomConditionViolation, BYTES32_ZERO); + + await expect(invoke(ownedByAvatar, someParam)).to.not.be.reverted; + }); +}); From ee40bd1f3b8d91044ab085473713d0cb16a7801f Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Tue, 4 Jul 2023 07:25:58 +0100 Subject: [PATCH 11/43] Renaming Custom Checker Name --- ...{ERC721IsOwnedByAvatar.sol => AvatarIsOwnerOfERC721.sol} | 2 +- ...sOwnedByAvatar.spec.ts => AvatarIsOwnerOfERC721.spec.ts} | 6 +++--- packages/evm/test/operators/Misc.spec.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) rename packages/evm/contracts/adapters/{ERC721IsOwnedByAvatar.sol => AvatarIsOwnerOfERC721.sol} (93%) rename packages/evm/test/adapters/{ERC721IsOwnedByAvatar.spec.ts => AvatarIsOwnerOfERC721.spec.ts} (95%) diff --git a/packages/evm/contracts/adapters/ERC721IsOwnedByAvatar.sol b/packages/evm/contracts/adapters/AvatarIsOwnerOfERC721.sol similarity index 93% rename from packages/evm/contracts/adapters/ERC721IsOwnedByAvatar.sol rename to packages/evm/contracts/adapters/AvatarIsOwnerOfERC721.sol index 8b2057036..dad684926 100644 --- a/packages/evm/contracts/adapters/ERC721IsOwnedByAvatar.sol +++ b/packages/evm/contracts/adapters/AvatarIsOwnerOfERC721.sol @@ -10,7 +10,7 @@ interface IModifier { function target() external view returns (address); } -contract ERC721IsOwnedByAvatar is ICustomCondition { +contract AvatarIsOwnerOfERC721 is ICustomCondition { function check( address to, uint256 /* value */, diff --git a/packages/evm/test/adapters/ERC721IsOwnedByAvatar.spec.ts b/packages/evm/test/adapters/AvatarIsOwnerOfERC721.spec.ts similarity index 95% rename from packages/evm/test/adapters/ERC721IsOwnedByAvatar.spec.ts rename to packages/evm/test/adapters/AvatarIsOwnerOfERC721.spec.ts index 185342116..6771f82ac 100644 --- a/packages/evm/test/adapters/ERC721IsOwnedByAvatar.spec.ts +++ b/packages/evm/test/adapters/AvatarIsOwnerOfERC721.spec.ts @@ -14,7 +14,7 @@ import { import { AddressOne } from "@gnosis.pm/safe-contracts"; import { ConditionFlatStruct } from "../../typechain-types/contracts/Integrity"; -describe("ERC721IsOwnedByAvatar", async () => { +describe("AvatarIsOwnerOfERC721", async () => { async function setup() { const ROLE_KEY = "0x0000000000000000000000000000000000000000000000000000000000000001"; @@ -45,7 +45,7 @@ describe("ERC721IsOwnedByAvatar", async () => { await roles.connect(owner).scopeTarget(ROLE_KEY, mockERC721.address); const CustomChecker = await hre.ethers.getContractFactory( - "ERC721IsOwnedByAvatar" + "AvatarIsOwnerOfERC721" ); const customChecker = await CustomChecker.deploy(); @@ -88,7 +88,7 @@ describe("ERC721IsOwnedByAvatar", async () => { }; } - it("evaluates operator Custom - result is check pass", async () => { + it("passes a comparison", async () => { const { roles, avatar, mockERC721, customChecker, scopeFunction, invoke } = await loadFixture(setup); diff --git a/packages/evm/test/operators/Misc.spec.ts b/packages/evm/test/operators/Misc.spec.ts index 64f1a0333..abce4b7de 100644 --- a/packages/evm/test/operators/Misc.spec.ts +++ b/packages/evm/test/operators/Misc.spec.ts @@ -63,13 +63,13 @@ describe("Operator - Misc", async () => { }, { - parent: 3, // ?? + parent: 3, paramType: ParameterType.Dynamic, operator: Operator.Bitmask, compValue: maskCompValue(iface.getSighash("fnAllowed1")), }, { - parent: 3, // ?? + parent: 3, paramType: ParameterType.Dynamic, operator: Operator.Bitmask, compValue: maskCompValue(iface.getSighash("fnAllowed2")), From 682fd22ce2e689d4a5212677a2caa47adefa8dc9 Mon Sep 17 00:00:00 2001 From: Jan-Felix Date: Wed, 30 Aug 2023 12:54:50 +0200 Subject: [PATCH 12/43] bump package version --- packages/evm/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/evm/package.json b/packages/evm/package.json index 0b09c5120..12d8cf582 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -1,6 +1,6 @@ { "name": "@gnosis.pm/zodiac-modifier-roles", - "version": "2.0.0", + "version": "2.1.0", "description": "A Zodiac modifier that allows avatars to enforce granular, role-based, permissions for attached modules.", "directories": { "test": "test" @@ -56,4 +56,4 @@ "ethers": "5.7.2", "yargs": "16.1.1" } -} +} \ No newline at end of file From a6c9b63863d6fead5d85f66d2f7002cbdc78d00a Mon Sep 17 00:00:00 2001 From: Jan-Felix Date: Wed, 30 Aug 2023 14:53:20 +0200 Subject: [PATCH 13/43] upgrade solidity --- packages/evm/hardhat.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/evm/hardhat.config.ts b/packages/evm/hardhat.config.ts index ef10b2e94..ce5d4a372 100644 --- a/packages/evm/hardhat.config.ts +++ b/packages/evm/hardhat.config.ts @@ -49,7 +49,7 @@ const config: HardhatUserConfig = { solidity: { compilers: [ { - version: "0.8.17", + version: "0.8.21", settings: { optimizer: { enabled: true, From da048b0b393e7972fbc8df3189b6998135389b9f Mon Sep 17 00:00:00 2001 From: Jan-Felix Date: Wed, 30 Aug 2023 15:14:10 +0200 Subject: [PATCH 14/43] trial to fix yarn install --- packages/evm/package.json | 3 + packages/evm/yarn.lock | 714 ++++++++++++++++++++++---------------- 2 files changed, 423 insertions(+), 294 deletions(-) diff --git a/packages/evm/package.json b/packages/evm/package.json index 12d8cf582..2db7ff436 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -55,5 +55,8 @@ "dotenv": "16.0.3", "ethers": "5.7.2", "yargs": "16.1.1" + }, + "installConfig": { + "hoistingLimits": "workspaces" } } \ No newline at end of file diff --git a/packages/evm/yarn.lock b/packages/evm/yarn.lock index 2e239a70e..c9dc2ac8d 100644 --- a/packages/evm/yarn.lock +++ b/packages/evm/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -22,18 +27,18 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0": - version "4.4.1" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.4.1.tgz#087cb8d9d757bb22e9c9946c9c0c2bf8806830f1" - integrity sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw== + version "4.8.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" + integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== "@eslint/eslintrc@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.0.1.tgz#7888fe7ec8f21bc26d646dbd2c11cd776e21192d" - integrity sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw== + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.5.0" + espree "^9.6.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -46,6 +51,20 @@ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.36.0.tgz#9837f768c03a1e4a30bd304a64fb8844f0e72efe" integrity sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg== +"@ethereumjs/rlp@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/rlp/-/rlp-4.0.1.tgz#626fabfd9081baab3d0a3074b0c7ecaf674aaa41" + integrity sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw== + +"@ethereumjs/util@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/util/-/util-8.1.0.tgz#299df97fb6b034e0577ce9f94c7d9d1004409ed4" + integrity sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA== + dependencies: + "@ethereumjs/rlp" "^4.0.1" + ethereum-cryptography "^2.0.0" + micro-ftch "^0.3.1" + "@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" @@ -410,9 +429,9 @@ ethers "^5.7.1" "@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== + version "0.11.11" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" + integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== dependencies: "@humanwhocodes/object-schema" "^1.2.1" debug "^4.1.1" @@ -429,14 +448,14 @@ integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== "@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" @@ -457,19 +476,28 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@morgan-stanley/ts-mocking-bird@^0.6.2": - version "0.6.4" - resolved "https://registry.yarnpkg.com/@morgan-stanley/ts-mocking-bird/-/ts-mocking-bird-0.6.4.tgz#2e4b60d42957bab3b50b67dbf14c3da2f62a39f7" - integrity sha512-57VJIflP8eR2xXa9cD1LUawh+Gh+BVQfVu0n6GALyg/AqV/Nz25kDRvws3i9kIe1PTrbsZZOYpsYp6bXPd6nVA== +"@noble/curves@1.1.0", "@noble/curves@~1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d" + integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA== dependencies: - lodash "^4.17.16" - uuid "^7.0.3" + "@noble/hashes" "1.3.1" "@noble/hashes@1.2.0", "@noble/hashes@~1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.2.0.tgz#a3150eeb09cc7ab207ebf6d7b9ad311a9bdbed12" integrity sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ== +"@noble/hashes@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9" + integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA== + +"@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" + integrity sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== + "@noble/secp256k1@1.7.1", "@noble/secp256k1@~1.7.0": version "1.7.1" resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" @@ -640,9 +668,9 @@ ordinal "^1.0.3" "@nomicfoundation/hardhat-network-helpers@^1.0.7": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz#e4fe1be93e8a65508c46d73c41fa26c7e9f84931" - integrity sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q== + version "1.0.9" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.9.tgz#767449e8a2acda79306ac84626117583d95d25aa" + integrity sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q== dependencies: ethereumjs-util "^7.1.4" @@ -718,9 +746,9 @@ "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.1" "@nomiclabs/hardhat-ethers@^2.2.1": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz#812d48929c3bf8fe840ec29eab4b613693467679" - integrity sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA== + version "2.2.3" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz#b41053e360c31a32c2640c9a45ee981a7e603fe0" + integrity sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg== "@nomiclabs/hardhat-etherscan@^3.1.4": version "3.1.7" @@ -739,19 +767,19 @@ undici "^5.14.0" "@openzeppelin/contracts-upgradeable@^4.8.1": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.8.2.tgz#edef522bdbc46d478481391553bababdd2199e27" - integrity sha512-zIggnBwemUmmt9IS73qxi+tumALxCY4QEs3zLCII78k0Gfse2hAOdAkuAeLUzvWUpneMUfFE5sGHzEUSTvn4Ag== + version "4.9.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.3.tgz#ff17a80fb945f5102571f8efecb5ce5915cc4811" + integrity sha512-jjaHAVRMrE4UuZNfDwjlLGDxTHWIOwTJS2ldnc278a0gevfXfPr8hxKEVBGFBE96kl2G3VHDZhUimw/+G3TG2A== "@openzeppelin/contracts@^4.8.1": - version "4.8.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.8.2.tgz#d815ade0027b50beb9bcca67143c6bcc3e3923d6" - integrity sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g== + version "4.9.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.3.tgz#00d7a8cf35a475b160b3f0293a6403c511099364" + integrity sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg== "@scure/base@~1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" - integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.2.tgz#ff0cf51874aaf176490c9cb46e4df807a2e581d2" + integrity sha512-sSCrnIdaUZQHhBxZThMuk7Wm1TWzMD3uJNdGgx3JS23xSqevu0tAOsg8k66nL3R2NwQe65AI9GgqpPOgZys/eA== "@scure/bip32@1.1.5": version "1.1.5" @@ -762,6 +790,15 @@ "@noble/secp256k1" "~1.7.0" "@scure/base" "~1.1.0" +"@scure/bip32@1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10" + integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A== + dependencies: + "@noble/curves" "~1.1.0" + "@noble/hashes" "~1.3.1" + "@scure/base" "~1.1.0" + "@scure/bip39@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" @@ -770,6 +807,14 @@ "@noble/hashes" "~1.2.0" "@scure/base" "~1.1.0" +"@scure/bip39@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a" + integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg== + dependencies: + "@noble/hashes" "~1.3.0" + "@scure/base" "~1.1.0" + "@sentry/core@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" @@ -846,9 +891,9 @@ antlr4ts "^0.5.0-alpha.4" "@solidity-parser/parser@^0.16.0": - version "0.16.0" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.0.tgz#1fb418c816ca1fc3a1e94b08bcfe623ec4e1add4" - integrity sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q== + version "0.16.1" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.16.1.tgz#f7c8a686974e1536da0105466c4db6727311253c" + integrity sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw== dependencies: antlr4ts "^0.5.0-alpha.4" @@ -868,22 +913,22 @@ integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@typechain/ethers-v5@^10.2.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz#68f5963efb5214cb2d881477228e4b5b315473e1" - integrity sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w== + version "10.2.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz#50241e6957683281ecfa03fb5a6724d8a3ce2391" + integrity sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A== dependencies: lodash "^4.17.15" ts-essentials "^7.0.1" "@typechain/hardhat@^6.1.5": - version "6.1.5" - resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.5.tgz#caad58a1d3e9cd88061a584eb4f4fa763d5dcad1" - integrity sha512-lg7LW4qDZpxFMknp3Xool61Fg6Lays8F8TXdFGBG+MxyYcYU5795P1U2XdStuzGq9S2Dzdgh+1jGww9wvZ6r4Q== + version "6.1.6" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.6.tgz#1a749eb35e5054c80df531cf440819cb347c62ea" + integrity sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA== dependencies: fs-extra "^9.1.0" @@ -914,9 +959,9 @@ "@types/chai" "*" "@types/chai@*": - version "4.3.4" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" - integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== + version "4.3.5" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" + integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== "@types/concat-stream@^1.6.0": version "1.6.1" @@ -941,9 +986,9 @@ "@types/node" "*" "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + version "7.0.12" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== "@types/json5@^0.0.29": version "0.0.29" @@ -966,9 +1011,9 @@ integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== "@types/node@*": - version "18.15.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.10.tgz#4ee2171c3306a185d1208dad5f44dae3dee4cfe3" - integrity sha512-9avDaQJczATcXgfmMAW3MIWArOO7A+m90vuCFLr8AotWf8igO/mRoYukrk2cqZVtv38tHs33retzHEilM7FpeQ== + version "20.5.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377" + integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== "@types/node@^10.0.3": version "10.17.60" @@ -988,9 +1033,9 @@ "@types/node" "*" "@types/prettier@^2.1.1": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" - integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/qs@^6.2.31": version "6.9.7" @@ -1005,9 +1050,9 @@ "@types/node" "*" "@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + version "7.5.1" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" + integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== "@types/yargs-parser@*": version "21.0.0" @@ -1022,87 +1067,87 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.9.0": - version "5.57.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz#52c8a7a4512f10e7249ca1e2e61f81c62c34365c" - integrity sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.57.0" - "@typescript-eslint/type-utils" "5.57.0" - "@typescript-eslint/utils" "5.57.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" natural-compare-lite "^1.4.0" semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/parser@^5.9.0": - version "5.57.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.57.0.tgz#f675bf2cd1a838949fd0de5683834417b757e4fa" - integrity sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: - "@typescript-eslint/scope-manager" "5.57.0" - "@typescript-eslint/types" "5.57.0" - "@typescript-eslint/typescript-estree" "5.57.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.57.0": - version "5.57.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz#79ccd3fa7bde0758059172d44239e871e087ea36" - integrity sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw== +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: - "@typescript-eslint/types" "5.57.0" - "@typescript-eslint/visitor-keys" "5.57.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/type-utils@5.57.0": - version "5.57.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz#98e7531c4e927855d45bd362de922a619b4319f2" - integrity sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ== +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: - "@typescript-eslint/typescript-estree" "5.57.0" - "@typescript-eslint/utils" "5.57.0" + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.57.0": - version "5.57.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.57.0.tgz#727bfa2b64c73a4376264379cf1f447998eaa132" - integrity sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ== +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/typescript-estree@5.57.0": - version "5.57.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz#ebcd0ee3e1d6230e888d88cddf654252d41e2e40" - integrity sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw== +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: - "@typescript-eslint/types" "5.57.0" - "@typescript-eslint/visitor-keys" "5.57.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.57.0": - version "5.57.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.57.0.tgz#eab8f6563a2ac31f60f3e7024b91bf75f43ecef6" - integrity sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw== +"@typescript-eslint/utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.57.0" - "@typescript-eslint/types" "5.57.0" - "@typescript-eslint/typescript-estree" "5.57.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.57.0": - version "5.57.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz#e2b2f4174aff1d15eef887ce3d019ecc2d7a8ac1" - integrity sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g== +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: - "@typescript-eslint/types" "5.57.0" + "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" abbrev@1: @@ -1145,10 +1190,10 @@ acorn-walk@^8.1.1: resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== -acorn@^8.4.1, acorn@^8.8.0: - version "8.8.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== +acorn@^8.4.1, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== address@^1.0.1: version "1.2.2" @@ -1351,16 +1396,28 @@ array.prototype.flatmap@^1.3.1: es-shim-unscopables "^1.0.0" array.prototype.reduce@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" - integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== + version "1.0.6" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz#63149931808c5fc1e1354814923d92d45f7d96d5" + integrity sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -1462,16 +1519,9 @@ bech32@1.1.4: integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== bigint-crypto-utils@^3.0.23: - version "3.1.8" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz#e2e0f40cf45488f9d7f0e32ff84152aa73819d5d" - integrity sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw== - dependencies: - bigint-mod-arith "^3.1.0" - -bigint-mod-arith@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz#658e416bc593a463d97b59766226d0a3021a76b1" - integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== + version "3.3.0" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz#72ad00ae91062cf07f2b1def9594006c279c1d77" + integrity sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg== binary-extensions@^2.0.0: version "2.2.0" @@ -1729,14 +1779,14 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: safe-buffer "^5.0.1" classic-level@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.2.0.tgz#2d52bdec8e7a27f534e67fdeb890abef3e643c27" - integrity sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.3.0.tgz#5e36680e01dc6b271775c093f2150844c5edd5c8" + integrity sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg== dependencies: abstract-level "^1.0.2" catering "^2.1.0" module-error "^1.0.1" - napi-macros "~2.0.0" + napi-macros "^2.2.2" node-gyp-build "^4.3.0" clean-stack@^2.0.0: @@ -1984,7 +2034,7 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== -define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: +define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== @@ -2090,29 +2140,31 @@ emoji-regex@^8.0.0: integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== enquirer@^2.3.0: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== dependencies: ansi-colors "^4.1.1" + strip-ansi "^6.0.1" env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.21.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff" - integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== +es-abstract@^1.20.4, es-abstract@^1.21.2, es-abstract@^1.22.1: + version "1.22.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== dependencies: array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" available-typed-arrays "^1.0.5" call-bind "^1.0.2" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" @@ -2132,14 +2184,18 @@ es-abstract@^1.19.0, es-abstract@^1.20.4: object-inspect "^1.12.3" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" safe-regex-test "^1.0.0" string.prototype.trim "^1.2.7" string.prototype.trimend "^1.0.6" string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.9" + which-typed-array "^1.1.10" es-array-method-boxes-properly@^1.0.0: version "1.0.0" @@ -2204,18 +2260,18 @@ eslint-config-prettier@8.8.0: integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + version "0.3.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" + integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== dependencies: debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" + is-core-module "^2.13.0" + resolve "^1.22.4" eslint-module-utils@^2.7.4: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== + version "2.8.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== dependencies: debug "^3.2.7" @@ -2264,17 +2320,17 @@ eslint-scope@^5.1.1: estraverse "^4.1.1" eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-visitor-keys@^3.3.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc" - integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@8.36.0: version "8.36.0" @@ -2322,14 +2378,14 @@ eslint@8.36.0: strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.5.0: - version "9.5.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.5.0.tgz#3646d4e3f58907464edba852fa047e6a27bdf113" - integrity sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw== +espree@^9.5.0, espree@^9.6.0: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.1" esprima@2.7.x, esprima@^2.7.1: version "2.7.3" @@ -2434,6 +2490,16 @@ ethereum-cryptography@^1.0.3: "@scure/bip32" "1.1.5" "@scure/bip39" "1.1.1" +ethereum-cryptography@^2.0.0, ethereum-cryptography@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz#18fa7108622e56481157a5cb7c01c0c6a672eb67" + integrity sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug== + dependencies: + "@noble/curves" "1.1.0" + "@noble/hashes" "1.3.1" + "@scure/bip32" "1.3.1" + "@scure/bip39" "1.2.1" + ethereumjs-abi@^0.6.8: version "0.6.8" resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" @@ -2455,7 +2521,7 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.4: +ethereumjs-util@^7.1.4: version "7.1.5" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== @@ -2567,14 +2633,14 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.0.3, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -2643,11 +2709,12 @@ find-up@^2.1.0: locate-path "^2.0.0" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.1.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" + integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== dependencies: - flatted "^3.1.0" + flatted "^3.2.7" + keyv "^4.5.3" rimraf "^3.0.2" flat@^4.1.0: @@ -2662,7 +2729,7 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.1.0: +flatted@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== @@ -2767,9 +2834,9 @@ fsevents@~2.1.1: integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== function-bind@^1.1.1: version "1.1.1" @@ -2777,21 +2844,21 @@ function-bind@^1.1.1: integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== -functions-have-names@^1.2.2: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -2806,13 +2873,14 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== dependencies: function-bind "^1.1.1" has "^1.0.3" + has-proto "^1.0.1" has-symbols "^1.0.3" get-port@^3.1.0: @@ -2933,9 +3001,9 @@ global-prefix@^3.0.0: which "^1.3.1" globals@^13.19.0: - version "13.20.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.20.0.tgz#ea276a1e508ffd4f1612888f9d1bad1e2717bf82" - integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + version "13.21.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" + integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== dependencies: type-fest "^0.20.2" @@ -2989,18 +3057,23 @@ grapheme-splitter@^1.0.4: resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== handlebars@^4.0.1: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: minimist "^1.2.5" - neo-async "^2.6.0" + neo-async "^2.6.2" source-map "^0.6.1" wordwrap "^1.0.0" optionalDependencies: @@ -3251,9 +3324,9 @@ ignore@^5.0.5, ignore@^5.1.1, ignore@^5.2.0: integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== immutable@^4.0.0-rc.12: - version "4.3.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.0.tgz#eb1738f14ffb39fd068b1dbe1296117484dd34be" - integrity sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg== + version "4.3.4" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" + integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" @@ -3353,10 +3426,10 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-core-module@^2.11.0, is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== dependencies: has "^1.0.3" @@ -3451,15 +3524,11 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: has-symbols "^1.0.2" is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" + which-typed-array "^1.1.11" is-typedarray@~1.0.0: version "1.0.0" @@ -3478,6 +3547,11 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -3494,9 +3568,9 @@ isstream@~0.1.2: integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== js-sdsl@^4.1.4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" - integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== + version "4.4.2" + resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" + integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== js-sha3@0.5.7: version "0.5.7" @@ -3536,6 +3610,11 @@ jsbn@~0.1.0: resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -3615,6 +3694,13 @@ keccak@^3.0.0, keccak@^3.0.2: node-gyp-build "^4.2.0" readable-stream "^3.6.0" +keyv@^4.5.3: + version "4.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + dependencies: + json-buffer "3.0.1" + kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" @@ -3702,7 +3788,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.16, lodash@^4.17.19, lodash@^4.17.21: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3791,6 +3877,11 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +micro-ftch@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/micro-ftch/-/micro-ftch-0.3.1.tgz#6cb83388de4c1f279a034fb0cf96dfc050853c5f" + integrity sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg== + micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -3985,10 +4076,10 @@ nanoid@3.3.3: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== -napi-macros@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" - integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== +napi-macros@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.2.2.tgz#817fef20c3e0e40a963fbf7b37d1600bd0201044" + integrity sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g== natural-compare-lite@^1.4.0: version "1.4.0" @@ -4000,7 +4091,7 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -neo-async@^2.6.0: +neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -4026,9 +4117,9 @@ node-environment-flags@1.0.6: semver "^5.7.0" node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" - integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" + integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== nofilter@^3.1.0: version "3.1.0" @@ -4096,23 +4187,24 @@ object.assign@^4.1.4: object-keys "^1.1.1" object.getownpropertydescriptors@^2.0.3: - version "2.1.5" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" - integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== + version "2.1.6" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz#5e5c384dd209fa4efffead39e3a0512770ccc312" + integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== dependencies: array.prototype.reduce "^1.0.5" call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.21.2" + safe-array-concat "^1.0.0" object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" obliterator@^2.0.0: version "2.0.4" @@ -4139,16 +4231,16 @@ optionator@^0.8.1: word-wrap "~1.2.3" optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" ordinal@^1.0.3: version "1.0.3" @@ -4324,9 +4416,9 @@ prettier@2.8.6: integrity sha512-mtuzdiBbHwPEgl7NxWlqOkithPyp4VN93V7VeHVWBF+ad3I5avc0RVDT4oImXQy9H/AqxA2NSQH8pSxHW6FYbQ== prettier@^2.3.1: - version "2.8.7" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.7.tgz#bb79fc8729308549d28fe3a98fce73d2c0656450" - integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== process-nextick-args@~2.0.0: version "2.0.1" @@ -4351,9 +4443,9 @@ punycode@^2.1.0, punycode@^2.1.1: integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== qs@^6.4.0, qs@^6.7.0: - version "6.11.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.1.tgz#6c29dff97f0c0060765911ba65cbc9764186109f" - integrity sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ== + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== dependencies: side-channel "^1.0.4" @@ -4439,14 +4531,14 @@ reduce-flatten@^2.0.0: resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== +regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" req-cwd@^2.0.0: version "2.0.0" @@ -4541,12 +4633,12 @@ resolve@1.17.0: dependencies: path-parse "^1.0.6" -resolve@^1.1.6, resolve@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== +resolve@^1.1.6, resolve@^1.22.1, resolve@^1.22.4: + version "1.22.4" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -4603,6 +4695,16 @@ rustbn.js@~0.2.0: resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -4667,19 +4769,19 @@ secp256k1@^4.0.1: node-gyp-build "^4.2.0" semver@^5.5.0, semver@^5.7.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== semver@^7.3.4, semver@^7.3.7, semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -5120,11 +5222,10 @@ tough-cookie@^2.3.3, tough-cookie@~2.5.0: punycode "^2.1.1" ts-command-line-args@^2.2.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.4.2.tgz#b4815b23c35f8a0159d4e69e01012d95690bc448" - integrity sha512-mJLQQBOdyD4XI/ZWQY44PIdYde47JhV2xl380O7twPkTQ+Y5vFDHsk8LOeXKuz7dVY5aDCfAzRarNfSqtKOkQQ== + version "2.5.1" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== dependencies: - "@morgan-stanley/ts-mocking-bird" "^0.6.2" chalk "^4.1.0" command-line-args "^5.1.1" command-line-usage "^6.1.0" @@ -5253,6 +5354,36 @@ typechain@8.1.1: ts-command-line-args "^2.2.0" ts-essentials "^7.0.1" +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + typed-array-length@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" @@ -5298,9 +5429,9 @@ unbox-primitive@^1.0.2: which-boxed-primitive "^1.0.2" undici@^5.14.0: - version "5.21.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.21.0.tgz#b00dfc381f202565ab7f52023222ab862bb2494f" - integrity sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA== + version "5.23.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.23.0.tgz#e7bdb0ed42cebe7b7aca87ced53e6eaafb8f8ca0" + integrity sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg== dependencies: busboy "^1.6.0" @@ -5346,11 +5477,6 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" - integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== - uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -5371,13 +5497,14 @@ verror@1.10.0: extsprintf "^1.2.0" web3-utils@^1.3.6: - version "1.9.0" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.9.0.tgz#7c5775a47586cefb4ad488831be8f6627be9283d" - integrity sha512-p++69rCNNfu2jM9n5+VD/g26l+qkEOQ1m6cfRQCbH8ZRrtquTmrirJMgTmyOoax5a5XRYOuws14aypCOs51pdQ== + version "1.10.2" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.2.tgz#361103d28a94d5e2a87ba15d776a62c33303eb44" + integrity sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow== dependencies: + "@ethereumjs/util" "^8.1.0" bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" + ethereum-cryptography "^2.1.2" ethjs-unit "0.1.6" number-to-bn "1.7.0" randombytes "^2.1.0" @@ -5395,21 +5522,20 @@ which-boxed-primitive@^1.0.2: is-symbol "^1.0.3" which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== +which-typed-array@^1.1.10, which-typed-array@^1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" which@1.3.1, which@^1.1.1, which@^1.3.1: version "1.3.1" @@ -5432,10 +5558,10 @@ wide-align@1.1.3: dependencies: string-width "^1.0.2 || 2" -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wordwrap@^1.0.0: version "1.0.0" From 4518dc56d4475879d61e61ecf8fd4f4786353f89 Mon Sep 17 00:00:00 2001 From: Jan-Felix Date: Wed, 30 Aug 2023 15:29:03 +0200 Subject: [PATCH 15/43] upgrade subgraph deps --- packages/subgraph/package.json | 6 +- packages/subgraph/yarn.lock | 2843 ++++++++++++++++++++------------ 2 files changed, 1797 insertions(+), 1052 deletions(-) diff --git a/packages/subgraph/package.json b/packages/subgraph/package.json index e5f0c152a..547041840 100644 --- a/packages/subgraph/package.json +++ b/packages/subgraph/package.json @@ -31,11 +31,11 @@ "prepare:gnosis-chain": "mustache network_configs/gnosis-chain.json subgraph.template.yaml > subgraph.yaml" }, "dependencies": { - "@graphprotocol/graph-cli": "0.26.0", - "@graphprotocol/graph-ts": "0.24.1" + "@graphprotocol/graph-cli": "0.56.0", + "@graphprotocol/graph-ts": "0.31.0" }, "devDependencies": { "mustache": "^4.2.0", "prettier": "^2.5.1" } -} +} \ No newline at end of file diff --git a/packages/subgraph/yarn.lock b/packages/subgraph/yarn.lock index 302ca42cb..3317358ae 100644 --- a/packages/subgraph/yarn.lock +++ b/packages/subgraph/yarn.lock @@ -23,42 +23,462 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@graphprotocol/graph-cli@0.26.0": - version "0.26.0" - resolved "https://registry.yarnpkg.com/@graphprotocol/graph-cli/-/graph-cli-0.26.0.tgz#9bcc3533d1384d44b65e0bf7eef81221ae8a4e05" - integrity sha512-sQKKfkGy6jsfpZD6KA9KdvHRpeStd1ZH334CMVxhyJtPY006a/Wc2rr7TBqgAtwpggs7UiT0UA3s5vG0jFQB5g== - dependencies: - assemblyscript "0.19.10" +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@ethersproject/abi@5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" + integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== + dependencies: + "@ethersproject/address" "^5.0.4" + "@ethersproject/bignumber" "^5.0.7" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/constants" "^5.0.4" + "@ethersproject/hash" "^5.0.4" + "@ethersproject/keccak256" "^5.0.3" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/properties" "^5.0.3" + "@ethersproject/strings" "^5.0.4" + +"@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@^5.0.4", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + +"@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== + dependencies: + "@ethersproject/bytes" "^5.7.0" + +"@ethersproject/bignumber@^5.0.7", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@^5.0.4", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@^5.0.4", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/hash@^5.0.4": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/keccak256@^5.0.3", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + js-sha3 "0.8.0" + +"@ethersproject/logger@^5.0.5", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== + +"@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/properties@^5.0.3", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + bn.js "^5.2.1" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/strings@^5.0.4", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@float-capital/float-subgraph-uncrashable@^0.0.0-alpha.4": + version "0.0.0-internal-testing.5" + resolved "https://registry.yarnpkg.com/@float-capital/float-subgraph-uncrashable/-/float-subgraph-uncrashable-0.0.0-internal-testing.5.tgz#060f98440f6e410812766c5b040952d2d02e2b73" + integrity sha512-yZ0H5e3EpAYKokX/AbtplzlvSxEJY7ZfpvQyDzyODkks0hakAAlDG6fQu1SlDJMWorY7bbq1j7fCiFeTWci6TA== + dependencies: + "@rescript/std" "9.0.0" + graphql "^16.6.0" + graphql-import-node "^0.0.5" + js-yaml "^4.1.0" + +"@graphprotocol/graph-cli@0.56.0": + version "0.56.0" + resolved "https://registry.yarnpkg.com/@graphprotocol/graph-cli/-/graph-cli-0.56.0.tgz#0f95af33f596c3fd5b5503b20c24771f584784b2" + integrity sha512-bOVtYLDLJpyqjPv9RX8DwRFePOiIlzWZhQGuznb6lY7Uk+uvjc0JSBsgPOAWjwkAI+3U1Ux7GPVwgYSLIOBXoQ== + dependencies: + "@float-capital/float-subgraph-uncrashable" "^0.0.0-alpha.4" + "@oclif/core" "2.8.6" + "@whatwg-node/fetch" "^0.8.4" + assemblyscript "0.19.23" binary-install-raw "0.0.13" - chalk "^3.0.0" - chokidar "^3.0.2" - debug "^4.1.1" - docker-compose "^0.23.2" - dockerode "^2.5.8" - fs-extra "^9.0.0" - glob "^7.1.2" - gluegun "https://github.com/edgeandnode/gluegun#v4.3.1-pin-colors-dep" - graphql "^15.5.0" - immutable "^3.8.2" - ipfs-http-client "^34.0.0" - jayson "^3.0.2" - js-yaml "^3.13.1" - node-fetch "^2.3.0" - pkginfo "^0.4.1" - prettier "^1.13.5" - request "^2.88.0" - semver "7.3.5" - tmp-promise "^3.0.2" + chalk "3.0.0" + chokidar "3.5.3" + debug "4.3.4" + docker-compose "0.23.19" + dockerode "2.5.8" + fs-extra "9.1.0" + glob "9.3.5" + gluegun "5.1.2" + graphql "15.5.0" + immutable "4.2.1" + ipfs-http-client "55.0.0" + jayson "4.0.0" + js-yaml "3.14.1" + prettier "1.19.1" + request "2.88.2" + semver "7.4.0" + sync-request "6.1.0" + tmp-promise "3.0.3" + web3-eth-abi "1.7.0" which "2.0.2" - yaml "^1.5.1" + yaml "1.10.2" -"@graphprotocol/graph-ts@0.24.1": - version "0.24.1" - resolved "https://registry.yarnpkg.com/@graphprotocol/graph-ts/-/graph-ts-0.24.1.tgz#50961b52b5383f9c5cf5e6e23fa039f24e729ddf" - integrity sha512-2vU4m5ZPQIqMlMce/z5vmOtGHRlRmcRhMfemS3NIwxCSxSBGVnX2zb7QBTzzdQKGwsAZdbz6V0okkOtvohELfQ== +"@graphprotocol/graph-ts@0.31.0": + version "0.31.0" + resolved "https://registry.yarnpkg.com/@graphprotocol/graph-ts/-/graph-ts-0.31.0.tgz#730668c0369828b31bef81e8d9bc66b9b48e3480" + integrity sha512-xreRVM6ho2BtolyOh2flDkNoGZximybnzUnF53zJVp0+Ed0KnAlO1/KOCUYw06euVI9tk0c9nA2Z/D5SIQV2Rg== dependencies: assemblyscript "0.19.10" +"@ipld/dag-cbor@^7.0.0": + version "7.0.3" + resolved "https://registry.yarnpkg.com/@ipld/dag-cbor/-/dag-cbor-7.0.3.tgz#aa31b28afb11a807c3d627828a344e5521ac4a1e" + integrity sha512-1VVh2huHsuohdXC1bGJNE8WR72slZ9XE2T3wbBBq31dm7ZBatmKLLxrB+XAqafxfRFjv08RZmj/W/ZqaM13AuA== + dependencies: + cborg "^1.6.0" + multiformats "^9.5.4" + +"@ipld/dag-json@^8.0.1": + version "8.0.11" + resolved "https://registry.yarnpkg.com/@ipld/dag-json/-/dag-json-8.0.11.tgz#8d30cc2dfacb0aef04d327465d3df91e79e8b6ce" + integrity sha512-Pea7JXeYHTWXRTIhBqBlhw7G53PJ7yta3G/sizGEZyzdeEwhZRr0od5IQ0r2ZxOt1Do+2czddjeEPp+YTxDwCA== + dependencies: + cborg "^1.5.4" + multiformats "^9.5.4" + +"@ipld/dag-pb@^2.1.3": + version "2.1.18" + resolved "https://registry.yarnpkg.com/@ipld/dag-pb/-/dag-pb-2.1.18.tgz#12d63e21580e87c75fd1a2c62e375a78e355c16f" + integrity sha512-ZBnf2fuX9y3KccADURG5vb9FaOeMjFkCrNysB0PtftME/4iCTjxfaLoNq/IAh5fTqUOMXvryN6Jyka4ZGuMLIg== + dependencies: + multiformats "^9.5.4" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@oclif/core@2.8.6": + version "2.8.6" + resolved "https://registry.yarnpkg.com/@oclif/core/-/core-2.8.6.tgz#7eb6984108f471ad0d719d3c07cde14c47ab17c5" + integrity sha512-1QlPaHMhOORySCXkQyzjsIsy2GYTilOw3LkjeHkCgsPJQjAT4IclVytJusWktPbYNys9O+O4V23J44yomQvnBQ== + dependencies: + "@types/cli-progress" "^3.11.0" + ansi-escapes "^4.3.2" + ansi-styles "^4.3.0" + cardinal "^2.1.1" + chalk "^4.1.2" + clean-stack "^3.0.1" + cli-progress "^3.12.0" + debug "^4.3.4" + ejs "^3.1.8" + fs-extra "^9.1.0" + get-package-type "^0.1.0" + globby "^11.1.0" + hyperlinker "^1.0.0" + indent-string "^4.0.0" + is-wsl "^2.2.0" + js-yaml "^3.14.1" + natural-orderby "^2.0.3" + object-treeify "^1.1.33" + password-prompt "^1.1.2" + semver "^7.3.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + supports-color "^8.1.1" + supports-hyperlinks "^2.2.0" + ts-node "^10.9.1" + tslib "^2.5.0" + widest-line "^3.1.0" + wordwrap "^1.0.0" + wrap-ansi "^7.0.0" + +"@peculiar/asn1-schema@^2.3.6": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@peculiar/asn1-schema/-/asn1-schema-2.3.6.tgz#3dd3c2ade7f702a9a94dfb395c192f5fa5d6b922" + integrity sha512-izNRxPoaeJeg/AyH8hER6s+H7p4itk+03QCa4sbxI3lNdseQYCuxzgsuNK8bTXChtLTjpJz6NmXKA73qLa3rCA== + dependencies: + asn1js "^3.0.5" + pvtsutils "^1.3.2" + tslib "^2.4.0" + +"@peculiar/json-schema@^1.1.12": + version "1.1.12" + resolved "https://registry.yarnpkg.com/@peculiar/json-schema/-/json-schema-1.1.12.tgz#fe61e85259e3b5ba5ad566cb62ca75b3d3cd5339" + integrity sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w== + dependencies: + tslib "^2.0.0" + +"@peculiar/webcrypto@^1.4.0": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@peculiar/webcrypto/-/webcrypto-1.4.3.tgz#078b3e8f598e847b78683dc3ba65feb5029b93a7" + integrity sha512-VtaY4spKTdN5LjJ04im/d/joXuvLbQdgy5Z4DXF4MFZhQ+MTrejbNMkfZBp1Bs3O5+bFqnJgyGdPuZQflvIa5A== + dependencies: + "@peculiar/asn1-schema" "^2.3.6" + "@peculiar/json-schema" "^1.1.12" + pvtsutils "^1.3.2" + tslib "^2.5.0" + webcrypto-core "^1.7.7" + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + +"@rescript/std@9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@rescript/std/-/std-9.0.0.tgz#df53f3fa5911cb4e85bd66b92e9e58ddf3e4a7e1" + integrity sha512-zGzFsgtZ44mgL4Xef2gOy1hrRVdrs9mcxCOOKZrIPsmbZW14yTkaF591GXxpQvjXiHtgZ/iA9qLyWH6oSReIxQ== + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/bn.js@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== + dependencies: + "@types/node" "*" + +"@types/cli-progress@^3.11.0": + version "3.11.0" + resolved "https://registry.yarnpkg.com/@types/cli-progress/-/cli-progress-3.11.0.tgz#ec79df99b26757c3d1c7170af8422e0fc95eef7e" + integrity sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg== + dependencies: + "@types/node" "*" + +"@types/concat-stream@^1.6.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" + integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== + dependencies: + "@types/node" "*" + "@types/connect@^3.4.33": version "3.4.35" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" @@ -66,44 +486,71 @@ dependencies: "@types/node" "*" -"@types/express-serve-static-core@^4.17.9": - version "4.17.28" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" - integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== +"@types/form-data@0.0.33": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" + integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== dependencies: "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" -"@types/lodash@^4.14.159": - version "4.14.178" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.178.tgz#341f6d2247db528d4a13ddbb374bcdc80406f4f8" - integrity sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw== +"@types/long@^4.0.1": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" + integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== + +"@types/minimatch@^3.0.4": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== "@types/node@*": version "17.0.17" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.17.tgz#a8ddf6e0c2341718d74ee3dc413a13a042c45a0c" integrity sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw== +"@types/node@>=13.7.0": + version "20.5.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377" + integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== + +"@types/node@^10.0.3": + version "10.17.60" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" + integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== + "@types/node@^12.12.54": version "12.20.45" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.45.tgz#f4980d177999299d99cd4b290f7f39366509a44f" integrity sha512-1Jg2Qv5tuxBqgQV04+wO5u+wmSHbHgpORCJdeCLM+E+YdPElpdHhgywU+M1V1InL8rfOtpqtOjswk+uXTKwx7w== +"@types/node@^8.0.0": + version "8.10.66" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" + integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== -"@types/qs@*": +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" + +"@types/qs@^6.2.31": version "6.9.7" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== +"@types/secp256k1@^4.0.1": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" "@types/ws@^7.4.4": version "7.4.7" @@ -112,6 +559,33 @@ dependencies: "@types/node" "*" +"@whatwg-node/events@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@whatwg-node/events/-/events-0.0.3.tgz#13a65dd4f5893f55280f766e29ae48074927acad" + integrity sha512-IqnKIDWfXBJkvy/k6tzskWTc2NK3LcqHlb+KHGCrjOCH4jfQckRX0NAiIcC/vIqQkzLYw2r2CTSwAxcrtcD6lA== + +"@whatwg-node/fetch@^0.8.4": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@whatwg-node/fetch/-/fetch-0.8.8.tgz#48c6ad0c6b7951a73e812f09dd22d75e9fa18cae" + integrity sha512-CdcjGC2vdKhc13KKxgsc6/616BQ7ooDIgPeTuAiE8qfCnS0mGzcfCOoZXypQSz73nxI+GWc7ZReIAVhxoE1KCg== + dependencies: + "@peculiar/webcrypto" "^1.4.0" + "@whatwg-node/node-fetch" "^0.3.6" + busboy "^1.6.0" + urlpattern-polyfill "^8.0.0" + web-streams-polyfill "^3.2.1" + +"@whatwg-node/node-fetch@^0.3.6": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@whatwg-node/node-fetch/-/node-fetch-0.3.6.tgz#e28816955f359916e2d830b68a64493124faa6d0" + integrity sha512-w9wKgDO4C95qnXZRwZTfCmLWqyRnooGjcIwG0wADWjw9/HN0p7dtvtgSvItZtUyNteEvgTrd8QojNEqV6DAGTA== + dependencies: + "@whatwg-node/events" "^0.0.3" + busboy "^1.6.0" + fast-querystring "^1.1.1" + fast-url-parser "^1.1.3" + tslib "^2.3.1" + JSONStream@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" @@ -135,6 +609,16 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.4.1: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + ajv@^6.12.3: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -145,15 +629,22 @@ ajv@^6.12.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ansi-colors@^3.2.1: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-escapes@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== ansi-regex@^5.0.1: version "5.0.1" @@ -167,13 +658,31 @@ ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" -ansi-styles@^4.1.0: +ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== dependencies: color-convert "^2.0.1" +ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== + +any-signal@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-2.1.2.tgz#8d48270de0605f8b218cf9abe8e9c6a0e7418102" + integrity sha512-B+rDnWasMi/eWcajPcCWSlYc7muXOrcYrqgyzcdKisl2H/WTlQ0gip1KyQfr0ZlxJdsuWCj/LWwQm7fhyhRfIQ== + dependencies: + abort-controller "^3.0.0" + native-abort-controller "^1.0.3" + +any-signal@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/any-signal/-/any-signal-3.0.1.tgz#49cae34368187a3472e31de28fb5cb1430caa9a6" + integrity sha512-xgZgJtKEa9YmDqXodIgl7Fl1C8yNXr8w6gXjqK3LW4GcEiYT+6AQfJSE/8SPsEpLLmcvbv8YU+qet94UewHxqg== + anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -182,19 +691,23 @@ anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" -apisauce@^1.0.1: - version "1.1.5" - resolved "https://registry.yarnpkg.com/apisauce/-/apisauce-1.1.5.tgz#31d41a5cf805e401266cec67faf1a50f4aeae234" - integrity sha512-gKC8qb/bDJsPsnEXLZnXJ7gVx7dh87CEVNeIwv1dvaffnXoh5GHwac5pWR1P2broLiVj/fqFMQvLDDt/RhjiqA== +apisauce@^2.1.5: + version "2.1.6" + resolved "https://registry.yarnpkg.com/apisauce/-/apisauce-2.1.6.tgz#94887f335bf3d735305fc895c8a191c9c2608a7f" + integrity sha512-MdxR391op/FucS2YQRfB/NMRyCnHEPDd4h17LRIuVYi0BpGmMhpxc0shbOpfs5ahABuBEffNCGal5EcsydbBWg== dependencies: - axios "^0.21.2" - ramda "^0.25.0" + axios "^0.21.4" app-module-path@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/app-module-path/-/app-module-path-2.2.0.tgz#641aa55dfb7d6a6f0a8141c4b9c0aa50b6c24dd5" integrity sha1-ZBqlXft9am8KgUHEucCqULbCTdU= +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -202,20 +715,20 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -asmcrypto.js@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/asmcrypto.js/-/asmcrypto.js-2.3.2.tgz#b9f84bd0a1fb82f21f8c29cc284a707ad17bba2e" - integrity sha512-3FgFARf7RupsZETQ1nHnhLUUvpcttcCq1iZCaVAbJZbCZ5VNRrNyvpDyHTOb0KC3llFcsyOT/a99NZcCbeiEsA== +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -asn1.js@^5.0.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== asn1@~0.2.3: version "0.2.6" @@ -224,6 +737,15 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" +asn1js@^3.0.1, asn1js@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/asn1js/-/asn1js-3.0.5.tgz#5ea36820443dbefb51cc7f88a2ebb5b462114f38" + integrity sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ== + dependencies: + pvtsutils "^1.3.2" + pvutils "^1.1.3" + tslib "^2.4.0" + assemblyscript@0.19.10: version "0.19.10" resolved "https://registry.yarnpkg.com/assemblyscript/-/assemblyscript-0.19.10.tgz#7ede6d99c797a219beb4fa4614c3eab9e6343c8e" @@ -232,17 +754,24 @@ assemblyscript@0.19.10: binaryen "101.0.0-nightly.20210723" long "^4.0.0" +assemblyscript@0.19.23: + version "0.19.23" + resolved "https://registry.yarnpkg.com/assemblyscript/-/assemblyscript-0.19.23.tgz#16ece69f7f302161e2e736a0f6a474e6db72134c" + integrity sha512-fwOQNZVTMga5KRsfY80g7cpOl4PsFQczMwHzdtgoqLXaYhkhavufKb0sB0l3T1DUxpAufA0KNhlbpuuhZUwxMA== + dependencies: + binaryen "102.0.0-nightly.20211028" + long "^5.2.0" + source-map-support "^0.5.20" + assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= -async@^2.6.1, async@^2.6.2, async@^2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== - dependencies: - lodash "^4.17.14" +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== asynckit@^0.4.0: version "0.4.0" @@ -264,7 +793,7 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axios@^0.21.1, axios@^0.21.2: +axios@^0.21.1, axios@^0.21.4: version "0.21.4" resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== @@ -276,7 +805,7 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base-x@^3.0.2, base-x@^3.0.8: +base-x@^3.0.2: version "3.0.9" resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== @@ -295,11 +824,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -bignumber.js@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" - integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -319,19 +843,10 @@ binaryen@101.0.0-nightly.20210723: resolved "https://registry.yarnpkg.com/binaryen/-/binaryen-101.0.0-nightly.20210723.tgz#b6bb7f3501341727681a03866c0856500eec3740" integrity sha512-eioJNqhHlkguVSbblHOtLqlhtC882SOEPKmNFZaDuz1hzQjolxZ+eu3/kaS10n3sGPONsIZsO7R9fR00UyhEUA== -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bip66@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" - integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI= - dependencies: - safe-buffer "^5.0.1" +binaryen@102.0.0-nightly.20211028: + version "102.0.0-nightly.20211028" + resolved "https://registry.yarnpkg.com/binaryen/-/binaryen-102.0.0-nightly.20211028.tgz#8f1efb0920afd34509e342e37f84313ec936afb2" + integrity sha512-GCJBVB5exbxzzvyt8MGDv/MeUjs6gkXDvf4xOIItRBptYl0Tz5sm1o/uG95YK0L0VeG5ajDu3hRtkBP2kzqC5w== bl@^1.0.0: version "1.2.3" @@ -341,44 +856,32 @@ bl@^1.0.0: readable-stream "^2.3.5" safe-buffer "^5.1.1" -bl@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/bl/-/bl-3.0.1.tgz#1cbb439299609e419b5a74d7fce2f8b37d8e5c6f" - integrity sha512-jrCW5ZhfQ/Vt07WX1Ngs+yn9BDqPL/gw28S7s9H6QK/gupnizNzJAss5akW20ISgOrbLTlXOOCTJeNUQqruAWQ== - dependencies: - readable-stream "^3.0.1" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - blakejs@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702" integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg== -bn.js@^4.0.0, bn.js@^4.11.8, bn.js@^4.11.9: +blob-to-it@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/blob-to-it/-/blob-to-it-1.0.4.tgz#f6caf7a4e90b7bb9215fa6a318ed6bd8ad9898cb" + integrity sha512-iCmk0W4NdbrWgRRuxOriU8aM5ijeVLI61Zulsmg/lUHNr7pYjoj+U77opLefNagevtrrbMt3JQ5Qip7ar178kA== + dependencies: + browser-readablestream-to-it "^1.0.3" + +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -borc@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/borc/-/borc-2.1.2.tgz#6ce75e7da5ce711b963755117dd1b187f6f8cf19" - integrity sha512-Sy9eoUi4OiKzq7VovMn246iTo17kzuyHJKomCfpWMlI6RpfN1gk95w7d7gH264nApVLg0HZfcpz62/g4VH1Y4w== - dependencies: - bignumber.js "^9.0.0" - buffer "^5.5.0" - commander "^2.15.0" - ieee754 "^1.1.13" - iso-url "~0.4.7" - json-text-sequence "~0.1.0" - readable-stream "^3.6.0" +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== brace-expansion@^1.1.7: version "1.1.11" @@ -388,7 +891,14 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@~3.0.2: +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -400,7 +910,12 @@ brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= -browserify-aes@^1.0.6, browserify-aes@^1.2.0: +browser-readablestream-to-it@^1.0.0, browser-readablestream-to-it@^1.0.1, browser-readablestream-to-it@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/browser-readablestream-to-it/-/browser-readablestream-to-it-1.0.3.tgz#ac3e406c7ee6cdf0a502dd55db33bab97f7fba76" + integrity sha512-+12sHB+Br8HIh6VAMVEG5r3UXCyESIgDW7kzk3BjIXa43DVqVwL7GC5TW3jeh+72dtcH99pPVpw0X8i0jt+/kw== + +browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -412,13 +927,22 @@ browserify-aes@^1.0.6, browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" -bs58@^4.0.1: +bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + buffer-alloc-unsafe@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" @@ -447,15 +971,7 @@ buffer-xor@^1.0.3: resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= -buffer@^5.2.1, buffer@^5.4.2, buffer@^5.4.3, buffer@^5.5.0, buffer@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@^6.0.3: +buffer@^6.0.1, buffer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== @@ -463,10 +979,12 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" call-bind@^1.0.0: version "1.0.2" @@ -481,16 +999,32 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +cardinal@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== + dependencies: + ansicolors "~0.3.2" + redeyed "~2.1.0" -caseless@~0.12.0: +caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= +cborg@^1.5.4, cborg@^1.6.0: + version "1.10.2" + resolved "https://registry.yarnpkg.com/cborg/-/cborg-1.10.2.tgz#83cd581b55b3574c816f82696307c7512db759a1" + integrity sha512-b3tFPA9pUr2zCUiCfRd2+wok2/LBSNUMKOuRRok+WlvvAgEt/PlbgPTsZUcwCOs53IJvLgTp0eotwtosE6njug== + +chalk@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^2.0.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -500,15 +1034,15 @@ chalk@^2.0.0, chalk@^2.4.2: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== +chalk@^4.0.2, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" -chokidar@^3.0.2: +chokidar@3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -533,28 +1067,6 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -cids@~0.7.0, cids@~0.7.1: - version "0.7.5" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" - integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== - dependencies: - buffer "^5.5.0" - class-is "^1.1.0" - multibase "~0.6.0" - multicodec "^1.0.0" - multihashes "~0.4.15" - -cids@~0.8.0: - version "0.8.3" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.8.3.tgz#aaf48ac8ed857c3d37dad94d8db1d8c9407b92db" - integrity sha512-yoXTbV3llpm+EBGWKeL9xKtksPE/s6DPoDSY4fn8I8TEW1zehWXPSB0pwAXVDlLaOlrw+sNynj995uD9abmPhA== - dependencies: - buffer "^5.6.0" - class-is "^1.1.0" - multibase "^1.0.0" - multicodec "^1.0.1" - multihashes "^1.0.1" - cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -563,10 +1075,12 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -class-is@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" - integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== +clean-stack@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-3.0.1.tgz#155bf0b2221bf5f4fba89528d24c5953f17fe3a8" + integrity sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg== + dependencies: + escape-string-regexp "4.0.0" cli-cursor@^3.1.0: version "3.1.0" @@ -575,18 +1089,25 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-progress@^3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/cli-progress/-/cli-progress-3.12.0.tgz#807ee14b66bcc086258e444ad0f19e7d42577942" + integrity sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A== + dependencies: + string-width "^4.2.3" + cli-spinners@^2.2.0: version "2.6.1" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== -cli-table3@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" - integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== +cli-table3@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee" + integrity sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ== dependencies: object-assign "^4.1.0" - string-width "^2.1.1" + string-width "^4.2.0" optionalDependencies: colors "^1.1.2" @@ -619,12 +1140,7 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colors@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" - integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== - -colors@^1.1.2: +colors@1.4.0, colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -636,7 +1152,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@^2.15.0, commander@^2.20.3: +commander@^2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -646,14 +1162,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -"concat-stream@github:hugomrdias/concat-stream#feat/smaller": - version "2.0.0" - resolved "https://codeload.github.com/hugomrdias/concat-stream/tar.gz/057bc7b5d6d8df26c8cf00a3f151b6721a0a8034" - dependencies: - inherits "^2.0.3" - readable-stream "^3.0.2" - -concat-stream@~1.6.2: +concat-stream@^1.6.0, concat-stream@^1.6.2, concat-stream@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -673,16 +1182,16 @@ core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== -cosmiconfig@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== +cosmiconfig@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" + integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== dependencies: "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" + import-fresh "^3.2.1" parse-json "^5.0.0" path-type "^4.0.0" - yaml "^1.7.2" + yaml "^1.10.0" create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" @@ -695,7 +1204,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.4: +create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -707,7 +1216,12 @@ create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-spawn@^7.0.0: +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@7.0.3, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -723,6 +1237,13 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +debug@4.3.4, debug@^4.3.1, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + debug@^3.2.6: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -730,18 +1251,13 @@ debug@^3.2.6: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1: +debug@^4.1.1: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: ms "2.1.2" -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -759,20 +1275,31 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -delimit-stream@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/delimit-stream/-/delimit-stream-0.1.0.tgz#9b8319477c0e5f8aeb3ce357ae305fc25ea1cd2b" - integrity sha1-m4MZR3wOX4rrPONXrjBfwl6hzSs= +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-over-http-resolver@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/dns-over-http-resolver/-/dns-over-http-resolver-1.2.3.tgz#194d5e140a42153f55bb79ac5a64dd2768c36af9" + integrity sha512-miDiVSI6KSNbi4SVifzO/reD8rMnxgrlnkrlkugOLQpWQTe2qMdHsZp5DmfKjxNE+/T3VAAYLQUZMv9SMr6+AA== + dependencies: + debug "^4.3.1" + native-fetch "^3.0.0" + receptacle "^1.3.2" -docker-compose@^0.23.2: - version "0.23.17" - resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.17.tgz#8816bef82562d9417dc8c790aa4871350f93a2ba" - integrity sha512-YJV18YoYIcxOdJKeFcCFihE6F4M2NExWM/d4S1ITcS9samHKnNUihz9kjggr0dNtsrbpFNc7/Yzd19DWs+m1xg== +docker-compose@0.23.19: + version "0.23.19" + resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.23.19.tgz#9947726e2fe67bdfa9e8efe1ff15aa0de2e10eb8" + integrity sha512-v5vNLIdUqwj4my80wxFDkNH+4S85zsRuH29SO7dCWVWPCMt/ohZBsGN6g6KXWifT0pzQ7uOxqEKCYCDPJ8Vz4g== dependencies: yaml "^1.10.2" @@ -786,7 +1313,7 @@ docker-modem@^1.0.8: readable-stream "~1.0.26-4" split-ca "^1.0.0" -dockerode@^2.5.8: +dockerode@2.5.8: version "2.5.8" resolved "https://registry.yarnpkg.com/dockerode/-/dockerode-2.5.8.tgz#1b661e36e1e4f860e25f56e0deabe9f87f1d0acc" integrity sha512-+7iOUYBeDTScmOmQqpUYQaE7F4vvIt6+gIZNHWhqAQEI887tiPFB9OvXI/HzQYqfUNvukMK+9myLW63oTJPZpw== @@ -795,15 +1322,6 @@ dockerode@^2.5.8: docker-modem "^1.0.8" tar-fs "~1.16.3" -drbg.js@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" - integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs= - dependencies: - browserify-aes "^1.0.6" - create-hash "^1.1.2" - create-hmac "^1.1.4" - ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -812,12 +1330,28 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -ejs@^2.6.1: - version "2.7.4" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" - integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== +ejs@3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" + integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== + dependencies: + jake "^10.6.1" + +ejs@^3.1.8: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +electron-fetch@^1.7.2: + version "1.9.1" + resolved "https://registry.yarnpkg.com/electron-fetch/-/electron-fetch-1.9.1.tgz#e28bfe78d467de3f2dec884b1d72b8b05322f30f" + integrity sha512-M9qw6oUILGVrcENMSRRefE1MbHPIz0h79EKIeJWK9v563aT9Qkh8aEHPO1H5vi970wPirNY+jO9OpFoLiMsMGA== + dependencies: + encoding "^0.1.13" -elliptic@^6.5.2: +elliptic@6.5.4, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -830,29 +1364,36 @@ elliptic@^6.5.2: minimalistic-assert "^1.0.1" minimalistic-crypto-utils "^1.0.1" -end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enquirer@2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.4.tgz#c608f2e1134c7f68c1c9ee056de13f9b31076de9" - integrity sha512-pkYrrDZumL2VS6VBGDhqbajCM2xpkUNLuKfGPjfKaSIBKYopQbqEFyrOkRMIb2HDR/rO1kGhEt/5twBwtzKBXw== +enquirer@2.3.6: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== dependencies: - ansi-colors "^3.2.1" - -err-code@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" - integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= + ansi-colors "^4.1.1" -err-code@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== +err-code@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" + integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== error-ex@^1.3.1: version "1.3.2" @@ -873,16 +1414,68 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -esprima@^4.0.0: +esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== +ethereum-bloom-filters@^1.0.6: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + dependencies: + js-sha3 "^0.8.0" + +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereumjs-util@^7.1.0: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.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" @@ -896,27 +1489,21 @@ evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^3.0.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" - integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== +execa@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" is-stream "^2.0.0" merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - p-finally "^2.0.0" - signal-exit "^3.0.2" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" strip-final-newline "^2.0.0" -explain-error@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/explain-error/-/explain-error-1.0.4.tgz#a793d3ac0cad4c6ab571e9968fbbab6cb2532929" - integrity sha1-p5PTrAytTGq1cemWj7urbLJTKSk= - extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" @@ -937,20 +1524,64 @@ eyes@^0.1.8: resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= +fast-decode-uri-component@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz#46f8b6c22b30ff7a81357d4f59abfae938202543" + integrity sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg== + fast-deep-equal@^3.1.1: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-fifo@^1.0.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + +fast-glob@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +fast-querystring@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fast-querystring/-/fast-querystring-1.1.2.tgz#a6d24937b4fc6f791b4ee31dcb6f53aeafb89f53" + integrity sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg== + dependencies: + fast-decode-uri-component "^1.0.1" + +fast-url-parser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" + integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== + dependencies: + punycode "^1.3.2" + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" fill-range@^7.0.1: version "7.0.1" @@ -959,11 +1590,6 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -flatmap@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/flatmap/-/flatmap-0.0.3.tgz#1f18a4d938152d495965f9c958d923ab2dd669b4" - integrity sha1-Hxik2TgVLUlZZfnJWNkjqy3WabQ= - follow-redirects@^1.14.0: version "1.14.8" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc" @@ -974,10 +1600,19 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== +form-data@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" + integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" combined-stream "^1.0.6" @@ -988,7 +1623,7 @@ fs-constants@^1.0.0: resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== -fs-extra@^9.0.0: +fs-extra@9.1.0, fs-extra@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== @@ -998,10 +1633,10 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-jetpack@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/fs-jetpack/-/fs-jetpack-2.4.0.tgz#6080c4ab464a019d37a404baeb47f32af8835026" - integrity sha512-S/o9Dd7K9A7gicVU32eT8G0kHcmSu0rCVdP79P0MWInKFb8XpTc8Syhoo66k9no+HDshtlh4pUJTws8X+8fdFQ== +fs-jetpack@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/fs-jetpack/-/fs-jetpack-4.3.1.tgz#cdfd4b64e6bfdec7c7dc55c76b39efaa7853bb20" + integrity sha512-dbeOK84F6BiQzk2yqqCVwCPWTxAvVGJ3fMQc6E2wuEohS28mR6yHngbrKuVCK1KHRx/ccByDylqu4H5PCP2urQ== dependencies: minimatch "^3.0.2" rimraf "^2.6.3" @@ -1037,12 +1672,25 @@ get-intrinsic@^1.0.2: has "^1.0.3" has-symbols "^1.0.1" -get-stream@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" +get-iterator@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-iterator/-/get-iterator-1.0.2.tgz#cd747c02b4c084461fac14f48f6b45a80ed25c82" + integrity sha512-v+dm9bNVfOYsY1OrhaCrmyOcYoSeVvbt+hHZ0Au+T+p1y+0Uyj9aMaGIeUTT6xdpRbWzDeYKvfOslPhggQMcsg== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-port@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" + integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== getpass@^0.1.1: version "0.1.7" @@ -1051,14 +1699,24 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@^7.1.2, glob@^7.1.3: +glob@9.3.5: + version "9.3.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + +glob@^7.1.3: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -1070,20 +1728,33 @@ glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -"gluegun@https://github.com/edgeandnode/gluegun#v4.3.1-pin-colors-dep": - version "4.3.1" - resolved "https://github.com/edgeandnode/gluegun#b34b9003d7bf556836da41b57ef36eb21570620a" +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gluegun@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/gluegun/-/gluegun-5.1.2.tgz#ffa0beda0fb6bbc089a867157b08602beae2c8cf" + integrity sha512-Cwx/8S8Z4YQg07a6AFsaGnnnmd8mN17414NcPS3OoDtZRwxgsvwRNJNg69niD6fDa8oNwslCG0xH7rEpRNNE/g== dependencies: - apisauce "^1.0.1" + apisauce "^2.1.5" app-module-path "^2.2.0" - cli-table3 "~0.5.0" - colors "1.3.3" - cosmiconfig "6.0.0" - cross-spawn "^7.0.0" - ejs "^2.6.1" - enquirer "2.3.4" - execa "^3.0.0" - fs-jetpack "^2.2.2" + cli-table3 "0.6.0" + colors "1.4.0" + cosmiconfig "7.0.1" + cross-spawn "7.0.3" + ejs "3.1.6" + enquirer "2.3.6" + execa "5.1.1" + fs-jetpack "4.3.1" lodash.camelcase "^4.3.0" lodash.kebabcase "^4.1.1" lodash.lowercase "^4.3.0" @@ -1099,22 +1770,31 @@ glob@^7.1.2, glob@^7.1.3: lodash.trimstart "^4.5.1" lodash.uppercase "^4.3.0" lodash.upperfirst "^4.3.1" - ora "^4.0.0" + ora "4.0.2" pluralize "^8.0.0" - ramdasauce "^2.1.0" - semver "^7.0.0" - which "^2.0.0" - yargs-parser "^16.1.0" + semver "7.3.5" + which "2.0.2" + yargs-parser "^21.0.0" graceful-fs@^4.1.6, graceful-fs@^4.2.0: version "4.2.9" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== -graphql@^15.5.0: - version "15.8.0" - resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" - integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== +graphql-import-node@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/graphql-import-node/-/graphql-import-node-0.0.5.tgz#caf76a6cece10858b14f27cce935655398fc1bf0" + integrity sha512-OXbou9fqh9/Lm7vwXT0XoRN9J5+WCYKnbiTalgFDvkQERITRmcfncZs6aVABedd5B85yQU5EULS4a5pnbpuI0Q== + +graphql@15.5.0: + version "15.5.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.5.0.tgz#39d19494dbe69d1ea719915b578bf920344a69d5" + integrity sha512-OmaM7y0kaK31NKG31q4YbD2beNYa6jBBKtMFT6gLYJljHLJr42IqJ8KX08u3Li/0ifzTU5HjmoOOrwa5BRLeDA== + +graphql@^16.6.0: + version "16.8.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.0.tgz#374478b7f27b2dc6153c8f42c1b80157f79d79d4" + integrity sha512-0oKGaR+y3qcS5mCu1vb7KG+a89vjn06C7Ihq/dDl3jA+A8B3TKomvi3CiEcVLJQGalbu8F52LxkOym7U5sSfbg== har-schema@^2.0.0: version "2.0.0" @@ -1160,7 +1840,7 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash.js@^1.0.0, hash.js@^1.0.3: +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -1168,11 +1848,6 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hi-base32@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/hi-base32/-/hi-base32-0.5.1.tgz#1279f2ddae2673219ea5870c2121d2a33132857e" - integrity sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA== - hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -1182,6 +1857,23 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +http-basic@^8.1.1: + version "8.1.3" + resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" + integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== + dependencies: + caseless "^0.12.0" + concat-stream "^1.6.2" + http-response-object "^3.0.1" + parse-cache-control "^1.0.1" + +http-response-object@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" + integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== + dependencies: + "@types/node" "^10.0.3" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -1191,22 +1883,39 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" -human-signals@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" - integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -ieee754@^1.1.13, ieee754@^1.2.1: +hyperlinker@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" + integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ== + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -immutable@^3.8.2: - version "3.8.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" - integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +immutable@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.2.1.tgz#8a4025691018c560a40c67e43d698f816edc44d4" + integrity sha512-7WYV7Q5BTs0nlQm7tl92rDYYoyELLKHoDMBKhrxEoiV4mrfVdRz8hzPiYOzH7yWjzoVEamxRuAqhxL2PLRwZYQ== -import-fresh@^3.1.0: +import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -1214,6 +1923,11 @@ import-fresh@^3.1.0: parent-module "^1.0.0" resolve-from "^4.0.0" +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -1227,131 +1941,114 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ip-regex@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= +interface-datastore@^6.0.2: + version "6.1.1" + resolved "https://registry.yarnpkg.com/interface-datastore/-/interface-datastore-6.1.1.tgz#5150a00de2e7513eaadba58bcafd059cb50004c1" + integrity sha512-AmCS+9CT34pp2u0QQVXjKztkuq3y5T+BIciuiHDDtDZucZD8VudosnSdUyXJV6IsRkN5jc4RFDhCk1O6Q3Gxjg== + dependencies: + interface-store "^2.0.2" + nanoid "^3.0.2" + uint8arrays "^3.0.0" + +interface-store@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/interface-store/-/interface-store-2.0.2.tgz#83175fd2b0c501585ed96db54bb8ba9d55fce34c" + integrity sha512-rScRlhDcz6k199EkHqT8NpM87ebN89ICOzILoBHgaG36/WX50N32BnU/kpZgCGPLhARRAWUUX5/cyaIjt7Kipg== ip-regex@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== -ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -ipfs-block@~0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/ipfs-block/-/ipfs-block-0.8.1.tgz#05e1068832775e8f1c2da5b64106cc837fd2acb9" - integrity sha512-0FaCpmij+jZBoUYhjoB5ptjdl9QzvrdRIoBmUU5JiBnK2GA+4YM/ifklaB8ePRhA/rRzhd+KYBjvMFMAL4NrVQ== +ipfs-core-types@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/ipfs-core-types/-/ipfs-core-types-0.9.0.tgz#cb201ff7a9470651ba14c4e7fae56661a55bf37e" + integrity sha512-VJ8vJSHvI1Zm7/SxsZo03T+zzpsg8pkgiIi5hfwSJlsrJ1E2v68QPlnLshGHUSYw89Oxq0IbETYl2pGTFHTWfg== dependencies: - cids "~0.7.0" - class-is "^1.1.0" + interface-datastore "^6.0.2" + multiaddr "^10.0.0" + multiformats "^9.4.13" -ipfs-http-client@^34.0.0: - version "34.0.0" - resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-34.0.0.tgz#8804d06a11c22306332a8ffa0949b6f672a0c9c8" - integrity sha512-4RCkk8ix4Dqn6sxqFVwuXWCZ1eLFPsVaj6Ijvu1fs9VYgxgVudsW9PWwarlr4mw1xUCmPWYyXnEbGgzBrfMy0Q== +ipfs-core-utils@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/ipfs-core-utils/-/ipfs-core-utils-0.13.0.tgz#8f0ec9aaa7c24f6f307e6e76e7bdc1cefd829894" + integrity sha512-HP5EafxU4/dLW3U13CFsgqVO5Ika8N4sRSIb/dTg16NjLOozMH31TXV0Grtu2ZWo1T10ahTzMvrfT5f4mhioXw== dependencies: + any-signal "^2.1.2" + blob-to-it "^1.0.1" + browser-readablestream-to-it "^1.0.1" + debug "^4.1.1" + err-code "^3.0.1" + ipfs-core-types "^0.9.0" + ipfs-unixfs "^6.0.3" + ipfs-utils "^9.0.2" + it-all "^1.0.4" + it-map "^1.0.4" + it-peekable "^1.0.2" + it-to-stream "^1.0.0" + merge-options "^3.0.4" + multiaddr "^10.0.0" + multiaddr-to-uri "^8.0.0" + multiformats "^9.4.13" + nanoid "^3.1.23" + parse-duration "^1.0.0" + timeout-abort-controller "^2.0.0" + uint8arrays "^3.0.0" + +ipfs-http-client@55.0.0: + version "55.0.0" + resolved "https://registry.yarnpkg.com/ipfs-http-client/-/ipfs-http-client-55.0.0.tgz#8b713c5fa318e873b7d7ad099a4eb14320a5b0ce" + integrity sha512-GpvEs7C7WL9M6fN/kZbjeh4Y8YN7rY8b18tVWZnKxRsVwM25cIFrRI8CwNt3Ugin9yShieI3i9sPyzYGMrLNnQ== + dependencies: + "@ipld/dag-cbor" "^7.0.0" + "@ipld/dag-json" "^8.0.1" + "@ipld/dag-pb" "^2.1.3" abort-controller "^3.0.0" - async "^2.6.1" - bignumber.js "^9.0.0" - bl "^3.0.0" - bs58 "^4.0.1" - buffer "^5.4.2" - cids "~0.7.1" - concat-stream "github:hugomrdias/concat-stream#feat/smaller" - debug "^4.1.0" - detect-node "^2.0.4" - end-of-stream "^1.4.1" - err-code "^2.0.0" - explain-error "^1.0.4" - flatmap "0.0.3" - glob "^7.1.3" - ipfs-block "~0.8.1" - ipfs-utils "~0.0.3" - ipld-dag-cbor "~0.15.0" - ipld-dag-pb "~0.17.3" - ipld-raw "^4.0.0" - is-ipfs "~0.6.1" - is-pull-stream "0.0.0" - is-stream "^2.0.0" - iso-stream-http "~0.1.2" - iso-url "~0.4.6" - iterable-ndjson "^1.1.0" - just-kebab-case "^1.1.0" - just-map-keys "^1.1.0" - kind-of "^6.0.2" - ky "^0.11.2" - ky-universal "^0.2.2" - lru-cache "^5.1.1" - multiaddr "^6.0.6" - multibase "~0.6.0" - multicodec "~0.5.1" - multihashes "~0.4.14" - ndjson "github:hugomrdias/ndjson#feat/readable-stream3" - once "^1.4.0" - peer-id "~0.12.3" - peer-info "~0.15.1" - promise-nodeify "^3.0.1" - promisify-es6 "^1.0.3" - pull-defer "~0.2.3" - pull-stream "^3.6.9" - pull-to-stream "~0.1.1" - pump "^3.0.0" - qs "^6.5.2" - readable-stream "^3.1.1" - stream-to-pull-stream "^1.7.2" - tar-stream "^2.0.1" - through2 "^3.0.1" - -ipfs-utils@~0.0.3: - version "0.0.4" - resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-0.0.4.tgz#946114cfeb6afb4454b4ccb10d2327cd323b0cce" - integrity sha512-7cZf6aGj2FG3XJWhCNwn4mS93Q0GEWjtBZvEHqzgI43U2qzNDCyzfS1pei1Y5F+tw/zDJ5U4XG0G9reJxR53Ig== - dependencies: - buffer "^5.2.1" - is-buffer "^2.0.3" + any-signal "^2.1.2" + debug "^4.1.1" + err-code "^3.0.1" + ipfs-core-types "^0.9.0" + ipfs-core-utils "^0.13.0" + ipfs-utils "^9.0.2" + it-first "^1.0.6" + it-last "^1.0.4" + merge-options "^3.0.4" + multiaddr "^10.0.0" + multiformats "^9.4.13" + native-abort-controller "^1.0.3" + parse-duration "^1.0.0" + stream-to-it "^0.2.2" + uint8arrays "^3.0.0" + +ipfs-unixfs@^6.0.3: + version "6.0.9" + resolved "https://registry.yarnpkg.com/ipfs-unixfs/-/ipfs-unixfs-6.0.9.tgz#f6613b8e081d83faa43ed96e016a694c615a9374" + integrity sha512-0DQ7p0/9dRB6XCb0mVCTli33GzIzSVx5udpJuVM47tGcD+W+Bl4LsnoLswd3ggNnNEakMv1FdoFITiEnchXDqQ== + dependencies: + err-code "^3.0.1" + protobufjs "^6.10.2" + +ipfs-utils@^9.0.2: + version "9.0.14" + resolved "https://registry.yarnpkg.com/ipfs-utils/-/ipfs-utils-9.0.14.tgz#24f5fda1f4567685eb32bca2543d518f95fd8704" + integrity sha512-zIaiEGX18QATxgaS0/EOQNoo33W0islREABAcxXE8n7y2MGAlB+hdsxXn4J0hGZge8IqVQhW8sWIb+oJz2yEvg== + dependencies: + any-signal "^3.0.0" + browser-readablestream-to-it "^1.0.0" + buffer "^6.0.1" + electron-fetch "^1.7.2" + err-code "^3.0.1" is-electron "^2.2.0" - is-pull-stream "0.0.0" - is-stream "^2.0.0" - kind-of "^6.0.2" - readable-stream "^3.4.0" - -ipld-dag-cbor@~0.15.0: - version "0.15.3" - resolved "https://registry.yarnpkg.com/ipld-dag-cbor/-/ipld-dag-cbor-0.15.3.tgz#283afdb81d5b07db8e4fff7a10ef5e517e87f299" - integrity sha512-m23nG7ZyoVFnkK55/bLAErc7EfiMgaEQlqHWDTGzPI+O5r6bPfp+qbL5zTVSIT8tpbHmu174dwerVtLoVgeVyA== - dependencies: - borc "^2.1.2" - buffer "^5.5.0" - cids "~0.8.0" - is-circular "^1.0.2" - multicodec "^1.0.0" - multihashing-async "~0.8.0" - -ipld-dag-pb@~0.17.3: - version "0.17.4" - resolved "https://registry.yarnpkg.com/ipld-dag-pb/-/ipld-dag-pb-0.17.4.tgz#080841cfdd014d996f8da7f3a522ec8b1f6b6494" - integrity sha512-YwCxETEMuXVspOKOhjIOHJvKvB/OZfCDkpSFiYBQN2/JQjM9y/RFCYzIQGm0wg7dCFLrhvfjAZLTSaKs65jzWA== - dependencies: - cids "~0.7.0" - class-is "^1.1.0" - multicodec "~0.5.1" - multihashing-async "~0.7.0" - protons "^1.0.1" - stable "~0.1.8" - -ipld-raw@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/ipld-raw/-/ipld-raw-4.0.1.tgz#49a6f58cdfece5a4d581925b19ee19255be2a29d" - integrity sha512-WjIdtZ06jJEar8zh+BHB84tE6ZdbS/XNa7+XCArOYfmeJ/c01T9VQpeMwdJQYn5c3s5UvvCu7y4VIi3vk2g1bA== - dependencies: - cids "~0.7.0" - multicodec "^1.0.0" - multihashing-async "~0.8.0" + iso-url "^1.1.5" + it-all "^1.0.4" + it-glob "^1.0.1" + it-to-stream "^1.0.0" + merge-options "^3.0.4" + nanoid "^3.1.20" + native-fetch "^3.0.0" + node-fetch "^2.6.8" + react-native-fetch-api "^3.0.0" + stream-to-it "^0.2.2" is-arrayish@^0.2.1: version "0.2.1" @@ -1365,15 +2062,10 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-buffer@^2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-circular@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-circular/-/is-circular-1.0.2.tgz#2e0ab4e9835f4c6b0ea2b9855a84acd501b8366c" - integrity sha512-YttjnrswnUYRVJvxCvu8z+PGMUSzC2JttP0OEXezlAEdp3EXzhf7IZ3j0gRAybJBQupedIZFhY61Tga6E0qASA== +is-docker@^2.0.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-electron@^2.2.0: version "2.2.1" @@ -1385,10 +2077,10 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.3" @@ -1397,18 +2089,16 @@ is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== + is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== -is-ip@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-2.0.0.tgz#68eea07e8a0a0a94c2d080dd674c731ab2a461ab" - integrity sha1-aO6gfooKCpTC0IDdZ0xzGrKkYas= - dependencies: - ip-regex "^2.0.0" - is-ip@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" @@ -1416,32 +2106,15 @@ is-ip@^3.1.0: dependencies: ip-regex "^4.0.0" -is-ipfs@~0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/is-ipfs/-/is-ipfs-0.6.3.tgz#82a5350e0a42d01441c40b369f8791e91404c497" - integrity sha512-HyRot1dvLcxImtDqPxAaY1miO6WsiP/z7Yxpg2qpaLWv5UdhAPtLvHJ4kMLM0w8GSl8AFsVF23PHe1LzuWrUlQ== - dependencies: - bs58 "^4.0.1" - cids "~0.7.0" - mafmt "^7.0.0" - multiaddr "^7.2.1" - multibase "~0.6.0" - multihashes "~0.4.13" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-promise@~1, is-promise@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-1.0.1.tgz#31573761c057e33c2e91aab9e96da08cefbe76e5" - integrity sha1-MVc3YcBX4zwukaq56W2gjO++duU= - -is-pull-stream@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/is-pull-stream/-/is-pull-stream-0.0.0.tgz#a3bc3d1c6d3055151c46bde6f399efed21440ca9" - integrity sha1-o7w9HG0wVRUcRr3m85nv7SFEDKk= +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== is-stream@^2.0.0: version "2.0.1" @@ -1453,6 +2126,13 @@ is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -1468,27 +2148,10 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -iso-random-stream@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iso-random-stream/-/iso-random-stream-1.1.2.tgz#c703da2c518db573277c5678cc43c5298283d64c" - integrity sha512-7y0tsBBgQs544iTYjyrMp5xvgrbYR8b+plQq1Bryp+03p0LssrxC9C1M0oHv4QESDt7d95c74XvMk/yawKqX+A== - dependencies: - buffer "^6.0.3" - readable-stream "^3.4.0" - -iso-stream-http@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/iso-stream-http/-/iso-stream-http-0.1.2.tgz#b3dfea4c9f23ff26d078d40c539cfc0dfebacd37" - integrity sha512-oHEDNOysIMTNypbg2f1SlydqRBvjl4ZbSE9+0awVxnkx3K2stGTFwB/kpVqnB6UEfF8QD36kAjDwZvqyXBLMnQ== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^3.1.1" - -iso-url@~0.4.6, iso-url@~0.4.7: - version "0.4.7" - resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-0.4.7.tgz#de7e48120dae46921079fe78f325ac9e9217a385" - integrity sha512-27fFRDnPAMnHGLq36bWTpKET+eiXct3ENlCcdcMdk+mjXrb2kw3mhBUg1B7ewAC0kVzlOPhADzQgz1SE6Tglog== +iso-url@^1.1.5: + version "1.2.1" + resolved "https://registry.yarnpkg.com/iso-url/-/iso-url-1.2.1.tgz#db96a49d8d9a64a1c889fc07cc525d093afb1811" + integrity sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng== isomorphic-ws@^4.0.1: version "4.0.1" @@ -1500,21 +2163,67 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -iterable-ndjson@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/iterable-ndjson/-/iterable-ndjson-1.1.0.tgz#36f7e8a5bb04fd087d384f29e44fc4280fc014fc" - integrity sha512-OOp1Lb0o3k5MkXHx1YaIY5Z0ELosZfTnBaas9f8opJVcZGBIONA2zY/6CYE+LKkqrSDooIneZbrBGgOZnHPkrg== +it-all@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-all/-/it-all-1.0.6.tgz#852557355367606295c4c3b7eff0136f07749335" + integrity sha512-3cmCc6Heqe3uWi3CVM/k51fa/XbMFpQVzFoDsV0IZNHSQDyAXl3c4MjHkFX5kF3922OGj7Myv1nSEUgRtcuM1A== + +it-first@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/it-first/-/it-first-1.0.7.tgz#a4bef40da8be21667f7d23e44dae652f5ccd7ab1" + integrity sha512-nvJKZoBpZD/6Rtde6FXqwDqDZGF1sCADmr2Zoc0hZsIvnE449gRFnGctxDf09Bzc/FWnHXAdaHVIetY6lrE0/g== + +it-glob@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/it-glob/-/it-glob-1.0.2.tgz#bab9b04d6aaac42884502f3a0bfee84c7a29e15e" + integrity sha512-Ch2Dzhw4URfB9L/0ZHyY+uqOnKvBNeS/SMcRiPmJfpHiM0TsUZn+GkpcZxAoF3dJVdPm/PuIk3A4wlV7SUo23Q== dependencies: - string_decoder "^1.2.0" + "@types/minimatch" "^3.0.4" + minimatch "^3.0.4" + +it-last@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-last/-/it-last-1.0.6.tgz#4106232e5905ec11e16de15a0e9f7037eaecfc45" + integrity sha512-aFGeibeiX/lM4bX3JY0OkVCFkAw8+n9lkukkLNivbJRvNz8lI3YXv5xcqhFUV2lDJiraEK3OXRDbGuevnnR67Q== -jayson@^3.0.2: - version "3.6.6" - resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.6.6.tgz#189984f624e398f831bd2be8e8c80eb3abf764a1" - integrity sha512-f71uvrAWTtrwoww6MKcl9phQTC+56AopLyEenWvKVAIMz+q0oVGj6tenLZ7Z6UiPBkJtKLj4kt0tACllFQruGQ== +it-map@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/it-map/-/it-map-1.0.6.tgz#6aa547e363eedcf8d4f69d8484b450bc13c9882c" + integrity sha512-XT4/RM6UHIFG9IobGlQPFQUrlEKkU4eBUFG3qhWhfAdh1JfF2x11ShCrKCdmZ0OiZppPfoLuzcfA4cey6q3UAQ== + +it-peekable@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/it-peekable/-/it-peekable-1.0.3.tgz#8ebe933767d9c5aa0ae4ef8e9cb3a47389bced8c" + integrity sha512-5+8zemFS+wSfIkSZyf0Zh5kNN+iGyccN02914BY4w/Dj+uoFEoPSvj5vaWn8pNZJNSxzjW0zHRxC3LUb2KWJTQ== + +it-to-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/it-to-stream/-/it-to-stream-1.0.0.tgz#6c47f91d5b5df28bda9334c52782ef8e97fe3a4a" + integrity sha512-pLULMZMAB/+vbdvbZtebC0nWBTbG581lk6w8P7DfIIIKUfa8FbY7Oi0FxZcFPbxvISs7A9E+cMpLDBc1XhpAOA== + dependencies: + buffer "^6.0.3" + fast-fifo "^1.0.0" + get-iterator "^1.0.2" + p-defer "^3.0.0" + p-fifo "^1.0.0" + readable-stream "^3.6.0" + +jake@^10.6.1, jake@^10.8.5: + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jayson@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.0.0.tgz#145a0ced46f900934c9b307e1332bcb0c7dbdb17" + integrity sha512-v2RNpDCMu45fnLzSk47vx7I+QUaOsox6f5X0CUlabAFwxoP+8MfAY0NQRFwOEYXIxm8Ih5y6OaEa5KYiQMkyAA== dependencies: "@types/connect" "^3.4.33" - "@types/express-serve-static-core" "^4.17.9" - "@types/lodash" "^4.14.159" "@types/node" "^12.12.54" "@types/ws" "^7.4.4" JSONStream "^1.3.5" @@ -1524,11 +2233,10 @@ jayson@^3.0.2: eyes "^0.1.8" isomorphic-ws "^4.0.1" json-stringify-safe "^5.0.1" - lodash "^4.17.20" uuid "^8.3.2" ws "^7.4.5" -js-sha3@^0.8.0, js-sha3@~0.8.0: +js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== @@ -1538,7 +2246,7 @@ js-tokens@^4.0.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.1: +js-yaml@3.14.1, js-yaml@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -1546,6 +2254,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -1571,13 +2286,6 @@ json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json-text-sequence@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/json-text-sequence/-/json-text-sequence-0.1.1.tgz#a72f217dc4afc4629fff5feb304dc1bd51a2f3d2" - integrity sha1-py8hfcSvxGKf/1/rME3BvVGi89I= - dependencies: - delimit-stream "0.1.0" - jsonfile@^6.0.1: version "6.1.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" @@ -1602,72 +2310,14 @@ jsprim@^1.2.2: json-schema "0.4.0" verror "1.10.0" -just-kebab-case@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/just-kebab-case/-/just-kebab-case-1.1.0.tgz#ebe854fde84b0afa4e597fcd870b12eb3c026755" - integrity sha512-QkuwuBMQ9BQHMUEkAtIA4INLrkmnnveqlFB1oFi09gbU0wBdZo6tTnyxNWMR84zHxBuwK7GLAwqN8nrvVxOLTA== - -just-map-keys@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/just-map-keys/-/just-map-keys-1.2.1.tgz#ef6e16133b7d34329962dfae9101d581abb1b143" - integrity sha512-Dmyz1Cy2SWM+PpqDPB1kdDglyexdzMthnAsvOIE9w4OPj8NDRuY1mh20x/JfG5w6fCGw9F0WmcofJhYZ4MiuyA== - -keypair@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/keypair/-/keypair-1.0.4.tgz#a749a45f388593f3950f18b3757d32a93bd8ce83" - integrity sha512-zwhgOhhniaL7oxMgUMKKw5219PWWABMO+dgMnzJOQ2/5L3XJtTJGhW2PEXlxXj9zaccdReZJZ83+4NPhVfNVDg== - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -ky-universal@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/ky-universal/-/ky-universal-0.2.2.tgz#7a36e1a75641a98f878157463513965f799f5bfe" - integrity sha512-fb32o/fKy/ux2ALWa9HU2hvGtfOq7/vn2nH0FpVE+jwNzyTeORlAbj3Fiw+WLMbUlmVqZIWupnLZ2USHvqwZHw== - dependencies: - abort-controller "^3.0.0" - node-fetch "^2.3.0" - -ky@^0.11.2: - version "0.11.2" - resolved "https://registry.yarnpkg.com/ky/-/ky-0.11.2.tgz#4ffe6621d9d9ab61bf0f5500542e3a96d1ba0815" - integrity sha512-5Aou5BWue5/mkPqIRqzSWW+0Hkl403pr/2AIrCKYw7cVl/Xoe8Xe4KLBO0PRjbz7GnRe1/8wW1KhqQNFFE7/GQ== - -libp2p-crypto-secp256k1@~0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/libp2p-crypto-secp256k1/-/libp2p-crypto-secp256k1-0.3.1.tgz#4cbeb857f5cfe5fefb1253e6b2994420c0ca166e" - integrity sha512-evrfK/CeUSd/lcELUdDruyPBvxDmLairth75S32OLl3H+++2m2fV24JEtxzdFS9JH3xEFw0h6JFO8DBa1bP9dA== - dependencies: - async "^2.6.2" - bs58 "^4.0.1" - multihashing-async "~0.6.0" - nodeify "^1.0.1" - safe-buffer "^5.1.2" - secp256k1 "^3.6.2" - -libp2p-crypto@~0.16.1: - version "0.16.4" - resolved "https://registry.yarnpkg.com/libp2p-crypto/-/libp2p-crypto-0.16.4.tgz#fb1a4ba39d56789303947784b5b0d6cefce12fdc" - integrity sha512-II8HxKc9jbmQp34pprlluNxsBCWJDjHRPYJzuRy7ragztNip9Zb7uJ4lCje6gGzz4DNAcHkAUn+GqCIK1592iA== +keccak@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" + integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== dependencies: - asmcrypto.js "^2.3.2" - asn1.js "^5.0.1" - async "^2.6.1" - bn.js "^4.11.8" - browserify-aes "^1.2.0" - bs58 "^4.0.1" - iso-random-stream "^1.1.0" - keypair "^1.0.1" - libp2p-crypto-secp256k1 "~0.3.0" - multihashing-async "~0.5.1" - node-forge "^0.10.0" - pem-jwk "^2.0.0" - protons "^1.0.1" - rsa-pem-to-jwk "^1.1.3" - tweetnacl "^1.0.0" - ursa-optional "~0.10.0" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" lines-and-columns@^1.1.6: version "1.2.4" @@ -1749,11 +2399,6 @@ lodash.upperfirst@^4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha1-E2Xt9DFIBIHvDRxolXpe2Z1J984= -lodash@^4.17.14, lodash@^4.17.20: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - log-symbols@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" @@ -1766,17 +2411,10 @@ long@^4.0.0: resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== -looper@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" - integrity sha1-LvpUw7HLq6m5Su4uWRSwvlf7t0k= - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" +long@^5.2.0: + version "5.2.3" + resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== lru-cache@^6.0.0: version "6.0.0" @@ -1785,19 +2423,15 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -mafmt@^6.0.2: - version "6.0.10" - resolved "https://registry.yarnpkg.com/mafmt/-/mafmt-6.0.10.tgz#3ad251c78f14f8164e66f70fd3265662da41113a" - integrity sha512-FjHDnew6dW9lUu3eYwP0FvvJl9uvNbqfoJM+c1WJcSyutNEIlyu6v3f/rlPnD1cnmue38IjuHlhBdIh3btAiyw== - dependencies: - multiaddr "^6.1.0" +"lru-cache@^9.1.1 || ^10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" + integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== -mafmt@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/mafmt/-/mafmt-7.1.0.tgz#4126f6d0eded070ace7dbbb6fb04977412d380b5" - integrity sha512-vpeo9S+hepT3k2h5iFxzEHvvR0GPBx9uKaErmnRzYNcaKb03DgOArjEMlgG4a9LcuZZ89a3I8xbeto487n26eA== - dependencies: - multiaddr "^7.3.0" +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== md5.js@^1.3.4: version "1.3.5" @@ -1808,11 +2442,31 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +merge-options@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-3.0.4.tgz#84709c2aa2a4b24c1981f66c179fe5565cc6dbb7" + integrity sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ== + dependencies: + is-plain-obj "^2.1.0" + merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + mime-db@1.51.0: version "1.51.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" @@ -1847,7 +2501,28 @@ minimatch@^3.0.2, minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.5: +minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^8.0.2: + version "8.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -1859,6 +2534,16 @@ minipass@^3.0.0: dependencies: yallist "^4.0.0" +minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0": + version "7.0.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.3.tgz#05ea638da44e475037ed94d1c7efcc76a25e1974" + integrity sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg== + minizlib@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" @@ -1889,209 +2574,97 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -multiaddr@^6.0.3, multiaddr@^6.0.6, multiaddr@^6.1.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-6.1.1.tgz#9aae57b3e399089b9896d9455afa8f6b117dff06" - integrity sha512-Q1Ika0F9MNhMtCs62Ue+GWIJtRFEhZ3Xz8wH7/MZDVZTWhil1/H2bEGN02kUees3hkI3q1oHSjmXYDM0gxaFjQ== - dependencies: - bs58 "^4.0.1" - class-is "^1.1.0" - hi-base32 "~0.5.0" - ip "^1.1.5" - is-ip "^2.0.0" - varint "^5.0.0" - -multiaddr@^7.2.1, multiaddr@^7.3.0: - version "7.5.0" - resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-7.5.0.tgz#976c88e256e512263445ab03b3b68c003d5f485e" - integrity sha512-GvhHsIGDULh06jyb6ev+VfREH9evJCFIRnh3jUt9iEZ6XDbyoisZRFEI9bMvK/AiR6y66y6P+eoBw9mBYMhMvw== - dependencies: - buffer "^5.5.0" - cids "~0.8.0" - class-is "^1.1.0" - is-ip "^3.1.0" - multibase "^0.7.0" - varint "^5.0.0" - -multibase@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" - integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@^1.0.0, multibase@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-1.0.1.tgz#4adbe1de0be8a1ab0274328b653c3f1903476724" - integrity sha512-KcCxpBVY8fdVKu4dJMAahq4F/2Z/9xqEjIiR7PiMe7LRGeorFn2NLmicN6nLBCqQvft6MG2Lc9X5P0IdyvnxEw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" - integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multicodec@^1.0.0, multicodec@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" - integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== - dependencies: - buffer "^5.6.0" - varint "^5.0.0" - -multicodec@~0.5.1: - version "0.5.7" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" - integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== - dependencies: - varint "^5.0.0" - -multihashes@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-1.0.1.tgz#a89415d68283cf6287c6e219e304e75ce7fb73fe" - integrity sha512-S27Tepg4i8atNiFaU5ZOm3+gl3KQlUanLs/jWcBxQHFttgq+5x1OgbQmf2d8axJ/48zYGBd/wT9d723USMFduw== - dependencies: - buffer "^5.6.0" - multibase "^1.0.1" - varint "^5.0.0" - -multihashes@~0.4.13, multihashes@~0.4.14, multihashes@~0.4.15: - version "0.4.21" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" - integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== - dependencies: - buffer "^5.5.0" - multibase "^0.7.0" - varint "^5.0.0" - -multihashing-async@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-0.5.2.tgz#4af40e0dde2f1dbb12a7c6b265181437ac26b9de" - integrity sha512-mmyG6M/FKxrpBh9xQDUvuJ7BbqT93ZeEeH5X6LeMYKoYshYLr9BDdCsvDtZvn+Egf+/Xi+aOznrWL4vp3s+p0Q== - dependencies: - blakejs "^1.1.0" - js-sha3 "~0.8.0" - multihashes "~0.4.13" - murmurhash3js "^3.0.1" - nodeify "^1.0.1" - -multihashing-async@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-0.6.0.tgz#c1fc6696a624b9bf39b160b0c4c4e7ba3f394453" - integrity sha512-Qv8pgg99Lewc191A5nlXy0bSd2amfqlafNJZmarU6Sj7MZVjpR94SCxQjf4DwPtgWZkiLqsjUQBXA2RSq+hYyA== - dependencies: - blakejs "^1.1.0" - js-sha3 "~0.8.0" - multihashes "~0.4.13" - murmurhash3js "^3.0.1" - nodeify "^1.0.1" - -multihashing-async@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-0.7.0.tgz#3234fb98295be84386b85bfd20377d3e5be20d6b" - integrity sha512-SCbfl3f+DzJh+/5piukga9ofIOxwfT05t8R4jfzZIJ88YE9zU9+l3K2X+XB19MYyxqvyK9UJRNWbmQpZqQlbRA== +multiaddr-to-uri@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/multiaddr-to-uri/-/multiaddr-to-uri-8.0.0.tgz#65efe4b1f9de5f6b681aa42ff36a7c8db7625e58" + integrity sha512-dq4p/vsOOUdVEd1J1gl+R2GFrXJQH8yjLtz4hodqdVbieg39LvBOdMQRdQnfbg5LSM/q1BYNVf5CBbwZFFqBgA== dependencies: - blakejs "^1.1.0" - buffer "^5.2.1" - err-code "^1.1.2" - js-sha3 "~0.8.0" - multihashes "~0.4.13" - murmurhash3js-revisited "^3.0.0" + multiaddr "^10.0.0" -multihashing-async@~0.8.0: - version "0.8.2" - resolved "https://registry.yarnpkg.com/multihashing-async/-/multihashing-async-0.8.2.tgz#3d5da05df27d83be923f6d04143a0954ff87f27f" - integrity sha512-2lKa1autuCy8x7KIEj9aVNbAb3aIMRFYIwN7mq/zD4pxgNIVgGlm+f6GKY4880EOF2Y3GktHYssRy7TAJQ2DyQ== +multiaddr@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/multiaddr/-/multiaddr-10.0.1.tgz#0d15848871370860a4d266bb44d93b3dac5d90ef" + integrity sha512-G5upNcGzEGuTHkzxezPrrD6CaIHR9uo+7MwqhNVcXTs33IInon4y7nMiGxl2CY5hG7chvYQUQhz5V52/Qe3cbg== dependencies: - blakejs "^1.1.0" - buffer "^5.4.3" - err-code "^2.0.0" - js-sha3 "^0.8.0" - multihashes "^1.0.1" - murmurhash3js-revisited "^3.0.0" - -murmurhash3js-revisited@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/murmurhash3js-revisited/-/murmurhash3js-revisited-3.0.0.tgz#6bd36e25de8f73394222adc6e41fa3fac08a5869" - integrity sha512-/sF3ee6zvScXMb1XFJ8gDsSnY+X8PbOyjIuBhtgis10W2Jx4ZjIhikUCIF9c4gpJxVnQIsPAFrSwTCuAjicP6g== + dns-over-http-resolver "^1.2.3" + err-code "^3.0.1" + is-ip "^3.1.0" + multiformats "^9.4.5" + uint8arrays "^3.0.0" + varint "^6.0.0" -murmurhash3js@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/murmurhash3js/-/murmurhash3js-3.0.1.tgz#3e983e5b47c2a06f43a713174e7e435ca044b998" - integrity sha1-Ppg+W0fCoG9DpxMXTn5DXKBEuZg= +multiformats@^9.4.13, multiformats@^9.4.2, multiformats@^9.4.5, multiformats@^9.5.4: + version "9.9.0" + resolved "https://registry.yarnpkg.com/multiformats/-/multiformats-9.9.0.tgz#c68354e7d21037a8f1f8833c8ccd68618e8f1d37" + integrity sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg== mustache@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +nanoid@^3.0.2, nanoid@^3.1.20, nanoid@^3.1.23: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +native-abort-controller@^1.0.3, native-abort-controller@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/native-abort-controller/-/native-abort-controller-1.0.4.tgz#39920155cc0c18209ff93af5bc90be856143f251" + integrity sha512-zp8yev7nxczDJMoP6pDxyD20IU0T22eX8VwN2ztDccKvSZhRaV33yP1BGwKSZfXuqWUzsXopVFjBdau9OOAwMQ== -nan@^2.14.0, nan@^2.14.2: - version "2.15.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee" - integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ== +native-fetch@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/native-fetch/-/native-fetch-3.0.0.tgz#06ccdd70e79e171c365c75117959cf4fe14a09bb" + integrity sha512-G3Z7vx0IFb/FQ4JxvtqGABsOTIqRWvgQz6e+erkB+JJD6LrszQtMozEHI4EkmgZQvnGHrpLVzUWk7t4sJCIkVw== -"ndjson@github:hugomrdias/ndjson#feat/readable-stream3": - version "1.5.0" - resolved "https://codeload.github.com/hugomrdias/ndjson/tar.gz/4db16da6b42e5b39bf300c3a7cde62abb3fa3a11" - dependencies: - json-stringify-safe "^5.0.1" - minimist "^1.2.0" - split2 "^3.1.0" - through2 "^3.0.0" +natural-orderby@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/natural-orderby/-/natural-orderby-2.0.3.tgz#8623bc518ba162f8ff1cdb8941d74deb0fdcc016" + integrity sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q== + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-fetch@^2.3.0: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== +node-fetch@^2.6.8: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" -node-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== - -nodeify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nodeify/-/nodeify-1.0.1.tgz#64ab69a7bdbaf03ce107b4f0335c87c0b9e91b1d" - integrity sha1-ZKtpp7268DzhB7TwM1yHwLnpGx0= - dependencies: - is-promise "~1.0.0" - promise "~1.3.0" +node-gyp-build@^4.2.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.1.tgz#24b6d075e5e391b8d5539d98c7fc5c210cac8a3e" + integrity sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== -npm-run-path@^4.0.0: +npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== dependencies: path-key "^3.0.0" +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa" - integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo= - object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -2102,6 +2675,11 @@ object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== +object-treeify@^1.1.33: + version "1.1.33" + resolved "https://registry.yarnpkg.com/object-treeify/-/object-treeify-1.1.33.tgz#f06fece986830a3cba78ddd32d4c11d1f76cdf40" + integrity sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A== + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -2109,38 +2687,38 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" -optimist@~0.3.5: - version "0.3.7" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.3.7.tgz#c90941ad59e4273328923074d2cf2e7cbc6ec0d9" - integrity sha1-yQlBrVnkJzMokjB00s8ufLxuwNk= - dependencies: - wordwrap "~0.0.2" - -ora@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ora/-/ora-4.1.1.tgz#566cc0348a15c36f5f0e979612842e02ba9dddbc" - integrity sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A== +ora@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.2.tgz#0e1e68fd45b135d28648b27cf08081fa6e8a297d" + integrity sha512-YUOZbamht5mfLxPmk4M35CD/5DuOkAacxlEUbStVXpBAt4fyhBf+vZHI/HRkI++QUp3sNoeA2Gw4C+hi4eGSig== dependencies: - chalk "^3.0.0" + chalk "^2.4.2" cli-cursor "^3.1.0" cli-spinners "^2.2.0" is-interactive "^1.0.0" log-symbols "^3.0.0" - mute-stream "0.0.8" - strip-ansi "^6.0.0" + strip-ansi "^5.2.0" wcwidth "^1.0.1" -p-finally@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz#bd6fcaa9c559a096b680806f4d657b3f0f240561" - integrity sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw== +p-defer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" + integrity sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw== + +p-fifo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-fifo/-/p-fifo-1.0.0.tgz#e29d5cf17c239ba87f51dde98c1d26a9cfe20a63" + integrity sha512-IjoCxXW48tqdtDFz6fqo5q1UfFVjjVZe8TC1QRflvNUJtNfCUhxOUw6MOVZhDPjqhSzc26xKdugsO17gmzd5+A== + dependencies: + fast-fifo "^1.0.0" + p-defer "^3.0.0" parent-module@^1.0.0: version "1.0.1" @@ -2149,6 +2727,16 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-cache-control@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" + integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== + +parse-duration@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.1.0.tgz#5192084c5d8f2a3fd676d04a451dbd2e05a1819c" + integrity sha512-z6t9dvSJYaPoQq7quMzdEagSFtpGu+utzHqqxmpVWNNZRIXnvqyCvn9XsTdh7c/w0Bqmdz3RB3YnRaKtpRtEXQ== + parse-json@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -2159,6 +2747,14 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +password-prompt@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/password-prompt/-/password-prompt-1.1.3.tgz#05e539f4e7ca4d6c865d479313f10eb9db63ee5f" + integrity sha512-HkrjG2aJlvF0t2BMH0e2LB/EHf3Lcq3fNMzy4GYHcQblAvOl+QQji1Lx7WRBMqpVK8p+KR7bCg7oqAMXtdgqyw== + dependencies: + ansi-escapes "^4.3.2" + cross-spawn "^7.0.3" + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -2169,59 +2765,46 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== +path-scurry@^1.6.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -peer-id@~0.12.2, peer-id@~0.12.3: - version "0.12.5" - resolved "https://registry.yarnpkg.com/peer-id/-/peer-id-0.12.5.tgz#b22a1edc5b4aaaa2bb830b265ba69429823e5179" - integrity sha512-3xVWrtIvNm9/OPzaQBgXDrfWNx63AftgFQkvqO6YSZy7sP3Fuadwwbn54F/VO9AnpyW/26i0WRQz9FScivXrmw== - dependencies: - async "^2.6.3" - class-is "^1.1.0" - libp2p-crypto "~0.16.1" - multihashes "~0.4.15" - -peer-info@~0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/peer-info/-/peer-info-0.15.1.tgz#21254a7c516d0dd046b150120b9aaf1b9ad02146" - integrity sha512-Y91Q2tZRC0CpSTPd1UebhGqniOrOAk/aj60uYUcWJXCoLTAnGu+4LJGoiay8ayudS6ice7l3SKhgL/cS62QacA== - dependencies: - mafmt "^6.0.2" - multiaddr "^6.0.3" - peer-id "~0.12.2" - unique-by "^1.0.0" - -pem-jwk@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pem-jwk/-/pem-jwk-2.0.0.tgz#1c5bb264612fc391340907f5c1de60c06d22f085" - integrity sha512-rFxu7rVoHgQ5H9YsP50dDWf0rHjreVA2z0yPiWr5WdH/UHb29hKtF7h6l8vNd1cbYR1t0QL+JKhW55a2ZV4KtA== +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: - asn1.js "^5.0.1" + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.2.1: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pkginfo@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" - integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8= - pluralize@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== -prettier@^1.13.5: +prettier@1.19.1: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== @@ -2236,60 +2819,37 @@ 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== -promise-nodeify@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/promise-nodeify/-/promise-nodeify-3.0.1.tgz#f0f5d9720ee9ec71dd2bfa92667be504c10229c2" - integrity sha512-ghsSuzZXJX8iO7WVec2z7GI+Xk/EyiD+JZK7AZKhUqYfpLa/Zs4ylUD+CwwnKlG6G3HnkUPMAi6PO7zeqGKssg== - -promise@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-1.3.0.tgz#e5cc9a4c8278e4664ffedc01c7da84842b040175" - integrity sha1-5cyaTIJ45GZP/twBx9qEhCsEAXU= - dependencies: - is-promise "~1" - -promisify-es6@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/promisify-es6/-/promisify-es6-1.0.3.tgz#b012668c4df3c965ce13daac2b3a4d1726a96346" - integrity sha512-N9iVG+CGJsI4b4ZGazjwLnxErD2d9Pe4DPvvXSxYA9tFNu8ymXME4Qs5HIQ0LMJpNM7zj+m0NlNnNeqFpKzqnA== - -protocol-buffers-schema@^3.3.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz#77bc75a48b2ff142c1ad5b5b90c94cd0fa2efd03" - integrity sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw== - -protons@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/protons/-/protons-1.2.1.tgz#5f1e0db8b2139469cd1c3b4e332a4c2d95d0a218" - integrity sha512-2oqDyc/SN+tNcJf8XxrXhYL7sQn2/OMl8mSdD7NVGsWjMEmAbks4eDVnCyf0vAoRbBWyWTEXWk4D8XfuKVl3zg== - dependencies: - buffer "^5.5.0" - protocol-buffers-schema "^3.3.1" - signed-varint "^2.0.1" - varint "^5.0.0" +promise@^8.0.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + +protobufjs@^6.10.2: + version "6.11.4" + resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" + integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/long" "^4.0.1" + "@types/node" ">=13.7.0" + long "^4.0.0" psl@^1.1.28: version "1.8.0" resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== -pull-defer@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113" - integrity sha512-/An3KE7mVjZCqNhZsr22k1Tx8MACnUnHZZNPSJ0S62td8JtYr/AiRG42Vz7Syu31SoTLUzVIe61jtT/pNdjVYA== - -pull-stream@^3.2.3, pull-stream@^3.6.9: - version "3.6.14" - resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.14.tgz#529dbd5b86131f4a5ed636fdf7f6af00781357ee" - integrity sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew== - -pull-to-stream@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pull-to-stream/-/pull-to-stream-0.1.1.tgz#fa2058528528e3542b81d6f17cbc42288508ff37" - integrity sha512-thZkMv6F9PILt9zdvpI2gxs19mkDrlixYKX6cOBxAW16i1NZH+yLAmF4r8QfJ69zuQh27e01JZP9y27tsH021w== - dependencies: - readable-stream "^3.1.1" - pump@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" @@ -2298,23 +2858,32 @@ pump@^1.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" +punycode@^1.3.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -qs@^6.5.2: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== +pvtsutils@^1.3.2: + version "1.3.5" + resolved "https://registry.yarnpkg.com/pvtsutils/-/pvtsutils-1.3.5.tgz#b8705b437b7b134cd7fd858f025a23456f1ce910" + integrity sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA== + dependencies: + tslib "^2.6.1" + +pvutils@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pvutils/-/pvutils-1.1.3.tgz#f35fc1d27e7cd3dfbd39c0826d173e806a03f5a3" + integrity sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ== + +qs@^6.4.0: + version "6.11.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" + integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== dependencies: side-channel "^1.0.4" @@ -2323,31 +2892,24 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== -ramda@^0.24.1: - version "0.24.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" - integrity sha1-w7d1UZfzW43DUCIoJixMkd22uFc= - -ramda@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.25.0.tgz#8fdf68231cffa90bc2f9460390a0cb74a29b29a9" - integrity sha512-GXpfrYVPwx3K7RQ6aYT8KPS8XViSXUVJT1ONhoKPE9VAleW42YE+U+8VEyGWt41EnEQW7gwecYJriTI0pKoecQ== +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -ramdasauce@^2.1.0: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ramdasauce/-/ramdasauce-2.1.3.tgz#acb45ecc7e4fc4d6f39e19989b4a16dff383e9c2" - integrity sha512-Ml3CPim4SKwmg5g9UI77lnRSeKr/kQw7YhQ6rfdMcBYy6DMlwmkEwQqjygJ3OhxPR+NfFfpjKl3Tf8GXckaqqg== +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: - ramda "^0.24.1" + safe-buffer "^5.1.0" -"readable-stream@2 || 3", readable-stream@^3.0.0, readable-stream@^3.0.1, readable-stream@^3.0.2, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +react-native-fetch-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/react-native-fetch-api/-/react-native-fetch-api-3.0.0.tgz#81e1bb6562c292521bc4eca52fe1097f4c1ebab5" + integrity sha512-g2rtqPjdroaboDKTsJCTlcmtw54E25OjyaunUP0anOZn4Fuo2IKs8BVfe02zVggA/UysbmfSnRJIqtNkAgggNA== dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" + p-defer "^3.0.0" readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5: version "2.3.7" @@ -2362,6 +2924,15 @@ readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@~1.0.26-4: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -2379,7 +2950,21 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -request@^2.88.0: +receptacle@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/receptacle/-/receptacle-1.3.2.tgz#a7994c7efafc7a01d0e2041839dab6c4951360d2" + integrity sha512-HrsFvqZZheusncQRiEE7GatOAETrARKV/lnfYicIm8lbvp/JQOdADOfhjBd2DajvoszEyxSM6RlAAIZgEoeu/A== + dependencies: + ms "^2.1.1" + +redeyed@~2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== + dependencies: + esprima "~4.0.0" + +request@2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -2418,6 +3003,16 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +retimer@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/retimer/-/retimer-3.0.0.tgz#98b751b1feaf1af13eb0228f8ea68b8f9da530df" + integrity sha512-WKE0j11Pa0ZJI5YIk0nflGI7SQsfl2ljihVy7ogh7DeQSeYAUi0ubZ/yEueGtDfUPk6GH5LRw1hBdLq4IwUBWA== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -2440,22 +3035,21 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rsa-pem-to-jwk@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/rsa-pem-to-jwk/-/rsa-pem-to-jwk-1.1.3.tgz#245e76bdb7e7234cfee7ca032d31b54c38fab98e" - integrity sha1-JF52vbfnI0z+58oDLTG1TDj6uY4= +rlp@^2.2.4: + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== dependencies: - object-assign "^2.0.0" - rsa-unpack "0.0.6" + bn.js "^5.2.0" -rsa-unpack@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/rsa-unpack/-/rsa-unpack-0.0.6.tgz#f50ebd56a628378e631f297161026ce9ab4eddba" - integrity sha1-9Q69VqYoN45jHylxYQJs6atO3bo= +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: - optimist "~0.3.5" + queue-microtask "^1.2.2" -safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -2465,32 +3059,51 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -secp256k1@^3.6.2: - version "3.8.0" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" - integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw== +scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: - bindings "^1.5.0" - bip66 "^1.1.5" - bn.js "^4.11.8" - create-hash "^1.2.0" - drbg.js "^1.0.1" - elliptic "^6.5.2" - nan "^2.14.0" - safe-buffer "^5.1.2" + elliptic "^6.5.4" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" -semver@7.3.5, semver@^7.0.0: +semver@7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" +semver@7.4.0: + version "7.4.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.4.0.tgz#8481c92feffc531ab1e012a8ffc15bdd3a0f4318" + integrity sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw== + dependencies: + lru-cache "^6.0.0" + +semver@^7.3.7: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== + sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" @@ -2520,30 +3133,34 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.2: +signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signed-varint@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/signed-varint/-/signed-varint-2.0.1.tgz#50a9989da7c98c2c61dad119bc97470ef8528129" - integrity sha1-UKmYnafJjCxh2tEZvJdHDvhSgSk= +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +source-map-support@^0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: - varint "~5.0.0" + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== split-ca@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/split-ca/-/split-ca-1.0.1.tgz#6c83aff3692fa61256e0cd197e05e9de157691a6" integrity sha1-bIOv82kvphJW4M0ZfgXp3hV2kaY= -split2@^3.1.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" - integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== - dependencies: - readable-stream "^3.0.0" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -2564,28 +3181,28 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -stable@~0.1.8: - version "0.1.8" - resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -stream-to-pull-stream@^1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.3.tgz#4161aa2d2eb9964de60bfa1af7feaf917e874ece" - integrity sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg== +stream-to-it@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/stream-to-it/-/stream-to-it-0.2.4.tgz#d2fd7bfbd4a899b4c0d6a7e6a533723af5749bd0" + integrity sha512-4vEbkSs83OahpmBybNJXlJd7d6/RxzkkSdT3I0mnGt79Xd2Kk+e1JqbvAvsQfCeKj3aKb0QIWkyK3/n0j506vQ== dependencies: - looper "^3.0.0" - pull-stream "^3.2.3" + get-iterator "^1.0.2" -string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" -string_decoder@^1.1.1, string_decoder@^1.2.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== @@ -2604,14 +3221,14 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= +strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== dependencies: - ansi-regex "^3.0.0" + ansi-regex "^4.1.0" -strip-ansi@^6.0.0: +strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -2623,6 +3240,13 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== + dependencies: + is-hex-prefixed "1.0.0" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -2630,13 +3254,44 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: +supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +sync-request@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" + integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== + dependencies: + http-response-object "^3.0.1" + sync-rpc "^1.2.1" + then-request "^6.0.0" + +sync-rpc@^1.2.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/sync-rpc/-/sync-rpc-1.3.6.tgz#b2e8b2550a12ccbc71df8644810529deb68665a7" + integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== + dependencies: + get-port "^3.1.0" + tar-fs@~1.16.3: version "1.16.3" resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" @@ -2660,17 +3315,6 @@ tar-stream@^1.1.2: to-buffer "^1.1.1" xtend "^4.0.0" -tar-stream@^2.0.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - tar@^6.1.0: version "6.1.11" resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" @@ -2683,20 +3327,38 @@ tar@^6.1.0: mkdirp "^1.0.3" yallist "^4.0.0" -through2@^3.0.0, through2@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4" - integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ== +then-request@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/then-request/-/then-request-6.0.2.tgz#ec18dd8b5ca43aaee5cb92f7e4c1630e950d4f0c" + integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== dependencies: - inherits "^2.0.4" - readable-stream "2 || 3" + "@types/concat-stream" "^1.6.0" + "@types/form-data" "0.0.33" + "@types/node" "^8.0.0" + "@types/qs" "^6.2.31" + caseless "~0.12.0" + concat-stream "^1.6.0" + form-data "^2.2.0" + http-basic "^8.1.1" + http-response-object "^3.0.1" + promise "^8.0.0" + qs "^6.4.0" "through@>=2.2.7 <3": version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -tmp-promise@^3.0.2: +timeout-abort-controller@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/timeout-abort-controller/-/timeout-abort-controller-2.0.0.tgz#d6a59209132e520413092dd4b4d71eaaf5887feb" + integrity sha512-2FAPXfzTPYEgw27bQGTHc0SzrbmnU2eso4qo172zMLZzaGqeu09PFa5B2FCUHM1tflgRqPgn5KQgp6+Vex4uNA== + dependencies: + abort-controller "^3.0.0" + native-abort-controller "^1.0.4" + retimer "^3.0.0" + +tmp-promise@3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7" integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ== @@ -2735,6 +3397,30 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= +ts-node@^10.9.1: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tslib@^2.0.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.5.0, tslib@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -2747,20 +3433,22 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= -tweetnacl@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -unique-by@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-by/-/unique-by-1.0.0.tgz#5220c86ba7bc572fb713ad74651470cb644212bd" - integrity sha1-UiDIa6e8Vy+3E610ZRRwy2RCEr0= +uint8arrays@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/uint8arrays/-/uint8arrays-3.1.1.tgz#2d8762acce159ccd9936057572dade9459f65ae0" + integrity sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg== + dependencies: + multiformats "^9.4.2" universalify@^2.0.0: version "2.0.0" @@ -2774,13 +3462,15 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -ursa-optional@~0.10.0: - version "0.10.2" - resolved "https://registry.yarnpkg.com/ursa-optional/-/ursa-optional-0.10.2.tgz#bd74e7d60289c22ac2a69a3c8dea5eb2817f9681" - integrity sha512-TKdwuLboBn7M34RcvVTuQyhvrA8gYKapuVdm0nBP0mnBc7oECOfUQZrY91cefL3/nm64ZyrejSRrhTVdX7NG/A== - dependencies: - bindings "^1.5.0" - nan "^2.14.2" +urlpattern-polyfill@^8.0.0: + version "8.0.2" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz#99f096e35eff8bf4b5a2aa7d58a1523d6ebc7ce5" + integrity sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ== + +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" @@ -2797,10 +3487,15 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -varint@^5.0.0, varint@~5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +varint@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/varint/-/varint-6.0.0.tgz#9881eb0ce8feaea6512439d19ddf84bf551661d0" + integrity sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg== verror@1.10.0: version "1.10.0" @@ -2818,6 +3513,43 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-streams-polyfill@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" + integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + +web3-eth-abi@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.0.tgz#4fac9c7d9e5a62b57f8884b37371f515c766f3f4" + integrity sha512-heqR0bWxgCJwjWIhq2sGyNj9bwun5+Xox/LdZKe+WMyTSy0cXDXEAgv3XKNkXC4JqdDt/ZlbTEx4TWak4TRMSg== + dependencies: + "@ethersproject/abi" "5.0.7" + web3-utils "1.7.0" + +web3-utils@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.0.tgz#c59f0fd43b2449357296eb54541810b99b1c771c" + integrity sha512-O8Tl4Ky40Sp6pe89Olk2FsaUkgHyb5QAXuaKo38ms3CxZZ4d3rPGfjP9DNKGm5+IUgAZBNpF1VmlSmNCqfDI1w== + dependencies: + bn.js "^4.11.9" + ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +webcrypto-core@^1.7.7: + version "1.7.7" + resolved "https://registry.yarnpkg.com/webcrypto-core/-/webcrypto-core-1.7.7.tgz#06f24b3498463e570fed64d7cab149e5437b162c" + integrity sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g== + dependencies: + "@peculiar/asn1-schema" "^2.3.6" + "@peculiar/json-schema" "^1.1.12" + asn1js "^3.0.1" + pvtsutils "^1.3.2" + tslib "^2.4.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -2831,17 +3563,33 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which@2.0.2, which@^2.0.0, which@^2.0.1: +which@2.0.2, which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" wrappy@1: version "1.0.2" @@ -2858,25 +3606,22 @@ xtend@^4.0.0: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.2, yaml@^1.5.1, yaml@^1.7.2: +yaml@1.10.2, yaml@^1.10.0, yaml@^1.10.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@^16.1.0: - version "16.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1" - integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" +yargs-parser@^21.0.0: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== From 2b20431b412cd56dd18ea1dbecda964033f96b06 Mon Sep 17 00:00:00 2001 From: Jan-Felix Date: Tue, 5 Sep 2023 20:27:57 +0200 Subject: [PATCH 16/43] upgrade hardhat --- packages/evm/package.json | 4 +- packages/evm/yarn.lock | 304 ++++++++++++++++++++------------------ 2 files changed, 163 insertions(+), 145 deletions(-) diff --git a/packages/evm/package.json b/packages/evm/package.json index 2db7ff436..8bf9c5847 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -37,8 +37,8 @@ "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-import": "2.27.5", "eslint-plugin-prettier": "4.2.1", - "hardhat": "2.13.0", - "hardhat-contract-sizer": "2.8.0", + "hardhat": "2.17.2", + "hardhat-contract-sizer": "2.10.0", "hardhat-gas-reporter": "1.0.9", "prettier": "2.8.6", "prettier-plugin-solidity": "1.1.3", diff --git a/packages/evm/yarn.lock b/packages/evm/yarn.lock index c9dc2ac8d..96c49b98c 100644 --- a/packages/evm/yarn.lock +++ b/packages/evm/yarn.lock @@ -7,6 +7,42 @@ resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== +"@chainsafe/as-sha256@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz#3639df0e1435cab03f4d9870cc3ac079e57a6fc9" + integrity sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg== + +"@chainsafe/persistent-merkle-tree@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz#4c9ee80cc57cd3be7208d98c40014ad38f36f7ff" + integrity sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/persistent-merkle-tree@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz#2b4a62c9489a5739dedd197250d8d2f5427e9f63" + integrity sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + +"@chainsafe/ssz@^0.10.0": + version "0.10.2" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.10.2.tgz#c782929e1bb25fec66ba72e75934b31fd087579e" + integrity sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.5.0" + +"@chainsafe/ssz@^0.9.2": + version "0.9.4" + resolved "https://registry.yarnpkg.com/@chainsafe/ssz/-/ssz-0.9.4.tgz#696a8db46d6975b600f8309ad3a12f7c0e310497" + integrity sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ== + dependencies: + "@chainsafe/as-sha256" "^0.3.1" + "@chainsafe/persistent-merkle-tree" "^0.4.2" + case "^1.6.3" + "@colors/colors@1.5.0": version "1.5.0" resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" @@ -256,7 +292,7 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.2": +"@ethersproject/providers@5.7.2", "@ethersproject/providers@^5.7.1", "@ethersproject/providers@^5.7.2": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== @@ -524,29 +560,31 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nomicfoundation/ethereumjs-block@4.2.2", "@nomicfoundation/ethereumjs-block@^4.0.0": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.2.2.tgz#f317078c810a54381c682d0c12e1e81acfc11599" - integrity sha512-atjpt4gc6ZGZUPHBAQaUJsm1l/VCo7FmyQ780tMGO8QStjLdhz09dXynmhwVTy5YbRr0FOh/uX3QaEM0yIB2Zg== - dependencies: - "@nomicfoundation/ethereumjs-common" "3.1.2" - "@nomicfoundation/ethereumjs-rlp" "4.0.3" - "@nomicfoundation/ethereumjs-trie" "5.0.5" - "@nomicfoundation/ethereumjs-tx" "4.1.2" - "@nomicfoundation/ethereumjs-util" "8.0.6" +"@nomicfoundation/ethereumjs-block@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz#13a7968f5964f1697da941281b7f7943b0465d04" + integrity sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" ethereum-cryptography "0.1.3" + ethers "^5.7.1" -"@nomicfoundation/ethereumjs-blockchain@6.2.2", "@nomicfoundation/ethereumjs-blockchain@^6.0.0": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.2.2.tgz#9f79dd2b3dc73f5d5a220f7d8a734330c4c26320" - integrity sha512-6AIB2MoTEPZJLl6IRKcbd8mUmaBAQ/NMe3O7OsAOIiDjMNPPH5KaUQiLfbVlegT4wKIg/GOsFH7XlH2KDVoJNg== - dependencies: - "@nomicfoundation/ethereumjs-block" "4.2.2" - "@nomicfoundation/ethereumjs-common" "3.1.2" - "@nomicfoundation/ethereumjs-ethash" "2.0.5" - "@nomicfoundation/ethereumjs-rlp" "4.0.3" - "@nomicfoundation/ethereumjs-trie" "5.0.5" - "@nomicfoundation/ethereumjs-util" "8.0.6" +"@nomicfoundation/ethereumjs-blockchain@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz#45323b673b3d2fab6b5008535340d1b8fea7d446" + integrity sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-ethash" "3.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" abstract-level "^1.0.3" debug "^4.3.3" ethereum-cryptography "0.1.3" @@ -554,105 +592,105 @@ lru-cache "^5.1.1" memory-level "^1.0.0" -"@nomicfoundation/ethereumjs-common@3.1.2", "@nomicfoundation/ethereumjs-common@^3.0.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.1.2.tgz#041086da66ed40f2bf2a2116a1f2f0fcf33fb80d" - integrity sha512-JAEBpIua62dyObHM9KI2b4wHZcRQYYge9gxiygTWa3lNCr2zo+K0TbypDpgiNij5MCGNWP1eboNfNfx1a3vkvA== +"@nomicfoundation/ethereumjs-common@4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz#a15d1651ca36757588fdaf2a7d381a150662a3c3" + integrity sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg== dependencies: - "@nomicfoundation/ethereumjs-util" "8.0.6" + "@nomicfoundation/ethereumjs-util" "9.0.2" crc-32 "^1.2.0" -"@nomicfoundation/ethereumjs-ethash@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.5.tgz#0c605812f6f4589a9f6d597db537bbf3b86469db" - integrity sha512-xlLdcICGgAYyYmnI3r1t0R5fKGBJNDQSOQxXNjVO99JmxJIdXR5MgPo5CSJO1RpyzKOgzi3uIFn8agv564dZEQ== +"@nomicfoundation/ethereumjs-ethash@3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz#da77147f806401ee996bfddfa6487500118addca" + integrity sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg== dependencies: - "@nomicfoundation/ethereumjs-block" "4.2.2" - "@nomicfoundation/ethereumjs-rlp" "4.0.3" - "@nomicfoundation/ethereumjs-util" "8.0.6" + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" abstract-level "^1.0.3" bigint-crypto-utils "^3.0.23" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-evm@1.3.2", "@nomicfoundation/ethereumjs-evm@^1.0.0": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.3.2.tgz#f9d6bafd5c23d07ab75b8649d589af1a43b60bfc" - integrity sha512-I00d4MwXuobyoqdPe/12dxUQxTYzX8OckSaWsMcWAfQhgVDvBx6ffPyP/w1aL0NW7MjyerySPcSVfDJAMHjilw== +"@nomicfoundation/ethereumjs-evm@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz#4c2f4b84c056047102a4fa41c127454e3f0cfcf6" + integrity sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ== dependencies: - "@nomicfoundation/ethereumjs-common" "3.1.2" - "@nomicfoundation/ethereumjs-util" "8.0.6" - "@types/async-eventemitter" "^0.2.1" - async-eventemitter "^0.2.4" + "@ethersproject/providers" "^5.7.1" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" debug "^4.3.3" ethereum-cryptography "0.1.3" mcl-wasm "^0.7.1" rustbn.js "~0.2.0" -"@nomicfoundation/ethereumjs-rlp@4.0.3", "@nomicfoundation/ethereumjs-rlp@^4.0.0": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.3.tgz#8d9147fbd0d49e8f4c5ce729d226694a8fe03eb8" - integrity sha512-DZMzB/lqPK78T6MluyXqtlRmOMcsZbTTbbEyAjo0ncaff2mqu/k8a79PBcyvpgAhWD/R59Fjq/x3ro5Lof0AtA== +"@nomicfoundation/ethereumjs-rlp@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz#4fee8dc58a53ac6ae87fb1fca7c15dc06c6b5dea" + integrity sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA== -"@nomicfoundation/ethereumjs-statemanager@1.0.5", "@nomicfoundation/ethereumjs-statemanager@^1.0.0": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.5.tgz#951cc9ff2c421d40233d2e9d0fe033db2391ee44" - integrity sha512-CAhzpzTR5toh/qOJIZUUOnWekUXuRqkkzaGAQrVcF457VhtCmr+ddZjjK50KNZ524c1XP8cISguEVNqJ6ij1sA== +"@nomicfoundation/ethereumjs-statemanager@2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz#3ba4253b29b1211cafe4f9265fee5a0d780976e0" + integrity sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA== dependencies: - "@nomicfoundation/ethereumjs-common" "3.1.2" - "@nomicfoundation/ethereumjs-rlp" "4.0.3" - "@nomicfoundation/ethereumjs-trie" "5.0.5" - "@nomicfoundation/ethereumjs-util" "8.0.6" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" debug "^4.3.3" ethereum-cryptography "0.1.3" - functional-red-black-tree "^1.0.1" + ethers "^5.7.1" + js-sdsl "^4.1.4" -"@nomicfoundation/ethereumjs-trie@5.0.5", "@nomicfoundation/ethereumjs-trie@^5.0.0": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.5.tgz#bf31c9306dcbba2007fad668e96109ddb147040c" - integrity sha512-+8sNZrXkzvA1NH5F4kz5RSYl1I6iaRz7mAZRsyxOm0IVY4UaP43Ofvfp/TwOalFunurQrYB5pRO40+8FBcxFMA== +"@nomicfoundation/ethereumjs-trie@6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz#9a6dbd28482dca1bc162d12b3733acab8cd12835" + integrity sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ== dependencies: - "@nomicfoundation/ethereumjs-rlp" "4.0.3" - "@nomicfoundation/ethereumjs-util" "8.0.6" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@types/readable-stream" "^2.3.13" ethereum-cryptography "0.1.3" readable-stream "^3.6.0" -"@nomicfoundation/ethereumjs-tx@4.1.2", "@nomicfoundation/ethereumjs-tx@^4.0.0": - version "4.1.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.1.2.tgz#8659fad7f9094b7eb82aa6cc3c8097cb1c42ff31" - integrity sha512-emJBJZpmTdUa09cqxQqHaysbBI9Od353ZazeH7WgPb35miMgNY6mb7/3vBA98N5lUW/rgkiItjX0KZfIzihSoQ== - dependencies: - "@nomicfoundation/ethereumjs-common" "3.1.2" - "@nomicfoundation/ethereumjs-rlp" "4.0.3" - "@nomicfoundation/ethereumjs-util" "8.0.6" +"@nomicfoundation/ethereumjs-tx@5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz#117813b69c0fdc14dd0446698a64be6df71d7e56" + integrity sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g== + dependencies: + "@chainsafe/ssz" "^0.9.2" + "@ethersproject/providers" "^5.7.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-util@8.0.6", "@nomicfoundation/ethereumjs-util@^8.0.0": - version "8.0.6" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.6.tgz#dbce5d258b017b37aa58b3a7c330ad59d10ccf0b" - integrity sha512-jOQfF44laa7xRfbfLXojdlcpkvxeHrE2Xu7tSeITsWFgoII163MzjOwFEzSNozHYieFysyoEMhCdP+NY5ikstw== +"@nomicfoundation/ethereumjs-util@9.0.2": + version "9.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz#16bdc1bb36f333b8a3559bbb4b17dac805ce904d" + integrity sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ== dependencies: - "@nomicfoundation/ethereumjs-rlp" "4.0.3" + "@chainsafe/ssz" "^0.10.0" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" ethereum-cryptography "0.1.3" -"@nomicfoundation/ethereumjs-vm@^6.0.0": - version "6.4.2" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.4.2.tgz#af1cf62e6c0054bc2b7febc8556d032433d1b18c" - integrity sha512-PRTyxZMP6kx+OdAzBhuH1LD2Yw+hrSpaytftvaK//thDy2OI07S0nrTdbrdk7b8ZVPAc9H9oTwFBl3/wJ3w15g== - dependencies: - "@nomicfoundation/ethereumjs-block" "4.2.2" - "@nomicfoundation/ethereumjs-blockchain" "6.2.2" - "@nomicfoundation/ethereumjs-common" "3.1.2" - "@nomicfoundation/ethereumjs-evm" "1.3.2" - "@nomicfoundation/ethereumjs-rlp" "4.0.3" - "@nomicfoundation/ethereumjs-statemanager" "1.0.5" - "@nomicfoundation/ethereumjs-trie" "5.0.5" - "@nomicfoundation/ethereumjs-tx" "4.1.2" - "@nomicfoundation/ethereumjs-util" "8.0.6" - "@types/async-eventemitter" "^0.2.1" - async-eventemitter "^0.2.4" +"@nomicfoundation/ethereumjs-vm@7.0.2": + version "7.0.2" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz#3b0852cb3584df0e18c182d0672a3596c9ca95e6" + integrity sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA== + dependencies: + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" debug "^4.3.3" ethereum-cryptography "0.1.3" - functional-red-black-tree "^1.0.1" mcl-wasm "^0.7.1" rustbn.js "~0.2.0" @@ -932,11 +970,6 @@ dependencies: fs-extra "^9.1.0" -"@types/async-eventemitter@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz#f8e6280e87e8c60b2b938624b0a3530fb3e24712" - integrity sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg== - "@types/bn.js@^4.11.3": version "4.11.6" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" @@ -1042,6 +1075,14 @@ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== +"@types/readable-stream@^2.3.13": + version "2.3.15" + resolved "https://registry.yarnpkg.com/@types/readable-stream/-/readable-stream-2.3.15.tgz#3d79c9ceb1b6a57d5f6e6976f489b9b5384321ae" + integrity sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ== + dependencies: + "@types/node" "*" + safe-buffer "~5.1.1" + "@types/secp256k1@^4.0.1": version "4.0.3" resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" @@ -1160,13 +1201,6 @@ abbrev@1.0.x: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== -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" @@ -1445,25 +1479,11 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-eventemitter@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" - integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== - dependencies: - async "^2.4.0" - async@1.x: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== -async@^2.4.0: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1671,6 +1691,11 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== +case@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/case/-/case-1.6.3.tgz#0a4386e3e9825351ca2e6216c60467ff5f1ea1c9" + integrity sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ== + caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -2599,11 +2624,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== - evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -3092,10 +3112,10 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" -hardhat-contract-sizer@2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/hardhat-contract-sizer/-/hardhat-contract-sizer-2.8.0.tgz#730a9bf35ed200ba57b6865bd3f459a91c90f205" - integrity sha512-jXt2Si3uIDx5z99J+gvKa0yvIw156pE4dpH9X/PvTQv652BUd+qGj7WT93PXnHXGh5qhQLkjDYeZMYNOThfjFg== +hardhat-contract-sizer@2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz#72646f43bfe50e9a5702c9720c9bc3e77d93a2c9" + integrity sha512-QiinUgBD5MqJZJh1hl1jc9dNnpJg7eE/w4/4GEnrcmZJJTDbVFNe3+/3Ep24XqISSkYxRz36czcPHKHd/a0dwA== dependencies: chalk "^4.0.0" cli-table3 "^0.6.0" @@ -3110,28 +3130,27 @@ hardhat-gas-reporter@1.0.9: eth-gas-reporter "^0.2.25" sha1 "^1.1.1" -hardhat@2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.13.0.tgz#d52a0ec9b733a651687e5b1c1b0ee9a11a30f3d0" - integrity sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ== +hardhat@2.17.2: + version "2.17.2" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.17.2.tgz#250a8c8e76029e9bfbfb9b9abee68d5b350b5d4a" + integrity sha512-oUv40jBeHw0dKpbyQ+iH9cmNMziweLoTW3MnkNxJ2Gc0KGLrQR/1n4vV4xY60zn2LdmRgnwPqy3CgtY0mfwIIA== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/ethereumjs-block" "^4.0.0" - "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-evm" "^1.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-tx" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - "@nomicfoundation/ethereumjs-vm" "^6.0.0" + "@nomicfoundation/ethereumjs-block" "5.0.2" + "@nomicfoundation/ethereumjs-blockchain" "7.0.2" + "@nomicfoundation/ethereumjs-common" "4.0.2" + "@nomicfoundation/ethereumjs-evm" "2.0.2" + "@nomicfoundation/ethereumjs-rlp" "5.0.2" + "@nomicfoundation/ethereumjs-statemanager" "2.0.2" + "@nomicfoundation/ethereumjs-trie" "6.0.2" + "@nomicfoundation/ethereumjs-tx" "5.0.2" + "@nomicfoundation/ethereumjs-util" "9.0.2" + "@nomicfoundation/ethereumjs-vm" "7.0.2" "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" - abort-controller "^3.0.0" adm-zip "^0.4.16" aggregate-error "^3.0.0" ansi-escapes "^4.3.0" @@ -3154,7 +3173,6 @@ hardhat@2.13.0: mnemonist "^0.38.0" mocha "^10.0.0" p-map "^4.0.0" - qs "^6.7.0" raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" @@ -4442,7 +4460,7 @@ punycode@^2.1.0, punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== -qs@^6.4.0, qs@^6.7.0: +qs@^6.4.0: version "6.11.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.2.tgz#64bea51f12c1f5da1bc01496f48ffcff7c69d7d9" integrity sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA== From 89c1e82138675f9c00ee46909872db476c2fbdc3 Mon Sep 17 00:00:00 2001 From: Jan-Felix Date: Tue, 5 Sep 2023 20:33:53 +0200 Subject: [PATCH 17/43] fix coverage --- packages/evm/package.json | 2 +- packages/evm/yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/evm/package.json b/packages/evm/package.json index 8bf9c5847..261907e71 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -42,7 +42,7 @@ "hardhat-gas-reporter": "1.0.9", "prettier": "2.8.6", "prettier-plugin-solidity": "1.1.3", - "solidity-coverage": "0.8.2", + "solidity-coverage": "0.8.4", "ts-node": "10.9.1", "typechain": "8.1.1", "typescript": "5.0.2" diff --git a/packages/evm/yarn.lock b/packages/evm/yarn.lock index 96c49b98c..6a2fd926b 100644 --- a/packages/evm/yarn.lock +++ b/packages/evm/yarn.lock @@ -921,7 +921,7 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" -"@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1": +"@solidity-parser/parser@^0.14.0": version "0.14.5" resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== @@ -4910,13 +4910,13 @@ solidity-comments-extractor@^0.0.7: resolved "https://registry.yarnpkg.com/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz#99d8f1361438f84019795d928b931f4e5c39ca19" integrity sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw== -solidity-coverage@0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.2.tgz#bc39604ab7ce0a3fa7767b126b44191830c07813" - integrity sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ== +solidity-coverage@0.8.4: + version "0.8.4" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.4.tgz#c57a21979f5e86859c5198de9fbae2d3bc6324a5" + integrity sha512-xeHOfBOjdMF6hWTbt42iH4x+7j1Atmrf5OldDPMxI+i/COdExUxszOswD9qqvcBTaLGiOrrpnh9UZjSpt4rBsg== dependencies: "@ethersproject/abi" "^5.0.9" - "@solidity-parser/parser" "^0.14.1" + "@solidity-parser/parser" "^0.16.0" chalk "^2.4.2" death "^1.1.0" detect-port "^1.3.0" From d2bb9ac9604b79c0921a3c344634b0aa7d7d43cb Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Thu, 7 Sep 2023 11:33:34 +0200 Subject: [PATCH 18/43] Remove uncessary check: it should be possible to create an allowance with an initial value, which is higher than the maxixum refilled value --- packages/evm/contracts/PermissionBuilder.sol | 5 ----- packages/evm/test/OnlyOwner.spec.ts | 7 ------- 2 files changed, 12 deletions(-) diff --git a/packages/evm/contracts/PermissionBuilder.sol b/packages/evm/contracts/PermissionBuilder.sol index 26f2cc858..ae3af247f 100644 --- a/packages/evm/contracts/PermissionBuilder.sol +++ b/packages/evm/contracts/PermissionBuilder.sol @@ -14,7 +14,6 @@ import "./packers/BufferPacker.sol"; * @author Jan-Felix Schwarz - */ abstract contract PermissionBuilder is Core { - error UnsuitableMaxBalanceForAllowance(); event AllowTarget( bytes32 roleKey, address targetAddress, @@ -166,10 +165,6 @@ abstract contract PermissionBuilder is Core { ) external onlyOwner { maxBalance = maxBalance > 0 ? maxBalance : type(uint128).max; - if (balance > maxBalance) { - revert UnsuitableMaxBalanceForAllowance(); - } - allowances[key] = Allowance({ refillAmount: refillAmount, refillInterval: refillInterval, diff --git a/packages/evm/test/OnlyOwner.spec.ts b/packages/evm/test/OnlyOwner.spec.ts index a1591a353..ceea0a5f1 100644 --- a/packages/evm/test/OnlyOwner.spec.ts +++ b/packages/evm/test/OnlyOwner.spec.ts @@ -149,13 +149,6 @@ describe("OnlyOwner", async () => { modifier.connect(johnDoe).setAllowance(allowanceKey, 0, 0, 0, 0, 0) ).to.be.revertedWith("Ownable: caller is not the owner"); - await expect( - modifier.connect(owner).setAllowance(allowanceKey, 100, 10, 0, 0, 0) - ).to.be.revertedWithCustomError( - modifier, - "UnsuitableMaxBalanceForAllowance" - ); - await expect( modifier.connect(owner).setAllowance(allowanceKey, 0, 0, 0, 0, 0) ).to.not.be.reverted; From d8b571bea28a0def603965401f91de8dda51f4e4 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Sun, 17 Sep 2023 17:55:25 +0200 Subject: [PATCH 19/43] Add test that exposes Allowance Event bug --- packages/evm/contracts/test/TestContract.sol | 10 +++ packages/evm/test/Allowance.spec.ts | 73 +++++++++++++++++++- packages/evm/test/operators/setup.ts | 25 +++++++ 3 files changed, 107 insertions(+), 1 deletion(-) diff --git a/packages/evm/contracts/test/TestContract.sol b/packages/evm/contracts/test/TestContract.sol index 73ff923cc..a019c7271 100644 --- a/packages/evm/contracts/test/TestContract.sol +++ b/packages/evm/contracts/test/TestContract.sol @@ -90,6 +90,16 @@ contract TestContract { revert AnError(); } + function fnThatMaybeReverts( + uint256 a, + bool maybe + ) public pure returns (uint256) { + if (maybe) { + revert AnError(); + } + return a; + } + function emitTheSender() public { emit EmitTheSender(msg.sender); } diff --git a/packages/evm/test/Allowance.spec.ts b/packages/evm/test/Allowance.spec.ts index 356572267..cf6b81d44 100644 --- a/packages/evm/test/Allowance.spec.ts +++ b/packages/evm/test/Allowance.spec.ts @@ -14,6 +14,7 @@ import { import { BigNumberish } from "ethers"; import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; import { + setupFnThatMaybeReturns, setupOneParamArrayOfDynamicTuple, setupOneParamStatic, setupOneParamStaticTuple, @@ -21,7 +22,7 @@ import { } from "./operators/setup"; describe("Allowance", async () => { - it("Unexistent allowance produces error", async () => { + it("unexistent allowance produces error", async () => { const { roles, scopeFunction, invoke } = await loadFixture( setupTwoParamsStatic ); @@ -54,6 +55,76 @@ describe("Allowance", async () => { .to.be.revertedWithCustomError(roles, "ConditionViolation") .withArgs(PermissionCheckerStatus.AllowanceExceeded, allowanceKey); }); + it("raises ConsumeAllowance event", async () => { + const { roles, scopeFunction, invoke, owner } = await loadFixture( + setupFnThatMaybeReturns + ); + + const allowanceKey = + "0x000000000000000000000000000000000000000000000000000000000000000f"; + await roles.connect(owner).setAllowance(allowanceKey, 1000, 0, 0, 0, 0); + + const conditionsFlat = toConditionsFlat({ + paramType: ParameterType.Calldata, + operator: Operator.Matches, + compValue: "0x", + children: [ + { + paramType: ParameterType.Static, + operator: Operator.WithinAllowance, + compValue: allowanceKey, + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + compValue: "0x", + }, + ], + }); + await scopeFunction(conditionsFlat); + const maybe = false; + + expect((await roles.allowances(allowanceKey)).balance).to.equal(1000); + + await expect(invoke(100, maybe)).to.emit(roles, "ConsumeAllowance"); + + expect((await roles.allowances(allowanceKey)).balance).to.equal(900); + }); + it("does not raise ConsumeAllowance, when inner transaction reverts, shouldRevert=false", async () => { + const { roles, scopeFunction, invoke, owner } = await loadFixture( + setupFnThatMaybeReturns + ); + + const allowanceKey = + "0x000000000000000000000000000000000000000000000000000000000000000f"; + await roles.connect(owner).setAllowance(allowanceKey, 1000, 0, 0, 0, 0); + + const conditionsFlat = toConditionsFlat({ + paramType: ParameterType.Calldata, + operator: Operator.Matches, + compValue: "0x", + children: [ + { + paramType: ParameterType.Static, + operator: Operator.WithinAllowance, + compValue: allowanceKey, + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + compValue: "0x", + }, + ], + }); + await scopeFunction(conditionsFlat); + const maybe = true; + + expect((await roles.allowances(allowanceKey)).balance).to.equal(1000); + + await expect(invoke(100, true)).to.not.emit(roles, "ConsumeAllowance"); + + expect((await roles.allowances(allowanceKey)).balance).to.equal(1000); + }); it("consumption in truthy And branch bleeds to other branches", async () => { const { roles, scopeFunction, invoke, owner } = await loadFixture( setupTwoParamsStatic diff --git a/packages/evm/test/operators/setup.ts b/packages/evm/test/operators/setup.ts index 67db1ca40..a5e857032 100644 --- a/packages/evm/test/operators/setup.ts +++ b/packages/evm/test/operators/setup.ts @@ -8,6 +8,7 @@ import { TestContract } from "../../typechain-types/contracts/test/"; export async function baseSetup( functioName: + | "fnThatMaybeReverts" | "oneParamStatic" | "twoParamsStatic" | "oneParamStaticTuple" @@ -82,6 +83,30 @@ export async function baseSetup( }; } +export async function setupFnThatMaybeReturns() { + const { owner, invoker, roles, testContract, scopeFunction } = + await baseSetup("fnThatMaybeReverts"); + + async function invoke(a: BigNumberish, b: boolean) { + return roles + .connect(invoker) + .execTransactionFromModule( + testContract.address, + 0, + (await testContract.populateTransaction.fnThatMaybeReverts(a, b)) + .data as string, + 0 + ); + } + + return { + owner, + roles, + scopeFunction, + invoke, + }; +} + export async function setupOneParamStatic() { const { owner, invoker, roles, testContract, scopeFunction } = await baseSetup("oneParamStatic"); From bd1cd96712c5b4b78f619f164e4e4d5f3f29424c Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Sun, 17 Sep 2023 17:56:47 +0200 Subject: [PATCH 20/43] Remove event emission from flushPrepare stage. Should only be emitted when finalizing flush --- packages/evm/contracts/AllowanceTracker.sol | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/evm/contracts/AllowanceTracker.sol b/packages/evm/contracts/AllowanceTracker.sol index 42b041a4f..ecbf0ad2b 100644 --- a/packages/evm/contracts/AllowanceTracker.sol +++ b/packages/evm/contracts/AllowanceTracker.sol @@ -74,9 +74,6 @@ abstract contract AllowanceTracker is Core { allowance.balance = balance - consumed; allowance.refillTimestamp = refillTimestamp; - // Emit an event to signal the total consumed amount. - emit ConsumeAllowance(key, consumed, balance - consumed); - unchecked { ++i; } From 0ce09d88f04d12008a9e1dcf0e640f6cfb8128a9 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Sun, 17 Sep 2023 18:39:30 +0200 Subject: [PATCH 21/43] Cleaning up Allowance field names, and their description --- packages/evm/contracts/AllowanceTracker.sol | 31 +++-- packages/evm/contracts/Core.sol | 4 +- packages/evm/contracts/PermissionBuilder.sol | 27 ++--- packages/evm/contracts/Types.sol | 33 +++-- .../test/operators/28WithinAllowance.spec.ts | 114 +++++++++--------- .../operators/29EtherWithinAllowance.spec.ts | 51 ++++---- .../operators/30CallWithinAllowance.spec.ts | 57 ++++----- 7 files changed, 151 insertions(+), 166 deletions(-) diff --git a/packages/evm/contracts/AllowanceTracker.sol b/packages/evm/contracts/AllowanceTracker.sol index ecbf0ad2b..dcd375565 100644 --- a/packages/evm/contracts/AllowanceTracker.sol +++ b/packages/evm/contracts/AllowanceTracker.sol @@ -19,30 +19,27 @@ abstract contract AllowanceTracker is Core { function _accruedAllowance( Allowance memory allowance, - uint256 timestamp - ) internal pure override returns (uint128 balance, uint64 refillTimestamp) { + uint256 blockTimestamp + ) internal pure override returns (uint128 balance, uint64 timestamp) { if ( - allowance.refillInterval == 0 || - timestamp < allowance.refillTimestamp + allowance.refillInterval + allowance.period == 0 || + blockTimestamp < (allowance.timestamp + allowance.period) ) { - return (allowance.balance, allowance.refillTimestamp); + return (allowance.balance, allowance.timestamp); } - uint64 elapsedIntervals = (uint64(timestamp) - - allowance.refillTimestamp) / allowance.refillInterval; + uint64 elapsedIntervals = (uint64(blockTimestamp) - + allowance.timestamp) / allowance.period; - uint128 uncappedBalance = allowance.balance + - allowance.refillAmount * + uint128 balanceUncapped = allowance.balance + + allowance.refill * elapsedIntervals; - balance = uncappedBalance < allowance.maxBalance - ? uncappedBalance + balance = balanceUncapped < allowance.maxBalance + ? balanceUncapped : allowance.maxBalance; - refillTimestamp = - allowance.refillTimestamp + - elapsedIntervals * - allowance.refillInterval; + timestamp = allowance.timestamp + elapsedIntervals * allowance.period; } /** @@ -63,7 +60,7 @@ abstract contract AllowanceTracker is Core { // Retrieve the allowance and calculate its current updated balance // and next refill timestamp. Allowance storage allowance = allowances[key]; - (uint128 balance, uint64 refillTimestamp) = _accruedAllowance( + (uint128 balance, uint64 timestamp) = _accruedAllowance( allowance, block.timestamp ); @@ -72,7 +69,7 @@ abstract contract AllowanceTracker is Core { assert(consumed <= balance); // Flush allowance.balance = balance - consumed; - allowance.refillTimestamp = refillTimestamp; + allowance.timestamp = timestamp; unchecked { ++i; diff --git a/packages/evm/contracts/Core.sol b/packages/evm/contracts/Core.sol index c4fd7d6e7..c89bd0fde 100644 --- a/packages/evm/contracts/Core.sol +++ b/packages/evm/contracts/Core.sol @@ -27,8 +27,8 @@ abstract contract Core is Modifier { function _accruedAllowance( Allowance memory allowance, - uint256 timestamp - ) internal pure virtual returns (uint128 balance, uint64 refillTimestamp); + uint256 blockTimestamp + ) internal pure virtual returns (uint128 balance, uint64 timestamp); function _key( address targetAddress, diff --git a/packages/evm/contracts/PermissionBuilder.sol b/packages/evm/contracts/PermissionBuilder.sol index ae3af247f..44acbbbd2 100644 --- a/packages/evm/contracts/PermissionBuilder.sol +++ b/packages/evm/contracts/PermissionBuilder.sol @@ -45,9 +45,9 @@ abstract contract PermissionBuilder is Core { bytes32 allowanceKey, uint128 balance, uint128 maxBalance, - uint128 refillAmount, - uint64 refillInterval, - uint64 refillTimestamp + uint128 refill, + uint64 period, + uint64 timestamp ); /// @dev Allows transactions to a target address. @@ -159,26 +159,19 @@ abstract contract PermissionBuilder is Core { bytes32 key, uint128 balance, uint128 maxBalance, - uint128 refillAmount, - uint64 refillInterval, - uint64 refillTimestamp + uint128 refill, + uint64 period, + uint64 timestamp ) external onlyOwner { maxBalance = maxBalance > 0 ? maxBalance : type(uint128).max; allowances[key] = Allowance({ - refillAmount: refillAmount, - refillInterval: refillInterval, - refillTimestamp: refillTimestamp, + refill: refill, + period: period, + timestamp: timestamp, balance: balance, maxBalance: maxBalance }); - emit SetAllowance( - key, - balance, - maxBalance, - refillAmount, - refillInterval, - refillTimestamp - ); + emit SetAllowance(key, balance, maxBalance, refill, period, timestamp); } } diff --git a/packages/evm/contracts/Types.sol b/packages/evm/contracts/Types.sol index ef4c3e387..85d2eee54 100644 --- a/packages/evm/contracts/Types.sol +++ b/packages/evm/contracts/Types.sol @@ -123,19 +123,28 @@ struct Role { } struct Allowance { - // refillInterval - duration of the period in seconds, 0 for one-time allowance - // refillAmount - amount that will be replenished "at the start of every period" (replace with: per period) - // refillTimestamp - timestamp of the last interval refilled for; - // maxBalance - max accrual amount, replenishing stops once the unused allowance hits this value - // balance - unused allowance; + /* + * period: Duration, in seconds, before a refill occurs. If set to 0, the allowance is + * for one-time use and won't be replenished. + * + * refill: Amount added to balance after each period elapses. + * + * timestamp: Records the moment when the last refill occurred. + * + * maxBalance: Maximum allowable accumulated allowance. Refill stops when unused allowance + * reaches this value. + * + * balance: Remaining, unused allowance available for use. It decreases with usage and + * increases after each refill according to the specified refill amount. + */ - // order matters - uint128 refillAmount; - uint128 maxBalance; - uint64 refillInterval; - // only these these two fields are updated on accrual, should live in the same word - uint128 balance; - uint64 refillTimestamp; + // The order is significant; fields updated during accrual are on the second word. + uint128 refill; // Amount added per accrual. + uint128 maxBalance; // Maximum allowable accumulated amount. + uint64 period; // Duration before a refill occurs. + // These two fields are the only ones updated during accrual and should reside in the same word. + uint128 balance; // Remaining unused amount. + uint64 timestamp; // Timestamp of the last refilled period. } struct Consumption { diff --git a/packages/evm/test/operators/28WithinAllowance.spec.ts b/packages/evm/test/operators/28WithinAllowance.spec.ts index 7c0995602..aa5ab8336 100644 --- a/packages/evm/test/operators/28WithinAllowance.spec.ts +++ b/packages/evm/test/operators/28WithinAllowance.spec.ts @@ -15,24 +15,24 @@ describe("Operator - WithinAllowance", async () => { { balance, maxBalance, - refillAmount, - refillInterval, - refillTimestamp, + refill, + period, + timestamp, }: { balance: BigNumberish; maxBalance?: BigNumberish; - refillAmount: BigNumberish; - refillInterval: BigNumberish; - refillTimestamp: BigNumberish; + refill: BigNumberish; + period: BigNumberish; + timestamp: BigNumberish; } ) { return roles.setAllowance( allowanceKey, balance, maxBalance || 0, - refillAmount, - refillInterval, - refillTimestamp + refill, + period, + timestamp ); } @@ -47,9 +47,9 @@ describe("Operator - WithinAllowance", async () => { await setAllowance(await roles.connect(owner), allowanceKey, { balance: 1000, - refillInterval: 0, - refillAmount: 0, - refillTimestamp: 0, + period: 0, + refill: 0, + timestamp: 0, }); await scopeFunction([ @@ -102,9 +102,9 @@ describe("Operator - WithinAllowance", async () => { const timestamp = await time.latest(); await setAllowance(await roles.connect(owner), allowanceKey, { balance: 333, - refillInterval: 1000, - refillAmount: 100, - refillTimestamp: timestamp, + period: 1000, + refill: 100, + timestamp: timestamp, }); await expect(invoke(334)) @@ -141,9 +141,9 @@ describe("Operator - WithinAllowance", async () => { const timestamp = await time.latest(); await setAllowance(await roles.connect(owner), allowanceKey, { balance: 250, - refillInterval: 500, - refillAmount: 100, - refillTimestamp: timestamp - 750, + period: 500, + refill: 100, + timestamp: timestamp - 750, }); await expect(invoke(351)) @@ -180,9 +180,9 @@ describe("Operator - WithinAllowance", async () => { const timestamp = await time.latest(); await setAllowance(await roles.connect(owner), allowanceKey, { balance: 250, - refillInterval: 1000, - refillAmount: 100, - refillTimestamp: timestamp - 50, + period: 1000, + refill: 100, + timestamp: timestamp - 50, }); await expect(invoke(251)) @@ -222,9 +222,9 @@ describe("Operator - WithinAllowance", async () => { await setAllowance(await roles.connect(owner), allowanceKey, { balance: 0, maxBalance: 1000, - refillInterval: interval, - refillAmount: 9999999, - refillTimestamp: timestamp - interval * 10, + period: interval, + refill: 9999999, + timestamp: timestamp - interval * 10, }); await expect(invoke(1001)) @@ -259,9 +259,9 @@ describe("Operator - WithinAllowance", async () => { await setAllowance(await roles.connect(owner), allowanceKey, { balance: 0, maxBalance: 9000, - refillInterval: 1000, - refillAmount: 10000, - refillTimestamp: timestamp - 5000, + period: 1000, + refill: 10000, + timestamp: timestamp - 5000, }); await expect(invoke(9001)) @@ -304,9 +304,9 @@ describe("Operator - WithinAllowance", async () => { await setAllowance(await roles.connect(owner), allowanceKey, { balance: 3000, - refillInterval: 0, - refillAmount: 0, - refillTimestamp: 0, + period: 0, + refill: 0, + timestamp: 0, }); let allowance = await roles.allowances(allowanceKey); @@ -352,9 +352,9 @@ describe("Operator - WithinAllowance", async () => { await setAllowance(await roles.connect(owner), allowanceKey, { balance: 3000, - refillInterval: 0, - refillAmount: 0, - refillTimestamp: 0, + period: 0, + refill: 0, + timestamp: 0, }); let allowance = await roles.allowances(allowanceKey); @@ -366,7 +366,7 @@ describe("Operator - WithinAllowance", async () => { allowance = await roles.allowances(allowanceKey); expect(allowance.balance).to.equal(3000); }); - it("Updates refillTimestamp starting from zero", async () => { + it("Updates timestamp starting from zero", async () => { const { owner, roles, invoke, scopeFunction } = await loadFixture( setupOneParamStatic ); @@ -392,25 +392,25 @@ describe("Operator - WithinAllowance", async () => { await setAllowance(await roles.connect(owner), allowanceKey, { balance: 1, - refillInterval: interval, - refillAmount: 0, - refillTimestamp: 0, + period: interval, + refill: 0, + timestamp: 0, }); let allowance = await roles.allowances(allowanceKey); expect(allowance.balance).to.equal(1); - expect(allowance.refillTimestamp).to.equal(0); + expect(allowance.timestamp).to.equal(0); await expect(invoke(0)).to.not.be.reverted; const now = await time.latest(); allowance = await roles.allowances(allowanceKey); - expect(allowance.refillTimestamp.toNumber()).to.be.greaterThan(0); - expect(now - allowance.refillTimestamp.toNumber()).to.be.lessThanOrEqual( + expect(allowance.timestamp.toNumber()).to.be.greaterThan(0); + expect(now - allowance.timestamp.toNumber()).to.be.lessThanOrEqual( interval * 2 ); }); - it("Does not updates refillTimestamp if interval is zero", async () => { + it("Does not updates timestamp if interval is zero", async () => { const { owner, roles, invoke, scopeFunction } = await loadFixture( setupOneParamStatic ); @@ -432,17 +432,17 @@ describe("Operator - WithinAllowance", async () => { ]); await setAllowance(await roles.connect(owner), allowanceKey, { balance: 1, - refillInterval: 0, - refillAmount: 0, - refillTimestamp: 0, + period: 0, + refill: 0, + timestamp: 0, }); await expect(invoke(0)).to.not.be.reverted; const allowance = await roles.allowances(allowanceKey); - expect(allowance.refillTimestamp).to.equal(0); + expect(allowance.timestamp).to.equal(0); }); - it("Updates refillTimestamp from past timestamp", async () => { + it("Updates timestamp from past timestamp", async () => { const { owner, roles, invoke, scopeFunction } = await loadFixture( setupOneParamStatic ); @@ -470,20 +470,20 @@ describe("Operator - WithinAllowance", async () => { const timestamp = (await time.latest()) - 2400; await setAllowance(await roles.connect(owner), allowanceKey, { balance: 1, - refillInterval: interval, - refillAmount: 0, - refillTimestamp: timestamp, + period: interval, + refill: 0, + timestamp: timestamp, }); let allowance = await roles.allowances(allowanceKey); - expect(allowance.refillTimestamp).to.equal(timestamp); + expect(allowance.timestamp).to.equal(timestamp); await expect(invoke(0)).to.not.be.reverted; allowance = await roles.allowances(allowanceKey); - expect(allowance.refillTimestamp.toNumber()).to.be.greaterThan(timestamp); + expect(allowance.timestamp.toNumber()).to.be.greaterThan(timestamp); }); - it("Does not update refillTimestamp from future timestamp", async () => { + it("Does not update timestamp from future timestamp", async () => { const { owner, roles, invoke, scopeFunction } = await loadFixture( setupOneParamStatic ); @@ -508,18 +508,18 @@ describe("Operator - WithinAllowance", async () => { const timestamp = (await time.latest()) + 1200; await setAllowance(await roles.connect(owner), allowanceKey, { balance: 1, - refillInterval: interval, - refillAmount: 0, - refillTimestamp: timestamp, + period: interval, + refill: 0, + timestamp: timestamp, }); let allowance = await roles.allowances(allowanceKey); - expect(allowance.refillTimestamp).to.equal(timestamp); + expect(allowance.timestamp).to.equal(timestamp); await expect(invoke(0)).to.not.be.reverted; allowance = await roles.allowances(allowanceKey); - expect(allowance.refillTimestamp).to.equal(timestamp); + expect(allowance.timestamp).to.equal(timestamp); }); }); }); diff --git a/packages/evm/test/operators/29EtherWithinAllowance.spec.ts b/packages/evm/test/operators/29EtherWithinAllowance.spec.ts index 774e56dbe..012d874d4 100644 --- a/packages/evm/test/operators/29EtherWithinAllowance.spec.ts +++ b/packages/evm/test/operators/29EtherWithinAllowance.spec.ts @@ -43,27 +43,20 @@ describe("Operator - EtherWithinAllowance", async () => { key, balance, maxBalance, - refillAmount, - refillInterval, - refillTimestamp, + refill, + period, + timestamp, }: { key: string; balance: BigNumberish; maxBalance?: BigNumberish; - refillAmount: BigNumberish; - refillInterval: BigNumberish; - refillTimestamp: BigNumberish; + refill: BigNumberish; + period: BigNumberish; + timestamp: BigNumberish; }) { await roles .connect(owner) - .setAllowance( - key, - balance, - maxBalance || 0, - refillAmount, - refillInterval, - refillTimestamp - ); + .setAllowance(key, balance, maxBalance || 0, refill, period, timestamp); } await roles.connect(owner).assignRoles(invoker.address, [ROLE_KEY], [true]); @@ -131,9 +124,9 @@ describe("Operator - EtherWithinAllowance", async () => { await setAllowance({ key: allowanceKey, balance: initialBalance, - refillInterval: 0, - refillAmount: 0, - refillTimestamp: 0, + period: 0, + refill: 0, + timestamp: 0, }); expect((await roles.allowances(allowanceKey)).balance).to.equal( @@ -159,9 +152,9 @@ describe("Operator - EtherWithinAllowance", async () => { await setAllowance({ key: allowanceKey, balance: 250, - refillInterval: 500, - refillAmount: 100, - refillTimestamp: timestamp - 750, + period: 500, + refill: 100, + timestamp: timestamp - 750, }); await expect(sendEthAndDoNothing(351)) @@ -181,9 +174,9 @@ describe("Operator - EtherWithinAllowance", async () => { await setAllowance({ key: allowanceKey, balance: 9, - refillInterval: 1000, - refillAmount: 1, - refillTimestamp: timestamp - 50, + period: 1000, + refill: 1, + timestamp: timestamp - 50, }); await expect(sendEthAndDoNothing(10)) @@ -219,17 +212,17 @@ describe("Operator - EtherWithinAllowance", async () => { await setAllowance({ key: allowanceKey1, balance: allowanceAmount1, - refillInterval: 0, - refillAmount: 0, - refillTimestamp: 0, + period: 0, + refill: 0, + timestamp: 0, }); await setAllowance({ key: allowanceKey2, balance: allowanceAmount2, - refillInterval: 0, - refillAmount: 0, - refillTimestamp: 0, + period: 0, + refill: 0, + timestamp: 0, }); await roles.connect(owner).scopeFunction( diff --git a/packages/evm/test/operators/30CallWithinAllowance.spec.ts b/packages/evm/test/operators/30CallWithinAllowance.spec.ts index 0aa3ed75f..bd5c2d6b7 100644 --- a/packages/evm/test/operators/30CallWithinAllowance.spec.ts +++ b/packages/evm/test/operators/30CallWithinAllowance.spec.ts @@ -39,27 +39,20 @@ describe("Operator - CallWithinAllowance", async () => { key, balance, maxBalance, - refillAmount, - refillInterval, - refillTimestamp, + refill, + period, + timestamp, }: { key: string; balance: BigNumberish; maxBalance?: BigNumberish; - refillAmount: BigNumberish; - refillInterval: BigNumberish; - refillTimestamp: BigNumberish; + refill: BigNumberish; + period: BigNumberish; + timestamp: BigNumberish; }) { await roles .connect(owner) - .setAllowance( - key, - balance, - maxBalance || 0, - refillAmount, - refillInterval, - refillTimestamp - ); + .setAllowance(key, balance, maxBalance || 0, refill, period, timestamp); } await roles.connect(owner).assignRoles(invoker.address, [ROLE_KEY], [true]); @@ -124,9 +117,9 @@ describe("Operator - CallWithinAllowance", async () => { await setAllowance({ key: allowanceKey, balance: 1, - refillInterval: 0, - refillAmount: 0, - refillTimestamp: 0, + period: 0, + refill: 0, + timestamp: 0, }); expect((await roles.allowances(allowanceKey)).balance).to.equal(1); @@ -149,9 +142,9 @@ describe("Operator - CallWithinAllowance", async () => { await setAllowance({ key: allowanceKey, balance: 2, - refillInterval: 0, - refillAmount: 0, - refillTimestamp: 0, + period: 0, + refill: 0, + timestamp: 0, }); expect((await roles.allowances(allowanceKey)).balance).to.equal(2); @@ -177,9 +170,9 @@ describe("Operator - CallWithinAllowance", async () => { await setAllowance({ key: allowanceKey, balance: 0, - refillInterval: 1000, - refillAmount: 1, - refillTimestamp: timestamp - 1010, + period: 1000, + refill: 1, + timestamp: timestamp - 1010, }); await expect(invoke()).to.not.be.reverted; @@ -196,9 +189,9 @@ describe("Operator - CallWithinAllowance", async () => { await setAllowance({ key: allowanceKey, balance: 0, - refillInterval: 1000, - refillAmount: 1, - refillTimestamp: timestamp, + period: 1000, + refill: 1, + timestamp: timestamp, }); await expect(invoke()) @@ -228,17 +221,17 @@ describe("Operator - CallWithinAllowance", async () => { await setAllowance({ key: allowanceKey1, balance: 0, - refillInterval: 0, - refillAmount: 0, - refillTimestamp: 0, + period: 0, + refill: 0, + timestamp: 0, }); await setAllowance({ key: allowanceKey2, balance: 1, - refillInterval: 0, - refillAmount: 0, - refillTimestamp: 0, + period: 0, + refill: 0, + timestamp: 0, }); async function invoke(p: BigNumberish) { From e6c2beb527ba742efea1ad90c80b1a1b38bc6b11 Mon Sep 17 00:00:00 2001 From: Auryn Macmillan Date: Mon, 18 Sep 2023 10:41:13 +1000 Subject: [PATCH 22/43] feat: natspec on Allowance struct --- packages/evm/contracts/Types.sol | 34 +++++++++++--------------------- 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/packages/evm/contracts/Types.sol b/packages/evm/contracts/Types.sol index 85d2eee54..874bdfb41 100644 --- a/packages/evm/contracts/Types.sol +++ b/packages/evm/contracts/Types.sol @@ -7,6 +7,7 @@ pragma solidity >=0.8.17 <0.9.0; * @author Cristóvão Honorato - * @author Jan-Felix Schwarz - */ + enum ParameterType { None, Static, @@ -122,29 +123,18 @@ struct Role { mapping(bytes32 => bytes32) scopeConfig; } +/// @notice The order of members in the `Allowance` struct is significant; members updated during accrual (`balance` and `timestamp`) should be stored in the same word. +/// @custom:member refill Amount added to balance after each period elapses. +/// @custom:member maxBalance Maximum allowable accumulated allowance. Refill stops when unused allowance reaches this value. +/// @custom:member perdio Duration, in seconds, before a refill occurs. If set to 0, the allowance is for one-time use and won't be replenished. +/// @custom:member balance Remaining allowance available for use. Decreases with usage and increases after each refill by the specified refill amount. +/// @custom:member timestamp Timestamp when the last refill occurred. struct Allowance { - /* - * period: Duration, in seconds, before a refill occurs. If set to 0, the allowance is - * for one-time use and won't be replenished. - * - * refill: Amount added to balance after each period elapses. - * - * timestamp: Records the moment when the last refill occurred. - * - * maxBalance: Maximum allowable accumulated allowance. Refill stops when unused allowance - * reaches this value. - * - * balance: Remaining, unused allowance available for use. It decreases with usage and - * increases after each refill according to the specified refill amount. - */ - - // The order is significant; fields updated during accrual are on the second word. - uint128 refill; // Amount added per accrual. - uint128 maxBalance; // Maximum allowable accumulated amount. - uint64 period; // Duration before a refill occurs. - // These two fields are the only ones updated during accrual and should reside in the same word. - uint128 balance; // Remaining unused amount. - uint64 timestamp; // Timestamp of the last refilled period. + uint128 refill; + uint128 maxBalance; + uint64 period; + uint128 balance; + uint64 timestamp; } struct Consumption { From 6a7fb909a1a5dc55d5cfbe759a624ce20c625f46 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Mon, 18 Sep 2023 18:04:24 +0200 Subject: [PATCH 23/43] Fix docs typo --- packages/evm/contracts/Types.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/evm/contracts/Types.sol b/packages/evm/contracts/Types.sol index 874bdfb41..93e0f4948 100644 --- a/packages/evm/contracts/Types.sol +++ b/packages/evm/contracts/Types.sol @@ -126,7 +126,7 @@ struct Role { /// @notice The order of members in the `Allowance` struct is significant; members updated during accrual (`balance` and `timestamp`) should be stored in the same word. /// @custom:member refill Amount added to balance after each period elapses. /// @custom:member maxBalance Maximum allowable accumulated allowance. Refill stops when unused allowance reaches this value. -/// @custom:member perdio Duration, in seconds, before a refill occurs. If set to 0, the allowance is for one-time use and won't be replenished. +/// @custom:member period Duration, in seconds, before a refill occurs. If set to 0, the allowance is for one-time use and won't be replenished. /// @custom:member balance Remaining allowance available for use. Decreases with usage and increases after each refill by the specified refill amount. /// @custom:member timestamp Timestamp when the last refill occurred. struct Allowance { From 171f92c213771f740a0926d65ba861280ec197ea Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Mon, 9 Oct 2023 18:43:54 +0200 Subject: [PATCH 24/43] Upgrade to OpenZeppelin v5 --- packages/evm/contracts/Roles.sol | 4 +-- packages/evm/package.json | 10 +++--- packages/evm/test/FactoryFriendly.spec.ts | 5 +-- packages/evm/test/Modifier.spec.ts | 10 +++--- packages/evm/test/OnlyOwner.spec.ts | 37 +++++++++++++++-------- packages/evm/test/Roles.spec.ts | 10 +++--- packages/evm/yarn.lock | 10 ++++++ 7 files changed, 56 insertions(+), 30 deletions(-) diff --git a/packages/evm/contracts/Roles.sol b/packages/evm/contracts/Roles.sol index 1e1ff680e..492141eba 100644 --- a/packages/evm/contracts/Roles.sol +++ b/packages/evm/contracts/Roles.sol @@ -53,12 +53,10 @@ contract Roles is initParams, (address, address, address) ); - __Ownable_init(); - + _transferOwnership(_owner); avatar = _avatar; target = _target; - _transferOwnership(_owner); setupModules(); emit RolesModSetup(msg.sender, _owner, _avatar, _target); diff --git a/packages/evm/package.json b/packages/evm/package.json index 261907e71..759ba8723 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -32,16 +32,16 @@ "@typescript-eslint/eslint-plugin": "^5.9.0", "@typescript-eslint/parser": "^5.9.0", "chai": "4.3.7", - "eslint": "8.36.0", "eslint-config-prettier": "8.8.0", "eslint-plugin-eslint-comments": "3.2.0", "eslint-plugin-import": "2.27.5", "eslint-plugin-prettier": "4.2.1", - "hardhat": "2.17.2", + "eslint": "8.36.0", "hardhat-contract-sizer": "2.10.0", "hardhat-gas-reporter": "1.0.9", - "prettier": "2.8.6", + "hardhat": "2.17.2", "prettier-plugin-solidity": "1.1.3", + "prettier": "2.8.6", "solidity-coverage": "0.8.4", "ts-node": "10.9.1", "typechain": "8.1.1", @@ -51,6 +51,8 @@ "@gnosis.pm/mock-contract": "^4.0.0", "@gnosis.pm/safe-contracts": "1.3.0", "@gnosis.pm/zodiac": "3.2.0", + "@openzeppelin/contracts-upgradeable": "^5.0.0", + "@openzeppelin/contracts": "^5.0.0", "argv": "0.0.3", "dotenv": "16.0.3", "ethers": "5.7.2", @@ -59,4 +61,4 @@ "installConfig": { "hoistingLimits": "workspaces" } -} \ No newline at end of file +} diff --git a/packages/evm/test/FactoryFriendly.spec.ts b/packages/evm/test/FactoryFriendly.spec.ts index 346b7c986..5505c6f1e 100644 --- a/packages/evm/test/FactoryFriendly.spec.ts +++ b/packages/evm/test/FactoryFriendly.spec.ts @@ -44,8 +44,9 @@ describe("Module works with factory", () => { AddressOne, ]); - await expect(masterCopy.setUp(encodedParams)).to.be.revertedWith( - "Initializable: contract is already initialized" + await expect(masterCopy.setUp(encodedParams)).to.be.revertedWithCustomError( + masterCopy, + "InvalidInitialization" ); }); diff --git a/packages/evm/test/Modifier.spec.ts b/packages/evm/test/Modifier.spec.ts index 7adc4d9ba..1a689e1c9 100644 --- a/packages/evm/test/Modifier.spec.ts +++ b/packages/evm/test/Modifier.spec.ts @@ -28,7 +28,9 @@ describe("Modifier", async () => { const { roles, invoker } = await loadFixture(setup); await expect( roles.connect(invoker).disableModule(AddressOne, invoker.address) - ).to.be.revertedWith("Ownable: caller is not the owner"); + ) + .to.be.revertedWithCustomError(roles, "OwnableUnauthorizedAccount") + .withArgs(invoker.address); }); it("reverts if module is null or sentinel", async () => { const { roles, owner } = await loadFixture(setup); @@ -63,9 +65,9 @@ describe("Modifier", async () => { describe("enableModule()", async () => { it("reverts if not owner", async () => { const { roles, invoker } = await loadFixture(setup); - await expect( - roles.connect(invoker).enableModule(AddressOne) - ).to.be.revertedWith("Ownable: caller is not the owner"); + await expect(roles.connect(invoker).enableModule(AddressOne)) + .to.be.revertedWithCustomError(roles, "OwnableUnauthorizedAccount") + .withArgs(invoker.address); }); it("reverts if module is already enabled", async () => { const { roles, owner, invoker } = await loadFixture(setup); diff --git a/packages/evm/test/OnlyOwner.spec.ts b/packages/evm/test/OnlyOwner.spec.ts index ceea0a5f1..08987759a 100644 --- a/packages/evm/test/OnlyOwner.spec.ts +++ b/packages/evm/test/OnlyOwner.spec.ts @@ -35,7 +35,9 @@ describe("OnlyOwner", async () => { await expect( modifier.connect(johnDoe).allowTarget(ROLE_KEY, SomeAddress, 0) - ).to.be.revertedWith("Ownable: caller is not the owner"); + ) + .to.be.revertedWithCustomError(modifier, "OwnableUnauthorizedAccount") + .withArgs(johnDoe.address); await expect(modifier.connect(owner).allowTarget(ROLE_KEY, SomeAddress, 0)) .to.not.be.reverted; @@ -43,9 +45,9 @@ describe("OnlyOwner", async () => { it("onlyOwner for scopeTarget, simple invoker fails", async () => { const { modifier, owner, johnDoe } = await loadFixture(setup); - await expect( - modifier.connect(johnDoe).scopeTarget(ROLE_KEY, SomeAddress) - ).to.be.revertedWith("Ownable: caller is not the owner"); + await expect(modifier.connect(johnDoe).scopeTarget(ROLE_KEY, SomeAddress)) + .to.be.revertedWithCustomError(modifier, "OwnableUnauthorizedAccount") + .withArgs(johnDoe.address); await expect(modifier.connect(owner).scopeTarget(ROLE_KEY, SomeAddress)).to .not.be.reverted; @@ -53,9 +55,9 @@ describe("OnlyOwner", async () => { it("onlyOwner for revokeTarget, simple invoker fails", async () => { const { modifier, owner, johnDoe } = await loadFixture(setup); - await expect( - modifier.connect(johnDoe).revokeTarget(ROLE_KEY, SomeAddress) - ).to.be.revertedWith("Ownable: caller is not the owner"); + await expect(modifier.connect(johnDoe).revokeTarget(ROLE_KEY, SomeAddress)) + .to.be.revertedWithCustomError(modifier, "OwnableUnauthorizedAccount") + .withArgs(johnDoe.address); await expect(modifier.connect(owner).revokeTarget(ROLE_KEY, SomeAddress)).to .not.be.reverted; @@ -67,8 +69,9 @@ describe("OnlyOwner", async () => { modifier .connect(johnDoe) .allowFunction(ROLE_KEY, SomeAddress, "0x00000000", 0) - ).to.be.revertedWith("Ownable: caller is not the owner"); - + ) + .to.be.revertedWithCustomError(modifier, "OwnableUnauthorizedAccount") + .withArgs(johnDoe.address); await expect( modifier .connect(owner) @@ -82,7 +85,9 @@ describe("OnlyOwner", async () => { modifier .connect(johnDoe) .revokeFunction(ROLE_KEY, SomeAddress, "0x00000000") - ).to.be.revertedWith("Ownable: caller is not the owner"); + ) + .to.be.revertedWithCustomError(modifier, "OwnableUnauthorizedAccount") + .withArgs(johnDoe.address); await expect( modifier @@ -114,7 +119,9 @@ describe("OnlyOwner", async () => { ], 0 ) - ).to.be.revertedWith("Ownable: caller is not the owner"); + ) + .to.be.revertedWithCustomError(modifier, "OwnableUnauthorizedAccount") + .withArgs(johnDoe.address); await expect( modifier.connect(owner).scopeFunction( @@ -147,7 +154,9 @@ describe("OnlyOwner", async () => { await expect( modifier.connect(johnDoe).setAllowance(allowanceKey, 0, 0, 0, 0, 0) - ).to.be.revertedWith("Ownable: caller is not the owner"); + ) + .to.be.revertedWithCustomError(modifier, "OwnableUnauthorizedAccount") + .withArgs(johnDoe.address); await expect( modifier.connect(owner).setAllowance(allowanceKey, 0, 0, 0, 0, 0) @@ -164,7 +173,9 @@ describe("OnlyOwner", async () => { "0xaabbccdd", "0x0000000000000000000000000000000000000004" ) - ).to.be.revertedWith("Ownable: caller is not the owner"); + ) + .to.be.revertedWithCustomError(modifier, "OwnableUnauthorizedAccount") + .withArgs(johnDoe.address); await expect( modifier diff --git a/packages/evm/test/Roles.spec.ts b/packages/evm/test/Roles.spec.ts index a73b1abbd..6acaf47b8 100644 --- a/packages/evm/test/Roles.spec.ts +++ b/packages/evm/test/Roles.spec.ts @@ -129,7 +129,9 @@ describe("Roles", async () => { const { roles, alice, bob } = await loadFixture(setup); await expect( roles.connect(alice).assignRoles(bob.address, [ROLE_KEY1], [true]) - ).to.be.revertedWith("Ownable: caller is not the owner"); + ) + .to.be.revertedWithCustomError(roles, "OwnableUnauthorizedAccount") + .withArgs(alice.address); }); it("assigns roles to a module", async () => { const { roles, testContract, owner, invoker } = await loadFixture(setup); @@ -237,9 +239,9 @@ describe("Roles", async () => { describe("setDefaultRole()", () => { it("reverts if not authorized", async () => { const { roles, alice, bob } = await loadFixture(setup); - await expect( - roles.connect(alice).setDefaultRole(bob.address, ROLE_KEY1) - ).to.be.revertedWith("Ownable: caller is not the owner"); + await expect(roles.connect(alice).setDefaultRole(bob.address, ROLE_KEY1)) + .to.be.revertedWithCustomError(roles, "OwnableUnauthorizedAccount") + .withArgs(alice.address); }); it("sets default role", async () => { const { roles, testContract, owner, invoker } = await loadFixture(setup); diff --git a/packages/evm/yarn.lock b/packages/evm/yarn.lock index 6a2fd926b..f58a8adf8 100644 --- a/packages/evm/yarn.lock +++ b/packages/evm/yarn.lock @@ -809,11 +809,21 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.3.tgz#ff17a80fb945f5102571f8efecb5ce5915cc4811" integrity sha512-jjaHAVRMrE4UuZNfDwjlLGDxTHWIOwTJS2ldnc278a0gevfXfPr8hxKEVBGFBE96kl2G3VHDZhUimw/+G3TG2A== +"@openzeppelin/contracts-upgradeable@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.0.0.tgz#859c00c55f04b6dda85b3c88bce507d65019888f" + integrity sha512-D54RHzkOKHQ8xUssPgQe2d/U92mwaiBDY7qCCVGq6VqwQjsT3KekEQ3bonev+BLP30oZ0R1U6YC8/oLpizgC5Q== + "@openzeppelin/contracts@^4.8.1": version "4.9.3" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.3.tgz#00d7a8cf35a475b160b3f0293a6403c511099364" integrity sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg== +"@openzeppelin/contracts@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.0.0.tgz#ee0e4b4564f101a5c4ee398cd4d73c0bd92b289c" + integrity sha512-bv2sdS6LKqVVMLI5+zqnNrNU/CA+6z6CmwFXm/MzmOPBRSO5reEJN7z0Gbzvs0/bv/MZZXNklubpwy3v2+azsw== + "@scure/base@~1.1.0": version "1.1.2" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.2.tgz#ff0cf51874aaf176490c9cb46e4df807a2e581d2" From a76e1203b01e59b260db61a9ac8243f52d385460 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Wed, 11 Oct 2023 01:15:26 +0200 Subject: [PATCH 25/43] Add tests to expose PRE-01M and TYG-01M --- packages/evm/test/decoder/Decoder.spec.ts | 346 +++++++++++++++++++++- 1 file changed, 345 insertions(+), 1 deletion(-) diff --git a/packages/evm/test/decoder/Decoder.spec.ts b/packages/evm/test/decoder/Decoder.spec.ts index 38a0451c6..37544493c 100644 --- a/packages/evm/test/decoder/Decoder.spec.ts +++ b/packages/evm/test/decoder/Decoder.spec.ts @@ -6,6 +6,7 @@ import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; import { defaultAbiCoder } from "ethers/lib/utils"; import { Operator, ParameterType } from "../utils"; +import { AddressOne } from "@gnosis.pm/safe-contracts"; const YesRemoveOffset = true; const DontRemoveOffset = false; @@ -106,7 +107,349 @@ describe("Decoder library", async () => { it.skip("plucks Tuple from top level"); it.skip("plucks Tuple from Tuple"); it.skip("plucks Tuple from Array"); - it.skip("plucks Tuple from nested Calldata"); + + it("plucks StaticTuple from nested Calldata", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const { data: inner } = await testEncoder.populateTransaction.staticTuple( + { + a: 999, + b: AddressOne, + }, + 123 + ); + assert(inner); + + const { data } = await testEncoder.populateTransaction.dynamic(inner); + assert(data); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Calldata, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Tuple, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data as string, layout); + + const calldata = result.children[0]; + const tuple = calldata.children[0]; + const tupleField1 = tuple.children[0]; + const tupleField2 = tuple.children[1]; + const arg = calldata.children[1]; + + expect( + await decoder.pluck(data as string, tuple.location, tuple.size) + ).to.equal( + defaultAbiCoder.encode(["tuple(uint256,address)"], [[999, AddressOne]]) + ); + + expect( + await decoder.pluck( + data as string, + tupleField1.location, + tupleField1.size + ) + ).to.equal(defaultAbiCoder.encode(["uint256"], [999])); + + expect( + await decoder.pluck( + data as string, + tupleField2.location, + tupleField2.size + ) + ).to.equal(defaultAbiCoder.encode(["address"], [AddressOne])); + }); + it("plucks DynamicTuple from nested Calldata", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const { data: inner } = await testEncoder.populateTransaction.dynamicTuple({ + dynamic: "0xbadfed", + _static: 123, + dynamic32: [456, 789], + }); + assert(inner); + + const { data } = await testEncoder.populateTransaction.dynamic(inner); + assert(data); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.Calldata, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Tuple, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Array, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data as string, layout); + + const calldata = result.children[0]; + const tuple = calldata.children[0]; + const tupleField1 = tuple.children[0]; + const tupleField2 = tuple.children[1]; + const tupleField3 = tuple.children[2]; + + expect( + await decoder.pluck(data as string, tuple.location, tuple.size) + ).to.equal( + encode( + ["tuple(bytes,uint256,uint256[])"], + [["0xbadfed", 123, [456, 789]]], + YesRemoveOffset + ) + ); + + expect( + await decoder.pluck( + data as string, + tupleField1.location, + tupleField1.size + ) + ).to.equal(encode(["bytes"], ["0xbadfed"], YesRemoveOffset)); + + expect( + await decoder.pluck( + data as string, + tupleField2.location, + tupleField2.size + ) + ).to.equal(encode(["uint256"], [123])); + + expect( + await decoder.pluck( + data as string, + tupleField3.location, + tupleField3.size + ) + ).to.equal(encode(["uint256[]"], [[456, 789]], YesRemoveOffset)); + }); + it("plucks StaticTuple from nested AbiEncoded", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const inner = encode( + ["tuple(uint256,address)", "uint256"], + [[999, AddressOne], 123] + ); + + const { data } = await testEncoder.populateTransaction.dynamic(inner); + assert(data); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.AbiEncoded, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Tuple, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data as string, layout); + + const calldata = result.children[0]; + const tuple = calldata.children[0]; + const tupleField1 = tuple.children[0]; + const tupleField2 = tuple.children[1]; + const arg = calldata.children[1]; + + expect( + await decoder.pluck(data as string, tuple.location, tuple.size) + ).to.equal( + defaultAbiCoder.encode(["tuple(uint256,address)"], [[999, AddressOne]]) + ); + + expect( + await decoder.pluck( + data as string, + tupleField1.location, + tupleField1.size + ) + ).to.equal(defaultAbiCoder.encode(["uint256"], [999])); + + expect( + await decoder.pluck( + data as string, + tupleField2.location, + tupleField2.size + ) + ).to.equal(defaultAbiCoder.encode(["address"], [AddressOne])); + }); + it("plucks DynamicTuple from nested AbiEncoded", async () => { + const { decoder, testEncoder } = await loadFixture(setup); + + const inner = encode( + ["tuple(bytes,uint256,uint256[])"], + [["0xbadfed", 123, [456, 789]]] + ); + + const { data } = await testEncoder.populateTransaction.dynamic(inner); + assert(data); + + const layout = { + paramType: ParameterType.Calldata, + operator: Operator.Matches, + children: [ + { + paramType: ParameterType.AbiEncoded, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Tuple, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Dynamic, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + { + paramType: ParameterType.Array, + operator: Operator.Pass, + children: [ + { + paramType: ParameterType.Static, + operator: Operator.Pass, + children: [], + }, + ], + }, + ], + }, + ], + }, + ], + }; + + const result = await decoder.inspect(data as string, layout); + + const calldata = result.children[0]; + const tuple = calldata.children[0]; + const tupleField1 = tuple.children[0]; + const tupleField2 = tuple.children[1]; + const tupleField3 = tuple.children[2]; + + expect( + await decoder.pluck(data as string, tuple.location, tuple.size) + ).to.equal( + encode( + ["tuple(bytes,uint256,uint256[])"], + [["0xbadfed", 123, [456, 789]]], + YesRemoveOffset + ) + ); + + expect( + await decoder.pluck( + data as string, + tupleField1.location, + tupleField1.size + ) + ).to.equal(encode(["bytes"], ["0xbadfed"], YesRemoveOffset)); + + expect( + await decoder.pluck( + data as string, + tupleField2.location, + tupleField2.size + ) + ).to.equal(encode(["uint256"], [123])); + + expect( + await decoder.pluck( + data as string, + tupleField3.location, + tupleField3.size + ) + ).to.equal(encode(["uint256[]"], [[456, 789]], YesRemoveOffset)); + }); it("plucks Tuple with multiple dynamic fields", async () => { const { decoder, testEncoder } = await loadFixture(setup); @@ -186,6 +529,7 @@ describe("Decoder library", async () => { it.skip("plucks Array from Tuple"); it.skip("plucks Array from Array"); it.skip("plucks Array from nested Calldata"); + it.skip("plucks Array from nested AbiEncoded"); describe("TypeTree", async () => { it("top level variants get unfolded to its entrypoint form", async () => { From b1d2f5dea1b0ab50f119e86f144329e4dc06cedf Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Wed, 11 Oct 2023 01:19:44 +0200 Subject: [PATCH 26/43] Fix PRE-01M and TYG-01M --- packages/evm/contracts/Topology.sol | 3 ++- packages/evm/contracts/packers/Packer.sol | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/evm/contracts/Topology.sol b/packages/evm/contracts/Topology.sol index 708f93a0e..b2b9eb1cc 100644 --- a/packages/evm/contracts/Topology.sol +++ b/packages/evm/contracts/Topology.sol @@ -52,7 +52,8 @@ library Topology { } else if ( paramType == ParameterType.Dynamic || paramType == ParameterType.Array || - paramType == ParameterType.Calldata + paramType == ParameterType.Calldata || + paramType == ParameterType.AbiEncoded ) { return false; } else { diff --git a/packages/evm/contracts/packers/Packer.sol b/packages/evm/contracts/packers/Packer.sol index 50191e500..e777c16ae 100644 --- a/packages/evm/contracts/packers/Packer.sol +++ b/packages/evm/contracts/packers/Packer.sol @@ -73,7 +73,8 @@ library Packer { } else if ( paramType == ParameterType.Dynamic || paramType == ParameterType.Array || - paramType == ParameterType.Calldata + paramType == ParameterType.Calldata || + paramType == ParameterType.AbiEncoded ) { return false; } else { From a10c49c8dfd9284f64ad9b9db9e3784adf419b1e Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Wed, 11 Oct 2023 01:22:17 +0200 Subject: [PATCH 27/43] Address Informational: AIO-01C --- packages/evm/contracts/adapters/AvatarIsOwnerOfERC721.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/evm/contracts/adapters/AvatarIsOwnerOfERC721.sol b/packages/evm/contracts/adapters/AvatarIsOwnerOfERC721.sol index dad684926..99a1f60f5 100644 --- a/packages/evm/contracts/adapters/AvatarIsOwnerOfERC721.sol +++ b/packages/evm/contracts/adapters/AvatarIsOwnerOfERC721.sol @@ -17,7 +17,7 @@ contract AvatarIsOwnerOfERC721 is ICustomCondition { bytes calldata data, uint256 location, uint256 size, - bytes12 + bytes12 /* extra */ ) public view returns (bool success, bytes32 reason) { address avatar = IModifier(msg.sender).avatar(); uint256 tokenId = uint256(bytes32(data[location:location + size])); From 55549584210c180b3a5dba994b1f6f20d30446e1 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Wed, 11 Oct 2023 01:42:25 +0200 Subject: [PATCH 28/43] Address Informational: PCR-02C --- packages/evm/contracts/PermissionChecker.sol | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/evm/contracts/PermissionChecker.sol b/packages/evm/contracts/PermissionChecker.sol index 7fbad1aa4..e540f6101 100644 --- a/packages/evm/contracts/PermissionChecker.sol +++ b/packages/evm/contracts/PermissionChecker.sol @@ -123,12 +123,7 @@ abstract contract PermissionChecker is Core, Periphery { revert FunctionSignatureTooShort(); } - if (role.targets[to].clearance == Clearance.Target) { - return ( - _executionOptions(value, operation, role.targets[to].options), - Result({consumptions: consumptions, info: 0}) - ); - } else if (role.targets[to].clearance == Clearance.Function) { + if (role.targets[to].clearance == Clearance.Function) { bytes32 key = _key(to, bytes4(data)); { bytes32 header = role.scopeConfig[key]; @@ -168,6 +163,11 @@ abstract contract PermissionChecker is Core, Periphery { data, Context({to: to, value: value, consumptions: consumptions}) ); + } else if (role.targets[to].clearance == Clearance.Target) { + return ( + _executionOptions(value, operation, role.targets[to].options), + Result({consumptions: consumptions, info: 0}) + ); } else { return ( Status.TargetAddressNotAllowed, From 58dd89539cfc83cdf06c0cd1cd269bdb5e0cfb2f Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Wed, 11 Oct 2023 15:08:41 +0200 Subject: [PATCH 29/43] Fix PBR-01M --- packages/evm/contracts/AllowanceTracker.sol | 20 +++++----- packages/evm/contracts/Core.sol | 2 +- packages/evm/contracts/PermissionBuilder.sol | 13 ++++--- packages/evm/contracts/PermissionLoader.sol | 2 +- packages/evm/contracts/Types.sol | 4 +- packages/evm/test/Allowance.spec.ts | 37 +++++++++++++++++++ .../test/operators/28WithinAllowance.spec.ts | 16 ++++---- 7 files changed, 67 insertions(+), 27 deletions(-) diff --git a/packages/evm/contracts/AllowanceTracker.sol b/packages/evm/contracts/AllowanceTracker.sol index dcd375565..86a257f97 100644 --- a/packages/evm/contracts/AllowanceTracker.sol +++ b/packages/evm/contracts/AllowanceTracker.sol @@ -19,7 +19,7 @@ abstract contract AllowanceTracker is Core { function _accruedAllowance( Allowance memory allowance, - uint256 blockTimestamp + uint64 blockTimestamp ) internal pure override returns (uint128 balance, uint64 timestamp) { if ( allowance.period == 0 || @@ -28,16 +28,18 @@ abstract contract AllowanceTracker is Core { return (allowance.balance, allowance.timestamp); } - uint64 elapsedIntervals = (uint64(blockTimestamp) - + uint64 elapsedIntervals = (blockTimestamp - allowance.timestamp) / allowance.period; - uint128 balanceUncapped = allowance.balance + - allowance.refill * - elapsedIntervals; + if (allowance.balance < allowance.maxRefill) { + balance = allowance.balance + allowance.refill * elapsedIntervals; - balance = balanceUncapped < allowance.maxBalance - ? balanceUncapped - : allowance.maxBalance; + balance = balance < allowance.maxRefill + ? balance + : allowance.maxRefill; + } else { + balance = allowance.balance; + } timestamp = allowance.timestamp + elapsedIntervals * allowance.period; } @@ -62,7 +64,7 @@ abstract contract AllowanceTracker is Core { Allowance storage allowance = allowances[key]; (uint128 balance, uint64 timestamp) = _accruedAllowance( allowance, - block.timestamp + uint64(block.timestamp) ); assert(balance == consumption.balance); diff --git a/packages/evm/contracts/Core.sol b/packages/evm/contracts/Core.sol index c89bd0fde..bf6d28239 100644 --- a/packages/evm/contracts/Core.sol +++ b/packages/evm/contracts/Core.sol @@ -27,7 +27,7 @@ abstract contract Core is Modifier { function _accruedAllowance( Allowance memory allowance, - uint256 blockTimestamp + uint64 blockTimestamp ) internal pure virtual returns (uint128 balance, uint64 timestamp); function _key( diff --git a/packages/evm/contracts/PermissionBuilder.sol b/packages/evm/contracts/PermissionBuilder.sol index 44acbbbd2..35339275a 100644 --- a/packages/evm/contracts/PermissionBuilder.sol +++ b/packages/evm/contracts/PermissionBuilder.sol @@ -44,7 +44,7 @@ abstract contract PermissionBuilder is Core { event SetAllowance( bytes32 allowanceKey, uint128 balance, - uint128 maxBalance, + uint128 maxRefill, uint128 refill, uint64 period, uint64 timestamp @@ -158,20 +158,21 @@ abstract contract PermissionBuilder is Core { function setAllowance( bytes32 key, uint128 balance, - uint128 maxBalance, + uint128 maxRefill, uint128 refill, uint64 period, uint64 timestamp ) external onlyOwner { - maxBalance = maxBalance > 0 ? maxBalance : type(uint128).max; + maxRefill = maxRefill != 0 ? maxRefill : type(uint128).max; + timestamp = timestamp != 0 ? timestamp : uint64(block.timestamp); allowances[key] = Allowance({ refill: refill, + maxRefill: maxRefill, period: period, timestamp: timestamp, - balance: balance, - maxBalance: maxBalance + balance: balance }); - emit SetAllowance(key, balance, maxBalance, refill, period, timestamp); + emit SetAllowance(key, balance, maxRefill, refill, period, timestamp); } } diff --git a/packages/evm/contracts/PermissionLoader.sol b/packages/evm/contracts/PermissionLoader.sol index f3bbe7a16..e78482481 100644 --- a/packages/evm/contracts/PermissionLoader.sol +++ b/packages/evm/contracts/PermissionLoader.sol @@ -144,7 +144,7 @@ abstract contract PermissionLoader is Core { result[insert].allowanceKey = key; (result[insert].balance, ) = _accruedAllowance( allowances[key], - block.timestamp + uint64(block.timestamp) ); insert++; } diff --git a/packages/evm/contracts/Types.sol b/packages/evm/contracts/Types.sol index 93e0f4948..0aebe7534 100644 --- a/packages/evm/contracts/Types.sol +++ b/packages/evm/contracts/Types.sol @@ -125,13 +125,13 @@ struct Role { /// @notice The order of members in the `Allowance` struct is significant; members updated during accrual (`balance` and `timestamp`) should be stored in the same word. /// @custom:member refill Amount added to balance after each period elapses. -/// @custom:member maxBalance Maximum allowable accumulated allowance. Refill stops when unused allowance reaches this value. +/// @custom:member maxRefill Refilling stops when balance reaches this value. /// @custom:member period Duration, in seconds, before a refill occurs. If set to 0, the allowance is for one-time use and won't be replenished. /// @custom:member balance Remaining allowance available for use. Decreases with usage and increases after each refill by the specified refill amount. /// @custom:member timestamp Timestamp when the last refill occurred. struct Allowance { uint128 refill; - uint128 maxBalance; + uint128 maxRefill; uint64 period; uint128 balance; uint64 timestamp; diff --git a/packages/evm/test/Allowance.spec.ts b/packages/evm/test/Allowance.spec.ts index cf6b81d44..07924b0ae 100644 --- a/packages/evm/test/Allowance.spec.ts +++ b/packages/evm/test/Allowance.spec.ts @@ -663,6 +663,43 @@ describe("Allowance", async () => { expect((await roles.allowances(allowanceKey1)).balance).to.equal(100); expect((await roles.allowances(allowanceKey2)).balance).to.equal(35); }); + it("balance above maxRefill gets consumed", async () => { + const { roles, scopeFunction, invoke, owner } = await loadFixture( + setupFnThatMaybeReturns + ); + + const allowanceKey = + "0x000000000000000000000000000000000000000000000000000000000000000f"; + await roles + .connect(owner) + .setAllowance(allowanceKey, 1300, 1000, 100, 0, 0); + + const conditionsFlat = toConditionsFlat({ + paramType: ParameterType.Calldata, + operator: Operator.Matches, + compValue: "0x", + children: [ + { + paramType: ParameterType.Static, + operator: Operator.WithinAllowance, + compValue: allowanceKey, + }, + { + paramType: ParameterType.Static, + operator: Operator.Pass, + compValue: "0x", + }, + ], + }); + await scopeFunction(conditionsFlat); + const maybe = false; + + expect((await roles.allowances(allowanceKey)).balance).to.equal(1300); + + await expect(invoke(1200, maybe)).to.emit(roles, "ConsumeAllowance"); + + expect((await roles.allowances(allowanceKey)).balance).to.equal(100); + }); describe("multiEntrypoint", async () => { async function setup() { diff --git a/packages/evm/test/operators/28WithinAllowance.spec.ts b/packages/evm/test/operators/28WithinAllowance.spec.ts index aa5ab8336..24143e360 100644 --- a/packages/evm/test/operators/28WithinAllowance.spec.ts +++ b/packages/evm/test/operators/28WithinAllowance.spec.ts @@ -366,7 +366,7 @@ describe("Operator - WithinAllowance", async () => { allowance = await roles.allowances(allowanceKey); expect(allowance.balance).to.equal(3000); }); - it("Updates timestamp starting from zero", async () => { + it("Updates timestamp", async () => { const { owner, roles, invoke, scopeFunction } = await loadFixture( setupOneParamStatic ); @@ -391,21 +391,21 @@ describe("Operator - WithinAllowance", async () => { ]); await setAllowance(await roles.connect(owner), allowanceKey, { - balance: 1, + balance: 100, period: interval, refill: 0, - timestamp: 0, + timestamp: 1, }); let allowance = await roles.allowances(allowanceKey); - expect(allowance.balance).to.equal(1); - expect(allowance.timestamp).to.equal(0); + expect(allowance.balance).to.equal(100); + expect(allowance.timestamp).to.equal(1); await expect(invoke(0)).to.not.be.reverted; const now = await time.latest(); allowance = await roles.allowances(allowanceKey); - expect(allowance.timestamp.toNumber()).to.be.greaterThan(0); + expect(allowance.timestamp.toNumber()).to.be.greaterThan(1); expect(now - allowance.timestamp.toNumber()).to.be.lessThanOrEqual( interval * 2 ); @@ -434,13 +434,13 @@ describe("Operator - WithinAllowance", async () => { balance: 1, period: 0, refill: 0, - timestamp: 0, + timestamp: 123, }); await expect(invoke(0)).to.not.be.reverted; const allowance = await roles.allowances(allowanceKey); - expect(allowance.timestamp).to.equal(0); + expect(allowance.timestamp).to.equal(123); }); it("Updates timestamp from past timestamp", async () => { const { owner, roles, invoke, scopeFunction } = await loadFixture( From 41881ea024f4b9505174c7267d556d61090995f4 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Mon, 30 Oct 2023 11:59:30 +0100 Subject: [PATCH 30/43] Use latest zodiac --- packages/evm/contracts/PermissionChecker.sol | 2 +- packages/evm/package.json | 2 +- packages/evm/yarn.lock | 22 ++++++-------------- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/packages/evm/contracts/PermissionChecker.sol b/packages/evm/contracts/PermissionChecker.sol index e540f6101..e0c349731 100644 --- a/packages/evm/contracts/PermissionChecker.sol +++ b/packages/evm/contracts/PermissionChecker.sol @@ -32,7 +32,7 @@ abstract contract PermissionChecker is Core, Periphery { } Role storage role = roles[roleKey]; - if (!role.members[msg.sender]) { + if (!role.members[sentOrSignedBy()]) { revert NoMembership(); } diff --git a/packages/evm/package.json b/packages/evm/package.json index 759ba8723..f6d8d61ab 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -50,7 +50,7 @@ "dependencies": { "@gnosis.pm/mock-contract": "^4.0.0", "@gnosis.pm/safe-contracts": "1.3.0", - "@gnosis.pm/zodiac": "3.2.0", + "@gnosis.pm/zodiac": "3.4.0", "@openzeppelin/contracts-upgradeable": "^5.0.0", "@openzeppelin/contracts": "^5.0.0", "argv": "0.0.3", diff --git a/packages/evm/yarn.lock b/packages/evm/yarn.lock index f58a8adf8..c2d3c79ec 100644 --- a/packages/evm/yarn.lock +++ b/packages/evm/yarn.lock @@ -453,15 +453,15 @@ resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-contracts/-/safe-contracts-1.3.0.tgz#316741a7690d8751a1f701538cfc9ec80866eedc" integrity sha512-1p+1HwGvxGUVzVkFjNzglwHrLNA67U/axP0Ct85FzzH8yhGJb4t9jDjPYocVMzLorDoWAfKicGy1akPY9jXRVw== -"@gnosis.pm/zodiac@3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@gnosis.pm/zodiac/-/zodiac-3.2.0.tgz#4cc59023332076ede901cb39563a09b8c5625568" - integrity sha512-eMkaezpwzNMhxr4sXR4fFjgUKtF7K6QxUM3j66pe4tsmdQ1gCqO1MERpGo8z1ggwEga3MwKGMuWvjkfaXJh3vQ== +"@gnosis.pm/zodiac@3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@gnosis.pm/zodiac/-/zodiac-3.4.0.tgz#64e0dcd6b9298fcdae2e501000820b4430daeeab" + integrity sha512-jiJXNn1EFO9CQ5P275eB7liSgivwyvO3f8nBbdpwFAMx4SlwRjzeGgxgR7S6ah4F0pHrWy6aFvjtWvH6JIW2xw== dependencies: "@gnosis.pm/mock-contract" "^4.0.0" "@gnosis.pm/safe-contracts" "1.3.0" - "@openzeppelin/contracts" "^4.8.1" - "@openzeppelin/contracts-upgradeable" "^4.8.1" + "@openzeppelin/contracts" "^5.0.0" + "@openzeppelin/contracts-upgradeable" "^5.0.0" ethers "^5.7.1" "@humanwhocodes/config-array@^0.11.8": @@ -804,21 +804,11 @@ table "^6.8.0" undici "^5.14.0" -"@openzeppelin/contracts-upgradeable@^4.8.1": - version "4.9.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-4.9.3.tgz#ff17a80fb945f5102571f8efecb5ce5915cc4811" - integrity sha512-jjaHAVRMrE4UuZNfDwjlLGDxTHWIOwTJS2ldnc278a0gevfXfPr8hxKEVBGFBE96kl2G3VHDZhUimw/+G3TG2A== - "@openzeppelin/contracts-upgradeable@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts-upgradeable/-/contracts-upgradeable-5.0.0.tgz#859c00c55f04b6dda85b3c88bce507d65019888f" integrity sha512-D54RHzkOKHQ8xUssPgQe2d/U92mwaiBDY7qCCVGq6VqwQjsT3KekEQ3bonev+BLP30oZ0R1U6YC8/oLpizgC5Q== -"@openzeppelin/contracts@^4.8.1": - version "4.9.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.9.3.tgz#00d7a8cf35a475b160b3f0293a6403c511099364" - integrity sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg== - "@openzeppelin/contracts@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-5.0.0.tgz#ee0e4b4564f101a5c4ee398cd4d73c0bd92b289c" From 6c0fa1c1219cb42269ad598dddae6b61bced322b Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Mon, 30 Oct 2023 12:00:04 +0100 Subject: [PATCH 31/43] Don't rely on zodiac tooling function anymore --- packages/evm/test/utils.ts | 42 +++++++++++++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 3 deletions(-) diff --git a/packages/evm/test/utils.ts b/packages/evm/test/utils.ts index 85529e414..8c51d9559 100644 --- a/packages/evm/test/utils.ts +++ b/packages/evm/test/utils.ts @@ -1,9 +1,13 @@ import assert from "assert"; -import { BigNumberish } from "ethers"; -import { BytesLike, solidityPack } from "ethers/lib/utils"; +import { BigNumberish, Signer } from "ethers"; +import { + BytesLike, + getAddress, + parseEther, + solidityPack, +} from "ethers/lib/utils"; import { HardhatRuntimeEnvironment } from "hardhat/types"; -import { getSingletonFactory } from "@gnosis.pm/zodiac/dist/src/factory/singletonFactory"; import { ConditionFlatStruct } from "../typechain-types/contracts/Integrity"; export const logGas = async ( @@ -238,3 +242,35 @@ export function toConditionsFlat(root: ConditionStruct): ConditionFlatStruct[] { return result; } + +async function getSingletonFactory(signer: Signer) { + const factoryAddress = getAddress( + "0xce0042b868300000d44a59004da54a005ffdcf9f" + ); + const deployerAddress = getAddress( + "0xBb6e024b9cFFACB947A71991E386681B1Cd1477D" + ); + + const provider = signer.provider; + assert(provider); + + // check if singleton factory is deployed. + if ((await provider.getCode(factoryAddress)) === "0x") { + // fund the singleton factory deployer account + await signer.sendTransaction({ + to: deployerAddress, + value: parseEther("0.0247"), + }); + + // deploy the singleton factory + await ( + await provider.sendTransaction( + "0xf9016c8085174876e8008303c4d88080b90154608060405234801561001057600080fd5b50610134806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80634af63f0214602d575b600080fd5b60cf60048036036040811015604157600080fd5b810190602081018135640100000000811115605b57600080fd5b820183602082011115606c57600080fd5b80359060200191846001830284011164010000000083111715608d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925060eb915050565b604080516001600160a01b039092168252519081900360200190f35b6000818351602085016000f5939250505056fea26469706673582212206b44f8a82cb6b156bfcc3dc6aadd6df4eefd204bc928a4397fd15dacf6d5320564736f6c634300060200331b83247000822470" + ) + )?.wait(); + + if ((await provider.getCode(factoryAddress)) == "0x") { + throw Error("Singleton factory could not be deployed to correct address"); + } + } +} From f55d00de507428cd3841975e7d85310c900c7b09 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Mon, 30 Oct 2023 17:36:49 +0100 Subject: [PATCH 32/43] Saving bytecode by moving moduleOnly access modifier into authorize function --- packages/evm/contracts/AllowanceTracker.sol | 4 ++-- packages/evm/contracts/PermissionChecker.sol | 2 +- packages/evm/contracts/Roles.sol | 13 ++++--------- packages/evm/contracts/WriteOnce.sol | 20 ++++++++------------ 4 files changed, 15 insertions(+), 24 deletions(-) diff --git a/packages/evm/contracts/AllowanceTracker.sol b/packages/evm/contracts/AllowanceTracker.sol index 86a257f97..6e1b10c17 100644 --- a/packages/evm/contracts/AllowanceTracker.sol +++ b/packages/evm/contracts/AllowanceTracker.sol @@ -28,8 +28,8 @@ abstract contract AllowanceTracker is Core { return (allowance.balance, allowance.timestamp); } - uint64 elapsedIntervals = (blockTimestamp - - allowance.timestamp) / allowance.period; + uint64 elapsedIntervals = (blockTimestamp - allowance.timestamp) / + allowance.period; if (allowance.balance < allowance.maxRefill) { balance = allowance.balance + allowance.refill * elapsedIntervals; diff --git a/packages/evm/contracts/PermissionChecker.sol b/packages/evm/contracts/PermissionChecker.sol index e0c349731..79474a59f 100644 --- a/packages/evm/contracts/PermissionChecker.sol +++ b/packages/evm/contracts/PermissionChecker.sol @@ -24,7 +24,7 @@ abstract contract PermissionChecker is Core, Periphery { uint256 value, bytes calldata data, Enum.Operation operation - ) internal view returns (Consumption[] memory) { + ) internal moduleOnly returns (Consumption[] memory) { // We never authorize the zero role, as it could clash with the // unassigned default role if (roleKey == 0) { diff --git a/packages/evm/contracts/Roles.sol b/packages/evm/contracts/Roles.sol index 492141eba..8d826b025 100644 --- a/packages/evm/contracts/Roles.sol +++ b/packages/evm/contracts/Roles.sol @@ -105,7 +105,7 @@ contract Roles is uint256 value, bytes calldata data, Enum.Operation operation - ) public override moduleOnly returns (bool success) { + ) public override returns (bool success) { Consumption[] memory consumptions = _authorize( defaultRoles[msg.sender], to, @@ -129,12 +129,7 @@ contract Roles is uint256 value, bytes calldata data, Enum.Operation operation - ) - public - override - moduleOnly - returns (bool success, bytes memory returnData) - { + ) public override returns (bool success, bytes memory returnData) { Consumption[] memory consumptions = _authorize( defaultRoles[msg.sender], to, @@ -162,7 +157,7 @@ contract Roles is Enum.Operation operation, bytes32 roleKey, bool shouldRevert - ) public moduleOnly returns (bool success) { + ) public returns (bool success) { Consumption[] memory consumptions = _authorize( roleKey, to, @@ -193,7 +188,7 @@ contract Roles is Enum.Operation operation, bytes32 roleKey, bool shouldRevert - ) public moduleOnly returns (bool success, bytes memory returnData) { + ) public returns (bool success, bytes memory returnData) { Consumption[] memory consumptions = _authorize( roleKey, to, diff --git a/packages/evm/contracts/WriteOnce.sol b/packages/evm/contracts/WriteOnce.sol index b078237a7..b60144d63 100644 --- a/packages/evm/contracts/WriteOnce.sol +++ b/packages/evm/contracts/WriteOnce.sol @@ -23,26 +23,22 @@ library WriteOnce { */ function store(bytes memory data) internal returns (address pointer) { bytes memory creationBytecode = creationBytecodeFor(data); - address calculatedAddress = addressFor(creationBytecode); + pointer = addressFor(creationBytecode); uint256 size; assembly { - size := extcodesize(calculatedAddress) + size := extcodesize(pointer) } - address actualAddress; if (size == 0) { - actualAddress = ISingletonFactory(SINGLETON_FACTORY).deploy( - creationBytecode, - SALT + assert( + pointer == + ISingletonFactory(SINGLETON_FACTORY).deploy( + creationBytecode, + SALT + ) ); - } else { - actualAddress = calculatedAddress; } - - assert(calculatedAddress == actualAddress); - - pointer = calculatedAddress; } /** From 6e8500eb4704a48179121e2caa1a397b18ec1bd8 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Mon, 30 Oct 2023 18:19:09 +0100 Subject: [PATCH 33/43] Test file rename --- .../evm/test/operators/28WithinAllowance.spec.ts | 14 +++++++------- .../test/operators/29EtherWithinAllowance.spec.ts | 6 +++--- .../test/operators/30CallWithinAllowance.spec.ts | 6 +++--- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/evm/test/operators/28WithinAllowance.spec.ts b/packages/evm/test/operators/28WithinAllowance.spec.ts index 24143e360..023b91be1 100644 --- a/packages/evm/test/operators/28WithinAllowance.spec.ts +++ b/packages/evm/test/operators/28WithinAllowance.spec.ts @@ -14,13 +14,13 @@ describe("Operator - WithinAllowance", async () => { allowanceKey: string, { balance, - maxBalance, + maxRefill, refill, period, timestamp, }: { balance: BigNumberish; - maxBalance?: BigNumberish; + maxRefill?: BigNumberish; refill: BigNumberish; period: BigNumberish; timestamp: BigNumberish; @@ -29,7 +29,7 @@ describe("Operator - WithinAllowance", async () => { return roles.setAllowance( allowanceKey, balance, - maxBalance || 0, + maxRefill || 0, refill, period, timestamp @@ -194,7 +194,7 @@ describe("Operator - WithinAllowance", async () => { .to.be.revertedWithCustomError(roles, `ConditionViolation`) .withArgs(PermissionCheckerStatus.AllowanceExceeded, allowanceKey); }); - it("passes a check with balance from refill and bellow maxBalance", async () => { + it("passes a check with balance from refill and bellow maxRefill", async () => { const { owner, roles, scopeFunction, invoke } = await loadFixture( setupOneParamStatic ); @@ -221,7 +221,7 @@ describe("Operator - WithinAllowance", async () => { const timestamp = await time.latest(); await setAllowance(await roles.connect(owner), allowanceKey, { balance: 0, - maxBalance: 1000, + maxRefill: 1000, period: interval, refill: 9999999, timestamp: timestamp - interval * 10, @@ -233,7 +233,7 @@ describe("Operator - WithinAllowance", async () => { await expect(invoke(1000)).to.not.be.reverted; }); - it("fails a check with balance from refill but capped by maxBalance", async () => { + it("fails a check with balance from refill but capped by maxRefill", async () => { const { owner, roles, scopeFunction, invoke } = await loadFixture( setupOneParamStatic ); @@ -258,7 +258,7 @@ describe("Operator - WithinAllowance", async () => { const timestamp = await time.latest(); await setAllowance(await roles.connect(owner), allowanceKey, { balance: 0, - maxBalance: 9000, + maxRefill: 9000, period: 1000, refill: 10000, timestamp: timestamp - 5000, diff --git a/packages/evm/test/operators/29EtherWithinAllowance.spec.ts b/packages/evm/test/operators/29EtherWithinAllowance.spec.ts index 012d874d4..78e0e95d1 100644 --- a/packages/evm/test/operators/29EtherWithinAllowance.spec.ts +++ b/packages/evm/test/operators/29EtherWithinAllowance.spec.ts @@ -42,21 +42,21 @@ describe("Operator - EtherWithinAllowance", async () => { async function setAllowance({ key, balance, - maxBalance, + maxRefill, refill, period, timestamp, }: { key: string; balance: BigNumberish; - maxBalance?: BigNumberish; + maxRefill?: BigNumberish; refill: BigNumberish; period: BigNumberish; timestamp: BigNumberish; }) { await roles .connect(owner) - .setAllowance(key, balance, maxBalance || 0, refill, period, timestamp); + .setAllowance(key, balance, maxRefill || 0, refill, period, timestamp); } await roles.connect(owner).assignRoles(invoker.address, [ROLE_KEY], [true]); diff --git a/packages/evm/test/operators/30CallWithinAllowance.spec.ts b/packages/evm/test/operators/30CallWithinAllowance.spec.ts index bd5c2d6b7..43e041ef6 100644 --- a/packages/evm/test/operators/30CallWithinAllowance.spec.ts +++ b/packages/evm/test/operators/30CallWithinAllowance.spec.ts @@ -38,21 +38,21 @@ describe("Operator - CallWithinAllowance", async () => { async function setAllowance({ key, balance, - maxBalance, + maxRefill, refill, period, timestamp, }: { key: string; balance: BigNumberish; - maxBalance?: BigNumberish; + maxRefill?: BigNumberish; refill: BigNumberish; period: BigNumberish; timestamp: BigNumberish; }) { await roles .connect(owner) - .setAllowance(key, balance, maxBalance || 0, refill, period, timestamp); + .setAllowance(key, balance, maxRefill || 0, refill, period, timestamp); } await roles.connect(owner).assignRoles(invoker.address, [ROLE_KEY], [true]); From 4d851d2a8425ee29a6f35b2561d775b52d7523ce Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Wed, 1 Nov 2023 00:13:36 +0100 Subject: [PATCH 34/43] Bump zodiac version --- packages/evm/contracts/Periphery.sol | 2 +- packages/evm/contracts/PermissionChecker.sol | 2 +- packages/evm/package.json | 2 +- packages/evm/yarn.lock | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/evm/contracts/Periphery.sol b/packages/evm/contracts/Periphery.sol index 3d9a5b4d2..8da85f0aa 100644 --- a/packages/evm/contracts/Periphery.sol +++ b/packages/evm/contracts/Periphery.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity >=0.8.17 <0.9.0; -import "@gnosis.pm/zodiac/contracts/core/Modifier.sol"; +import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "./adapters/Types.sol"; /** diff --git a/packages/evm/contracts/PermissionChecker.sol b/packages/evm/contracts/PermissionChecker.sol index 79474a59f..79ec616f8 100644 --- a/packages/evm/contracts/PermissionChecker.sol +++ b/packages/evm/contracts/PermissionChecker.sol @@ -32,7 +32,7 @@ abstract contract PermissionChecker is Core, Periphery { } Role storage role = roles[roleKey]; - if (!role.members[sentOrSignedBy()]) { + if (!role.members[sentOrSignedByModule()]) { revert NoMembership(); } diff --git a/packages/evm/package.json b/packages/evm/package.json index f6d8d61ab..e61eed051 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -50,7 +50,7 @@ "dependencies": { "@gnosis.pm/mock-contract": "^4.0.0", "@gnosis.pm/safe-contracts": "1.3.0", - "@gnosis.pm/zodiac": "3.4.0", + "@gnosis.pm/zodiac": "3.4.1", "@openzeppelin/contracts-upgradeable": "^5.0.0", "@openzeppelin/contracts": "^5.0.0", "argv": "0.0.3", diff --git a/packages/evm/yarn.lock b/packages/evm/yarn.lock index c2d3c79ec..bc757da9f 100644 --- a/packages/evm/yarn.lock +++ b/packages/evm/yarn.lock @@ -453,10 +453,10 @@ resolved "https://registry.yarnpkg.com/@gnosis.pm/safe-contracts/-/safe-contracts-1.3.0.tgz#316741a7690d8751a1f701538cfc9ec80866eedc" integrity sha512-1p+1HwGvxGUVzVkFjNzglwHrLNA67U/axP0Ct85FzzH8yhGJb4t9jDjPYocVMzLorDoWAfKicGy1akPY9jXRVw== -"@gnosis.pm/zodiac@3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@gnosis.pm/zodiac/-/zodiac-3.4.0.tgz#64e0dcd6b9298fcdae2e501000820b4430daeeab" - integrity sha512-jiJXNn1EFO9CQ5P275eB7liSgivwyvO3f8nBbdpwFAMx4SlwRjzeGgxgR7S6ah4F0pHrWy6aFvjtWvH6JIW2xw== +"@gnosis.pm/zodiac@3.4.1": + version "3.4.1" + resolved "https://registry.yarnpkg.com/@gnosis.pm/zodiac/-/zodiac-3.4.1.tgz#9bf090f93d2eae69b11c0587aee4114064d18f28" + integrity sha512-Cr89b+Mxu3JETJSmQyzgknJrxyIxd0rZvuJKiIxv87TNJBqnsoiJ88esV+6ap3YN6ttAOAVjaGv4Qm0gKdRgQQ== dependencies: "@gnosis.pm/mock-contract" "^4.0.0" "@gnosis.pm/safe-contracts" "1.3.0" From b7be7e3e42325336a84b4c21e08a73514fb104af Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Thu, 2 Nov 2023 22:50:17 +0100 Subject: [PATCH 35/43] Update deploy and verify tooling --- packages/evm/hardhat.config.ts | 55 +- packages/evm/package.json | 9 +- packages/evm/src/deploy-mastercopy.ts | 46 -- packages/evm/tasks/EIP2470.ts | 92 +++ packages/evm/tasks/deploy-mastercopy.ts | 63 ++ packages/evm/{src => tasks}/deploy.ts | 60 +- packages/evm/tsconfig.json | 2 +- packages/evm/yarn.lock | 909 ++++++++---------------- 8 files changed, 517 insertions(+), 719 deletions(-) delete mode 100644 packages/evm/src/deploy-mastercopy.ts create mode 100644 packages/evm/tasks/EIP2470.ts create mode 100644 packages/evm/tasks/deploy-mastercopy.ts rename packages/evm/{src => tasks}/deploy.ts (51%) diff --git a/packages/evm/hardhat.config.ts b/packages/evm/hardhat.config.ts index ce5d4a372..6496f6374 100644 --- a/packages/evm/hardhat.config.ts +++ b/packages/evm/hardhat.config.ts @@ -6,39 +6,21 @@ import "hardhat-gas-reporter"; import dotenv from "dotenv"; import { HardhatUserConfig } from "hardhat/config"; import type { HttpNetworkUserConfig } from "hardhat/types"; -import yargs from "yargs"; -import "./src/deploy"; - -const argv = yargs - .option("network", { - type: "string", - default: "hardhat", - }) - .help(false) - .version(false).argv; +import "./tasks/deploy-mastercopy"; +import "./tasks/deploy"; // Load environment variables. dotenv.config(); -const { INFURA_KEY, MNEMONIC, ETHERSCAN_API_KEY, PK } = process.env; - -const DEFAULT_MNEMONIC = - "candy maple cake sugar pudding cream honey rich smooth crumble sweet treat"; +const { INFURA_KEY, MNEMONIC, ETHERSCAN_API_KEY } = process.env; -const sharedNetworkConfig: HttpNetworkUserConfig = {}; -if (PK) { - sharedNetworkConfig.accounts = [PK]; -} else { - sharedNetworkConfig.accounts = { - mnemonic: MNEMONIC || DEFAULT_MNEMONIC, - }; -} - -if (["goerli", "mainnet"].includes(argv.network) && INFURA_KEY === undefined) { - throw new Error( - `Could not find Infura key in env, unable to connect to network ${argv.network}` - ); -} +const sharedNetworkConfig: HttpNetworkUserConfig = { + accounts: { + mnemonic: + MNEMONIC || + "candy maple cake sugar pudding cream honey rich smooth crumble sweet treat", + }, +}; const config: HardhatUserConfig = { paths: { @@ -67,28 +49,25 @@ const config: HardhatUserConfig = { ...sharedNetworkConfig, url: `https://mainnet.infura.io/v3/${INFURA_KEY}`, }, - goerli: { + gnosis: { ...sharedNetworkConfig, - url: `https://goerli.infura.io/v3/${INFURA_KEY}`, + url: "https://rpc.gnosischain.com", }, - xdai: { + goerli: { ...sharedNetworkConfig, - url: "https://rpc.gnosischain.com/", + url: `https://goerli.infura.io/v3/${INFURA_KEY}`, }, matic: { ...sharedNetworkConfig, url: "https://rpc-mainnet.maticvigil.com", }, }, - gasReporter: { - enabled: true, - }, - mocha: { - timeout: 2000000, - }, etherscan: { apiKey: ETHERSCAN_API_KEY, }, + gasReporter: { + enabled: true, + }, }; export default config; diff --git a/packages/evm/package.json b/packages/evm/package.json index e61eed051..a95398779 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -8,8 +8,8 @@ "scripts": { "build": "hardhat compile", "test": "hardhat test", - "deploy": "hardhat run deploy --network", - "deploy:mastercopy": "hardhat run src/deploy-mastercopy.ts --network", + "deploy": "yarn hardhat deploy", + "deploy:mastercopy": "yarn hardhat deploy:mastercopy --network", "coverage": "hardhat coverage", "fmt": "yarn fmt:sol && yarn fmt:ts", "fmt:sol": "prettier 'contracts/**/*.sol' -w", @@ -48,15 +48,12 @@ "typescript": "5.0.2" }, "dependencies": { - "@gnosis.pm/mock-contract": "^4.0.0", "@gnosis.pm/safe-contracts": "1.3.0", "@gnosis.pm/zodiac": "3.4.1", "@openzeppelin/contracts-upgradeable": "^5.0.0", "@openzeppelin/contracts": "^5.0.0", - "argv": "0.0.3", "dotenv": "16.0.3", - "ethers": "5.7.2", - "yargs": "16.1.1" + "ethers": "5.7.2" }, "installConfig": { "hoistingLimits": "workspaces" diff --git a/packages/evm/src/deploy-mastercopy.ts b/packages/evm/src/deploy-mastercopy.ts deleted file mode 100644 index 1a9a1c121..000000000 --- a/packages/evm/src/deploy-mastercopy.ts +++ /dev/null @@ -1,46 +0,0 @@ -import hre from "hardhat"; -import { deployMastercopyWithInitData } from "@gnosis.pm/zodiac"; -import { defaultAbiCoder } from "ethers/lib/utils"; - -const SaltZero = - "0x0000000000000000000000000000000000000000000000000000000000000000"; -const AddressZero = "0x0000000000000000000000000000000000000001"; - -async function run() { - const [signer] = await hre.ethers.getSigners(); - const deployer = hre.ethers.provider.getSigner(signer.address); - - const Packer = await hre.ethers.getContractFactory("Packer"); - const packerLibraryAddress = await deployMastercopyWithInitData( - deployer, - Packer.bytecode, - SaltZero - ); - - const Integrity = await hre.ethers.getContractFactory("Integrity"); - const integrityLibraryAddress = await deployMastercopyWithInitData( - deployer, - Integrity.bytecode, - SaltZero - ); - - const Roles = await hre.ethers.getContractFactory("Roles", { - libraries: { - Integrity: integrityLibraryAddress, - Packer: packerLibraryAddress, - }, - }); - - const args = defaultAbiCoder.encode( - ["address", "address", "address"], - [AddressZero, AddressZero, AddressZero] - ); - - await deployMastercopyWithInitData( - deployer, - `${Roles.bytecode}${args.substring(2)}`, - SaltZero - ); -} - -run(); diff --git a/packages/evm/tasks/EIP2470.ts b/packages/evm/tasks/EIP2470.ts new file mode 100644 index 000000000..139c39d56 --- /dev/null +++ b/packages/evm/tasks/EIP2470.ts @@ -0,0 +1,92 @@ +import assert from "assert"; + +import { Contract, Signer } from "ethers"; +import { getCreate2Address, keccak256, parseEther } from "ethers/lib/utils"; + +export async function deployViaFactory( + creationBytecode: string, + salt: string, + deployer: Signer, + displayName?: string +): Promise { + await maybeDeployFactory(deployer); + + const provider = deployer.provider; + assert(provider); + + const factory = new Contract( + factoryInfo.address, + [ + "function deploy(bytes memory _initCode, bytes32 _salt) public returns (address payable createdContract)", + ], + deployer + ); + + const computedAddress = getCreate2Address( + factoryInfo.address, + salt, + keccak256(creationBytecode) + ); + + if ((await provider.getCode(computedAddress)) != "0x") { + console.log( + `✔ ${displayName || "Singleton"} already deployed to: ${computedAddress}` + ); + return computedAddress; + } + + const receipt = await ( + await factory.deploy(creationBytecode, salt, { gasLimit: 10000000 }) + ).wait(); + + if (receipt?.status == 1) { + console.log( + `\x1B[32m✔ ${ + displayName || "Singleton" + } deployed to: ${computedAddress} 🎉\x1B[0m ` + ); + } else { + console.log( + `\x1B[31m✘ ${displayName || "Singleton"} deployment failed.\x1B[0m` + ); + } + + return computedAddress; +} + +const factoryInfo = { + address: "0xce0042b868300000d44a59004da54a005ffdcf9f", + deployer: "0xBb6e024b9cFFACB947A71991E386681B1Cd1477D", + transaction: + "0xf9016c8085174876e8008303c4d88080b90154608060405234801561001057600080fd5b50610134806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80634af63f0214602d575b600080fd5b60cf60048036036040811015604157600080fd5b810190602081018135640100000000811115605b57600080fd5b820183602082011115606c57600080fd5b80359060200191846001830284011164010000000083111715608d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925060eb915050565b604080516001600160a01b039092168252519081900360200190f35b6000818351602085016000f5939250505056fea26469706673582212206b44f8a82cb6b156bfcc3dc6aadd6df4eefd204bc928a4397fd15dacf6d5320564736f6c634300060200331b83247000822470", +}; + +/** + * If it is not deployed on the network, deploys the singleton factory contract + * + * https://eips.ethereum.org/EIPS/eip-2470 + */ +async function maybeDeployFactory(signer: Signer) { + const { provider } = signer; + assert(provider); + + // check if singleton factory is deployed. + if ((await provider.getCode(factoryInfo.address)) === "0x") { + // fund the singleton factory deployer account + await signer.sendTransaction({ + to: factoryInfo.deployer, + value: parseEther("0.0247"), + }); + + // deploy the singleton factory + const receipt = await ( + await provider.sendTransaction(factoryInfo.transaction) + ).wait(); + + if (receipt?.status != 1) { + throw Error( + "EIP2470 SingletonFactory could not be deployed to correct address, deployment haulted." + ); + } + } +} diff --git a/packages/evm/tasks/deploy-mastercopy.ts b/packages/evm/tasks/deploy-mastercopy.ts new file mode 100644 index 000000000..7ffc3ea95 --- /dev/null +++ b/packages/evm/tasks/deploy-mastercopy.ts @@ -0,0 +1,63 @@ +import { defaultAbiCoder } from "ethers/lib/utils"; +import { task } from "hardhat/config"; +import { deployViaFactory } from "./EIP2470"; + +const ZeroHash = + "0x0000000000000000000000000000000000000000000000000000000000000000"; +const AddressZero = "0x0000000000000000000000000000000000000001"; + +task("deploy:mastercopy", "Deploys and verifies Delay mastercopy").setAction( + async (_, hre) => { + const [deployer] = await hre.ethers.getSigners(); + + const salt = ZeroHash; + + const Packer = await hre.ethers.getContractFactory("Packer"); + const packerLibraryAddress = await deployViaFactory( + Packer.bytecode, + salt, + deployer, + "Packer " + ); + + const Integrity = await hre.ethers.getContractFactory("Integrity"); + const integrityLibraryAddress = await deployViaFactory( + Integrity.bytecode, + salt, + deployer, + "Integrity " + ); + + const Roles = await hre.ethers.getContractFactory("Roles", { + libraries: { + Integrity: integrityLibraryAddress, + Packer: packerLibraryAddress, + }, + }); + + const args = defaultAbiCoder.encode( + ["address", "address", "address"], + [AddressZero, AddressZero, AddressZero] + ); + + const rolesAddress = await deployViaFactory( + `${Roles.bytecode}${args.substring(2)}`, + salt, + deployer, + "Roles Mastercopy" + ); + + if (hre.network.name == "hardhat") { + return; + } + + console.log("Waiting 1 minute before etherscan verification start..."); + // Etherscan needs some time to process before trying to verify. + await new Promise((resolve) => setTimeout(resolve, 60000)); + + await hre.run("verify:verify", { + address: rolesAddress, + constructorArguments: [AddressZero, AddressZero, AddressZero], + }); + } +); diff --git a/packages/evm/src/deploy.ts b/packages/evm/tasks/deploy.ts similarity index 51% rename from packages/evm/src/deploy.ts rename to packages/evm/tasks/deploy.ts index 5872c4d13..72c8833e9 100644 --- a/packages/evm/src/deploy.ts +++ b/packages/evm/tasks/deploy.ts @@ -1,5 +1,6 @@ import { task, types } from "hardhat/config"; import { HardhatRuntimeEnvironment } from "hardhat/types"; +import { deployViaFactory } from "./EIP2470"; interface RolesTaskArgs { owner: string; @@ -7,6 +8,9 @@ interface RolesTaskArgs { target: string; } +const ZeroHash = + "0x0000000000000000000000000000000000000000000000000000000000000000"; + task("deploy", "Deploys a Roles modifier") .addParam("owner", "Address of the owner", undefined, types.string) .addParam( @@ -21,20 +25,28 @@ task("deploy", "Deploys a Roles modifier") const [signer] = await hre.ethers.getSigners(); const deployer = hre.ethers.provider.getSigner(signer.address); + const salt = ZeroHash; + const Packer = await hre.ethers.getContractFactory("Packer"); - const packer = await Packer.connect(deployer).deploy(); - await packer.deployed(); - console.log("Library Packer:", packer.address); + const packerLibraryAddress = await deployViaFactory( + Packer.bytecode, + salt, + deployer, + "Packer " + ); const Integrity = await hre.ethers.getContractFactory("Integrity"); - const integrity = await Integrity.connect(deployer).deploy(); - await integrity.deployed(); - console.log("Library Integrity:", integrity.address); + const integrityLibraryAddress = await deployViaFactory( + Integrity.bytecode, + salt, + deployer, + "Integrity " + ); const Roles = await hre.ethers.getContractFactory("Roles", { libraries: { - Integrity: integrity.address, - Packer: packer.address, + Integrity: integrityLibraryAddress, + Packer: packerLibraryAddress, }, }); @@ -44,25 +56,21 @@ task("deploy", "Deploys a Roles modifier") taskArgs.target ); await roles.connect(deployer).deployed(); - console.log("Roles:", roles.address); + console.log(`\x1B[32m✔ Roles deployed to: ${roles.address} 🎉\x1B[0m `); + + console.log("Waiting 1 minute before etherscan verification start..."); + // Etherscan needs some time to process before trying to verify. + await new Promise((resolve) => setTimeout(resolve, 60000)); + + await hre.run("verify", { + address: roles.address, + constructorArguments: [ + taskArgs.owner, + taskArgs.avatar, + taskArgs.target, + ], + }); } ); -task("verifyEtherscan", "Verifies the contract on etherscan") - .addParam("roles", "Address of the Roles mod", undefined, types.string) - .addParam("owner", "Address of the owner", undefined, types.string) - .addParam( - "avatar", - "Address of the avatar (e.g. Safe)", - undefined, - types.string - ) - .addParam("target", "Address of the target", undefined, types.string) - .setAction(async (taskArgs, hardhatRuntime) => { - await hardhatRuntime.run("verify", { - address: taskArgs.roles, - constructorArgsParams: [taskArgs.owner, taskArgs.avatar, taskArgs.target], - }); - }); - export {}; diff --git a/packages/evm/tsconfig.json b/packages/evm/tsconfig.json index 41862d455..40a5a88d9 100644 --- a/packages/evm/tsconfig.json +++ b/packages/evm/tsconfig.json @@ -15,6 +15,6 @@ "typechain-types/hardhat.d.ts" ] }, - "include": ["./src", "./test", "./typechain-types"], + "include": ["tasks", "./test", "./typechain-types"], "files": ["./hardhat.config.ts"] } diff --git a/packages/evm/yarn.lock b/packages/evm/yarn.lock index bc757da9f..f791c506a 100644 --- a/packages/evm/yarn.lock +++ b/packages/evm/yarn.lock @@ -63,9 +63,9 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0": - version "4.8.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.8.0.tgz#11195513186f68d42fbf449f9a7136b2c0c92005" - integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== "@eslint/eslintrc@^2.0.1": version "2.1.2" @@ -101,7 +101,7 @@ ethereum-cryptography "^2.0.0" micro-ftch "^0.3.1" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0": +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -443,6 +443,11 @@ "@ethersproject/properties" "^5.7.0" "@ethersproject/strings" "^5.7.0" +"@fastify/busboy@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.0.0.tgz#f22824caff3ae506b18207bad4126dbc6ccdb6b8" + integrity sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ== + "@gnosis.pm/mock-contract@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@gnosis.pm/mock-contract/-/mock-contract-4.0.0.tgz#eaf500fddcab81b5f6c22280a7b22ff891dd6f87" @@ -465,11 +470,11 @@ ethers "^5.7.1" "@humanwhocodes/config-array@^0.11.8": - version "0.11.11" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.11.tgz#88a04c570dbbc7dd943e4712429c3df09bc32844" - integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== + version "0.11.13" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" + integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" + "@humanwhocodes/object-schema" "^2.0.1" debug "^4.1.1" minimatch "^3.0.5" @@ -478,10 +483,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" + integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== "@jridgewell/resolve-uri@^3.0.3": version "3.1.1" @@ -815,9 +820,9 @@ integrity sha512-bv2sdS6LKqVVMLI5+zqnNrNU/CA+6z6CmwFXm/MzmOPBRSO5reEJN7z0Gbzvs0/bv/MZZXNklubpwy3v2+azsw== "@scure/base@~1.1.0": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.2.tgz#ff0cf51874aaf176490c9cb46e4df807a2e581d2" - integrity sha512-sSCrnIdaUZQHhBxZThMuk7Wm1TWzMD3uJNdGgx3JS23xSqevu0tAOsg8k66nL3R2NwQe65AI9GgqpPOgZys/eA== + version "1.1.3" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.3.tgz#8584115565228290a6c6c4961973e0903bb3df2f" + integrity sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q== "@scure/bip32@1.1.5": version "1.1.5" @@ -978,23 +983,23 @@ "@types/node" "*" "@types/bn.js@^5.1.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" - integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== + version "5.1.4" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.4.tgz#0853d5f92dfdbc8fe1ae60700411a60845fa7d27" + integrity sha512-ZtBd9L8hVtoBpPMSWfbwjC4dhQtJdlPS+e1A0Rydb7vg7bDcUwiRklPx24sMYtXcmAMST/k0Wze7JLbNU/5SkA== dependencies: "@types/node" "*" "@types/chai-as-promised@^7.1.3": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz#6e016811f6c7a64f2eed823191c3a6955094e255" - integrity sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ== + version "7.1.7" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.7.tgz#fd16a981ba9542c83d4e1d2f40c7899aae82aa38" + integrity sha512-APucaP5rlmTRYKtRA6FE5QPP87x76ejw5t5guRJ4y5OgMnwtsvigw7HHhKZlx2MGXLeZd6R/GNZR/IqDHcbtQw== dependencies: "@types/chai" "*" "@types/chai@*": - version "4.3.5" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.5.tgz#ae69bcbb1bebb68c4ac0b11e9d8ed04526b3562b" - integrity sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng== + version "4.3.9" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.9.tgz#144d762491967db8c6dea38e03d2206c2623feec" + integrity sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg== "@types/concat-stream@^1.6.0": version "1.6.1" @@ -1019,9 +1024,9 @@ "@types/node" "*" "@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + version "7.0.14" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1" + integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw== "@types/json5@^0.0.29": version "0.0.29" @@ -1044,9 +1049,11 @@ integrity sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q== "@types/node@*": - version "20.5.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.7.tgz#4b8ecac87fbefbc92f431d09c30e176fc0a7c377" - integrity sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA== + version "20.8.10" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.10.tgz#a5448b895c753ae929c26ce85cab557c6d4a365e" + integrity sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w== + dependencies: + undici-types "~5.26.4" "@types/node@^10.0.3": version "10.17.60" @@ -1059,9 +1066,9 @@ integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== "@types/pbkdf2@^3.0.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" - integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.1.tgz#c290c1f0d3dc364af94c2c5ee92046a13b7f89fd" + integrity sha512-4HCoGwR3221nOc7G0Z/6KgTNGgaaFGkbGrtUJsB+zlKX2LBVjFHHIUkieMBgHHXgBH5Gq6dZHJKdBYdtlhBQvw== dependencies: "@types/node" "*" @@ -1071,9 +1078,9 @@ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/qs@^6.2.31": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + version "6.9.9" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.9.tgz#66f7b26288f6799d279edf13da7ccd40d2fa9197" + integrity sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg== "@types/readable-stream@^2.3.13": version "2.3.15" @@ -1084,21 +1091,21 @@ safe-buffer "~5.1.1" "@types/secp256k1@^4.0.1": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" - integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.5.tgz#14b1766b4fbc198b0af5599d9fd21c89056633ce" + integrity sha512-aIonTBMErtE3T9MxDvTZRzcrT/mCqpEZBw3CCY/i+oG9n57N/+7obBkhFgavUAIrX21bU0LHg1XRgtaLdelBhA== dependencies: "@types/node" "*" "@types/semver@^7.3.12": - version "7.5.1" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.1.tgz#0480eeb7221eb9bc398ad7432c9d7e14b1a5a367" - integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== + version "7.5.4" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.4.tgz#0a41252ad431c473158b22f9bfb9a63df7541cff" + integrity sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ== "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.2" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.2.tgz#7bd04c5da378496ef1695a1008bf8f71847a8b8b" + integrity sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw== "@types/yargs@16.0.0": version "16.0.0" @@ -1220,14 +1227,14 @@ acorn-jsx@^5.3.2: integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + version "8.3.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" + integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== acorn@^8.4.1, acorn@^8.9.0: - version "8.10.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== address@^1.0.1: version "1.2.2" @@ -1259,7 +1266,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: +ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1365,11 +1372,6 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -argv@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/argv/-/argv-0.0.3.tgz#10896017133223ef6b4f12426eafb9d227112596" - integrity sha512-T/78+mAFUtUoCCdEiXzMwumwX490tUCQwMiKrr2DVEM90uvkiQqI3izIF5GXgCDAet1NAlPsKTV63wNc4wuIag== - array-back@^3.0.1, array-back@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" @@ -1389,14 +1391,14 @@ array-buffer-byte-length@^1.0.0: is-array-buffer "^3.0.1" array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" is-string "^1.0.7" array-union@^2.1.0: @@ -1410,26 +1412,26 @@ array-uniq@1.0.3: integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.reduce@^1.0.5: +array.prototype.reduce@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz#63149931808c5fc1e1354814923d92d45f7d96d5" integrity sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg== @@ -1440,14 +1442,15 @@ array.prototype.reduce@^1.0.5: es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== dependencies: array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" define-properties "^1.2.0" + es-abstract "^1.22.1" get-intrinsic "^1.2.1" is-array-buffer "^3.0.2" is-shared-array-buffer "^1.0.2" @@ -1457,18 +1460,6 @@ asap@~2.0.6: resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -1499,15 +1490,14 @@ available-typed-arrays@^1.0.5: resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.12.0.tgz#ce1c9d143389679e253b314241ea9aa5cec980d3" - integrity sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg== +axios@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.0.tgz#f1e5292f26b2fd5c2e66876adc5b06cdbd7d2102" + integrity sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" balanced-match@^1.0.0: version "1.0.2" @@ -1526,13 +1516,6 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - bech32@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" @@ -1656,25 +1639,19 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" -busboy@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" callsites@^3.0.0: version "3.1.0" @@ -1756,9 +1733,11 @@ chalk@^4.0.0, chalk@^4.1.0: integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" chokidar@3.3.0: version "3.3.0" @@ -1885,7 +1864,7 @@ colors@1.4.0, colors@^1.1.2: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -1942,11 +1921,6 @@ cookie@^0.4.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - core-util-is@~1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" @@ -1999,13 +1973,6 @@ cross-spawn@^7.0.2: resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - death@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" @@ -2059,11 +2026,21 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -2133,14 +2110,6 @@ dotenv@16.0.3: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" @@ -2177,26 +2146,26 @@ env-paths@^2.2.0: resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -es-abstract@^1.20.4, es-abstract@^1.21.2, es-abstract@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== +es-abstract@^1.22.1: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== dependencies: array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" + arraybuffer.prototype.slice "^1.0.2" available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + call-bind "^1.0.5" es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.1" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" get-symbol-description "^1.0.0" globalthis "^1.0.3" gopd "^1.0.1" - has "^1.0.3" has-property-descriptors "^1.0.0" has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" internal-slot "^1.0.5" is-array-buffer "^3.0.2" is-callable "^1.2.7" @@ -2204,23 +2173,23 @@ es-abstract@^1.20.4, es-abstract@^1.21.2, es-abstract@^1.22.1: is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" - is-typed-array "^1.1.10" + is-typed-array "^1.1.12" is-weakref "^1.0.2" - object-inspect "^1.12.3" + object-inspect "^1.13.1" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" typed-array-buffer "^1.0.0" typed-array-byte-length "^1.0.0" typed-array-byte-offset "^1.0.0" typed-array-length "^1.0.4" unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" + which-typed-array "^1.1.13" es-array-method-boxes-properly@^1.0.0: version "1.0.0" @@ -2228,20 +2197,20 @@ es-array-method-boxes-properly@^1.0.0: integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" + get-intrinsic "^1.2.2" has-tostringtag "^1.0.0" + hasown "^2.0.0" es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: - has "^1.0.3" + hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -2457,23 +2426,21 @@ esutils@^2.0.2: integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== eth-gas-reporter@^0.2.25: - version "0.2.25" - resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz#546dfa946c1acee93cb1a94c2a1162292d6ff566" - integrity sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ== + version "0.2.27" + resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz#928de8548a674ed64c7ba0bf5795e63079150d4e" + integrity sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw== dependencies: - "@ethersproject/abi" "^5.0.0-beta.146" "@solidity-parser/parser" "^0.14.0" + axios "^1.5.1" cli-table3 "^0.5.0" colors "1.4.0" ethereum-cryptography "^1.0.3" - ethers "^4.0.40" + ethers "^5.7.2" fs-readdir-recursive "^1.1.0" lodash "^4.17.14" markdown-table "^1.1.3" - mocha "^7.1.1" + mocha "^10.2.0" req-cwd "^2.0.0" - request "^2.88.0" - request-promise-native "^1.0.5" sha1 "^1.1.1" sync-request "^6.0.0" @@ -2557,7 +2524,7 @@ ethereumjs-util@^7.1.4: ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@5.7.2, ethers@^5.7.1: +ethers@5.7.2, ethers@^5.7.1, ethers@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -2593,21 +2560,6 @@ ethers@5.7.2, ethers@^5.7.1: "@ethersproject/web" "5.7.1" "@ethersproject/wordlists" "5.7.0" -ethers@^4.0.40: - version "4.0.49" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" - integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== - dependencies: - aes-js "3.0.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.3" - js-sha3 "0.5.7" - scrypt-js "2.0.4" - setimmediate "1.0.4" - uuid "2.0.1" - xmlhttprequest "1.8.0" - ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -2632,21 +2584,6 @@ evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -2729,11 +2666,11 @@ find-up@^2.1.0: locate-path "^2.0.0" flat-cache@^3.0.4: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.0.tgz#0e54ab4a1a60fe87e2946b6b00657f1c99e1af3f" - integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== + version "3.1.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" + integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== dependencies: - flatted "^3.2.7" + flatted "^3.2.9" keyv "^4.5.3" rimraf "^3.0.2" @@ -2749,15 +2686,15 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== -follow-redirects@^1.12.1: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +follow-redirects@^1.12.1, 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== for-each@^0.3.3: version "0.3.3" @@ -2766,11 +2703,6 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - form-data@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" @@ -2780,13 +2712,13 @@ form-data@^2.2.0: combined-stream "^1.0.6" mime-types "^2.1.12" -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" + combined-stream "^1.0.8" mime-types "^2.1.12" fp-ts@1.19.3: @@ -2858,12 +2790,12 @@ fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.1, function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5: +function.prototype.name@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== @@ -2888,20 +2820,20 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== +get-func-name@^2.0.0, get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== dependencies: - function-bind "^1.1.1" - has "^1.0.3" + function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" get-port@^3.1.0: version "3.2.0" @@ -2916,13 +2848,6 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - ghost-testrpc@^0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" @@ -3021,9 +2946,9 @@ global-prefix@^3.0.0: which "^1.3.1" globals@^13.19.0: - version "13.21.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" - integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== dependencies: type-fest "^0.20.2" @@ -3099,19 +3024,6 @@ handlebars@^4.0.1: optionalDependencies: uglify-js "^3.1.4" -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - hardhat-contract-sizer@2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/hardhat-contract-sizer/-/hardhat-contract-sizer-2.10.0.tgz#72646f43bfe50e9a5702c9720c9bc3e77d93a2c9" @@ -3205,11 +3117,11 @@ has-flag@^4.0.0: integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== dependencies: - get-intrinsic "^1.1.1" + get-intrinsic "^1.2.2" has-proto@^1.0.1: version "1.0.1" @@ -3229,11 +3141,9 @@ has-tostringtag@^1.0.0: has-symbols "^1.0.2" has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" + version "1.0.4" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" + integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== hash-base@^3.0.0: version "3.1.0" @@ -3244,14 +3154,6 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -hash.js@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" - integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.0" - hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -3260,6 +3162,13 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -3307,15 +3216,6 @@ http-response-object@^3.0.1: dependencies: "@types/node" "^10.0.3" -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -3383,12 +3283,12 @@ ini@^1.3.5: integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" + get-intrinsic "^1.2.2" + hasown "^2.0.0" side-channel "^1.0.4" interpret@^1.0.0: @@ -3445,11 +3345,11 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-core-module@^2.11.0, is-core-module@^2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" - integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - has "^1.0.3" + hasown "^2.0.0" is-date-object@^1.0.1: version "1.0.5" @@ -3541,18 +3441,13 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.9: +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: version "1.1.12" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== dependencies: which-typed-array "^1.1.11" -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" @@ -3580,21 +3475,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - js-sdsl@^4.1.4: version "4.4.2" resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.2.tgz#2e3c031b1f47d3aca8b775532e3ebb0818e7f847" integrity sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w== -js-sha3@0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" - integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== - js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" @@ -3623,11 +3508,6 @@ js-yaml@4.1.0, js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - json-buffer@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" @@ -3643,21 +3523,11 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -3693,29 +3563,19 @@ jsonschema@^1.2.4: resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - keccak@^3.0.0, keccak@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.3.tgz#4bc35ad917be1ef54ff246f904c2bbbf9ac61276" - integrity sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ== + version "3.0.4" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.4.tgz#edc09b89e633c0549da444432ecf062ffadee86d" + integrity sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q== dependencies: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" readable-stream "^3.6.0" keyv@^4.5.3: - version "4.5.3" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.3.tgz#00873d2b046df737963157bd04f294ca818c9c25" - integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -3806,7 +3666,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3827,11 +3687,11 @@ log-symbols@4.1.0: is-unicode-supported "^0.1.0" loupe@^2.3.1: - version "2.3.6" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" - integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== dependencies: - get-func-name "^2.0.0" + get-func-name "^2.0.1" lru-cache@^5.1.1: version "5.1.1" @@ -3913,7 +3773,7 @@ mime-db@1.52.0: resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@~2.1.19: +mime-types@^2.1.12: version "2.1.35" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== @@ -4012,7 +3872,7 @@ mocha@7.1.2: yargs-parser "13.1.2" yargs-unparser "1.6.0" -mocha@^10.0.0: +mocha@^10.0.0, mocha@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.2.0.tgz#1fd4a7c32ba5ac372e03a17eef435bd00e5c68b8" integrity sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg== @@ -4039,36 +3899,6 @@ mocha@^10.0.0: yargs-parser "20.2.4" yargs-unparser "2.0.0" -mocha@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" - integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - module-error@^1.0.1, module-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" @@ -4164,20 +3994,15 @@ number-to-bn@1.7.0: bn.js "4.11.6" strip-hex-prefix "1.0.0" -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== +object-inspect@^1.13.1, object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-keys@^1.0.11, object-keys@^1.1.1: version "1.1.1" @@ -4205,14 +4030,14 @@ object.assign@^4.1.4: object-keys "^1.1.1" object.getownpropertydescriptors@^2.0.3: - version "2.1.6" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz#5e5c384dd209fa4efffead39e3a0512770ccc312" - integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== + version "2.1.7" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz#7a466a356cd7da4ba8b9e94ff6d35c3eeab5d56a" + integrity sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g== dependencies: - array.prototype.reduce "^1.0.5" + array.prototype.reduce "^1.0.6" call-bind "^1.0.2" define-properties "^1.2.0" - es-abstract "^1.21.2" + es-abstract "^1.22.1" safe-array-concat "^1.0.0" object.values@^1.1.6: @@ -4387,11 +4212,6 @@ pbkdf2@^3.0.17: safe-buffer "^5.0.1" sha.js "^2.4.8" -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" @@ -4450,15 +4270,15 @@ promise@^8.0.0: dependencies: asap "~2.0.6" -psl@^1.1.28: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -punycode@^2.1.0, punycode@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== qs@^6.4.0: version "6.11.2" @@ -4467,11 +4287,6 @@ qs@^6.4.0: dependencies: side-channel "^1.0.4" -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -4549,14 +4364,14 @@ reduce-flatten@^2.0.0: resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== -regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== +regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== dependencies: call-bind "^1.0.2" define-properties "^1.2.0" - functions-have-names "^1.2.3" + set-function-name "^2.0.0" req-cwd@^2.0.0: version "2.0.0" @@ -4572,48 +4387,6 @@ req-from@^2.0.0: dependencies: resolve-from "^3.0.0" -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.5: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.88.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -4652,9 +4425,9 @@ resolve@1.17.0: path-parse "^1.0.6" resolve@^1.1.6, resolve@^1.22.1, resolve@^1.22.4: - version "1.22.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.4.tgz#1dc40df46554cdaf8948a486a10f6ba1e2026c34" - integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: is-core-module "^2.13.0" path-parse "^1.0.7" @@ -4713,13 +4486,13 @@ rustbn.js@~0.2.0: resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== +safe-array-concat@^1.0.0, safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" isarray "^2.0.5" @@ -4742,7 +4515,7 @@ safe-regex-test@^1.0.0: get-intrinsic "^1.1.3" is-regex "^1.1.4" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -4767,11 +4540,6 @@ sc-istanbul@^0.4.5: which "^1.1.1" wordwrap "^1.0.0" -scrypt-js@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" - integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== - scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" @@ -4815,10 +4583,24 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -setimmediate@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" - integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +set-function-name@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" setimmediate@^1.0.5: version "1.0.5" @@ -4961,21 +4743,6 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - stacktrace-parser@^0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" @@ -4988,16 +4755,6 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - string-format@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" @@ -5029,32 +4786,32 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" string_decoder@^1.1.1: version "1.3.0" @@ -5231,14 +4988,6 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tough-cookie@^2.3.3, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - ts-command-line-args@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" @@ -5300,23 +5049,11 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - 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@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - tweetnacl@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" @@ -5446,12 +5183,17 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + undici@^5.14.0: - version "5.23.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.23.0.tgz#e7bdb0ed42cebe7b7aca87ced53e6eaafb8f8ca0" - integrity sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg== + version "5.27.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.27.0.tgz#789f2e40ce982b5507899abc2c2ddeb2712b4554" + integrity sha512-l3ydWhlhOJzMVOYkymLykcRRXqbUaQriERtR70B9LzNkZ4bX52Fc8wbTDneMiwo8T+AemZXvXaTx+9o5ROxrXg== dependencies: - busboy "^1.6.0" + "@fastify/busboy" "^2.0.0" universalify@^0.1.0: version "0.1.2" @@ -5459,9 +5201,9 @@ universalify@^0.1.0: integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== unpipe@1.0.0: version "1.0.0" @@ -5485,16 +5227,6 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -uuid@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" - integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -5505,19 +5237,10 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - web3-utils@^1.3.6: - version "1.10.2" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.2.tgz#361103d28a94d5e2a87ba15d776a62c33303eb44" - integrity sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow== + version "1.10.3" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.10.3.tgz#f1db99c82549c7d9f8348f04ffe4e0188b449714" + integrity sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ== dependencies: "@ethereumjs/util" "^8.1.0" bn.js "^5.2.1" @@ -5544,13 +5267,13 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which-typed-array@^1.1.10, which-typed-array@^1.1.11: - version "1.1.11" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.11.tgz#99d691f23c72aab6768680805a271b69761ed61a" - integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== +which-typed-array@^1.1.11, which-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== dependencies: available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + call-bind "^1.0.4" for-each "^0.3.3" gopd "^1.0.1" has-tostringtag "^1.0.0" @@ -5632,11 +5355,6 @@ ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== -xmlhttprequest@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" - integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== - y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" @@ -5710,19 +5428,6 @@ yargs@13.3.2, yargs@^13.3.0: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@16.1.1: - version "16.1.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.1.1.tgz#5a4a095bd1ca806b0a50d0c03611d38034d219a1" - integrity sha512-hAD1RcFP/wfgfxgMVswPE+z3tlPFtxG8/yWUrG2i17sTWGCGqWnxKcLTF4cUKDUK8fzokwsmO9H0TDkRbMHy8w== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - yargs@16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" From 76904e5fa009c0883899ff53847a49089a20d2e2 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Sat, 4 Nov 2023 03:10:58 +0100 Subject: [PATCH 36/43] Also verify Libraries --- packages/evm/tasks/deploy-mastercopy.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/evm/tasks/deploy-mastercopy.ts b/packages/evm/tasks/deploy-mastercopy.ts index 7ffc3ea95..7ea89dc3d 100644 --- a/packages/evm/tasks/deploy-mastercopy.ts +++ b/packages/evm/tasks/deploy-mastercopy.ts @@ -55,6 +55,16 @@ task("deploy:mastercopy", "Deploys and verifies Delay mastercopy").setAction( // Etherscan needs some time to process before trying to verify. await new Promise((resolve) => setTimeout(resolve, 60000)); + await hre.run("verify:verify", { + address: packerLibraryAddress, + constructorArguments: [], + }); + + await hre.run("verify:verify", { + address: integrityLibraryAddress, + constructorArguments: [], + }); + await hre.run("verify:verify", { address: rolesAddress, constructorArguments: [AddressZero, AddressZero, AddressZero], From d4b6539bdb742cf20d29425bbfdfd06acebda7d1 Mon Sep 17 00:00:00 2001 From: cristovaoth Date: Mon, 6 Nov 2023 17:16:25 +0100 Subject: [PATCH 37/43] Include latest audit --- .../Audit05_RolesV2_1_Nov2023_Ominiscia.pdf | Bin 0 -> 21047179 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages/evm/docs/Audit05_RolesV2_1_Nov2023_Ominiscia.pdf diff --git a/packages/evm/docs/Audit05_RolesV2_1_Nov2023_Ominiscia.pdf b/packages/evm/docs/Audit05_RolesV2_1_Nov2023_Ominiscia.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cb7d313f4e7df033e906e011e7d5f7542ec7aaf0 GIT binary patch literal 21047179 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 zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oUHKffJ5B-Ge|^1Qu?zd!Kx&ody8{1PBly&~E}C z`A48j0tv4D_VIQ;1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly 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 zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD6oSF z+-K7P&pG7KgE#H5|H{;X&))Yw_qp%=cllqttW5pg-`(f``Ku?q=%7uz{MA$b?b-Wo z+VfC8KmM?1AA0w!f7ySJ=Wb%gllOVfp?mN0zz5xz>3`m|&vW-abeF%r@BQz`r-vQ5 z-+>1|{-8bfB!h=Zrb&q{(<@bu+O1~Ja*H;4?A%GgAP1k(*cL>@<3)jeAAu> zK4;To_c(a}Lv~qN@#e)3*@c{DFLHN^!}dSmkgWV647>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> z3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36A zpnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim} z0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7j zD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUg zfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7>3Mim}0tzUgfC36Apnw7jD4>7> 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