diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4d28c35..ab13942 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,4 +28,3 @@ jobs: - run: pnpm i - run: pnpm lint:check - run: forge build - - run: forge test diff --git a/broadcast/DeployFraxswapRouterMultihop.s.sol/252/run-1715897630.json b/broadcast/DeployFraxswapRouterMultihop.s.sol/252/run-1715897630.json new file mode 100644 index 0000000..4c909d3 --- /dev/null +++ b/broadcast/DeployFraxswapRouterMultihop.s.sol/252/run-1715897630.json @@ -0,0 +1,54 @@ +{ + "transactions": [ + { + "hash": "0xf5db9329e47777d50772c642e0f24492a334e64ceb14cf50c3e6c73319388e83", + "transactionType": "CREATE", + "contractName": "FraxswapRouterMultihop", + "contractAddress": "0x46d2487cdbea04411c49e6c55ace805bfa8f5de5", + "function": null, + "arguments": [ + "0xFC00000000000000000000000000000000000006", + "0xFc00000000000000000000000000000000000001", + "true" + ], + "transaction": { + "from": "0xb0e1650a9760e0f383174af042091fc544b8356f", + "gas": "0x51882c", + "value": "0x0", + "input": "0x60e060405234801561001057600080fd5b50604051614ba0380380614ba08339818101604052810190610032919061018f565b60016000819055508273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505080151560c0811515815250505050506101e2565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100e6826100bb565b9050919050565b60006100f8826100db565b9050919050565b610108816100ed565b811461011357600080fd5b50565b600081519050610125816100ff565b92915050565b610134816100db565b811461013f57600080fd5b50565b6000815190506101518161012b565b92915050565b60008115159050919050565b61016c81610157565b811461017757600080fd5b50565b60008151905061018981610163565b92915050565b6000806000606084860312156101a8576101a76100b6565b5b60006101b686828701610116565b93505060206101c786828701610142565b92505060406101d88682870161017a565b9150509250925092565b60805160a05160c05161491f6102816000396000818161089001528181610c7b0152610df90152600081816102f70152611b500152600081816102d3015281816105930152818161063d01528181610a6f01528181610b1401528181611da401528181611dfd01528181611f2f01528181611f8601528181612016015281816120b1015281816121080152818161228201526122d9015261491f6000f3fe6080604052600436106100745760003560e01c8063b60650d71161004e578063b60650d714610113578063d2c9041114610150578063dcd6c4d514610180578063fa461e33146101ab5761007b565b80634a264940146100805780634aa4a4fc146100bd578063b0e4556f146100e85761007b565b3661007b57005b600080fd5b34801561008c57600080fd5b506100a760048036038101906100a29190612c89565b6101d4565b6040516100b49190612dcf565b60405180910390f35b3480156100c957600080fd5b506100d26102d1565b6040516100df9190612e50565b60405180910390f35b3480156100f457600080fd5b506100fd6102f5565b60405161010a9190612e7a565b60405180910390f35b34801561011f57600080fd5b5061013a600480360381019061013591906130b0565b610319565b6040516101479190612dcf565b60405180910390f35b61016a600480360381019061016591906132ef565b6103ad565b6040516101779190613347565b60405180910390f35b34801561018c57600080fd5b50610195610df7565b6040516101a29190613371565b60405180910390f35b3480156101b757600080fd5b506101d260048036038101906101cd919061341d565b610e1b565b005b60606101de612ae9565b89816000019060ff16908160ff168152505088816020019060ff16908160ff168152505087816040019060ff16908160ff168152505086816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050848160a0018181525050838160c0018181525050828160e0018181525050806040516020016102b39190613560565b60405160208183030381529060405291505098975050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060610323612b63565b85816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600081602001818152505084816040018181525050838160600181905250828160800181905250806040516020016103939190613705565b604051602081830303815290604052915050949350505050565b60006103b7610e75565b8160a00151804211156103ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f690613784565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16836080015173ffffffffffffffffffffffffffffffffffffffff16036104705733836080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b600083610140015180602001905181019061048b91906139b7565b90508360000151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508360200151816020018181525050600081608001516000815181106104f1576104f0613a00565b5b602002602001015180602001905181019061050c91906139b7565b9050600073ffffffffffffffffffffffffffffffffffffffff16856000015173ffffffffffffffffffffffffffffffffffffffff1603610591578460200151341461058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058390613a7b565b60405180910390fd5b610855565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16856000015173ffffffffffffffffffffffffffffffffffffffff161480156105f05750600034115b156106c1578460200151341461063b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063290613a7b565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156106a357600080fd5b505af11580156106b7573d6000803e3d6000fd5b5050505050610854565b60003414610704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fb90613ae7565b60405180910390fd5b60008560e0015160ff16146107db5760008560c0015161072857856020015161074a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b9050856000015173ffffffffffffffffffffffffffffffffffffffff1663d505accf3330848a60a001518b60e001518c61010001518d61012001516040518863ffffffff1660e01b81526004016107a79796959493929190613b25565b600060405180830381600087803b1580156107c157600080fd5b505af11580156107d5573d6000803e3d6000fd5b50505050505b60003090506000826060015151111561083e576000826060015160008151811061080857610807613a00565b5b60200260200101518060200190518101906108239190613c73565b90506001816040015160ff160361083c57806080015191505b505b610852866000015133838960200151610ebb565b505b5b60008073ffffffffffffffffffffffffffffffffffffffff16866040015173ffffffffffffffffffffffffffffffffffffffff1614905060007f000000000000000000000000000000000000000000000000000000000000000061095f578161093f57866040015173ffffffffffffffffffffffffffffffffffffffff166370a0823188608001516040518263ffffffff1660e01b81526004016108f99190612e7a565b602060405180830381865afa158015610916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093a9190613ca1565b61095c565b866080015173ffffffffffffffffffffffffffffffffffffffff16315b90505b60005b8460800151518110156109ce5760008082146109af578560800151828151811061098f5761098e613a00565b5b60200260200101518060200190518101906109aa91906139b7565b6109b1565b845b90506109c286828b60800151611013565b50806001019050610962565b5081610a5757866040015173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a119190612e7a565b602060405180830381865afa158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a529190613ca1565b610a59565b475b9550818015610a685750600086145b15610b9f577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ac69190612e7a565b602060405180830381865afa158015610ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b079190613ca1565b95506000861115610b9e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d876040518263ffffffff1660e01b8152600401610b6b9190613347565b600060405180830381600087803b158015610b8557600080fd5b505af1158015610b99573d6000803e3d6000fd5b505050505b5b6000861115610c79578115610c64576000876080015173ffffffffffffffffffffffffffffffffffffffff1687604051610bd890613cff565b60006040518083038185875af1925050503d8060008114610c15576040519150601f19603f3d011682016040523d82523d6000602084013e610c1a565b606091505b5050905080610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5590613d60565b60405180910390fd5b50610c78565b610c778760400151886080015188611096565b5b5b7f0000000000000000000000000000000000000000000000000000000000000000610d555781610d355780876040015173ffffffffffffffffffffffffffffffffffffffff166370a0823189608001516040518263ffffffff1660e01b8152600401610ce59190612e7a565b602060405180830381865afa158015610d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d269190613ca1565b610d309190613daf565b610d52565b866080015173ffffffffffffffffffffffffffffffffffffffff16315b95505b8660600151861015610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9390613e2f565b60405180910390fd5b7f95c81fee1a892bf5851845efaa51f1f7941266f2f0da809680e6d37fbd3562b387600001518860400151896020015189604051610ddd9493929190613e4f565b60405180910390a15050505050610df26111eb565b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000841380610e2a5750600083135b610e3357600080fd5b60008282810190610e449190613ee4565b90508060200151610e6e57610e6d81600001513360008813610e665786610e68565b875b611096565b5b5050505050565b600260005403610eb1576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600081905550565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b868686604051602401610ef293929190613f11565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610f5c9190613f79565b6000604051808303816000865af19150503d8060008114610f99576040519150601f19603f3d011682016040523d82523d6000602084013e610f9e565b606091505b5091509150818015610fcc5750600081511480610fcb575080806020019051810190610fca9190613fa5565b5b5b61100b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110029061401e565b60405180910390fd5b505050505050565b611033838360008560800151511461102c57600061102e565b835b6111f5565b60005b8260800151518110156110905760008360800151828151811061105c5761105b613a00565b5b602002602001015180602001905181019061107791906139b7565b9050611084848285611013565b50806001019050611036565b50505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b85856040516024016110cb92919061403e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516111359190613f79565b6000604051808303816000865af19150503d8060008114611172576040519150601f19603f3d011682016040523d82523d6000602084013e611177565b606091505b50915091508180156111a557506000815114806111a45750808060200190518101906111a39190613fa5565b5b5b6111e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111db906140b3565b60405180910390fd5b5050505050565b6001600081905550565b60005b82606001515181101561128b5760008360600151828151811061121e5761121d613a00565b5b60200260200101518060200190518101906112399190613c73565b905061126785858360018860600151516112539190613daf565b8614611260576000611262565b865b611291565b8460200181815161127891906140d3565b91508181525050508060010190506111f8565b50505050565b6000806112ab8460e00151866040015188602001516126e7565b90506002846000015160ff161015611613576000808560c001511480156113055750846060015173ffffffffffffffffffffffffffffffffffffffff16876000015173ffffffffffffffffffffffffffffffffffffffff16105b80611314575060018560c00151145b90506000856000015160ff160361139557846080015173ffffffffffffffffffffffffffffffffffffffff16632e0ae375426040518263ffffffff1660e01b81526004016113629190613347565b600060405180830381600087803b15801561137c57600080fd5b505af1158015611390573d6000803e3d6000fd5b505050505b60018560a001510361142c57846080015173ffffffffffffffffffffffffffffffffffffffff1663f140a35a8389600001516040518363ffffffff1660e01b81526004016113e4929190614107565b602060405180830381865afa158015611401573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114259190613ca1565b92506114ef565b600080866080015173ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561147e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a291906141b2565b50915091506114ea84846114b657826114b8565b835b6dffffffffffffffffffffffffffff16856114d357846114d5565b835b6dffffffffffffffffffffffffffff16612718565b945050505b6000856040015160ff1603611512576115118760000151866080015184611096565b5b846080015173ffffffffffffffffffffffffffffffffffffffff1663022c0d9f8261153d5784611540565b60005b8361154c57600061154e565b855b6001896020015160ff1614611563573061156e565b61156d8a89612802565b5b600067ffffffffffffffff81111561158957611588612e9a565b5b6040519080825280601f01601f1916602001820160405280156115bb5781602001600182028036833780820191505090505b506040518563ffffffff1660e01b81526004016115db9493929190614205565b600060405180830381600087803b1580156115f557600080fd5b505af1158015611609573d6000803e3d6000fd5b50505050506126de565b6002846000015160ff16036117dd576000808560c0015114801561166a5750846060015173ffffffffffffffffffffffffffffffffffffffff16876000015173ffffffffffffffffffffffffffffffffffffffff16105b80611679575060018560c00151145b905060006040518060400160405280896000015173ffffffffffffffffffffffffffffffffffffffff1681526020016001886040015160ff161415158152506040516020016116c8919061428f565b6040516020818303038152906040529050600080876080015173ffffffffffffffffffffffffffffffffffffffff1663128acb0860018a6020015160ff1614611711573061171c565b61171b8b8a612802565b5b866117268961295e565b886117455773fffd8963efd1fc6a506488495d951d5263988d2561174c565b6401000276a45b886040518663ffffffff1660e01b815260040161176d9594939291906142c8565b60408051808303816000875af115801561178b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117af9190614337565b91509150836117c757816117c290614377565b6117d2565b806117d190614377565b5b9550505050506126dd565b6003846000015160ff1603611902576117ff8660000151856080015183612994565b836080015173ffffffffffffffffffffffffffffffffffffffff16635b41b9088560a001518660c001518460006040518563ffffffff1660e01b815260040161184b94939291906143fa565b600060405180830381600087803b15801561186557600080fd5b505af1158015611879573d6000803e3d6000fd5b50505050836060015173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118ba9190612e7a565b602060405180830381865afa1580156118d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fb9190613ca1565b91506126dc565b6004846000015160ff16036119ba576119248660000151856080015183612994565b836080015173ffffffffffffffffffffffffffffffffffffffff16633df021248560a001518660c001518460006040518563ffffffff1660e01b8152600401611970949392919061445b565b6020604051808303816000875af115801561198f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b39190613ca1565b91506126db565b6005846000015160ff1603611a72576119dc8660000151856080015183612994565b836080015173ffffffffffffffffffffffffffffffffffffffff1663a6417ed68560a001518660c001518460006040518563ffffffff1660e01b8152600401611a28949392919061445b565b6020604051808303816000875af1158015611a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6b9190613ca1565b91506126da565b6006846000015160ff1603611b2c57611a948660000151856080015183612994565b836080015173ffffffffffffffffffffffffffffffffffffffff1663916955868560a001518660c00151846000426040518663ffffffff1660e01b8152600401611ae29594939291906144a0565b6020604051808303816000875af1158015611b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b259190613ca1565b91506126d9565b6007846000015160ff1603611cba57611b4e8660000151856080015183612994565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff1603611c2f57836080015173ffffffffffffffffffffffffffffffffffffffff16634d6f9ef28260006040518363ffffffff1660e01b8152600401611be59291906144f3565b6020604051808303816000875af1158015611c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c289190613ca1565b9150611cb5565b836080015173ffffffffffffffffffffffffffffffffffffffff1663c5a36df18260006040518363ffffffff1660e01b8152600401611c6f9291906144f3565b6020604051808303816000875af1158015611c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb29190613ca1565b91505b6126d8565b6008846000015160ff1603611d8457611cdc8660000151856080015183612994565b836080015173ffffffffffffffffffffffffffffffffffffffff16636e553f65826001876020015160ff1614611d125730611d1d565b611d1c8887612802565b5b6040518363ffffffff1660e01b8152600401611d3a929190614107565b6020604051808303816000875af1158015611d59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7d9190613ca1565b91506126d7565b6009846000015160ff1603611f1e5760008460a00151148015611df657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff16145b15611e87577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401611e549190613347565b600060405180830381600087803b158015611e6e57600080fd5b505af1158015611e82573d6000803e3d6000fd5b505050505b836080015173ffffffffffffffffffffffffffffffffffffffff1663bfda0c8c826001876020015160ff1614611ebd5730611ec8565b611ec78887612802565b5b6040518363ffffffff1660e01b8152600401611ee49190612e7a565b6000604051808303818588803b158015611efd57600080fd5b505af1158015611f11573d6000803e3d6000fd5b50505050508091506126d6565b600a846000015160ff160361209e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff1603612014577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401611fdd9190613347565b600060405180830381600087803b158015611ff757600080fd5b505af115801561200b573d6000803e3d6000fd5b50505050612096565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561207c57600080fd5b505af1158015612090573d6000803e3d6000fd5b50505050505b8091506126d5565b600b846000015160ff160361235f5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16876000015173ffffffffffffffffffffffffffffffffffffffff1603612199577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040161215f9190613347565b600060405180830381600087803b15801561217957600080fd5b505af115801561218d573d6000803e3d6000fd5b505050508190506121ee565b600073ffffffffffffffffffffffffffffffffffffffff16876000015173ffffffffffffffffffffffffffffffffffffffff16036121d9578190506121ed565b6121ec8760000151866080015184612994565b5b5b846080015173ffffffffffffffffffffffffffffffffffffffff16633df02124828760a001518860c001518660006040518663ffffffff1660e01b815260040161223b949392919061445b565b60206040518083038185885af1158015612259573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061227e9190613ca1565b92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff1603612359577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561233f57600080fd5b505af1158015612353573d6000803e3d6000fd5b50505050505b506126d4565b600c846000015160ff1603612448576000846040015160ff1603612391576123908660000151856080015183611096565b5b836080015173ffffffffffffffffffffffffffffffffffffffff1663afb430128560a001518660c0015184600060018a6020015160ff16146123d357306123de565b6123dd8b8a612802565b5b6040518663ffffffff1660e01b81526004016123fe95949392919061451c565b6020604051808303816000875af115801561241d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124419190613ca1565b91506126d3565b600d846000015160ff160361250157836080015173ffffffffffffffffffffffffffffffffffffffff1663ba087652826001876020015160ff161461248d5730612498565b6124978887612802565b5b306040518463ffffffff1660e01b81526004016124b79392919061456f565b6020604051808303816000875af11580156124d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fa9190613ca1565b91506126d2565b600e846000015160ff16036125da576125238660000151856080015183612994565b836080015173ffffffffffffffffffffffffffffffffffffffff1663ddc1f59d8560a001518660c0015184600060018a6020015160ff16146125655730612570565b61256f8b8a612802565b5b6040518663ffffffff1660e01b815260040161259095949392919061451c565b6020604051808303816000875af11580156125af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d39190613ca1565b91506126d1565b60ff846000015160ff16036126d05760008460a0015190506000856040015160ff16036126115761261087600001518284612994565b5b8073ffffffffffffffffffffffffffffffffffffffff166364074c70886000015187606001518589608001518a6040015160018c6020015160ff16146126575730612662565b6126618d8c612802565b5b8c60c001516040518863ffffffff1660e01b815260040161268997969594939291906145a6565b6020604051808303816000875af11580156126a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cc9190613ca1565b9250505b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50949350505050565b60006305f5e1008284866126fb9190614615565b6127059190614615565b61270f9190614686565b90509392505050565b600080841161275c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275390614729565b60405180910390fd5b60008311801561276c5750600082115b6127ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a2906147bb565b60405180910390fd5b60006103e5856127bb9190614615565b9050600083826127cb9190614615565b90506000826103e8876127de9190614615565b6127e891906140d3565b905080826127f69190614686565b93505050509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461283f57819050612958565b600183606001515114801561285957506001836080015151145b612898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288f90614827565b60405180910390fd5b600083608001516000815181106128b2576128b1613a00565b5b60200260200101518060200190518101906128cd91906139b7565b9050600181606001515114612917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290e90614893565b60405180910390fd5b6000816060015160008151811061293157612930613a00565b5b602002602001015180602001905181019061294c9190613c73565b90508060800151925050505b92915050565b60007f8000000000000000000000000000000000000000000000000000000000000000821061298c57600080fd5b819050919050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663095ea7b360e01b85856040516024016129c992919061403e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612a339190613f79565b6000604051808303816000865af19150503d8060008114612a70576040519150601f19603f3d011682016040523d82523d6000602084013e612a75565b606091505b5091509150818015612aa35750600081511480612aa2575080806020019051810190612aa19190613fa5565b5b5b612ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad9906148ff565b60405180910390fd5b5050505050565b604051806101000160405280600060ff168152602001600060ff168152602001600060ff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081525090565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600060ff82169050919050565b612bd281612bbc565b8114612bdd57600080fd5b50565b600081359050612bef81612bc9565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c2082612bf5565b9050919050565b612c3081612c15565b8114612c3b57600080fd5b50565b600081359050612c4d81612c27565b92915050565b6000819050919050565b612c6681612c53565b8114612c7157600080fd5b50565b600081359050612c8381612c5d565b92915050565b600080600080600080600080610100898b031215612caa57612ca9612bb2565b5b6000612cb88b828c01612be0565b9850506020612cc98b828c01612be0565b9750506040612cda8b828c01612be0565b9650506060612ceb8b828c01612c3e565b9550506080612cfc8b828c01612c3e565b94505060a0612d0d8b828c01612c74565b93505060c0612d1e8b828c01612c74565b92505060e0612d2f8b828c01612c74565b9150509295985092959890939650565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d79578082015181840152602081019050612d5e565b60008484015250505050565b6000601f19601f8301169050919050565b6000612da182612d3f565b612dab8185612d4a565b9350612dbb818560208601612d5b565b612dc481612d85565b840191505092915050565b60006020820190508181036000830152612de98184612d96565b905092915050565b6000819050919050565b6000612e16612e11612e0c84612bf5565b612df1565b612bf5565b9050919050565b6000612e2882612dfb565b9050919050565b6000612e3a82612e1d565b9050919050565b612e4a81612e2f565b82525050565b6000602082019050612e656000830184612e41565b92915050565b612e7481612c15565b82525050565b6000602082019050612e8f6000830184612e6b565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ed282612d85565b810181811067ffffffffffffffff82111715612ef157612ef0612e9a565b5b80604052505050565b6000612f04612ba8565b9050612f108282612ec9565b919050565b600067ffffffffffffffff821115612f3057612f2f612e9a565b5b602082029050602081019050919050565b600080fd5b600080fd5b600067ffffffffffffffff821115612f6657612f65612e9a565b5b612f6f82612d85565b9050602081019050919050565b82818337600083830152505050565b6000612f9e612f9984612f4b565b612efa565b905082815260208101848484011115612fba57612fb9612f46565b5b612fc5848285612f7c565b509392505050565b600082601f830112612fe257612fe1612e95565b5b8135612ff2848260208601612f8b565b91505092915050565b600061300e61300984612f15565b612efa565b9050808382526020820190506020840283018581111561303157613030612f41565b5b835b8181101561307857803567ffffffffffffffff81111561305657613055612e95565b5b8086016130638982612fcd565b85526020850194505050602081019050613033565b5050509392505050565b600082601f83011261309757613096612e95565b5b81356130a7848260208601612ffb565b91505092915050565b600080600080608085870312156130ca576130c9612bb2565b5b60006130d887828801612c3e565b94505060206130e987828801612c74565b935050604085013567ffffffffffffffff81111561310a57613109612bb7565b5b61311687828801613082565b925050606085013567ffffffffffffffff81111561313757613136612bb7565b5b61314387828801613082565b91505092959194509250565b600080fd5b600080fd5b60008115159050919050565b61316e81613159565b811461317957600080fd5b50565b60008135905061318b81613165565b92915050565b6000819050919050565b6131a481613191565b81146131af57600080fd5b50565b6000813590506131c18161319b565b92915050565b600061016082840312156131de576131dd61314f565b5b6131e9610160612efa565b905060006131f984828501612c3e565b600083015250602061320d84828501612c74565b602083015250604061322184828501612c3e565b604083015250606061323584828501612c74565b606083015250608061324984828501612c3e565b60808301525060a061325d84828501612c74565b60a08301525060c06132718482850161317c565b60c08301525060e061328584828501612be0565b60e08301525061010061329a848285016131b2565b610100830152506101206132b0848285016131b2565b6101208301525061014082013567ffffffffffffffff8111156132d6576132d5613154565b5b6132e284828501612fcd565b6101408301525092915050565b60006020828403121561330557613304612bb2565b5b600082013567ffffffffffffffff81111561332357613322612bb7565b5b61332f848285016131c7565b91505092915050565b61334181612c53565b82525050565b600060208201905061335c6000830184613338565b92915050565b61336b81613159565b82525050565b60006020820190506133866000830184613362565b92915050565b6000819050919050565b61339f8161338c565b81146133aa57600080fd5b50565b6000813590506133bc81613396565b92915050565b600080fd5b60008083601f8401126133dd576133dc612e95565b5b8235905067ffffffffffffffff8111156133fa576133f96133c2565b5b60208301915083600182028301111561341657613415612f41565b5b9250929050565b6000806000806060858703121561343757613436612bb2565b5b6000613445878288016133ad565b9450506020613456878288016133ad565b935050604085013567ffffffffffffffff81111561347757613476612bb7565b5b613483878288016133c7565b925092505092959194509250565b61349a81612bbc565b82525050565b6134a981612c15565b82525050565b6134b881612c53565b82525050565b610100820160008201516134d56000850182613491565b5060208201516134e86020850182613491565b5060408201516134fb6040850182613491565b50606082015161350e60608501826134a0565b50608082015161352160808501826134a0565b5060a082015161353460a08501826134af565b5060c082015161354760c08501826134af565b5060e082015161355a60e08501826134af565b50505050565b60006101008201905061357660008301846134be565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b60006135c482612d3f565b6135ce81856135a8565b93506135de818560208601612d5b565b6135e781612d85565b840191505092915050565b60006135fe83836135b9565b905092915050565b6000602082019050919050565b600061361e8261357c565b6136288185613587565b93508360208202850161363a85613598565b8060005b85811015613676578484038952815161365785826135f2565b945061366283613606565b925060208a0199505060018101905061363e565b50829750879550505050505092915050565b600060a0830160008301516136a060008601826134a0565b5060208301516136b360208601826134af565b5060408301516136c660408601826134af565b50606083015184820360608601526136de8282613613565b915050608083015184820360808601526136f88282613613565b9150508091505092915050565b6000602082019050818103600083015261371f8184613688565b905092915050565b600082825260208201905092915050565b7f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000600082015250565b600061376e601383613727565b915061377982613738565b602082019050919050565b6000602082019050818103600083015261379d81613761565b9050919050565b6000815190506137b381612c27565b92915050565b6000815190506137c881612c5d565b92915050565b60006137e16137dc84612f4b565b612efa565b9050828152602081018484840111156137fd576137fc612f46565b5b613808848285612d5b565b509392505050565b600082601f83011261382557613824612e95565b5b81516138358482602086016137ce565b91505092915050565b600061385161384c84612f15565b612efa565b9050808382526020820190506020840283018581111561387457613873612f41565b5b835b818110156138bb57805167ffffffffffffffff81111561389957613898612e95565b5b8086016138a68982613810565b85526020850194505050602081019050613876565b5050509392505050565b600082601f8301126138da576138d9612e95565b5b81516138ea84826020860161383e565b91505092915050565b600060a082840312156139095761390861314f565b5b61391360a0612efa565b90506000613923848285016137a4565b6000830152506020613937848285016137b9565b602083015250604061394b848285016137b9565b604083015250606082015167ffffffffffffffff81111561396f5761396e613154565b5b61397b848285016138c5565b606083015250608082015167ffffffffffffffff81111561399f5761399e613154565b5b6139ab848285016138c5565b60808301525092915050565b6000602082840312156139cd576139cc612bb2565b5b600082015167ffffffffffffffff8111156139eb576139ea612bb7565b5b6139f7848285016138f3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4653523a49490000000000000000000000000000000000000000000000000000600082015250565b6000613a65600683613727565b9150613a7082613a2f565b602082019050919050565b60006020820190508181036000830152613a9481613a58565b9050919050565b7f4653523a49450000000000000000000000000000000000000000000000000000600082015250565b6000613ad1600683613727565b9150613adc82613a9b565b602082019050919050565b60006020820190508181036000830152613b0081613ac4565b9050919050565b613b1081612bbc565b82525050565b613b1f81613191565b82525050565b600060e082019050613b3a600083018a612e6b565b613b476020830189612e6b565b613b546040830188613338565b613b616060830187613338565b613b6e6080830186613b07565b613b7b60a0830185613b16565b613b8860c0830184613b16565b98975050505050505050565b600081519050613ba381612bc9565b92915050565b60006101008284031215613bc057613bbf61314f565b5b613bcb610100612efa565b90506000613bdb84828501613b94565b6000830152506020613bef84828501613b94565b6020830152506040613c0384828501613b94565b6040830152506060613c17848285016137a4565b6060830152506080613c2b848285016137a4565b60808301525060a0613c3f848285016137b9565b60a08301525060c0613c53848285016137b9565b60c08301525060e0613c67848285016137b9565b60e08301525092915050565b60006101008284031215613c8a57613c89612bb2565b5b6000613c9884828501613ba9565b91505092915050565b600060208284031215613cb757613cb6612bb2565b5b6000613cc5848285016137b9565b91505092915050565b600081905092915050565b50565b6000613ce9600083613cce565b9150613cf482613cd9565b600082019050919050565b6000613d0a82613cdc565b9150819050919050565b7f4653523a496e76616c6964207472616e73666572000000000000000000000000600082015250565b6000613d4a601483613727565b9150613d5582613d14565b602082019050919050565b60006020820190508181036000830152613d7981613d3d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dba82612c53565b9150613dc583612c53565b9250828203905081811115613ddd57613ddc613d80565b5b92915050565b7f4653523a494f0000000000000000000000000000000000000000000000000000600082015250565b6000613e19600683613727565b9150613e2482613de3565b602082019050919050565b60006020820190508181036000830152613e4881613e0c565b9050919050565b6000608082019050613e646000830187612e6b565b613e716020830186612e6b565b613e7e6040830185613338565b613e8b6060830184613338565b95945050505050565b600060408284031215613eaa57613ea961314f565b5b613eb46040612efa565b90506000613ec484828501612c3e565b6000830152506020613ed88482850161317c565b60208301525092915050565b600060408284031215613efa57613ef9612bb2565b5b6000613f0884828501613e94565b91505092915050565b6000606082019050613f266000830186612e6b565b613f336020830185612e6b565b613f406040830184613338565b949350505050565b6000613f5382612d3f565b613f5d8185613cce565b9350613f6d818560208601612d5b565b80840191505092915050565b6000613f858284613f48565b915081905092915050565b600081519050613f9f81613165565b92915050565b600060208284031215613fbb57613fba612bb2565b5b6000613fc984828501613f90565b91505092915050565b7f5354460000000000000000000000000000000000000000000000000000000000600082015250565b6000614008600383613727565b915061401382613fd2565b602082019050919050565b6000602082019050818103600083015261403781613ffb565b9050919050565b60006040820190506140536000830185612e6b565b6140606020830184613338565b9392505050565b7f5354000000000000000000000000000000000000000000000000000000000000600082015250565b600061409d600283613727565b91506140a882614067565b602082019050919050565b600060208201905081810360008301526140cc81614090565b9050919050565b60006140de82612c53565b91506140e983612c53565b925082820190508082111561410157614100613d80565b5b92915050565b600060408201905061411c6000830185613338565b6141296020830184612e6b565b9392505050565b60006dffffffffffffffffffffffffffff82169050919050565b61415381614130565b811461415e57600080fd5b50565b6000815190506141708161414a565b92915050565b600063ffffffff82169050919050565b61418f81614176565b811461419a57600080fd5b50565b6000815190506141ac81614186565b92915050565b6000806000606084860312156141cb576141ca612bb2565b5b60006141d986828701614161565b93505060206141ea86828701614161565b92505060406141fb8682870161419d565b9150509250925092565b600060808201905061421a6000830187613338565b6142276020830186613338565b6142346040830185612e6b565b81810360608301526142468184612d96565b905095945050505050565b61425a81613159565b82525050565b60408201600082015161427660008501826134a0565b5060208201516142896020850182614251565b50505050565b60006040820190506142a46000830184614260565b92915050565b6142b38161338c565b82525050565b6142c281612bf5565b82525050565b600060a0820190506142dd6000830188612e6b565b6142ea6020830187613362565b6142f760408301866142aa565b61430460608301856142b9565b81810360808301526143168184612d96565b90509695505050505050565b60008151905061433181613396565b92915050565b6000806040838503121561434e5761434d612bb2565b5b600061435c85828601614322565b925050602061436d85828601614322565b9150509250929050565b60006143828261338c565b91507f800000000000000000000000000000000000000000000000000000000000000082036143b4576143b3613d80565b5b816000039050919050565b6000819050919050565b60006143e46143df6143da846143bf565b612df1565b612c53565b9050919050565b6143f4816143c9565b82525050565b600060808201905061440f6000830187613338565b61441c6020830186613338565b6144296040830185613338565b61443660608301846143eb565b95945050505050565b600081600f0b9050919050565b6144558161443f565b82525050565b6000608082019050614470600083018761444c565b61447d602083018661444c565b61448a6040830185613338565b61449760608301846143eb565b95945050505050565b600060a0820190506144b56000830188613b07565b6144c26020830187613b07565b6144cf6040830186613338565b6144dc60608301856143eb565b6144e96080830184613338565b9695505050505050565b60006040820190506145086000830185613338565b61451560208301846143eb565b9392505050565b600060a082019050614531600083018861444c565b61453e602083018761444c565b61454b6040830186613338565b61455860608301856143eb565b6145656080830184612e6b565b9695505050505050565b60006060820190506145846000830186613338565b6145916020830185612e6b565b61459e6040830184612e6b565b949350505050565b600060e0820190506145bb600083018a612e6b565b6145c86020830189612e6b565b6145d56040830188613338565b6145e26060830187612e6b565b6145ef6080830186613b07565b6145fc60a0830185612e6b565b61460960c0830184613338565b98975050505050505050565b600061462082612c53565b915061462b83612c53565b925082820261463981612c53565b915082820484148315176146505761464f613d80565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061469182612c53565b915061469c83612c53565b9250826146ac576146ab614657565b5b828204905092915050565b7f556e697377617056324c6962726172793a20494e53554646494349454e545f4960008201527f4e5055545f414d4f554e54000000000000000000000000000000000000000000602082015250565b6000614713602b83613727565b915061471e826146b7565b604082019050919050565b6000602082019050818103600083015261474281614706565b9050919050565b7f556e697377617056324c6962726172793a20494e53554646494349454e545f4c60008201527f4951554944495459000000000000000000000000000000000000000000000000602082015250565b60006147a5602883613727565b91506147b082614749565b604082019050919050565b600060208201905081810360008301526147d481614798565b9050919050565b7f4653523a204446526f7574657300000000000000000000000000000000000000600082015250565b6000614811600d83613727565b915061481c826147db565b602082019050919050565b6000602082019050818103600083015261484081614804565b9050919050565b7f4653523a20444653746570730000000000000000000000000000000000000000600082015250565b600061487d600c83613727565b915061488882614847565b602082019050919050565b600060208201905081810360008301526148ac81614870565b9050919050565b7f5341000000000000000000000000000000000000000000000000000000000000600082015250565b60006148e9600283613727565b91506148f4826148b3565b602082019050919050565b60006020820190508181036000830152614918816148dc565b905091905056000000000000000000000000fc00000000000000000000000000000000000006000000000000000000000000fc000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x7e", + "chainId": "0xfc" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x3f81bb", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf5db9329e47777d50772c642e0f24492a334e64ceb14cf50c3e6c73319388e83", + "transactionIndex": "0x1", + "blockHash": "0xd47ed71ee415642196ae33653086ed1a271f4978c0a0ea84520d3b03b9563f64", + "blockNumber": "0x4553d4", + "gasUsed": "0x3ebc45", + "effectiveGasPrice": "0xfe", + "from": "0xb0e1650a9760e0f383174af042091fc544b8356f", + "to": null, + "contractAddress": "0x46d2487cdbea04411c49e6c55ace805bfa8f5de5", + "l1Fee": "0x2c784a43454a", + "l1FeeScalar": "0.05", + "l1GasPrice": "0xcac3c677", + "l1GasUsed": "0x462e8" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1715897630, + "chain": 252, + "commit": "2e3b46e" +} \ No newline at end of file diff --git a/broadcast/DeployFraxswapRouterMultihop.s.sol/252/run-latest.json b/broadcast/DeployFraxswapRouterMultihop.s.sol/252/run-latest.json new file mode 100644 index 0000000..4c909d3 --- /dev/null +++ b/broadcast/DeployFraxswapRouterMultihop.s.sol/252/run-latest.json @@ -0,0 +1,54 @@ +{ + "transactions": [ + { + "hash": "0xf5db9329e47777d50772c642e0f24492a334e64ceb14cf50c3e6c73319388e83", + "transactionType": "CREATE", + "contractName": "FraxswapRouterMultihop", + "contractAddress": "0x46d2487cdbea04411c49e6c55ace805bfa8f5de5", + "function": null, + "arguments": [ + "0xFC00000000000000000000000000000000000006", + "0xFc00000000000000000000000000000000000001", + "true" + ], + "transaction": { + "from": "0xb0e1650a9760e0f383174af042091fc544b8356f", + "gas": "0x51882c", + "value": "0x0", + "input": "0x60e060405234801561001057600080fd5b50604051614ba0380380614ba08339818101604052810190610032919061018f565b60016000819055508273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505080151560c0811515815250505050506101e2565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100e6826100bb565b9050919050565b60006100f8826100db565b9050919050565b610108816100ed565b811461011357600080fd5b50565b600081519050610125816100ff565b92915050565b610134816100db565b811461013f57600080fd5b50565b6000815190506101518161012b565b92915050565b60008115159050919050565b61016c81610157565b811461017757600080fd5b50565b60008151905061018981610163565b92915050565b6000806000606084860312156101a8576101a76100b6565b5b60006101b686828701610116565b93505060206101c786828701610142565b92505060406101d88682870161017a565b9150509250925092565b60805160a05160c05161491f6102816000396000818161089001528181610c7b0152610df90152600081816102f70152611b500152600081816102d3015281816105930152818161063d01528181610a6f01528181610b1401528181611da401528181611dfd01528181611f2f01528181611f8601528181612016015281816120b1015281816121080152818161228201526122d9015261491f6000f3fe6080604052600436106100745760003560e01c8063b60650d71161004e578063b60650d714610113578063d2c9041114610150578063dcd6c4d514610180578063fa461e33146101ab5761007b565b80634a264940146100805780634aa4a4fc146100bd578063b0e4556f146100e85761007b565b3661007b57005b600080fd5b34801561008c57600080fd5b506100a760048036038101906100a29190612c89565b6101d4565b6040516100b49190612dcf565b60405180910390f35b3480156100c957600080fd5b506100d26102d1565b6040516100df9190612e50565b60405180910390f35b3480156100f457600080fd5b506100fd6102f5565b60405161010a9190612e7a565b60405180910390f35b34801561011f57600080fd5b5061013a600480360381019061013591906130b0565b610319565b6040516101479190612dcf565b60405180910390f35b61016a600480360381019061016591906132ef565b6103ad565b6040516101779190613347565b60405180910390f35b34801561018c57600080fd5b50610195610df7565b6040516101a29190613371565b60405180910390f35b3480156101b757600080fd5b506101d260048036038101906101cd919061341d565b610e1b565b005b60606101de612ae9565b89816000019060ff16908160ff168152505088816020019060ff16908160ff168152505087816040019060ff16908160ff168152505086816060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505085816080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050848160a0018181525050838160c0018181525050828160e0018181525050806040516020016102b39190613560565b60405160208183030381529060405291505098975050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060610323612b63565b85816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600081602001818152505084816040018181525050838160600181905250828160800181905250806040516020016103939190613705565b604051602081830303815290604052915050949350505050565b60006103b7610e75565b8160a00151804211156103ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f690613784565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16836080015173ffffffffffffffffffffffffffffffffffffffff16036104705733836080019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b600083610140015180602001905181019061048b91906139b7565b90508360000151816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508360200151816020018181525050600081608001516000815181106104f1576104f0613a00565b5b602002602001015180602001905181019061050c91906139b7565b9050600073ffffffffffffffffffffffffffffffffffffffff16856000015173ffffffffffffffffffffffffffffffffffffffff1603610591578460200151341461058c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161058390613a7b565b60405180910390fd5b610855565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16856000015173ffffffffffffffffffffffffffffffffffffffff161480156105f05750600034115b156106c1578460200151341461063b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063290613a7b565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156106a357600080fd5b505af11580156106b7573d6000803e3d6000fd5b5050505050610854565b60003414610704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106fb90613ae7565b60405180910390fd5b60008560e0015160ff16146107db5760008560c0015161072857856020015161074a565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b9050856000015173ffffffffffffffffffffffffffffffffffffffff1663d505accf3330848a60a001518b60e001518c61010001518d61012001516040518863ffffffff1660e01b81526004016107a79796959493929190613b25565b600060405180830381600087803b1580156107c157600080fd5b505af11580156107d5573d6000803e3d6000fd5b50505050505b60003090506000826060015151111561083e576000826060015160008151811061080857610807613a00565b5b60200260200101518060200190518101906108239190613c73565b90506001816040015160ff160361083c57806080015191505b505b610852866000015133838960200151610ebb565b505b5b60008073ffffffffffffffffffffffffffffffffffffffff16866040015173ffffffffffffffffffffffffffffffffffffffff1614905060007f000000000000000000000000000000000000000000000000000000000000000061095f578161093f57866040015173ffffffffffffffffffffffffffffffffffffffff166370a0823188608001516040518263ffffffff1660e01b81526004016108f99190612e7a565b602060405180830381865afa158015610916573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093a9190613ca1565b61095c565b866080015173ffffffffffffffffffffffffffffffffffffffff16315b90505b60005b8460800151518110156109ce5760008082146109af578560800151828151811061098f5761098e613a00565b5b60200260200101518060200190518101906109aa91906139b7565b6109b1565b845b90506109c286828b60800151611013565b50806001019050610962565b5081610a5757866040015173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a119190612e7a565b602060405180830381865afa158015610a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a529190613ca1565b610a59565b475b9550818015610a685750600086145b15610b9f577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ac69190612e7a565b602060405180830381865afa158015610ae3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b079190613ca1565b95506000861115610b9e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d876040518263ffffffff1660e01b8152600401610b6b9190613347565b600060405180830381600087803b158015610b8557600080fd5b505af1158015610b99573d6000803e3d6000fd5b505050505b5b6000861115610c79578115610c64576000876080015173ffffffffffffffffffffffffffffffffffffffff1687604051610bd890613cff565b60006040518083038185875af1925050503d8060008114610c15576040519150601f19603f3d011682016040523d82523d6000602084013e610c1a565b606091505b5050905080610c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5590613d60565b60405180910390fd5b50610c78565b610c778760400151886080015188611096565b5b5b7f0000000000000000000000000000000000000000000000000000000000000000610d555781610d355780876040015173ffffffffffffffffffffffffffffffffffffffff166370a0823189608001516040518263ffffffff1660e01b8152600401610ce59190612e7a565b602060405180830381865afa158015610d02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d269190613ca1565b610d309190613daf565b610d52565b866080015173ffffffffffffffffffffffffffffffffffffffff16315b95505b8660600151861015610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9390613e2f565b60405180910390fd5b7f95c81fee1a892bf5851845efaa51f1f7941266f2f0da809680e6d37fbd3562b387600001518860400151896020015189604051610ddd9493929190613e4f565b60405180910390a15050505050610df26111eb565b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000841380610e2a5750600083135b610e3357600080fd5b60008282810190610e449190613ee4565b90508060200151610e6e57610e6d81600001513360008813610e665786610e68565b875b611096565b5b5050505050565b600260005403610eb1576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600081905550565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b868686604051602401610ef293929190613f11565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610f5c9190613f79565b6000604051808303816000865af19150503d8060008114610f99576040519150601f19603f3d011682016040523d82523d6000602084013e610f9e565b606091505b5091509150818015610fcc5750600081511480610fcb575080806020019051810190610fca9190613fa5565b5b5b61100b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110029061401e565b60405180910390fd5b505050505050565b611033838360008560800151511461102c57600061102e565b835b6111f5565b60005b8260800151518110156110905760008360800151828151811061105c5761105b613a00565b5b602002602001015180602001905181019061107791906139b7565b9050611084848285611013565b50806001019050611036565b50505050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b85856040516024016110cb92919061403e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516111359190613f79565b6000604051808303816000865af19150503d8060008114611172576040519150601f19603f3d011682016040523d82523d6000602084013e611177565b606091505b50915091508180156111a557506000815114806111a45750808060200190518101906111a39190613fa5565b5b5b6111e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111db906140b3565b60405180910390fd5b5050505050565b6001600081905550565b60005b82606001515181101561128b5760008360600151828151811061121e5761121d613a00565b5b60200260200101518060200190518101906112399190613c73565b905061126785858360018860600151516112539190613daf565b8614611260576000611262565b865b611291565b8460200181815161127891906140d3565b91508181525050508060010190506111f8565b50505050565b6000806112ab8460e00151866040015188602001516126e7565b90506002846000015160ff161015611613576000808560c001511480156113055750846060015173ffffffffffffffffffffffffffffffffffffffff16876000015173ffffffffffffffffffffffffffffffffffffffff16105b80611314575060018560c00151145b90506000856000015160ff160361139557846080015173ffffffffffffffffffffffffffffffffffffffff16632e0ae375426040518263ffffffff1660e01b81526004016113629190613347565b600060405180830381600087803b15801561137c57600080fd5b505af1158015611390573d6000803e3d6000fd5b505050505b60018560a001510361142c57846080015173ffffffffffffffffffffffffffffffffffffffff1663f140a35a8389600001516040518363ffffffff1660e01b81526004016113e4929190614107565b602060405180830381865afa158015611401573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114259190613ca1565b92506114ef565b600080866080015173ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561147e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a291906141b2565b50915091506114ea84846114b657826114b8565b835b6dffffffffffffffffffffffffffff16856114d357846114d5565b835b6dffffffffffffffffffffffffffff16612718565b945050505b6000856040015160ff1603611512576115118760000151866080015184611096565b5b846080015173ffffffffffffffffffffffffffffffffffffffff1663022c0d9f8261153d5784611540565b60005b8361154c57600061154e565b855b6001896020015160ff1614611563573061156e565b61156d8a89612802565b5b600067ffffffffffffffff81111561158957611588612e9a565b5b6040519080825280601f01601f1916602001820160405280156115bb5781602001600182028036833780820191505090505b506040518563ffffffff1660e01b81526004016115db9493929190614205565b600060405180830381600087803b1580156115f557600080fd5b505af1158015611609573d6000803e3d6000fd5b50505050506126de565b6002846000015160ff16036117dd576000808560c0015114801561166a5750846060015173ffffffffffffffffffffffffffffffffffffffff16876000015173ffffffffffffffffffffffffffffffffffffffff16105b80611679575060018560c00151145b905060006040518060400160405280896000015173ffffffffffffffffffffffffffffffffffffffff1681526020016001886040015160ff161415158152506040516020016116c8919061428f565b6040516020818303038152906040529050600080876080015173ffffffffffffffffffffffffffffffffffffffff1663128acb0860018a6020015160ff1614611711573061171c565b61171b8b8a612802565b5b866117268961295e565b886117455773fffd8963efd1fc6a506488495d951d5263988d2561174c565b6401000276a45b886040518663ffffffff1660e01b815260040161176d9594939291906142c8565b60408051808303816000875af115801561178b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117af9190614337565b91509150836117c757816117c290614377565b6117d2565b806117d190614377565b5b9550505050506126dd565b6003846000015160ff1603611902576117ff8660000151856080015183612994565b836080015173ffffffffffffffffffffffffffffffffffffffff16635b41b9088560a001518660c001518460006040518563ffffffff1660e01b815260040161184b94939291906143fa565b600060405180830381600087803b15801561186557600080fd5b505af1158015611879573d6000803e3d6000fd5b50505050836060015173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016118ba9190612e7a565b602060405180830381865afa1580156118d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fb9190613ca1565b91506126dc565b6004846000015160ff16036119ba576119248660000151856080015183612994565b836080015173ffffffffffffffffffffffffffffffffffffffff16633df021248560a001518660c001518460006040518563ffffffff1660e01b8152600401611970949392919061445b565b6020604051808303816000875af115801561198f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b39190613ca1565b91506126db565b6005846000015160ff1603611a72576119dc8660000151856080015183612994565b836080015173ffffffffffffffffffffffffffffffffffffffff1663a6417ed68560a001518660c001518460006040518563ffffffff1660e01b8152600401611a28949392919061445b565b6020604051808303816000875af1158015611a47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6b9190613ca1565b91506126da565b6006846000015160ff1603611b2c57611a948660000151856080015183612994565b836080015173ffffffffffffffffffffffffffffffffffffffff1663916955868560a001518660c00151846000426040518663ffffffff1660e01b8152600401611ae29594939291906144a0565b6020604051808303816000875af1158015611b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b259190613ca1565b91506126d9565b6007846000015160ff1603611cba57611b4e8660000151856080015183612994565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff1603611c2f57836080015173ffffffffffffffffffffffffffffffffffffffff16634d6f9ef28260006040518363ffffffff1660e01b8152600401611be59291906144f3565b6020604051808303816000875af1158015611c04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c289190613ca1565b9150611cb5565b836080015173ffffffffffffffffffffffffffffffffffffffff1663c5a36df18260006040518363ffffffff1660e01b8152600401611c6f9291906144f3565b6020604051808303816000875af1158015611c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb29190613ca1565b91505b6126d8565b6008846000015160ff1603611d8457611cdc8660000151856080015183612994565b836080015173ffffffffffffffffffffffffffffffffffffffff16636e553f65826001876020015160ff1614611d125730611d1d565b611d1c8887612802565b5b6040518363ffffffff1660e01b8152600401611d3a929190614107565b6020604051808303816000875af1158015611d59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7d9190613ca1565b91506126d7565b6009846000015160ff1603611f1e5760008460a00151148015611df657507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff16145b15611e87577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401611e549190613347565b600060405180830381600087803b158015611e6e57600080fd5b505af1158015611e82573d6000803e3d6000fd5b505050505b836080015173ffffffffffffffffffffffffffffffffffffffff1663bfda0c8c826001876020015160ff1614611ebd5730611ec8565b611ec78887612802565b5b6040518363ffffffff1660e01b8152600401611ee49190612e7a565b6000604051808303818588803b158015611efd57600080fd5b505af1158015611f11573d6000803e3d6000fd5b50505050508091506126d6565b600a846000015160ff160361209e577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff1603612014577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401611fdd9190613347565b600060405180830381600087803b158015611ff757600080fd5b505af115801561200b573d6000803e3d6000fd5b50505050612096565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561207c57600080fd5b505af1158015612090573d6000803e3d6000fd5b50505050505b8091506126d5565b600b846000015160ff160361235f5760007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16876000015173ffffffffffffffffffffffffffffffffffffffff1603612199577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040161215f9190613347565b600060405180830381600087803b15801561217957600080fd5b505af115801561218d573d6000803e3d6000fd5b505050508190506121ee565b600073ffffffffffffffffffffffffffffffffffffffff16876000015173ffffffffffffffffffffffffffffffffffffffff16036121d9578190506121ed565b6121ec8760000151866080015184612994565b5b5b846080015173ffffffffffffffffffffffffffffffffffffffff16633df02124828760a001518860c001518660006040518663ffffffff1660e01b815260040161223b949392919061445b565b60206040518083038185885af1158015612259573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061227e9190613ca1565b92507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16866000015173ffffffffffffffffffffffffffffffffffffffff1603612359577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561233f57600080fd5b505af1158015612353573d6000803e3d6000fd5b50505050505b506126d4565b600c846000015160ff1603612448576000846040015160ff1603612391576123908660000151856080015183611096565b5b836080015173ffffffffffffffffffffffffffffffffffffffff1663afb430128560a001518660c0015184600060018a6020015160ff16146123d357306123de565b6123dd8b8a612802565b5b6040518663ffffffff1660e01b81526004016123fe95949392919061451c565b6020604051808303816000875af115801561241d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124419190613ca1565b91506126d3565b600d846000015160ff160361250157836080015173ffffffffffffffffffffffffffffffffffffffff1663ba087652826001876020015160ff161461248d5730612498565b6124978887612802565b5b306040518463ffffffff1660e01b81526004016124b79392919061456f565b6020604051808303816000875af11580156124d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fa9190613ca1565b91506126d2565b600e846000015160ff16036125da576125238660000151856080015183612994565b836080015173ffffffffffffffffffffffffffffffffffffffff1663ddc1f59d8560a001518660c0015184600060018a6020015160ff16146125655730612570565b61256f8b8a612802565b5b6040518663ffffffff1660e01b815260040161259095949392919061451c565b6020604051808303816000875af11580156125af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125d39190613ca1565b91506126d1565b60ff846000015160ff16036126d05760008460a0015190506000856040015160ff16036126115761261087600001518284612994565b5b8073ffffffffffffffffffffffffffffffffffffffff166364074c70886000015187606001518589608001518a6040015160018c6020015160ff16146126575730612662565b6126618d8c612802565b5b8c60c001516040518863ffffffff1660e01b815260040161268997969594939291906145a6565b6020604051808303816000875af11580156126a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126cc9190613ca1565b9250505b5b5b5b5b5b5b5b5b5b5b5b5b5b5b50949350505050565b60006305f5e1008284866126fb9190614615565b6127059190614615565b61270f9190614686565b90509392505050565b600080841161275c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275390614729565b60405180910390fd5b60008311801561276c5750600082115b6127ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a2906147bb565b60405180910390fd5b60006103e5856127bb9190614615565b9050600083826127cb9190614615565b90506000826103e8876127de9190614615565b6127e891906140d3565b905080826127f69190614686565b93505050509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461283f57819050612958565b600183606001515114801561285957506001836080015151145b612898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288f90614827565b60405180910390fd5b600083608001516000815181106128b2576128b1613a00565b5b60200260200101518060200190518101906128cd91906139b7565b9050600181606001515114612917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290e90614893565b60405180910390fd5b6000816060015160008151811061293157612930613a00565b5b602002602001015180602001905181019061294c9190613c73565b90508060800151925050505b92915050565b60007f8000000000000000000000000000000000000000000000000000000000000000821061298c57600080fd5b819050919050565b6000808473ffffffffffffffffffffffffffffffffffffffff1663095ea7b360e01b85856040516024016129c992919061403e565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051612a339190613f79565b6000604051808303816000865af19150503d8060008114612a70576040519150601f19603f3d011682016040523d82523d6000602084013e612a75565b606091505b5091509150818015612aa35750600081511480612aa2575080806020019051810190612aa19190613fa5565b5b5b612ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ad9906148ff565b60405180910390fd5b5050505050565b604051806101000160405280600060ff168152602001600060ff168152602001600060ff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081525090565b6040518060a00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160608152602001606081525090565b6000604051905090565b600080fd5b600080fd5b600060ff82169050919050565b612bd281612bbc565b8114612bdd57600080fd5b50565b600081359050612bef81612bc9565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c2082612bf5565b9050919050565b612c3081612c15565b8114612c3b57600080fd5b50565b600081359050612c4d81612c27565b92915050565b6000819050919050565b612c6681612c53565b8114612c7157600080fd5b50565b600081359050612c8381612c5d565b92915050565b600080600080600080600080610100898b031215612caa57612ca9612bb2565b5b6000612cb88b828c01612be0565b9850506020612cc98b828c01612be0565b9750506040612cda8b828c01612be0565b9650506060612ceb8b828c01612c3e565b9550506080612cfc8b828c01612c3e565b94505060a0612d0d8b828c01612c74565b93505060c0612d1e8b828c01612c74565b92505060e0612d2f8b828c01612c74565b9150509295985092959890939650565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d79578082015181840152602081019050612d5e565b60008484015250505050565b6000601f19601f8301169050919050565b6000612da182612d3f565b612dab8185612d4a565b9350612dbb818560208601612d5b565b612dc481612d85565b840191505092915050565b60006020820190508181036000830152612de98184612d96565b905092915050565b6000819050919050565b6000612e16612e11612e0c84612bf5565b612df1565b612bf5565b9050919050565b6000612e2882612dfb565b9050919050565b6000612e3a82612e1d565b9050919050565b612e4a81612e2f565b82525050565b6000602082019050612e656000830184612e41565b92915050565b612e7481612c15565b82525050565b6000602082019050612e8f6000830184612e6b565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612ed282612d85565b810181811067ffffffffffffffff82111715612ef157612ef0612e9a565b5b80604052505050565b6000612f04612ba8565b9050612f108282612ec9565b919050565b600067ffffffffffffffff821115612f3057612f2f612e9a565b5b602082029050602081019050919050565b600080fd5b600080fd5b600067ffffffffffffffff821115612f6657612f65612e9a565b5b612f6f82612d85565b9050602081019050919050565b82818337600083830152505050565b6000612f9e612f9984612f4b565b612efa565b905082815260208101848484011115612fba57612fb9612f46565b5b612fc5848285612f7c565b509392505050565b600082601f830112612fe257612fe1612e95565b5b8135612ff2848260208601612f8b565b91505092915050565b600061300e61300984612f15565b612efa565b9050808382526020820190506020840283018581111561303157613030612f41565b5b835b8181101561307857803567ffffffffffffffff81111561305657613055612e95565b5b8086016130638982612fcd565b85526020850194505050602081019050613033565b5050509392505050565b600082601f83011261309757613096612e95565b5b81356130a7848260208601612ffb565b91505092915050565b600080600080608085870312156130ca576130c9612bb2565b5b60006130d887828801612c3e565b94505060206130e987828801612c74565b935050604085013567ffffffffffffffff81111561310a57613109612bb7565b5b61311687828801613082565b925050606085013567ffffffffffffffff81111561313757613136612bb7565b5b61314387828801613082565b91505092959194509250565b600080fd5b600080fd5b60008115159050919050565b61316e81613159565b811461317957600080fd5b50565b60008135905061318b81613165565b92915050565b6000819050919050565b6131a481613191565b81146131af57600080fd5b50565b6000813590506131c18161319b565b92915050565b600061016082840312156131de576131dd61314f565b5b6131e9610160612efa565b905060006131f984828501612c3e565b600083015250602061320d84828501612c74565b602083015250604061322184828501612c3e565b604083015250606061323584828501612c74565b606083015250608061324984828501612c3e565b60808301525060a061325d84828501612c74565b60a08301525060c06132718482850161317c565b60c08301525060e061328584828501612be0565b60e08301525061010061329a848285016131b2565b610100830152506101206132b0848285016131b2565b6101208301525061014082013567ffffffffffffffff8111156132d6576132d5613154565b5b6132e284828501612fcd565b6101408301525092915050565b60006020828403121561330557613304612bb2565b5b600082013567ffffffffffffffff81111561332357613322612bb7565b5b61332f848285016131c7565b91505092915050565b61334181612c53565b82525050565b600060208201905061335c6000830184613338565b92915050565b61336b81613159565b82525050565b60006020820190506133866000830184613362565b92915050565b6000819050919050565b61339f8161338c565b81146133aa57600080fd5b50565b6000813590506133bc81613396565b92915050565b600080fd5b60008083601f8401126133dd576133dc612e95565b5b8235905067ffffffffffffffff8111156133fa576133f96133c2565b5b60208301915083600182028301111561341657613415612f41565b5b9250929050565b6000806000806060858703121561343757613436612bb2565b5b6000613445878288016133ad565b9450506020613456878288016133ad565b935050604085013567ffffffffffffffff81111561347757613476612bb7565b5b613483878288016133c7565b925092505092959194509250565b61349a81612bbc565b82525050565b6134a981612c15565b82525050565b6134b881612c53565b82525050565b610100820160008201516134d56000850182613491565b5060208201516134e86020850182613491565b5060408201516134fb6040850182613491565b50606082015161350e60608501826134a0565b50608082015161352160808501826134a0565b5060a082015161353460a08501826134af565b5060c082015161354760c08501826134af565b5060e082015161355a60e08501826134af565b50505050565b60006101008201905061357660008301846134be565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b60006135c482612d3f565b6135ce81856135a8565b93506135de818560208601612d5b565b6135e781612d85565b840191505092915050565b60006135fe83836135b9565b905092915050565b6000602082019050919050565b600061361e8261357c565b6136288185613587565b93508360208202850161363a85613598565b8060005b85811015613676578484038952815161365785826135f2565b945061366283613606565b925060208a0199505060018101905061363e565b50829750879550505050505092915050565b600060a0830160008301516136a060008601826134a0565b5060208301516136b360208601826134af565b5060408301516136c660408601826134af565b50606083015184820360608601526136de8282613613565b915050608083015184820360808601526136f88282613613565b9150508091505092915050565b6000602082019050818103600083015261371f8184613688565b905092915050565b600082825260208201905092915050565b7f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000600082015250565b600061376e601383613727565b915061377982613738565b602082019050919050565b6000602082019050818103600083015261379d81613761565b9050919050565b6000815190506137b381612c27565b92915050565b6000815190506137c881612c5d565b92915050565b60006137e16137dc84612f4b565b612efa565b9050828152602081018484840111156137fd576137fc612f46565b5b613808848285612d5b565b509392505050565b600082601f83011261382557613824612e95565b5b81516138358482602086016137ce565b91505092915050565b600061385161384c84612f15565b612efa565b9050808382526020820190506020840283018581111561387457613873612f41565b5b835b818110156138bb57805167ffffffffffffffff81111561389957613898612e95565b5b8086016138a68982613810565b85526020850194505050602081019050613876565b5050509392505050565b600082601f8301126138da576138d9612e95565b5b81516138ea84826020860161383e565b91505092915050565b600060a082840312156139095761390861314f565b5b61391360a0612efa565b90506000613923848285016137a4565b6000830152506020613937848285016137b9565b602083015250604061394b848285016137b9565b604083015250606082015167ffffffffffffffff81111561396f5761396e613154565b5b61397b848285016138c5565b606083015250608082015167ffffffffffffffff81111561399f5761399e613154565b5b6139ab848285016138c5565b60808301525092915050565b6000602082840312156139cd576139cc612bb2565b5b600082015167ffffffffffffffff8111156139eb576139ea612bb7565b5b6139f7848285016138f3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4653523a49490000000000000000000000000000000000000000000000000000600082015250565b6000613a65600683613727565b9150613a7082613a2f565b602082019050919050565b60006020820190508181036000830152613a9481613a58565b9050919050565b7f4653523a49450000000000000000000000000000000000000000000000000000600082015250565b6000613ad1600683613727565b9150613adc82613a9b565b602082019050919050565b60006020820190508181036000830152613b0081613ac4565b9050919050565b613b1081612bbc565b82525050565b613b1f81613191565b82525050565b600060e082019050613b3a600083018a612e6b565b613b476020830189612e6b565b613b546040830188613338565b613b616060830187613338565b613b6e6080830186613b07565b613b7b60a0830185613b16565b613b8860c0830184613b16565b98975050505050505050565b600081519050613ba381612bc9565b92915050565b60006101008284031215613bc057613bbf61314f565b5b613bcb610100612efa565b90506000613bdb84828501613b94565b6000830152506020613bef84828501613b94565b6020830152506040613c0384828501613b94565b6040830152506060613c17848285016137a4565b6060830152506080613c2b848285016137a4565b60808301525060a0613c3f848285016137b9565b60a08301525060c0613c53848285016137b9565b60c08301525060e0613c67848285016137b9565b60e08301525092915050565b60006101008284031215613c8a57613c89612bb2565b5b6000613c9884828501613ba9565b91505092915050565b600060208284031215613cb757613cb6612bb2565b5b6000613cc5848285016137b9565b91505092915050565b600081905092915050565b50565b6000613ce9600083613cce565b9150613cf482613cd9565b600082019050919050565b6000613d0a82613cdc565b9150819050919050565b7f4653523a496e76616c6964207472616e73666572000000000000000000000000600082015250565b6000613d4a601483613727565b9150613d5582613d14565b602082019050919050565b60006020820190508181036000830152613d7981613d3d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dba82612c53565b9150613dc583612c53565b9250828203905081811115613ddd57613ddc613d80565b5b92915050565b7f4653523a494f0000000000000000000000000000000000000000000000000000600082015250565b6000613e19600683613727565b9150613e2482613de3565b602082019050919050565b60006020820190508181036000830152613e4881613e0c565b9050919050565b6000608082019050613e646000830187612e6b565b613e716020830186612e6b565b613e7e6040830185613338565b613e8b6060830184613338565b95945050505050565b600060408284031215613eaa57613ea961314f565b5b613eb46040612efa565b90506000613ec484828501612c3e565b6000830152506020613ed88482850161317c565b60208301525092915050565b600060408284031215613efa57613ef9612bb2565b5b6000613f0884828501613e94565b91505092915050565b6000606082019050613f266000830186612e6b565b613f336020830185612e6b565b613f406040830184613338565b949350505050565b6000613f5382612d3f565b613f5d8185613cce565b9350613f6d818560208601612d5b565b80840191505092915050565b6000613f858284613f48565b915081905092915050565b600081519050613f9f81613165565b92915050565b600060208284031215613fbb57613fba612bb2565b5b6000613fc984828501613f90565b91505092915050565b7f5354460000000000000000000000000000000000000000000000000000000000600082015250565b6000614008600383613727565b915061401382613fd2565b602082019050919050565b6000602082019050818103600083015261403781613ffb565b9050919050565b60006040820190506140536000830185612e6b565b6140606020830184613338565b9392505050565b7f5354000000000000000000000000000000000000000000000000000000000000600082015250565b600061409d600283613727565b91506140a882614067565b602082019050919050565b600060208201905081810360008301526140cc81614090565b9050919050565b60006140de82612c53565b91506140e983612c53565b925082820190508082111561410157614100613d80565b5b92915050565b600060408201905061411c6000830185613338565b6141296020830184612e6b565b9392505050565b60006dffffffffffffffffffffffffffff82169050919050565b61415381614130565b811461415e57600080fd5b50565b6000815190506141708161414a565b92915050565b600063ffffffff82169050919050565b61418f81614176565b811461419a57600080fd5b50565b6000815190506141ac81614186565b92915050565b6000806000606084860312156141cb576141ca612bb2565b5b60006141d986828701614161565b93505060206141ea86828701614161565b92505060406141fb8682870161419d565b9150509250925092565b600060808201905061421a6000830187613338565b6142276020830186613338565b6142346040830185612e6b565b81810360608301526142468184612d96565b905095945050505050565b61425a81613159565b82525050565b60408201600082015161427660008501826134a0565b5060208201516142896020850182614251565b50505050565b60006040820190506142a46000830184614260565b92915050565b6142b38161338c565b82525050565b6142c281612bf5565b82525050565b600060a0820190506142dd6000830188612e6b565b6142ea6020830187613362565b6142f760408301866142aa565b61430460608301856142b9565b81810360808301526143168184612d96565b90509695505050505050565b60008151905061433181613396565b92915050565b6000806040838503121561434e5761434d612bb2565b5b600061435c85828601614322565b925050602061436d85828601614322565b9150509250929050565b60006143828261338c565b91507f800000000000000000000000000000000000000000000000000000000000000082036143b4576143b3613d80565b5b816000039050919050565b6000819050919050565b60006143e46143df6143da846143bf565b612df1565b612c53565b9050919050565b6143f4816143c9565b82525050565b600060808201905061440f6000830187613338565b61441c6020830186613338565b6144296040830185613338565b61443660608301846143eb565b95945050505050565b600081600f0b9050919050565b6144558161443f565b82525050565b6000608082019050614470600083018761444c565b61447d602083018661444c565b61448a6040830185613338565b61449760608301846143eb565b95945050505050565b600060a0820190506144b56000830188613b07565b6144c26020830187613b07565b6144cf6040830186613338565b6144dc60608301856143eb565b6144e96080830184613338565b9695505050505050565b60006040820190506145086000830185613338565b61451560208301846143eb565b9392505050565b600060a082019050614531600083018861444c565b61453e602083018761444c565b61454b6040830186613338565b61455860608301856143eb565b6145656080830184612e6b565b9695505050505050565b60006060820190506145846000830186613338565b6145916020830185612e6b565b61459e6040830184612e6b565b949350505050565b600060e0820190506145bb600083018a612e6b565b6145c86020830189612e6b565b6145d56040830188613338565b6145e26060830187612e6b565b6145ef6080830186613b07565b6145fc60a0830185612e6b565b61460960c0830184613338565b98975050505050505050565b600061462082612c53565b915061462b83612c53565b925082820261463981612c53565b915082820484148315176146505761464f613d80565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061469182612c53565b915061469c83612c53565b9250826146ac576146ab614657565b5b828204905092915050565b7f556e697377617056324c6962726172793a20494e53554646494349454e545f4960008201527f4e5055545f414d4f554e54000000000000000000000000000000000000000000602082015250565b6000614713602b83613727565b915061471e826146b7565b604082019050919050565b6000602082019050818103600083015261474281614706565b9050919050565b7f556e697377617056324c6962726172793a20494e53554646494349454e545f4c60008201527f4951554944495459000000000000000000000000000000000000000000000000602082015250565b60006147a5602883613727565b91506147b082614749565b604082019050919050565b600060208201905081810360008301526147d481614798565b9050919050565b7f4653523a204446526f7574657300000000000000000000000000000000000000600082015250565b6000614811600d83613727565b915061481c826147db565b602082019050919050565b6000602082019050818103600083015261484081614804565b9050919050565b7f4653523a20444653746570730000000000000000000000000000000000000000600082015250565b600061487d600c83613727565b915061488882614847565b602082019050919050565b600060208201905081810360008301526148ac81614870565b9050919050565b7f5341000000000000000000000000000000000000000000000000000000000000600082015250565b60006148e9600283613727565b91506148f4826148b3565b602082019050919050565b60006020820190508181036000830152614918816148dc565b905091905056000000000000000000000000fc00000000000000000000000000000000000006000000000000000000000000fc000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001", + "nonce": "0x7e", + "chainId": "0xfc" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x3f81bb", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xf5db9329e47777d50772c642e0f24492a334e64ceb14cf50c3e6c73319388e83", + "transactionIndex": "0x1", + "blockHash": "0xd47ed71ee415642196ae33653086ed1a271f4978c0a0ea84520d3b03b9563f64", + "blockNumber": "0x4553d4", + "gasUsed": "0x3ebc45", + "effectiveGasPrice": "0xfe", + "from": "0xb0e1650a9760e0f383174af042091fc544b8356f", + "to": null, + "contractAddress": "0x46d2487cdbea04411c49e6c55ace805bfa8f5de5", + "l1Fee": "0x2c784a43454a", + "l1FeeScalar": "0.05", + "l1GasPrice": "0xcac3c677", + "l1GasUsed": "0x462e8" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1715897630, + "chain": 252, + "commit": "2e3b46e" +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7543ad9..c03f4a9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,121 +1,1379 @@ -lockfileVersion: "6.0" +lockfileVersion: "9.0" settings: autoInstallPeers: true excludeLinksFromLockfile: false -dependencies: - ds-test: - specifier: github:dapphub/ds-test - version: github.com/dapphub/ds-test/e282159d5170298eb2455a6c05280ab5a73a4ef0 - forge-std: - specifier: github:foundry-rs/forge-std#e8a047e3f40f13fa37af6fe14e6e06283d9a060e - version: github.com/foundry-rs/forge-std/e8a047e3f40f13fa37af6fe14e6e06283d9a060e - frax-standard-solidity: - specifier: github:FraxFinance/frax-standard-solidity - version: github.com/FraxFinance/frax-standard-solidity/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6(ethers@5.7.2) - solidity-bytes-utils: - specifier: github:GNSPS/solidity-bytes-utils - version: github.com/GNSPS/solidity-bytes-utils/df88556cbbc267b33a787a3a6eaa32fd7247b589 - -devDependencies: - "@openzeppelin/contracts": - specifier: ^5.0.1 - version: 5.0.1 - husky: - specifier: ^8.0.3 - version: 8.0.3 - lint-staged: - specifier: ^13.3.0 - version: 13.3.0 - prettier: - specifier: ^3.2.4 - version: 3.2.5 - prettier-plugin-solidity: - specifier: ^1.3.1 - version: 1.3.1(prettier@3.2.5) - prettier-plugin-svelte: - specifier: ^3.1.2 - version: 3.1.2(prettier@3.2.5)(svelte@4.2.10) - solhint: - specifier: ^3.6.2 - version: 3.6.2(typescript@5.3.3) - solhint-plugin-prettier: - specifier: ^0.1.0 - version: 0.1.0(prettier-plugin-solidity@1.3.1)(prettier@3.2.5) - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@20.11.16)(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 +importers: + .: + dependencies: + ds-test: + specifier: github:dapphub/ds-test + version: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 + forge-std: + specifier: github:foundry-rs/forge-std#e8a047e3f40f13fa37af6fe14e6e06283d9a060e + version: https://codeload.github.com/foundry-rs/forge-std/tar.gz/e8a047e3f40f13fa37af6fe14e6e06283d9a060e + frax-standard-solidity: + specifier: github:FraxFinance/frax-standard-solidity + version: https://codeload.github.com/FraxFinance/frax-standard-solidity/tar.gz/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6(ethers@5.7.2) + solidity-bytes-utils: + specifier: github:GNSPS/solidity-bytes-utils + version: https://codeload.github.com/GNSPS/solidity-bytes-utils/tar.gz/df88556cbbc267b33a787a3a6eaa32fd7247b589 + devDependencies: + "@openzeppelin/contracts": + specifier: ^5.0.1 + version: 5.0.1 + husky: + specifier: ^8.0.3 + version: 8.0.3 + lint-staged: + specifier: ^13.3.0 + version: 13.3.0 + prettier: + specifier: ^3.2.4 + version: 3.2.5 + prettier-plugin-solidity: + specifier: ^1.3.1 + version: 1.3.1(prettier@3.2.5) + prettier-plugin-svelte: + specifier: ^3.1.2 + version: 3.1.2(prettier@3.2.5)(svelte@4.2.10) + solhint: + specifier: ^3.6.2 + version: 3.6.2(typescript@5.3.3) + solhint-plugin-prettier: + specifier: ^0.1.0 + version: 0.1.0(prettier-plugin-solidity@1.3.1)(prettier@3.2.5) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@20.11.16)(typescript@5.3.3) + typescript: + specifier: ^5.3.3 + version: 5.3.3 + +packages: + "@ampproject/remapping@2.2.1": + resolution: + { integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== } + engines: { node: ">=6.0.0" } + + "@babel/code-frame@7.23.5": + resolution: + { integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.22.20": + resolution: + { integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== } + engines: { node: ">=6.9.0" } + + "@babel/highlight@7.23.4": + resolution: + { integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== } + engines: { node: ">=6.9.0" } + + "@babel/runtime@7.23.9": + resolution: + { integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== } + engines: { node: ">=6.9.0" } + + "@chainlink/contracts@0.6.1": + resolution: + { integrity: sha512-EuwijGexttw0UjfrW+HygwhQIrGAbqpf1ue28R55HhWMHBzphEH0PhWm8DQmFfj5OZNy8Io66N4L0nStkZ3QKQ== } + + "@cspotcode/source-map-support@0.8.1": + resolution: + { integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== } + engines: { node: ">=12" } + + "@eth-optimism/contracts@0.5.40": + resolution: + { integrity: sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w== } + peerDependencies: + ethers: ^5 + + "@eth-optimism/core-utils@0.12.0": + resolution: + { integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw== } + + "@ethersproject/abi@5.7.0": + resolution: + { integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== } + + "@ethersproject/abstract-provider@5.7.0": + resolution: + { integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== } + + "@ethersproject/abstract-signer@5.7.0": + resolution: + { integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== } + + "@ethersproject/address@5.7.0": + resolution: + { integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== } + + "@ethersproject/base64@5.7.0": + resolution: + { integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== } + + "@ethersproject/basex@5.7.0": + resolution: + { integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== } + + "@ethersproject/bignumber@5.7.0": + resolution: + { integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== } + + "@ethersproject/bytes@5.7.0": + resolution: + { integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== } + + "@ethersproject/constants@5.7.0": + resolution: + { integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== } + + "@ethersproject/contracts@5.7.0": + resolution: + { integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== } + + "@ethersproject/hash@5.7.0": + resolution: + { integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== } + + "@ethersproject/hdnode@5.7.0": + resolution: + { integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== } + + "@ethersproject/json-wallets@5.7.0": + resolution: + { integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== } + + "@ethersproject/keccak256@5.7.0": + resolution: + { integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== } + + "@ethersproject/logger@5.7.0": + resolution: + { integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== } + + "@ethersproject/networks@5.7.1": + resolution: + { integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== } + + "@ethersproject/pbkdf2@5.7.0": + resolution: + { integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== } + + "@ethersproject/properties@5.7.0": + resolution: + { integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== } + + "@ethersproject/providers@5.7.2": + resolution: + { integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== } + + "@ethersproject/random@5.7.0": + resolution: + { integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== } + + "@ethersproject/rlp@5.7.0": + resolution: + { integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== } + + "@ethersproject/sha2@5.7.0": + resolution: + { integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== } + + "@ethersproject/signing-key@5.7.0": + resolution: + { integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== } + + "@ethersproject/solidity@5.7.0": + resolution: + { integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== } + + "@ethersproject/strings@5.7.0": + resolution: + { integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== } + + "@ethersproject/transactions@5.7.0": + resolution: + { integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== } + + "@ethersproject/units@5.7.0": + resolution: + { integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== } + + "@ethersproject/wallet@5.7.0": + resolution: + { integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== } + + "@ethersproject/web@5.7.1": + resolution: + { integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== } + + "@ethersproject/wordlists@5.7.0": + resolution: + { integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== } + + "@jridgewell/gen-mapping@0.3.3": + resolution: + { integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== } + engines: { node: ">=6.0.0" } + + "@jridgewell/resolve-uri@3.1.1": + resolution: + { integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== } + engines: { node: ">=6.0.0" } + + "@jridgewell/set-array@1.1.2": + resolution: + { integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== } + engines: { node: ">=6.0.0" } + + "@jridgewell/sourcemap-codec@1.4.15": + resolution: + { integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== } + + "@jridgewell/trace-mapping@0.3.22": + resolution: + { integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== } + + "@jridgewell/trace-mapping@0.3.9": + resolution: + { integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== } + + "@openzeppelin/contracts-upgradeable@4.9.5": + resolution: + { integrity: sha512-f7L1//4sLlflAN7fVzJLoRedrf5Na3Oal5PZfIq55NFcVZ90EpV1q5xOvL4lFvg3MNICSDr2hH0JUBxwlxcoPg== } + + "@openzeppelin/contracts@3.4.2": + resolution: + { integrity: sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA== } + + "@openzeppelin/contracts@4.3.3": + resolution: + { integrity: sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g== } + + "@openzeppelin/contracts@5.0.1": + resolution: + { integrity: sha512-yQJaT5HDp9hYOOp4jTYxMsR02gdFZFXhewX5HW9Jo4fsqSVqqyIO/xTHdWDaKX5a3pv1txmf076Lziz+sO7L1w== } + + "@prettier/sync@0.3.0": + resolution: + { integrity: sha512-3dcmCyAxIcxy036h1I7MQU/uEEBq8oLwf1CE3xeze+MPlgkdlb/+w6rGR/1dhp6Hqi17fRS6nvwnOzkESxEkOw== } + peerDependencies: + prettier: ^3.0.0 + + "@solidity-parser/parser@0.16.2": + resolution: + { integrity: sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg== } + + "@solidity-parser/parser@0.17.0": + resolution: + { integrity: sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw== } + + "@tsconfig/node10@1.0.9": + resolution: + { integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== } + + "@tsconfig/node12@1.0.11": + resolution: + { integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== } + + "@tsconfig/node14@1.0.3": + resolution: + { integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== } + + "@tsconfig/node16@1.0.4": + resolution: + { integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== } + + "@types/estree@1.0.5": + resolution: + { integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== } + + "@types/fs-extra@11.0.4": + resolution: + { integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ== } + + "@types/jsonfile@6.1.4": + resolution: + { integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ== } + + "@types/node@18.19.14": + resolution: + { integrity: sha512-EnQ4Us2rmOS64nHDWr0XqAD8DsO6f3XR6lf9UIIrZQpUzPVdN/oPuEzfDWNHSyXLvoGgjuEm/sPwFGSSs35Wtg== } + + "@types/node@20.11.16": + resolution: + { integrity: sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ== } + + acorn-walk@8.3.2: + resolution: + { integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== } + engines: { node: ">=0.4.0" } + + acorn@8.11.3: + resolution: + { integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== } + engines: { node: ">=0.4.0" } + hasBin: true + + aes-js@3.0.0: + resolution: + { integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== } + + ajv@6.12.6: + resolution: + { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== } + + ajv@8.12.0: + resolution: + { integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== } + + ansi-escapes@5.0.0: + resolution: + { integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== } + engines: { node: ">=12" } + + ansi-regex@5.0.1: + resolution: + { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== } + engines: { node: ">=8" } + + ansi-regex@6.0.1: + resolution: + { integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== } + engines: { node: ">=12" } + + ansi-styles@3.2.1: + resolution: + { integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== } + engines: { node: ">=4" } + + ansi-styles@4.3.0: + resolution: + { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } + engines: { node: ">=8" } + + ansi-styles@6.2.1: + resolution: + { integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== } + engines: { node: ">=12" } + + antlr4@4.13.1: + resolution: + { integrity: sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA== } + engines: { node: ">=16" } + + antlr4ts@0.5.0-alpha.4: + resolution: + { integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== } + + arg@4.1.3: + resolution: + { integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== } + + argparse@2.0.1: + resolution: + { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } + + aria-query@5.3.0: + resolution: + { integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== } + + assertion-error@1.1.0: + resolution: + { integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== } + + ast-parents@0.0.1: + resolution: + { integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== } + + astral-regex@2.0.0: + resolution: + { integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== } + engines: { node: ">=8" } + + axobject-query@4.0.0: + resolution: + { integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw== } + + balanced-match@1.0.2: + resolution: + { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } + + bech32@1.1.4: + resolution: + { integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== } + + bn.js@4.12.0: + resolution: + { integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== } + + bn.js@5.2.1: + resolution: + { integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== } + + brace-expansion@2.0.1: + resolution: + { integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== } + + braces@3.0.2: + resolution: + { integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== } + engines: { node: ">=8" } + + brorand@1.1.0: + resolution: + { integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== } + + bufio@1.2.1: + resolution: + { integrity: sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA== } + engines: { node: ">=14.0.0" } + + callsites@3.1.0: + resolution: + { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } + engines: { node: ">=6" } + + camel-case@4.1.2: + resolution: + { integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== } + + capital-case@1.0.4: + resolution: + { integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== } + + chai@4.4.1: + resolution: + { integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== } + engines: { node: ">=4" } + + chalk@2.4.2: + resolution: + { integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== } + engines: { node: ">=4" } + + chalk@4.1.2: + resolution: + { integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== } + engines: { node: ">=10" } + + chalk@5.3.0: + resolution: + { integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + + change-case@4.1.2: + resolution: + { integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== } + + check-error@1.0.3: + resolution: + { integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== } + + cli-cursor@4.0.0: + resolution: + { integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + cli-truncate@3.1.0: + resolution: + { integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + code-red@1.0.4: + resolution: + { integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw== } + + color-convert@1.9.3: + resolution: + { integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== } + + color-convert@2.0.1: + resolution: + { integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== } + engines: { node: ">=7.0.0" } + + color-name@1.1.3: + resolution: + { integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== } + + color-name@1.1.4: + resolution: + { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== } + + colorette@2.0.20: + resolution: + { integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== } + + command-exists@1.2.9: + resolution: + { integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== } + + commander@10.0.1: + resolution: + { integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== } + engines: { node: ">=14" } + + commander@11.0.0: + resolution: + { integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== } + engines: { node: ">=16" } + + commander@8.3.0: + resolution: + { integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== } + engines: { node: ">= 12" } + + constant-case@3.0.4: + resolution: + { integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== } + + cosmiconfig@8.3.6: + resolution: + { integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== } + engines: { node: ">=14" } + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + + create-require@1.1.1: + resolution: + { integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== } + + cross-spawn@7.0.3: + resolution: + { integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== } + engines: { node: ">= 8" } + + css-tree@2.3.1: + resolution: + { integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } + + date-fns@2.30.0: + resolution: + { integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== } + engines: { node: ">=0.11" } + + debug@4.3.4: + resolution: + { integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== } + engines: { node: ">=6.0" } + peerDependencies: + supports-color: "*" + peerDependenciesMeta: + supports-color: + optional: true + + deep-eql@4.1.3: + resolution: + { integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== } + engines: { node: ">=6" } + + dequal@2.0.3: + resolution: + { integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== } + engines: { node: ">=6" } + + diff@4.0.2: + resolution: + { integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== } + engines: { node: ">=0.3.1" } + + dot-case@3.0.4: + resolution: + { integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== } + + ds-test@https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0: + resolution: { tarball: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 } + name: ds-test + version: 1.0.0 + + eastasianwidth@0.2.0: + resolution: + { integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== } + + elliptic@6.5.4: + resolution: + { integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== } + + emoji-regex@8.0.0: + resolution: + { integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== } + + emoji-regex@9.2.2: + resolution: + { integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== } + + error-ex@1.3.2: + resolution: + { integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== } + + escape-string-regexp@1.0.5: + resolution: + { integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== } + engines: { node: ">=0.8.0" } + + estree-walker@3.0.3: + resolution: + { integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== } + + ethers@5.7.2: + resolution: + { integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== } + + eventemitter3@5.0.1: + resolution: + { integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== } + + execa@7.2.0: + resolution: + { integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== } + engines: { node: ^14.18.0 || ^16.14.0 || >=18.0.0 } + + fast-deep-equal@3.1.3: + resolution: + { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } + + fast-diff@1.3.0: + resolution: + { integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== } + + fast-json-stable-stringify@2.1.0: + resolution: + { integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== } + + fill-range@7.0.1: + resolution: + { integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== } + engines: { node: ">=8" } + + follow-redirects@1.15.5: + resolution: + { integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== } + engines: { node: ">=4.0" } + peerDependencies: + debug: "*" + peerDependenciesMeta: + debug: + optional: true + + forge-std@1.1.2: + resolution: + { integrity: sha512-Wfb0iAS9PcfjMKtGpWQw9mXzJxrWD62kJCUqqLcyuI0+VRtJ3j20XembjF3kS20qELYdXft1vD/SPFVWVKMFOw== } + + forge-std@https://codeload.github.com/foundry-rs/forge-std/tar.gz/e8a047e3f40f13fa37af6fe14e6e06283d9a060e: + resolution: + { tarball: https://codeload.github.com/foundry-rs/forge-std/tar.gz/e8a047e3f40f13fa37af6fe14e6e06283d9a060e } + name: forge-std + version: 1.5.6 + + frax-standard-solidity@https://codeload.github.com/FraxFinance/frax-standard-solidity/tar.gz/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6: + resolution: + { + tarball: https://codeload.github.com/FraxFinance/frax-standard-solidity/tar.gz/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6, + } + name: frax-standard-solidity + version: 1.0.0 + + fs-extra@11.2.0: + resolution: + { integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== } + engines: { node: ">=14.14" } + + fs.realpath@1.0.0: + resolution: + { integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== } + + get-func-name@2.0.2: + resolution: + { integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== } + + get-stream@6.0.1: + resolution: + { integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== } + engines: { node: ">=10" } + + glob@8.1.0: + resolution: + { integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== } + engines: { node: ">=12" } + + graceful-fs@4.2.11: + resolution: + { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } + + has-flag@3.0.0: + resolution: + { integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== } + engines: { node: ">=4" } + + has-flag@4.0.0: + resolution: + { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } + engines: { node: ">=8" } + + hash.js@1.1.7: + resolution: + { integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== } + + header-case@2.0.4: + resolution: + { integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== } + + hmac-drbg@1.0.1: + resolution: + { integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== } + + human-signals@4.3.1: + resolution: + { integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== } + engines: { node: ">=14.18.0" } + + husky@8.0.3: + resolution: + { integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== } + engines: { node: ">=14" } + hasBin: true + + ignore@5.3.1: + resolution: + { integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== } + engines: { node: ">= 4" } + + import-fresh@3.3.0: + resolution: + { integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== } + engines: { node: ">=6" } + + inflight@1.0.6: + resolution: + { integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== } + + inherits@2.0.4: + resolution: + { integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== } + + is-arrayish@0.2.1: + resolution: + { integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== } + + is-fullwidth-code-point@3.0.0: + resolution: + { integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== } + engines: { node: ">=8" } + + is-fullwidth-code-point@4.0.0: + resolution: + { integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== } + engines: { node: ">=12" } + + is-number@7.0.0: + resolution: + { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } + engines: { node: ">=0.12.0" } + + is-reference@3.0.2: + resolution: + { integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg== } + + is-stream@3.0.0: + resolution: + { integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + isexe@2.0.0: + resolution: + { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } + + js-sha3@0.8.0: + resolution: + { integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== } + + js-tokens@4.0.0: + resolution: + { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== } + + js-yaml@4.1.0: + resolution: + { integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== } + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: + { integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== } + + json-schema-traverse@0.4.1: + resolution: + { integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== } + + json-schema-traverse@1.0.0: + resolution: + { integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== } + + jsonfile@6.1.0: + resolution: + { integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== } + + lilconfig@2.1.0: + resolution: + { integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== } + engines: { node: ">=10" } + + lines-and-columns@1.2.4: + resolution: + { integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== } + + lint-staged@13.3.0: + resolution: + { integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ== } + engines: { node: ^16.14.0 || >=18.0.0 } + hasBin: true + + listr2@6.6.1: + resolution: + { integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg== } + engines: { node: ">=16.0.0" } + peerDependencies: + enquirer: ">= 2.3.0 < 3" + peerDependenciesMeta: + enquirer: + optional: true + + locate-character@3.0.0: + resolution: + { integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA== } + + lodash.truncate@4.4.2: + resolution: + { integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== } + + lodash@4.17.21: + resolution: + { integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== } + + log-update@5.0.1: + resolution: + { integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + loupe@2.3.7: + resolution: + { integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== } + + lower-case@2.0.2: + resolution: + { integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== } + + lru-cache@6.0.0: + resolution: + { integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== } + engines: { node: ">=10" } + + magic-string@0.30.7: + resolution: + { integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA== } + engines: { node: ">=12" } + + make-error@1.3.6: + resolution: + { integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== } + + mdn-data@2.0.30: + resolution: + { integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== } + + memorystream@0.3.1: + resolution: + { integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== } + engines: { node: ">= 0.10.0" } + + merge-stream@2.0.0: + resolution: + { integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== } + + micromatch@4.0.5: + resolution: + { integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== } + engines: { node: ">=8.6" } + + mimic-fn@2.1.0: + resolution: + { integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== } + engines: { node: ">=6" } + + mimic-fn@4.0.0: + resolution: + { integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== } + engines: { node: ">=12" } + + minimalistic-assert@1.0.1: + resolution: + { integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== } + + minimalistic-crypto-utils@1.0.1: + resolution: + { integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== } + + minimatch@5.1.6: + resolution: + { integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== } + engines: { node: ">=10" } + + ms@2.1.2: + resolution: + { integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== } + + no-case@3.0.4: + resolution: + { integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== } + + npm-run-path@5.2.0: + resolution: + { integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + once@1.4.0: + resolution: + { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== } + + onetime@5.1.2: + resolution: + { integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== } + engines: { node: ">=6" } + + onetime@6.0.0: + resolution: + { integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== } + engines: { node: ">=12" } + + os-tmpdir@1.0.2: + resolution: + { integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== } + engines: { node: ">=0.10.0" } + + param-case@3.0.4: + resolution: + { integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== } + + parent-module@1.0.1: + resolution: + { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } + engines: { node: ">=6" } + + parse-json@5.2.0: + resolution: + { integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== } + engines: { node: ">=8" } + + pascal-case@3.1.2: + resolution: + { integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== } + + path-case@3.0.4: + resolution: + { integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== } + + path-key@3.1.1: + resolution: + { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } + engines: { node: ">=8" } + + path-key@4.0.0: + resolution: + { integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== } + engines: { node: ">=12" } + + path-type@4.0.0: + resolution: + { integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== } + engines: { node: ">=8" } + + pathval@1.1.1: + resolution: + { integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== } + + periscopic@3.1.0: + resolution: + { integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== } + + picomatch@2.3.1: + resolution: + { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== } + engines: { node: ">=8.6" } + + pidtree@0.6.0: + resolution: + { integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== } + engines: { node: ">=0.10" } + hasBin: true + + pluralize@8.0.0: + resolution: + { integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== } + engines: { node: ">=4" } + + prettier-linter-helpers@1.0.0: + resolution: + { integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== } + engines: { node: ">=6.0.0" } + + prettier-plugin-solidity@1.3.1: + resolution: + { integrity: sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA== } + engines: { node: ">=16" } + peerDependencies: + prettier: ">=2.3.0" + + prettier-plugin-svelte@3.1.2: + resolution: + { integrity: sha512-7xfMZtwgAWHMT0iZc8jN4o65zgbAQ3+O32V6W7pXrqNvKnHnkoyQCGCbKeUyXKZLbYE0YhFRnamfxfkEGxm8qA== } + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + + prettier@2.8.8: + resolution: + { integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== } + engines: { node: ">=10.13.0" } + hasBin: true + + prettier@3.2.5: + resolution: + { integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== } + engines: { node: ">=14" } + hasBin: true + + punycode@2.3.1: + resolution: + { integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== } + engines: { node: ">=6" } + + regenerator-runtime@0.14.1: + resolution: + { integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== } + + require-from-string@2.0.2: + resolution: + { integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== } + engines: { node: ">=0.10.0" } + + resolve-from@4.0.0: + resolution: + { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } + engines: { node: ">=4" } + + restore-cursor@4.0.0: + resolution: + { integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + rfdc@1.3.1: + resolution: + { integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== } + + scrypt-js@3.0.1: + resolution: + { integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== } -packages: - /@ampproject/remapping@2.2.1: + semver@5.7.2: resolution: - { integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== } - engines: { node: ">=6.0.0" } + { integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== } + hasBin: true + + semver@7.6.0: + resolution: + { integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== } + engines: { node: ">=10" } + hasBin: true + + sentence-case@3.0.4: + resolution: + { integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== } + + shebang-command@2.0.0: + resolution: + { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== } + engines: { node: ">=8" } + + shebang-regex@3.0.0: + resolution: + { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== } + engines: { node: ">=8" } + + signal-exit@3.0.7: + resolution: + { integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== } + + slice-ansi@4.0.0: + resolution: + { integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== } + engines: { node: ">=10" } + + slice-ansi@5.0.0: + resolution: + { integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== } + engines: { node: ">=12" } + + snake-case@3.0.4: + resolution: + { integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== } + + solc@0.8.24: + resolution: + { integrity: sha512-G5yUqjTUPc8Np74sCFwfsevhBPlUifUOfhYrgyu6CmYlC6feSw0YS6eZW47XDT23k3JYdKx5nJ+Q7whCEmNcoA== } + engines: { node: ">=10.0.0" } + hasBin: true + + solhint-plugin-prettier@0.1.0: + resolution: + { integrity: sha512-SDOTSM6tZxZ6hamrzl3GUgzF77FM6jZplgL2plFBclj/OjKP8Z3eIPojKU73gRr0MvOS8ACZILn8a5g0VTz/Gw== } + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-solidity: ^1.0.0 + + solhint@3.6.2: + resolution: + { integrity: sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ== } + hasBin: true + + solidity-bytes-utils@0.8.2: + resolution: + { integrity: sha512-cqXPYAV2auhpdKSTPuqji0CwpSceZDu95CzqSM/9tDJ2MoMaMsdHTpOIWtVw31BIqqGPNmIChCswzbw0tHaMTw== } + + solidity-bytes-utils@https://codeload.github.com/GNSPS/solidity-bytes-utils/tar.gz/df88556cbbc267b33a787a3a6eaa32fd7247b589: + resolution: + { + tarball: https://codeload.github.com/GNSPS/solidity-bytes-utils/tar.gz/df88556cbbc267b33a787a3a6eaa32fd7247b589, + } + name: solidity-bytes-utils + version: 0.8.2 + + solidity-comments-extractor@0.0.8: + resolution: + { integrity: sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g== } + + source-map-js@1.0.2: + resolution: + { integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== } + engines: { node: ">=0.10.0" } + + string-argv@0.3.2: + resolution: + { integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== } + engines: { node: ">=0.6.19" } + + string-width@4.2.3: + resolution: + { integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== } + engines: { node: ">=8" } + + string-width@5.1.2: + resolution: + { integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== } + engines: { node: ">=12" } + + strip-ansi@6.0.1: + resolution: + { integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== } + engines: { node: ">=8" } + + strip-ansi@7.1.0: + resolution: + { integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== } + engines: { node: ">=12" } + + strip-final-newline@3.0.0: + resolution: + { integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== } + engines: { node: ">=12" } + + supports-color@5.5.0: + resolution: + { integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== } + engines: { node: ">=4" } + + supports-color@7.2.0: + resolution: + { integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== } + engines: { node: ">=8" } + + svelte@4.2.10: + resolution: + { integrity: sha512-Ep06yCaCdgG1Mafb/Rx8sJ1QS3RW2I2BxGp2Ui9LBHSZ2/tO/aGLc5WqPjgiAP6KAnLJGaIr/zzwQlOo1b8MxA== } + engines: { node: ">=16" } + + table@6.8.1: + resolution: + { integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== } + engines: { node: ">=10.0.0" } + + text-table@0.2.0: + resolution: + { integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== } + + tmp@0.0.33: + resolution: + { integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== } + engines: { node: ">=0.6.0" } + + to-regex-range@5.0.1: + resolution: + { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } + engines: { node: ">=8.0" } + + toml@3.0.0: + resolution: + { integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== } + + ts-node@10.9.2: + resolution: + { integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== } + hasBin: true + peerDependencies: + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" + peerDependenciesMeta: + "@swc/core": + optional: true + "@swc/wasm": + optional: true + + tslib@2.6.2: + resolution: + { integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== } + + type-detect@4.0.8: + resolution: + { integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== } + engines: { node: ">=4" } + + type-fest@1.4.0: + resolution: + { integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== } + engines: { node: ">=10" } + + typescript@5.3.3: + resolution: + { integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== } + engines: { node: ">=14.17" } + hasBin: true + + undici-types@5.26.5: + resolution: + { integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== } + + universalify@2.0.1: + resolution: + { integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== } + engines: { node: ">= 10.0.0" } + + upper-case-first@2.0.2: + resolution: + { integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== } + + upper-case@2.0.2: + resolution: + { integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== } + + uri-js@4.4.1: + resolution: + { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } + + v8-compile-cache-lib@3.0.1: + resolution: + { integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== } + + which@2.0.2: + resolution: + { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } + engines: { node: ">= 8" } + hasBin: true + + wrap-ansi@8.1.0: + resolution: + { integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== } + engines: { node: ">=12" } + + wrappy@1.0.2: + resolution: + { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== } + + ws@7.4.6: + resolution: + { integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== } + engines: { node: ">=8.3.0" } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + yallist@4.0.0: + resolution: + { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== } + + yaml@2.3.1: + resolution: + { integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== } + engines: { node: ">= 14" } + + yn@3.1.1: + resolution: + { integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== } + engines: { node: ">=6" } + +snapshots: + "@ampproject/remapping@2.2.1": dependencies: "@jridgewell/gen-mapping": 0.3.3 "@jridgewell/trace-mapping": 0.3.22 - dev: true - /@babel/code-frame@7.23.5: - resolution: - { integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== } - engines: { node: ">=6.9.0" } + "@babel/code-frame@7.23.5": dependencies: "@babel/highlight": 7.23.4 chalk: 2.4.2 - /@babel/helper-validator-identifier@7.22.20: - resolution: - { integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== } - engines: { node: ">=6.9.0" } + "@babel/helper-validator-identifier@7.22.20": {} - /@babel/highlight@7.23.4: - resolution: - { integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== } - engines: { node: ">=6.9.0" } + "@babel/highlight@7.23.4": dependencies: "@babel/helper-validator-identifier": 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/runtime@7.23.9: - resolution: - { integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== } - engines: { node: ">=6.9.0" } + "@babel/runtime@7.23.9": dependencies: regenerator-runtime: 0.14.1 - dev: false - /@chainlink/contracts@0.6.1(ethers@5.7.2): - resolution: - { integrity: sha512-EuwijGexttw0UjfrW+HygwhQIrGAbqpf1ue28R55HhWMHBzphEH0PhWm8DQmFfj5OZNy8Io66N4L0nStkZ3QKQ== } + "@chainlink/contracts@0.6.1(ethers@5.7.2)": dependencies: "@eth-optimism/contracts": 0.5.40(ethers@5.7.2) "@openzeppelin/contracts": 4.3.3 "@openzeppelin/contracts-upgradeable": 4.9.5 - "@openzeppelin/contracts-v0.7": /@openzeppelin/contracts@3.4.2 + "@openzeppelin/contracts-v0.7": "@openzeppelin/contracts@3.4.2" transitivePeerDependencies: - bufferutil - ethers - utf-8-validate - dev: false - /@cspotcode/source-map-support@0.8.1: - resolution: - { integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== } - engines: { node: ">=12" } + "@cspotcode/source-map-support@0.8.1": dependencies: "@jridgewell/trace-mapping": 0.3.9 - /@eth-optimism/contracts@0.5.40(ethers@5.7.2): - resolution: - { integrity: sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w== } - peerDependencies: - ethers: ^5 + "@eth-optimism/contracts@0.5.40(ethers@5.7.2)": dependencies: "@eth-optimism/core-utils": 0.12.0 "@ethersproject/abstract-provider": 5.7.0 @@ -124,11 +1382,8 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /@eth-optimism/core-utils@0.12.0: - resolution: - { integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw== } + "@eth-optimism/core-utils@0.12.0": dependencies: "@ethersproject/abi": 5.7.0 "@ethersproject/abstract-provider": 5.7.0 @@ -149,11 +1404,8 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /@ethersproject/abi@5.7.0: - resolution: - { integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== } + "@ethersproject/abi@5.7.0": dependencies: "@ethersproject/address": 5.7.0 "@ethersproject/bignumber": 5.7.0 @@ -164,11 +1416,8 @@ packages: "@ethersproject/logger": 5.7.0 "@ethersproject/properties": 5.7.0 "@ethersproject/strings": 5.7.0 - dev: false - /@ethersproject/abstract-provider@5.7.0: - resolution: - { integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== } + "@ethersproject/abstract-provider@5.7.0": dependencies: "@ethersproject/bignumber": 5.7.0 "@ethersproject/bytes": 5.7.0 @@ -177,71 +1426,47 @@ packages: "@ethersproject/properties": 5.7.0 "@ethersproject/transactions": 5.7.0 "@ethersproject/web": 5.7.1 - dev: false - /@ethersproject/abstract-signer@5.7.0: - resolution: - { integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== } + "@ethersproject/abstract-signer@5.7.0": 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 - dev: false - /@ethersproject/address@5.7.0: - resolution: - { integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== } + "@ethersproject/address@5.7.0": 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 - dev: false - /@ethersproject/base64@5.7.0: - resolution: - { integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== } + "@ethersproject/base64@5.7.0": dependencies: "@ethersproject/bytes": 5.7.0 - dev: false - /@ethersproject/basex@5.7.0: - resolution: - { integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== } + "@ethersproject/basex@5.7.0": dependencies: "@ethersproject/bytes": 5.7.0 "@ethersproject/properties": 5.7.0 - dev: false - /@ethersproject/bignumber@5.7.0: - resolution: - { integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== } + "@ethersproject/bignumber@5.7.0": dependencies: "@ethersproject/bytes": 5.7.0 "@ethersproject/logger": 5.7.0 bn.js: 5.2.1 - dev: false - /@ethersproject/bytes@5.7.0: - resolution: - { integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== } + "@ethersproject/bytes@5.7.0": dependencies: "@ethersproject/logger": 5.7.0 - dev: false - /@ethersproject/constants@5.7.0: - resolution: - { integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== } + "@ethersproject/constants@5.7.0": dependencies: "@ethersproject/bignumber": 5.7.0 - dev: false - /@ethersproject/contracts@5.7.0: - resolution: - { integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== } + "@ethersproject/contracts@5.7.0": dependencies: "@ethersproject/abi": 5.7.0 "@ethersproject/abstract-provider": 5.7.0 @@ -253,11 +1478,8 @@ packages: "@ethersproject/logger": 5.7.0 "@ethersproject/properties": 5.7.0 "@ethersproject/transactions": 5.7.0 - dev: false - /@ethersproject/hash@5.7.0: - resolution: - { integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== } + "@ethersproject/hash@5.7.0": dependencies: "@ethersproject/abstract-signer": 5.7.0 "@ethersproject/address": 5.7.0 @@ -268,11 +1490,8 @@ packages: "@ethersproject/logger": 5.7.0 "@ethersproject/properties": 5.7.0 "@ethersproject/strings": 5.7.0 - dev: false - /@ethersproject/hdnode@5.7.0: - resolution: - { integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== } + "@ethersproject/hdnode@5.7.0": dependencies: "@ethersproject/abstract-signer": 5.7.0 "@ethersproject/basex": 5.7.0 @@ -286,11 +1505,8 @@ packages: "@ethersproject/strings": 5.7.0 "@ethersproject/transactions": 5.7.0 "@ethersproject/wordlists": 5.7.0 - dev: false - /@ethersproject/json-wallets@5.7.0: - resolution: - { integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== } + "@ethersproject/json-wallets@5.7.0": dependencies: "@ethersproject/abstract-signer": 5.7.0 "@ethersproject/address": 5.7.0 @@ -305,46 +1521,28 @@ packages: "@ethersproject/transactions": 5.7.0 aes-js: 3.0.0 scrypt-js: 3.0.1 - dev: false - /@ethersproject/keccak256@5.7.0: - resolution: - { integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== } + "@ethersproject/keccak256@5.7.0": dependencies: "@ethersproject/bytes": 5.7.0 js-sha3: 0.8.0 - dev: false - /@ethersproject/logger@5.7.0: - resolution: - { integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== } - dev: false + "@ethersproject/logger@5.7.0": {} - /@ethersproject/networks@5.7.1: - resolution: - { integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== } + "@ethersproject/networks@5.7.1": dependencies: "@ethersproject/logger": 5.7.0 - dev: false - /@ethersproject/pbkdf2@5.7.0: - resolution: - { integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== } + "@ethersproject/pbkdf2@5.7.0": dependencies: "@ethersproject/bytes": 5.7.0 "@ethersproject/sha2": 5.7.0 - dev: false - /@ethersproject/properties@5.7.0: - resolution: - { integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== } + "@ethersproject/properties@5.7.0": dependencies: "@ethersproject/logger": 5.7.0 - dev: false - /@ethersproject/providers@5.7.2: - resolution: - { integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== } + "@ethersproject/providers@5.7.2": dependencies: "@ethersproject/abstract-provider": 5.7.0 "@ethersproject/abstract-signer": 5.7.0 @@ -369,36 +1567,24 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /@ethersproject/random@5.7.0: - resolution: - { integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== } + "@ethersproject/random@5.7.0": dependencies: "@ethersproject/bytes": 5.7.0 "@ethersproject/logger": 5.7.0 - dev: false - /@ethersproject/rlp@5.7.0: - resolution: - { integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== } + "@ethersproject/rlp@5.7.0": dependencies: "@ethersproject/bytes": 5.7.0 "@ethersproject/logger": 5.7.0 - dev: false - /@ethersproject/sha2@5.7.0: - resolution: - { integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== } + "@ethersproject/sha2@5.7.0": dependencies: "@ethersproject/bytes": 5.7.0 "@ethersproject/logger": 5.7.0 hash.js: 1.1.7 - dev: false - /@ethersproject/signing-key@5.7.0: - resolution: - { integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== } + "@ethersproject/signing-key@5.7.0": dependencies: "@ethersproject/bytes": 5.7.0 "@ethersproject/logger": 5.7.0 @@ -406,11 +1592,8 @@ packages: bn.js: 5.2.1 elliptic: 6.5.4 hash.js: 1.1.7 - dev: false - /@ethersproject/solidity@5.7.0: - resolution: - { integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== } + "@ethersproject/solidity@5.7.0": dependencies: "@ethersproject/bignumber": 5.7.0 "@ethersproject/bytes": 5.7.0 @@ -418,20 +1601,14 @@ packages: "@ethersproject/logger": 5.7.0 "@ethersproject/sha2": 5.7.0 "@ethersproject/strings": 5.7.0 - dev: false - /@ethersproject/strings@5.7.0: - resolution: - { integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== } + "@ethersproject/strings@5.7.0": dependencies: "@ethersproject/bytes": 5.7.0 "@ethersproject/constants": 5.7.0 "@ethersproject/logger": 5.7.0 - dev: false - /@ethersproject/transactions@5.7.0: - resolution: - { integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== } + "@ethersproject/transactions@5.7.0": dependencies: "@ethersproject/address": 5.7.0 "@ethersproject/bignumber": 5.7.0 @@ -442,20 +1619,14 @@ packages: "@ethersproject/properties": 5.7.0 "@ethersproject/rlp": 5.7.0 "@ethersproject/signing-key": 5.7.0 - dev: false - /@ethersproject/units@5.7.0: - resolution: - { integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== } + "@ethersproject/units@5.7.0": dependencies: "@ethersproject/bignumber": 5.7.0 "@ethersproject/constants": 5.7.0 "@ethersproject/logger": 5.7.0 - dev: false - /@ethersproject/wallet@5.7.0: - resolution: - { integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== } + "@ethersproject/wallet@5.7.0": dependencies: "@ethersproject/abstract-provider": 5.7.0 "@ethersproject/abstract-signer": 5.7.0 @@ -472,341 +1643,184 @@ packages: "@ethersproject/signing-key": 5.7.0 "@ethersproject/transactions": 5.7.0 "@ethersproject/wordlists": 5.7.0 - dev: false - /@ethersproject/web@5.7.1: - resolution: - { integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== } + "@ethersproject/web@5.7.1": 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 - dev: false - /@ethersproject/wordlists@5.7.0: - resolution: - { integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== } + "@ethersproject/wordlists@5.7.0": dependencies: "@ethersproject/bytes": 5.7.0 "@ethersproject/hash": 5.7.0 "@ethersproject/logger": 5.7.0 "@ethersproject/properties": 5.7.0 "@ethersproject/strings": 5.7.0 - dev: false - /@jridgewell/gen-mapping@0.3.3: - resolution: - { integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== } - engines: { node: ">=6.0.0" } + "@jridgewell/gen-mapping@0.3.3": dependencies: "@jridgewell/set-array": 1.1.2 "@jridgewell/sourcemap-codec": 1.4.15 "@jridgewell/trace-mapping": 0.3.22 - dev: true - /@jridgewell/resolve-uri@3.1.1: - resolution: - { integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== } - engines: { node: ">=6.0.0" } + "@jridgewell/resolve-uri@3.1.1": {} - /@jridgewell/set-array@1.1.2: - resolution: - { integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== } - engines: { node: ">=6.0.0" } - dev: true + "@jridgewell/set-array@1.1.2": {} - /@jridgewell/sourcemap-codec@1.4.15: - resolution: - { integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== } + "@jridgewell/sourcemap-codec@1.4.15": {} - /@jridgewell/trace-mapping@0.3.22: - resolution: - { integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== } + "@jridgewell/trace-mapping@0.3.22": dependencies: "@jridgewell/resolve-uri": 3.1.1 "@jridgewell/sourcemap-codec": 1.4.15 - dev: true - /@jridgewell/trace-mapping@0.3.9: - resolution: - { integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== } + "@jridgewell/trace-mapping@0.3.9": dependencies: "@jridgewell/resolve-uri": 3.1.1 "@jridgewell/sourcemap-codec": 1.4.15 - /@openzeppelin/contracts-upgradeable@4.9.5: - resolution: - { integrity: sha512-f7L1//4sLlflAN7fVzJLoRedrf5Na3Oal5PZfIq55NFcVZ90EpV1q5xOvL4lFvg3MNICSDr2hH0JUBxwlxcoPg== } - dev: false + "@openzeppelin/contracts-upgradeable@4.9.5": {} - /@openzeppelin/contracts@3.4.2: - resolution: - { integrity: sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA== } - dev: false + "@openzeppelin/contracts@3.4.2": {} - /@openzeppelin/contracts@4.3.3: - resolution: - { integrity: sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g== } - dev: false + "@openzeppelin/contracts@4.3.3": {} - /@openzeppelin/contracts@5.0.1: - resolution: - { integrity: sha512-yQJaT5HDp9hYOOp4jTYxMsR02gdFZFXhewX5HW9Jo4fsqSVqqyIO/xTHdWDaKX5a3pv1txmf076Lziz+sO7L1w== } + "@openzeppelin/contracts@5.0.1": {} - /@prettier/sync@0.3.0(prettier@3.2.5): - resolution: - { integrity: sha512-3dcmCyAxIcxy036h1I7MQU/uEEBq8oLwf1CE3xeze+MPlgkdlb/+w6rGR/1dhp6Hqi17fRS6nvwnOzkESxEkOw== } - peerDependencies: - prettier: ^3.0.0 + "@prettier/sync@0.3.0(prettier@3.2.5)": dependencies: prettier: 3.2.5 - /@solidity-parser/parser@0.16.2: - resolution: - { integrity: sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg== } + "@solidity-parser/parser@0.16.2": dependencies: antlr4ts: 0.5.0-alpha.4 - /@solidity-parser/parser@0.17.0: - resolution: - { integrity: sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw== } + "@solidity-parser/parser@0.17.0": {} - /@tsconfig/node10@1.0.9: - resolution: - { integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== } + "@tsconfig/node10@1.0.9": {} - /@tsconfig/node12@1.0.11: - resolution: - { integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== } + "@tsconfig/node12@1.0.11": {} - /@tsconfig/node14@1.0.3: - resolution: - { integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== } + "@tsconfig/node14@1.0.3": {} - /@tsconfig/node16@1.0.4: - resolution: - { integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== } + "@tsconfig/node16@1.0.4": {} - /@types/estree@1.0.5: - resolution: - { integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== } - dev: true + "@types/estree@1.0.5": {} - /@types/fs-extra@11.0.4: - resolution: - { integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ== } + "@types/fs-extra@11.0.4": dependencies: "@types/jsonfile": 6.1.4 "@types/node": 18.19.14 - dev: false - /@types/jsonfile@6.1.4: - resolution: - { integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ== } + "@types/jsonfile@6.1.4": dependencies: "@types/node": 18.19.14 - dev: false - /@types/node@18.19.14: - resolution: - { integrity: sha512-EnQ4Us2rmOS64nHDWr0XqAD8DsO6f3XR6lf9UIIrZQpUzPVdN/oPuEzfDWNHSyXLvoGgjuEm/sPwFGSSs35Wtg== } + "@types/node@18.19.14": dependencies: undici-types: 5.26.5 - dev: false - /@types/node@20.11.16: - resolution: - { integrity: sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ== } + "@types/node@20.11.16": dependencies: undici-types: 5.26.5 - dev: true - /acorn-walk@8.3.2: - resolution: - { integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== } - engines: { node: ">=0.4.0" } + acorn-walk@8.3.2: {} - /acorn@8.11.3: - resolution: - { integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== } - engines: { node: ">=0.4.0" } - hasBin: true + acorn@8.11.3: {} - /aes-js@3.0.0: - resolution: - { integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== } - dev: false + aes-js@3.0.0: {} - /ajv@6.12.6: - resolution: - { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== } + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - /ajv@8.12.0: - resolution: - { integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== } + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - /ansi-escapes@5.0.0: - resolution: - { integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== } - engines: { node: ">=12" } + ansi-escapes@5.0.0: dependencies: type-fest: 1.4.0 - /ansi-regex@5.0.1: - resolution: - { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== } - engines: { node: ">=8" } + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: - { integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== } - engines: { node: ">=12" } + ansi-regex@6.0.1: {} - /ansi-styles@3.2.1: - resolution: - { integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== } - engines: { node: ">=4" } + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: - { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } - engines: { node: ">=8" } + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@6.2.1: - resolution: - { integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== } - engines: { node: ">=12" } + ansi-styles@6.2.1: {} - /antlr4@4.13.1: - resolution: - { integrity: sha512-kiXTspaRYvnIArgE97z5YVVf/cDVQABr3abFRR6mE7yesLMkgu4ujuyV/sgxafQ8wgve0DJQUJ38Z8tkgA2izA== } - engines: { node: ">=16" } + antlr4@4.13.1: {} - /antlr4ts@0.5.0-alpha.4: - resolution: - { integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== } + antlr4ts@0.5.0-alpha.4: {} - /arg@4.1.3: - resolution: - { integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== } + arg@4.1.3: {} - /argparse@2.0.1: - resolution: - { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } + argparse@2.0.1: {} - /aria-query@5.3.0: - resolution: - { integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== } + aria-query@5.3.0: dependencies: dequal: 2.0.3 - dev: true - /assertion-error@1.1.0: - resolution: - { integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== } - dev: false + assertion-error@1.1.0: {} - /ast-parents@0.0.1: - resolution: - { integrity: sha512-XHusKxKz3zoYk1ic8Un640joHbFMhbqneyoZfoKnEGtf2ey9Uh/IdpcQplODdO/kENaMIWsD0nJm4+wX3UNLHA== } + ast-parents@0.0.1: {} - /astral-regex@2.0.0: - resolution: - { integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== } - engines: { node: ">=8" } + astral-regex@2.0.0: {} - /axobject-query@4.0.0: - resolution: - { integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw== } + axobject-query@4.0.0: dependencies: dequal: 2.0.3 - dev: true - /balanced-match@1.0.2: - resolution: - { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } + balanced-match@1.0.2: {} - /bech32@1.1.4: - resolution: - { integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== } - dev: false + bech32@1.1.4: {} - /bn.js@4.12.0: - resolution: - { integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== } - dev: false + bn.js@4.12.0: {} - /bn.js@5.2.1: - resolution: - { integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== } - dev: false + bn.js@5.2.1: {} - /brace-expansion@2.0.1: - resolution: - { integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== } + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - /braces@3.0.2: - resolution: - { integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== } - engines: { node: ">=8" } + braces@3.0.2: dependencies: fill-range: 7.0.1 - /brorand@1.1.0: - resolution: - { integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== } - dev: false + brorand@1.1.0: {} - /bufio@1.2.1: - resolution: - { integrity: sha512-9oR3zNdupcg/Ge2sSHQF3GX+kmvL/fTPvD0nd5AGLq8SjUYnTz+SlFjK/GXidndbZtIj+pVKXiWeR9w6e9wKCA== } - engines: { node: ">=14.0.0" } - dev: false + bufio@1.2.1: {} - /callsites@3.1.0: - resolution: - { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } - engines: { node: ">=6" } + callsites@3.1.0: {} - /camel-case@4.1.2: - resolution: - { integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== } + camel-case@4.1.2: dependencies: pascal-case: 3.1.2 tslib: 2.6.2 - dev: false - /capital-case@1.0.4: - resolution: - { integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== } + capital-case@1.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 - dev: false - /chai@4.4.1: - resolution: - { integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== } - engines: { node: ">=4" } + chai@4.4.1: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 @@ -815,33 +1829,21 @@ packages: loupe: 2.3.7 pathval: 1.1.1 type-detect: 4.0.8 - dev: false - /chalk@2.4.2: - resolution: - { integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== } - engines: { node: ">=4" } + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@4.1.2: - resolution: - { integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== } - engines: { node: ">=10" } + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.3.0: - resolution: - { integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== } - engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } + chalk@5.3.0: {} - /change-case@4.1.2: - resolution: - { integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== } + change-case@4.1.2: dependencies: camel-case: 4.1.2 capital-case: 1.0.4 @@ -855,105 +1857,57 @@ packages: sentence-case: 3.0.4 snake-case: 3.0.4 tslib: 2.6.2 - dev: false - /check-error@1.0.3: - resolution: - { integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== } + check-error@1.0.3: dependencies: get-func-name: 2.0.2 - dev: false - /cli-cursor@4.0.0: - resolution: - { integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + cli-cursor@4.0.0: dependencies: restore-cursor: 4.0.0 - /cli-truncate@3.1.0: - resolution: - { integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + cli-truncate@3.1.0: dependencies: slice-ansi: 5.0.0 string-width: 5.1.2 - /code-red@1.0.4: - resolution: - { integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw== } + code-red@1.0.4: dependencies: "@jridgewell/sourcemap-codec": 1.4.15 "@types/estree": 1.0.5 acorn: 8.11.3 estree-walker: 3.0.3 periscopic: 3.1.0 - dev: true - /color-convert@1.9.3: - resolution: - { integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== } + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: - { integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== } - engines: { node: ">=7.0.0" } + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: - { integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== } + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: - { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== } + color-name@1.1.4: {} - /colorette@2.0.20: - resolution: - { integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== } + colorette@2.0.20: {} - /command-exists@1.2.9: - resolution: - { integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== } - dev: false + command-exists@1.2.9: {} - /commander@10.0.1: - resolution: - { integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== } - engines: { node: ">=14" } + commander@10.0.1: {} - /commander@11.0.0: - resolution: - { integrity: sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== } - engines: { node: ">=16" } + commander@11.0.0: {} - /commander@8.3.0: - resolution: - { integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== } - engines: { node: ">= 12" } - dev: false + commander@8.3.0: {} - /constant-case@3.0.4: - resolution: - { integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== } + constant-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case: 2.0.2 - dev: false - /cosmiconfig@8.3.6(typescript@5.3.3): - resolution: - { integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== } - engines: { node: ">=14" } - peerDependencies: - typescript: ">=4.9.5" - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@8.3.6(typescript@5.3.3): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -961,82 +1915,45 @@ packages: path-type: 4.0.0 typescript: 5.3.3 - /create-require@1.1.1: - resolution: - { integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== } + create-require@1.1.1: {} - /cross-spawn@7.0.3: - resolution: - { integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== } - engines: { node: ">= 8" } + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - /css-tree@2.3.1: - resolution: - { integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== } - engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } + css-tree@2.3.1: dependencies: mdn-data: 2.0.30 source-map-js: 1.0.2 - dev: true - /date-fns@2.30.0: - resolution: - { integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== } - engines: { node: ">=0.11" } + date-fns@2.30.0: dependencies: "@babel/runtime": 7.23.9 - dev: false - /debug@4.3.4: - resolution: - { integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== } - engines: { node: ">=6.0" } - peerDependencies: - supports-color: "*" - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - /deep-eql@4.1.3: - resolution: - { integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== } - engines: { node: ">=6" } + deep-eql@4.1.3: dependencies: type-detect: 4.0.8 - dev: false - /dequal@2.0.3: - resolution: - { integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== } - engines: { node: ">=6" } - dev: true + dequal@2.0.3: {} - /diff@4.0.2: - resolution: - { integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== } - engines: { node: ">=0.3.1" } + diff@4.0.2: {} - /dot-case@3.0.4: - resolution: - { integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== } + dot-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 - dev: false - /eastasianwidth@0.2.0: - resolution: - { integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== } + ds-test@https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0: {} - /elliptic@6.5.4: - resolution: - { integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== } + eastasianwidth@0.2.0: {} + + elliptic@6.5.4: dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -1045,37 +1962,22 @@ packages: inherits: 2.0.4 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - dev: false - /emoji-regex@8.0.0: - resolution: - { integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== } + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: - { integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== } + emoji-regex@9.2.2: {} - /error-ex@1.3.2: - resolution: - { integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== } + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - /escape-string-regexp@1.0.5: - resolution: - { integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== } - engines: { node: ">=0.8.0" } + escape-string-regexp@1.0.5: {} - /estree-walker@3.0.3: - resolution: - { integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== } + estree-walker@3.0.3: dependencies: "@types/estree": 1.0.5 - dev: true - /ethers@5.7.2: - resolution: - { integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== } + ethers@5.7.2: dependencies: "@ethersproject/abi": 5.7.0 "@ethersproject/abstract-provider": 5.7.0 @@ -1110,16 +2012,10 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: false - /eventemitter3@5.0.1: - resolution: - { integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== } + eventemitter3@5.0.1: {} - /execa@7.2.0: - resolution: - { integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== } - engines: { node: ^14.18.0 || ^16.14.0 || >=18.0.0 } + execa@7.2.0: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -1131,69 +2027,69 @@ packages: signal-exit: 3.0.7 strip-final-newline: 3.0.0 - /fast-deep-equal@3.1.3: - resolution: - { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } + fast-deep-equal@3.1.3: {} - /fast-diff@1.3.0: - resolution: - { integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== } + fast-diff@1.3.0: {} - /fast-json-stable-stringify@2.1.0: - resolution: - { integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== } + fast-json-stable-stringify@2.1.0: {} - /fill-range@7.0.1: - resolution: - { integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== } - engines: { node: ">=8" } + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - /follow-redirects@1.15.5: - resolution: - { integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== } - engines: { node: ">=4.0" } - peerDependencies: - debug: "*" - peerDependenciesMeta: - debug: - optional: true - dev: false + follow-redirects@1.15.5: {} - /forge-std@1.1.2: - resolution: - { integrity: sha512-Wfb0iAS9PcfjMKtGpWQw9mXzJxrWD62kJCUqqLcyuI0+VRtJ3j20XembjF3kS20qELYdXft1vD/SPFVWVKMFOw== } - dev: false + forge-std@1.1.2: {} - /fs-extra@11.2.0: - resolution: - { integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== } - engines: { node: ">=14.14" } + forge-std@https://codeload.github.com/foundry-rs/forge-std/tar.gz/e8a047e3f40f13fa37af6fe14e6e06283d9a060e: {} + + frax-standard-solidity@https://codeload.github.com/FraxFinance/frax-standard-solidity/tar.gz/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6(ethers@5.7.2): + id: frax-standard-solidity@https://codeload.github.com/FraxFinance/frax-standard-solidity/tar.gz/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6 + dependencies: + "@chainlink/contracts": 0.6.1(ethers@5.7.2) + "@openzeppelin/contracts": 5.0.1 + "@types/fs-extra": 11.0.4 + "@types/node": 18.19.14 + change-case: 4.1.2 + commander: 10.0.1 + date-fns: 2.30.0 + ds-test: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 + forge-std: https://codeload.github.com/foundry-rs/forge-std/tar.gz/e8a047e3f40f13fa37af6fe14e6e06283d9a060e + fs-extra: 11.2.0 + husky: 8.0.3 + lint-staged: 13.3.0 + prettier: 3.2.5 + prettier-plugin-solidity: 1.3.1(prettier@3.2.5) + solc: 0.8.24 + solhint: 3.6.2(typescript@5.3.3) + solhint-plugin-prettier: 0.1.0(prettier-plugin-solidity@1.3.1)(prettier@3.2.5) + solidity-bytes-utils: 0.8.2 + toml: 3.0.0 + ts-node: 10.9.2(@types/node@18.19.14)(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - "@swc/core" + - "@swc/wasm" + - bufferutil + - debug + - enquirer + - ethers + - supports-color + - utf-8-validate + + fs-extra@11.2.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: false - /fs.realpath@1.0.0: - resolution: - { integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== } + fs.realpath@1.0.0: {} - /get-func-name@2.0.2: - resolution: - { integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== } - dev: false + get-func-name@2.0.2: {} - /get-stream@6.0.1: - resolution: - { integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== } - engines: { node: ">=10" } + get-stream@6.0.1: {} - /glob@8.1.0: - resolution: - { integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== } - engines: { node: ">=12" } + glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -1201,167 +2097,87 @@ packages: minimatch: 5.1.6 once: 1.4.0 - /graceful-fs@4.2.11: - resolution: - { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } - dev: false + graceful-fs@4.2.11: {} - /has-flag@3.0.0: - resolution: - { integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== } - engines: { node: ">=4" } + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: - { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } - engines: { node: ">=8" } + has-flag@4.0.0: {} - /hash.js@1.1.7: - resolution: - { integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== } + hash.js@1.1.7: dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 - dev: false - /header-case@2.0.4: - resolution: - { integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== } + header-case@2.0.4: dependencies: capital-case: 1.0.4 tslib: 2.6.2 - dev: false - /hmac-drbg@1.0.1: - resolution: - { integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== } + hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - dev: false - /human-signals@4.3.1: - resolution: - { integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== } - engines: { node: ">=14.18.0" } + human-signals@4.3.1: {} - /husky@8.0.3: - resolution: - { integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg== } - engines: { node: ">=14" } - hasBin: true + husky@8.0.3: {} - /ignore@5.3.1: - resolution: - { integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== } - engines: { node: ">= 4" } + ignore@5.3.1: {} - /import-fresh@3.3.0: - resolution: - { integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== } - engines: { node: ">=6" } + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - /inflight@1.0.6: - resolution: - { integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== } + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - /inherits@2.0.4: - resolution: - { integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== } + inherits@2.0.4: {} - /is-arrayish@0.2.1: - resolution: - { integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== } + is-arrayish@0.2.1: {} - /is-fullwidth-code-point@3.0.0: - resolution: - { integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== } - engines: { node: ">=8" } + is-fullwidth-code-point@3.0.0: {} - /is-fullwidth-code-point@4.0.0: - resolution: - { integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== } - engines: { node: ">=12" } + is-fullwidth-code-point@4.0.0: {} - /is-number@7.0.0: - resolution: - { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } - engines: { node: ">=0.12.0" } + is-number@7.0.0: {} - /is-reference@3.0.2: - resolution: - { integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg== } + is-reference@3.0.2: dependencies: "@types/estree": 1.0.5 - dev: true - /is-stream@3.0.0: - resolution: - { integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + is-stream@3.0.0: {} - /isexe@2.0.0: - resolution: - { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } + isexe@2.0.0: {} - /js-sha3@0.8.0: - resolution: - { integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== } - dev: false + js-sha3@0.8.0: {} - /js-tokens@4.0.0: - resolution: - { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== } + js-tokens@4.0.0: {} - /js-yaml@4.1.0: - resolution: - { integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== } - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - /json-parse-even-better-errors@2.3.1: - resolution: - { integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== } + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@0.4.1: - resolution: - { integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== } + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: - { integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== } + json-schema-traverse@1.0.0: {} - /jsonfile@6.1.0: - resolution: - { integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== } + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - dev: false - /lilconfig@2.1.0: - resolution: - { integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== } - engines: { node: ">=10" } + lilconfig@2.1.0: {} - /lines-and-columns@1.2.4: - resolution: - { integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== } + lines-and-columns@1.2.4: {} - /lint-staged@13.3.0: - resolution: - { integrity: sha512-mPRtrYnipYYv1FEE134ufbWpeggNTo+O/UPzngoaKzbzHAthvR55am+8GfHTnqNRQVRRrYQLGW9ZyUoD7DsBHQ== } - engines: { node: ^16.14.0 || >=18.0.0 } - hasBin: true + lint-staged@13.3.0: dependencies: chalk: 5.3.0 commander: 11.0.0 @@ -1377,15 +2193,7 @@ packages: - enquirer - supports-color - /listr2@6.6.1: - resolution: - { integrity: sha512-+rAXGHh0fkEWdXBmX+L6mmfmXmXvDGEKzkjxO+8mP3+nI/r/CWznVBvsibXdxda9Zz0OW2e2ikphN3OwCT/jSg== } - engines: { node: ">=16.0.0" } - peerDependencies: - enquirer: ">= 2.3.0 < 3" - peerDependenciesMeta: - enquirer: - optional: true + listr2@6.6.1: dependencies: cli-truncate: 3.1.0 colorette: 2.0.20 @@ -1394,23 +2202,13 @@ packages: rfdc: 1.3.1 wrap-ansi: 8.1.0 - /locate-character@3.0.0: - resolution: - { integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA== } - dev: true + locate-character@3.0.0: {} - /lodash.truncate@4.4.2: - resolution: - { integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== } + lodash.truncate@4.4.2: {} - /lodash@4.17.21: - resolution: - { integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== } + lodash@4.17.21: {} - /log-update@5.0.1: - resolution: - { integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + log-update@5.0.1: dependencies: ansi-escapes: 5.0.0 cli-cursor: 4.0.0 @@ -1418,370 +2216,193 @@ packages: strip-ansi: 7.1.0 wrap-ansi: 8.1.0 - /loupe@2.3.7: - resolution: - { integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== } + loupe@2.3.7: dependencies: get-func-name: 2.0.2 - dev: false - /lower-case@2.0.2: - resolution: - { integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== } + lower-case@2.0.2: dependencies: tslib: 2.6.2 - dev: false - /lru-cache@6.0.0: - resolution: - { integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== } - engines: { node: ">=10" } + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - /magic-string@0.30.7: - resolution: - { integrity: sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA== } - engines: { node: ">=12" } + magic-string@0.30.7: dependencies: "@jridgewell/sourcemap-codec": 1.4.15 - dev: true - /make-error@1.3.6: - resolution: - { integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== } + make-error@1.3.6: {} - /mdn-data@2.0.30: - resolution: - { integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== } - dev: true + mdn-data@2.0.30: {} - /memorystream@0.3.1: - resolution: - { integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== } - engines: { node: ">= 0.10.0" } - dev: false + memorystream@0.3.1: {} - /merge-stream@2.0.0: - resolution: - { integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== } + merge-stream@2.0.0: {} - /micromatch@4.0.5: - resolution: - { integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== } - engines: { node: ">=8.6" } + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - /mimic-fn@2.1.0: - resolution: - { integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== } - engines: { node: ">=6" } + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: - { integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== } - engines: { node: ">=12" } + mimic-fn@4.0.0: {} - /minimalistic-assert@1.0.1: - resolution: - { integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== } - dev: false + minimalistic-assert@1.0.1: {} - /minimalistic-crypto-utils@1.0.1: - resolution: - { integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== } - dev: false + minimalistic-crypto-utils@1.0.1: {} - /minimatch@5.1.6: - resolution: - { integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== } - engines: { node: ">=10" } + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - /ms@2.1.2: - resolution: - { integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== } + ms@2.1.2: {} - /no-case@3.0.4: - resolution: - { integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== } + no-case@3.0.4: dependencies: lower-case: 2.0.2 tslib: 2.6.2 - dev: false - /npm-run-path@5.2.0: - resolution: - { integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + npm-run-path@5.2.0: dependencies: path-key: 4.0.0 - /once@1.4.0: - resolution: - { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== } + once@1.4.0: dependencies: wrappy: 1.0.2 - /onetime@5.1.2: - resolution: - { integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== } - engines: { node: ">=6" } + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - /onetime@6.0.0: - resolution: - { integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== } - engines: { node: ">=12" } + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - /os-tmpdir@1.0.2: - resolution: - { integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== } - engines: { node: ">=0.10.0" } - dev: false + os-tmpdir@1.0.2: {} - /param-case@3.0.4: - resolution: - { integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== } + param-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false - /parent-module@1.0.1: - resolution: - { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } - engines: { node: ">=6" } + parent-module@1.0.1: dependencies: callsites: 3.1.0 - /parse-json@5.2.0: - resolution: - { integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== } - engines: { node: ">=8" } + parse-json@5.2.0: dependencies: "@babel/code-frame": 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /pascal-case@3.1.2: - resolution: - { integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== } + pascal-case@3.1.2: dependencies: no-case: 3.0.4 tslib: 2.6.2 - dev: false - /path-case@3.0.4: - resolution: - { integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== } + path-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false - /path-key@3.1.1: - resolution: - { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } - engines: { node: ">=8" } + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: - { integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== } - engines: { node: ">=12" } + path-key@4.0.0: {} - /path-type@4.0.0: - resolution: - { integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== } - engines: { node: ">=8" } + path-type@4.0.0: {} - /pathval@1.1.1: - resolution: - { integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== } - dev: false + pathval@1.1.1: {} - /periscopic@3.1.0: - resolution: - { integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw== } + periscopic@3.1.0: dependencies: "@types/estree": 1.0.5 estree-walker: 3.0.3 is-reference: 3.0.2 - dev: true - /picomatch@2.3.1: - resolution: - { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== } - engines: { node: ">=8.6" } + picomatch@2.3.1: {} - /pidtree@0.6.0: - resolution: - { integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== } - engines: { node: ">=0.10" } - hasBin: true + pidtree@0.6.0: {} - /pluralize@8.0.0: - resolution: - { integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== } - engines: { node: ">=4" } + pluralize@8.0.0: {} - /prettier-linter-helpers@1.0.0: - resolution: - { integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== } - engines: { node: ">=6.0.0" } + prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 - /prettier-plugin-solidity@1.3.1(prettier@3.2.5): - resolution: - { integrity: sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA== } - engines: { node: ">=16" } - peerDependencies: - prettier: ">=2.3.0" + prettier-plugin-solidity@1.3.1(prettier@3.2.5): dependencies: "@solidity-parser/parser": 0.17.0 prettier: 3.2.5 semver: 7.6.0 solidity-comments-extractor: 0.0.8 - /prettier-plugin-svelte@3.1.2(prettier@3.2.5)(svelte@4.2.10): - resolution: - { integrity: sha512-7xfMZtwgAWHMT0iZc8jN4o65zgbAQ3+O32V6W7pXrqNvKnHnkoyQCGCbKeUyXKZLbYE0YhFRnamfxfkEGxm8qA== } - peerDependencies: - prettier: ^3.0.0 - svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + prettier-plugin-svelte@3.1.2(prettier@3.2.5)(svelte@4.2.10): dependencies: prettier: 3.2.5 svelte: 4.2.10 - dev: true - /prettier@2.8.8: - resolution: - { integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== } - engines: { node: ">=10.13.0" } - hasBin: true - requiresBuild: true + prettier@2.8.8: optional: true - /prettier@3.2.5: - resolution: - { integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== } - engines: { node: ">=14" } - hasBin: true + prettier@3.2.5: {} - /punycode@2.3.1: - resolution: - { integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== } - engines: { node: ">=6" } + punycode@2.3.1: {} - /regenerator-runtime@0.14.1: - resolution: - { integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== } - dev: false + regenerator-runtime@0.14.1: {} - /require-from-string@2.0.2: - resolution: - { integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== } - engines: { node: ">=0.10.0" } + require-from-string@2.0.2: {} - /resolve-from@4.0.0: - resolution: - { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } - engines: { node: ">=4" } + resolve-from@4.0.0: {} - /restore-cursor@4.0.0: - resolution: - { integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== } - engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + restore-cursor@4.0.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - /rfdc@1.3.1: - resolution: - { integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== } + rfdc@1.3.1: {} - /scrypt-js@3.0.1: - resolution: - { integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== } - dev: false + scrypt-js@3.0.1: {} - /semver@5.7.2: - resolution: - { integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== } - hasBin: true - dev: false + semver@5.7.2: {} - /semver@7.6.0: - resolution: - { integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== } - engines: { node: ">=10" } - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - /sentence-case@3.0.4: - resolution: - { integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== } + sentence-case@3.0.4: dependencies: no-case: 3.0.4 tslib: 2.6.2 upper-case-first: 2.0.2 - dev: false - /shebang-command@2.0.0: - resolution: - { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== } - engines: { node: ">=8" } + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - /shebang-regex@3.0.0: - resolution: - { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== } - engines: { node: ">=8" } + shebang-regex@3.0.0: {} - /signal-exit@3.0.7: - resolution: - { integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== } + signal-exit@3.0.7: {} - /slice-ansi@4.0.0: - resolution: - { integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== } - engines: { node: ">=10" } + slice-ansi@4.0.0: dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - /slice-ansi@5.0.0: - resolution: - { integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== } - engines: { node: ">=12" } + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - /snake-case@3.0.4: - resolution: - { integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== } + snake-case@3.0.4: dependencies: dot-case: 3.0.4 tslib: 2.6.2 - dev: false - /solc@0.8.24: - resolution: - { integrity: sha512-G5yUqjTUPc8Np74sCFwfsevhBPlUifUOfhYrgyu6CmYlC6feSw0YS6eZW47XDT23k3JYdKx5nJ+Q7whCEmNcoA== } - engines: { node: ">=10.0.0" } - hasBin: true + solc@0.8.24: dependencies: command-exists: 1.2.9 commander: 8.3.0 @@ -1792,24 +2413,15 @@ packages: tmp: 0.0.33 transitivePeerDependencies: - debug - dev: false - /solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.3.1)(prettier@3.2.5): - resolution: - { integrity: sha512-SDOTSM6tZxZ6hamrzl3GUgzF77FM6jZplgL2plFBclj/OjKP8Z3eIPojKU73gRr0MvOS8ACZILn8a5g0VTz/Gw== } - peerDependencies: - prettier: ^3.0.0 - prettier-plugin-solidity: ^1.0.0 + solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.3.1)(prettier@3.2.5): dependencies: "@prettier/sync": 0.3.0(prettier@3.2.5) prettier: 3.2.5 prettier-linter-helpers: 1.0.0 prettier-plugin-solidity: 1.3.1(prettier@3.2.5) - /solhint@3.6.2(typescript@5.3.3): - resolution: - { integrity: sha512-85EeLbmkcPwD+3JR7aEMKsVC9YrRSxd4qkXuMzrlf7+z2Eqdfm1wHWq1ffTuo5aDhoZxp2I9yF3QkxZOxOL7aQ== } - hasBin: true + solhint@3.6.2(typescript@5.3.3): dependencies: "@solidity-parser/parser": 0.16.2 ajv: 6.12.6 @@ -1833,84 +2445,53 @@ packages: transitivePeerDependencies: - typescript - /solidity-bytes-utils@0.8.2: - resolution: - { integrity: sha512-cqXPYAV2auhpdKSTPuqji0CwpSceZDu95CzqSM/9tDJ2MoMaMsdHTpOIWtVw31BIqqGPNmIChCswzbw0tHaMTw== } + solidity-bytes-utils@0.8.2: dependencies: - ds-test: github.com/dapphub/ds-test/e282159d5170298eb2455a6c05280ab5a73a4ef0 + ds-test: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 forge-std: 1.1.2 - dev: false - /solidity-comments-extractor@0.0.8: - resolution: - { integrity: sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g== } + solidity-bytes-utils@https://codeload.github.com/GNSPS/solidity-bytes-utils/tar.gz/df88556cbbc267b33a787a3a6eaa32fd7247b589: + dependencies: + ds-test: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 + forge-std: 1.1.2 - /source-map-js@1.0.2: - resolution: - { integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== } - engines: { node: ">=0.10.0" } - dev: true + solidity-comments-extractor@0.0.8: {} - /string-argv@0.3.2: - resolution: - { integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== } - engines: { node: ">=0.6.19" } + source-map-js@1.0.2: {} - /string-width@4.2.3: - resolution: - { integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== } - engines: { node: ">=8" } + string-argv@0.3.2: {} + + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: - resolution: - { integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== } - engines: { node: ">=12" } + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - /strip-ansi@6.0.1: - resolution: - { integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== } - engines: { node: ">=8" } + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.1.0: - resolution: - { integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== } - engines: { node: ">=12" } + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - /strip-final-newline@3.0.0: - resolution: - { integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== } - engines: { node: ">=12" } + strip-final-newline@3.0.0: {} - /supports-color@5.5.0: - resolution: - { integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== } - engines: { node: ">=4" } + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: - { integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== } - engines: { node: ">=8" } + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /svelte@4.2.10: - resolution: - { integrity: sha512-Ep06yCaCdgG1Mafb/Rx8sJ1QS3RW2I2BxGp2Ui9LBHSZ2/tO/aGLc5WqPjgiAP6KAnLJGaIr/zzwQlOo1b8MxA== } - engines: { node: ">=16" } + svelte@4.2.10: dependencies: "@ampproject/remapping": 2.2.1 "@jridgewell/sourcemap-codec": 1.4.15 @@ -1926,12 +2507,8 @@ packages: locate-character: 3.0.0 magic-string: 0.30.7 periscopic: 3.1.0 - dev: true - /table@6.8.1: - resolution: - { integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== } - engines: { node: ">=10.0.0" } + table@6.8.1: dependencies: ajv: 8.12.0 lodash.truncate: 4.4.2 @@ -1939,44 +2516,19 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 - /text-table@0.2.0: - resolution: - { integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== } + text-table@0.2.0: {} - /tmp@0.0.33: - resolution: - { integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== } - engines: { node: ">=0.6.0" } + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - dev: false - /to-regex-range@5.0.1: - resolution: - { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } - engines: { node: ">=8.0" } + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /toml@3.0.0: - resolution: - { integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== } - dev: false + toml@3.0.0: {} - /ts-node@10.9.2(@types/node@18.19.14)(typescript@5.3.3): - resolution: - { integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== } - hasBin: true - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true + ts-node@10.9.2(@types/node@18.19.14)(typescript@5.3.3): dependencies: "@cspotcode/source-map-support": 0.8.1 "@tsconfig/node10": 1.0.9 @@ -1993,22 +2545,8 @@ packages: typescript: 5.3.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: false - /ts-node@10.9.2(@types/node@20.11.16)(typescript@5.3.3): - resolution: - { integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== } - hasBin: true - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true + ts-node@10.9.2(@types/node@20.11.16)(typescript@5.3.3): dependencies: "@cspotcode/source-map-support": 0.8.1 "@tsconfig/node10": 1.0.9 @@ -2025,177 +2563,49 @@ packages: typescript: 5.3.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: true - /tslib@2.6.2: - resolution: - { integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== } - dev: false + tslib@2.6.2: {} - /type-detect@4.0.8: - resolution: - { integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== } - engines: { node: ">=4" } - dev: false + type-detect@4.0.8: {} - /type-fest@1.4.0: - resolution: - { integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== } - engines: { node: ">=10" } + type-fest@1.4.0: {} - /typescript@5.3.3: - resolution: - { integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== } - engines: { node: ">=14.17" } - hasBin: true + typescript@5.3.3: {} - /undici-types@5.26.5: - resolution: - { integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== } + undici-types@5.26.5: {} - /universalify@2.0.1: - resolution: - { integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== } - engines: { node: ">= 10.0.0" } - dev: false + universalify@2.0.1: {} - /upper-case-first@2.0.2: - resolution: - { integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== } + upper-case-first@2.0.2: dependencies: tslib: 2.6.2 - dev: false - /upper-case@2.0.2: - resolution: - { integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== } + upper-case@2.0.2: dependencies: tslib: 2.6.2 - dev: false - /uri-js@4.4.1: - resolution: - { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } + uri-js@4.4.1: dependencies: punycode: 2.3.1 - /v8-compile-cache-lib@3.0.1: - resolution: - { integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== } + v8-compile-cache-lib@3.0.1: {} - /which@2.0.2: - resolution: - { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } - engines: { node: ">= 8" } - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - /wrap-ansi@8.1.0: - resolution: - { integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== } - engines: { node: ">=12" } + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - /wrappy@1.0.2: - resolution: - { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== } - - /ws@7.4.6: - resolution: - { integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== } - engines: { node: ">=8.3.0" } - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: false - - /yallist@4.0.0: - resolution: - { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== } - - /yaml@2.3.1: - resolution: - { integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== } - engines: { node: ">= 14" } - - /yn@3.1.1: - resolution: - { integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== } - engines: { node: ">=6" } + wrappy@1.0.2: {} - github.com/FraxFinance/frax-standard-solidity/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6(ethers@5.7.2): - resolution: - { - tarball: https://codeload.github.com/FraxFinance/frax-standard-solidity/tar.gz/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6, - } - id: github.com/FraxFinance/frax-standard-solidity/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6 - name: frax-standard-solidity - version: 1.0.0 - prepare: true - requiresBuild: true - dependencies: - "@chainlink/contracts": 0.6.1(ethers@5.7.2) - "@openzeppelin/contracts": 5.0.1 - "@types/fs-extra": 11.0.4 - "@types/node": 18.19.14 - change-case: 4.1.2 - commander: 10.0.1 - date-fns: 2.30.0 - ds-test: github.com/dapphub/ds-test/e282159d5170298eb2455a6c05280ab5a73a4ef0 - forge-std: github.com/foundry-rs/forge-std/e8a047e3f40f13fa37af6fe14e6e06283d9a060e - fs-extra: 11.2.0 - husky: 8.0.3 - lint-staged: 13.3.0 - prettier: 3.2.5 - prettier-plugin-solidity: 1.3.1(prettier@3.2.5) - solc: 0.8.24 - solhint: 3.6.2(typescript@5.3.3) - solhint-plugin-prettier: 0.1.0(prettier-plugin-solidity@1.3.1)(prettier@3.2.5) - solidity-bytes-utils: 0.8.2 - toml: 3.0.0 - ts-node: 10.9.2(@types/node@18.19.14)(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - "@swc/core" - - "@swc/wasm" - - bufferutil - - debug - - enquirer - - ethers - - supports-color - - utf-8-validate - dev: false + ws@7.4.6: {} - github.com/GNSPS/solidity-bytes-utils/df88556cbbc267b33a787a3a6eaa32fd7247b589: - resolution: - { - tarball: https://codeload.github.com/GNSPS/solidity-bytes-utils/tar.gz/df88556cbbc267b33a787a3a6eaa32fd7247b589, - } - name: solidity-bytes-utils - version: 0.8.2 - dependencies: - ds-test: github.com/dapphub/ds-test/e282159d5170298eb2455a6c05280ab5a73a4ef0 - forge-std: 1.1.2 - dev: false + yallist@4.0.0: {} - github.com/dapphub/ds-test/e282159d5170298eb2455a6c05280ab5a73a4ef0: - resolution: { tarball: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 } - name: ds-test - version: 1.0.0 - dev: false + yaml@2.3.1: {} - github.com/foundry-rs/forge-std/e8a047e3f40f13fa37af6fe14e6e06283d9a060e: - resolution: - { tarball: https://codeload.github.com/foundry-rs/forge-std/tar.gz/e8a047e3f40f13fa37af6fe14e6e06283d9a060e } - name: forge-std - version: 1.5.6 - dev: false + yn@3.1.1: {} diff --git a/src/flattened-factory.sol b/src/contracts/flattened/flattened-factory.sol similarity index 100% rename from src/flattened-factory.sol rename to src/contracts/flattened/flattened-factory.sol diff --git a/src/flattened-pair.sol b/src/contracts/flattened/flattened-pair.sol similarity index 100% rename from src/flattened-pair.sol rename to src/contracts/flattened/flattened-pair.sol diff --git a/src/flattened-router.sol b/src/contracts/flattened/flattened-router.sol similarity index 100% rename from src/flattened-router.sol rename to src/contracts/flattened/flattened-router.sol diff --git a/src/contracts/periphery/FraxswapRouterMultihop.sol b/src/contracts/periphery/FraxswapRouterMultihop.sol index 01111ee..4656033 100644 --- a/src/contracts/periphery/FraxswapRouterMultihop.sol +++ b/src/contracts/periphery/FraxswapRouterMultihop.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BUSL-1.1 -pragma solidity ^0.8.0; +pragma solidity >=0.8.0; pragma abicoder v2; // ==================================================================== @@ -12,24 +12,22 @@ pragma abicoder v2; // ==================================================================== // ===================== Fraxswap Router Multihop ===================== // ==================================================================== +// Fraxswap Router Multihop -import { IERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol"; -import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; -import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; -import { SafeCast } from "@uniswap/v3-core/contracts/libraries/SafeCast.sol"; -import { IWETH } from "@uniswap/v2-periphery/contracts/interfaces/IWETH.sol"; -import { TransferHelper } from "@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol"; -import { IUniswapV3SwapCallback } from "@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol"; -import { IUniswapV3Pool } from "@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol"; -import { IUniswapV2Pair } from "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol"; +// Frax Finance: https://github.com/FraxFinance -import { IPoolInterface } from "./interfaces/IPoolInterface.sol"; -import { IFraxswapRouterMultihop } from "./interfaces/IFraxswapRouterMultihop.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; +import "@uniswap/v3-core/contracts/libraries/SafeCast.sol"; +import "@uniswap/v2-periphery/contracts/interfaces/IWETH.sol"; +import "@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol"; +import "@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol"; +import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol"; +import "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol"; /// @title Fraxswap Router Multihop /// @dev Router for swapping across the majority of the FRAX liquidity -/// @author Frax Finance (https://github.com/FraxFinance) -contract FraxswapRouterMultihop is ReentrancyGuard, IFraxswapRouterMultihop { +contract FraxswapRouterMultihop is ReentrancyGuard { using SafeCast for uint256; using SafeCast for int256; @@ -171,11 +169,11 @@ contract FraxswapRouterMultihop is ReentrancyGuard, IFraxswapRouterMultihop { bool zeroForOne = (step.extraParam2 == 0 && prevRoute.tokenOut < step.tokenOut) || step.extraParam2 == 1; if (step.swapType == 0) { // Execute virtual orders for Fraxswap - IPoolInterface(step.pool).executeVirtualOrders(block.timestamp); + PoolInterface(step.pool).executeVirtualOrders(block.timestamp); } if (step.extraParam1 == 1) { // Fraxswap V2 has getAmountOut in the pair (different fees) - amountOut = IPoolInterface(step.pool).getAmountOut(amountIn, prevRoute.tokenOut); + amountOut = PoolInterface(step.pool).getAmountOut(amountIn, prevRoute.tokenOut); } else { // use the reserves and helper function for Uniswap V2 and Fraxswap V1 (uint112 reserve0, uint112 reserve1, ) = IUniswapV2Pair(step.pool).getReserves(); @@ -208,12 +206,12 @@ contract FraxswapRouterMultihop is ReentrancyGuard, IFraxswapRouterMultihop { } else if (step.swapType == 3) { // Curve exchange V2 TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); - IPoolInterface(step.pool).exchange(step.extraParam1, step.extraParam2, amountIn, 0); + PoolInterface(step.pool).exchange(step.extraParam1, step.extraParam2, amountIn, 0); amountOut = IERC20(step.tokenOut).balanceOf(address(this)); } else if (step.swapType == 4) { // Curve exchange, with returns (no ETH) TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); - amountOut = IPoolInterface(step.pool).exchange( + amountOut = PoolInterface(step.pool).exchange( int128(int256(step.extraParam1)), int128(int256(step.extraParam2)), amountIn, @@ -222,7 +220,7 @@ contract FraxswapRouterMultihop is ReentrancyGuard, IFraxswapRouterMultihop { } else if (step.swapType == 5) { // Curve exchange_underlying TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); - amountOut = IPoolInterface(step.pool).exchange_underlying( + amountOut = PoolInterface(step.pool).exchange_underlying( int128(int256(step.extraParam1)), int128(int256(step.extraParam2)), amountIn, @@ -231,7 +229,7 @@ contract FraxswapRouterMultihop is ReentrancyGuard, IFraxswapRouterMultihop { } else if (step.swapType == 6) { // Saddle TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); - amountOut = IPoolInterface(step.pool).swap( + amountOut = PoolInterface(step.pool).swap( uint8(step.extraParam1), uint8(step.extraParam2), amountIn, @@ -242,14 +240,14 @@ contract FraxswapRouterMultihop is ReentrancyGuard, IFraxswapRouterMultihop { // FPIController TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); if (prevRoute.tokenOut == FRAX) { - amountOut = IPoolInterface(step.pool).mintFPI(amountIn, 0); + amountOut = PoolInterface(step.pool).mintFPI(amountIn, 0); } else { - amountOut = IPoolInterface(step.pool).redeemFPI(amountIn, 0); + amountOut = PoolInterface(step.pool).redeemFPI(amountIn, 0); } } else if (step.swapType == 8) { // ERC4626/Fraxlend deposit TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); - amountOut = IPoolInterface(step.pool).deposit( + amountOut = PoolInterface(step.pool).deposit( amountIn, step.directFundNextPool == 1 ? getNextDirectFundingPool(route, recipient) : address(this) ); @@ -259,7 +257,7 @@ contract FraxswapRouterMultihop is ReentrancyGuard, IFraxswapRouterMultihop { // Unwrap WETH WETH9.withdraw(amountIn); } - IPoolInterface(step.pool).submitAndGive{ value: amountIn }( + PoolInterface(step.pool).submitAndGive{ value: amountIn }( step.directFundNextPool == 1 ? getNextDirectFundingPool(route, recipient) : address(this) ); amountOut = amountIn; // exchange 1 for 1 @@ -285,7 +283,7 @@ contract FraxswapRouterMultihop is ReentrancyGuard, IFraxswapRouterMultihop { } else { TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); } - amountOut = IPoolInterface(step.pool).exchange{ value: value }( + amountOut = PoolInterface(step.pool).exchange{ value: value }( int128(int256(step.extraParam1)), int128(int256(step.extraParam2)), amountIn, @@ -301,7 +299,7 @@ contract FraxswapRouterMultihop is ReentrancyGuard, IFraxswapRouterMultihop { // this pool is funded by router TransferHelper.safeTransfer(prevRoute.tokenOut, step.pool, amountIn); } - amountOut = IPoolInterface(step.pool).exchange_received( + amountOut = PoolInterface(step.pool).exchange_received( int128(int256(step.extraParam1)), int128(int256(step.extraParam2)), amountIn, @@ -310,7 +308,7 @@ contract FraxswapRouterMultihop is ReentrancyGuard, IFraxswapRouterMultihop { ); } else if (step.swapType == 13) { // Redeem ERC4626 - amountOut = IPoolInterface(step.pool).redeem( + amountOut = PoolInterface(step.pool).redeem( amountIn, step.directFundNextPool == 1 ? getNextDirectFundingPool(route, recipient) : address(this), address(this) @@ -318,7 +316,7 @@ contract FraxswapRouterMultihop is ReentrancyGuard, IFraxswapRouterMultihop { } else if (step.swapType == 14) { // Curve exchange, with returns + receiver (no ETH) TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); - amountOut = IPoolInterface(step.pool).exchange( + amountOut = PoolInterface(step.pool).exchange( int128(int256(step.extraParam1)), int128(int256(step.extraParam2)), amountIn, @@ -326,22 +324,18 @@ contract FraxswapRouterMultihop is ReentrancyGuard, IFraxswapRouterMultihop { step.directFundNextPool == 1 ? getNextDirectFundingPool(route, recipient) : address(this) ); } else if (step.swapType == 255) { - // Delegatecall - bytes4 signature = bytes4(uint32(step.extraParam1)); - (bool success, bytes memory data) = address(address(uint160(step.extraParam1 >> 32))).delegatecall( - abi.encodeWithSelector( - signature, - prevRoute.tokenOut, - step.tokenOut, - amountIn, - step.pool, - step.directFundThisPool, - step.directFundNextPool == 1 ? getNextDirectFundingPool(route, recipient) : address(this), - step.extraParam2 - ) + // Plugin + address plugin = address(uint160(step.extraParam1)); + if (step.directFundThisPool == 0) TransferHelper.safeApprove(prevRoute.tokenOut, plugin, amountIn); + amountOut = IPluginSwaptype(plugin).swap( + prevRoute.tokenOut, + step.tokenOut, + amountIn, + step.pool, + step.directFundThisPool, + step.directFundNextPool == 1 ? getNextDirectFundingPool(route, recipient) : address(this), + step.extraParam2 ); - require(success, "FSR:Delecatecall failed"); - amountOut = abi.decode(data, (uint256)); } } @@ -472,4 +466,176 @@ contract FraxswapRouterMultihop is ReentrancyGuard, IFraxswapRouterMultihop { uint256 denominator = reserveIn * 1000 + amountInWithFee; amountOut = numerator / denominator; } + + /// --------------------------- + /// --------- Structs --------- + /// --------------------------- + + /// @notice Input to the swap function + /// @dev contains the top level info for the swap + /// @param tokenIn input token address + /// @param amountIn input token amount + /// @param tokenOut output token address + /// @param amountOutMinimum output token minimum amount (reverts if lower) + /// @param recipient recipient of the output token + /// @param deadline deadline for this swap transaction (reverts if exceeded) + /// @param v v value for permit signature if supported + /// @param r r value for permit signature if supported + /// @param s s value for permit signature if supported + /// @param route byte encoded + struct FraxswapParams { + address tokenIn; + uint256 amountIn; + address tokenOut; + uint256 amountOutMinimum; + address recipient; + uint256 deadline; + bool approveMax; + uint8 v; + bytes32 r; + bytes32 s; + bytes route; + } + + /// @notice A hop along the swap route + /// @dev a series of swaps (steps) containing the same input token and output token + /// @param tokenOut output token address + /// @param amountOut output token amount + /// @param percentOfHop amount of output tokens from the previous hop going into this hop + /// @param steps list of swaps from the same input token to the same output token + /// @param nextHops next hops from this one, the next hops' input token is the tokenOut + struct FraxswapRoute { + address tokenOut; + uint256 amountOut; + uint256 percentOfHop; + bytes[] steps; + bytes[] nextHops; + } + + /// @notice A swap step in a specific route. routes can have multiple swap steps + /// @dev a single swap to a token from the token of the previous hop in the route + /// @param swapType type of the swap performed (Uniswap V2, Fraxswap,Curve, etc) + /// @param directFundNextPool 0 = funds go via router, 1 = fund are sent directly to pool + /// @param directFundThisPool 0 = funds go via router, 1 = fund are sent directly to pool + /// @param tokenOut the target token of the step. output token address + /// @param pool address of the pool to use in the step + /// @param extraParam1 extra data used in the step + /// @param extraParam2 extra data used in the step + /// @param percentOfHop percentage of all of the steps in this route (hop) + struct FraxswapStepData { + uint8 swapType; + uint8 directFundNextPool; + uint8 directFundThisPool; + address tokenOut; + address pool; + uint256 extraParam1; + uint256 extraParam2; + uint256 percentOfHop; + } + + /// @notice struct for Uniswap V3 callback + /// @param tokenIn address of input token + /// @param directFundThisPool this pool already been funded + struct SwapCallbackData { + address tokenIn; + bool directFundThisPool; + } + + /// --------------------------- + /// --------- Events ---------- + /// --------------------------- + + /// @notice Routing event emitted every swap + /// @param tokenIn address of the original input token + /// @param tokenOut address of the final output token + /// @param amountIn input amount for original input token + /// @param amountOut output amount for the final output token + event Routed(address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOut); +} + +// Interface for ERC20 Permit +interface IERC20Permit is IERC20 { + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external; +} + +interface IPluginSwaptype { + function swap( + address _tokenIn, + address _tokenOut, + uint256 _amountIn, + address _pool, + uint8 _directFundThisPool, + address _receiver, + uint256 _extraParam2 + ) external returns (uint256 _amountOut); +} + +// Interface used to call pool specific functions +interface PoolInterface { + // Fraxswap + function executeVirtualOrders(uint256 blockNumber) external; + + function getAmountOut(uint256 amountIn, address tokenIn) external view returns (uint256); + + // Fraxlend + function deposit(uint256 userId, address userAddress) external returns (uint256 _sharesReceived); + + // FrxETHMinter + function submitAndGive(address recipient) external payable; + + // Curve + function exchange(uint256 i, uint256 j, uint256 dx, uint256 min_dy) external; + + function exchange(int128 i, int128 j, uint256 dx, uint256 min_dy) external payable returns (uint256); + + function exchange( + int128 i, + int128 j, + uint256 dx, + uint256 min_dy, + address receiver + ) external payable returns (uint256); + + function exchange_underlying(int128 i, int128 j, uint256 dx, uint256 min_dy) external returns (uint256); + + function exchange_received( + int128 i, + int128 j, + uint256 dx, + uint256 min_dy, + address receiver + ) external returns (uint256); + + // Saddle + function swap( + uint8 tokenIndexFrom, + uint8 tokenIndexTo, + uint256 dx, + uint256 minDy, + uint256 deadline + ) external returns (uint256); + + //FPI Mint/Redeem + function mintFPI(uint256 frax_in, uint256 min_fpi_out) external returns (uint256 fpi_out); + + function redeemFPI(uint256 fpi_in, uint256 min_frax_out) external returns (uint256 frax_out); + + // ERC4626 redeem + function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets); + + // generic swap wrapper + function swap( + address tokenIn, + address tokenOut, + uint256 amountIn, + address target + ) external returns (uint256 amountOut); } diff --git a/src/flattened-router-multihop.sol b/src/flattened-router-multihop.sol deleted file mode 100644 index 73120f2..0000000 --- a/src/flattened-router-multihop.sol +++ /dev/null @@ -1,1485 +0,0 @@ -// SPDX-License-Identifier: BUSL-1.1 -pragma solidity >=0.5.0 >=0.6.0 ^0.8.0 ^0.8.20; - -// lib/v2-core/contracts/interfaces/IUniswapV2Pair.sol - -interface IUniswapV2Pair { - event Approval(address indexed owner, address indexed spender, uint256 value); - event Transfer(address indexed from, address indexed to, uint256 value); - - function name() external pure returns (string memory); - function symbol() external pure returns (string memory); - function decimals() external pure returns (uint8); - function totalSupply() external view returns (uint256); - function balanceOf(address owner) external view returns (uint256); - function allowance(address owner, address spender) external view returns (uint256); - - function approve(address spender, uint256 value) external returns (bool); - function transfer(address to, uint256 value) external returns (bool); - function transferFrom(address from, address to, uint256 value) external returns (bool); - - function DOMAIN_SEPARATOR() external view returns (bytes32); - function PERMIT_TYPEHASH() external pure returns (bytes32); - function nonces(address owner) external view returns (uint256); - - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - event Mint(address indexed sender, uint256 amount0, uint256 amount1); - event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to); - event Swap( - address indexed sender, - uint256 amount0In, - uint256 amount1In, - uint256 amount0Out, - uint256 amount1Out, - address indexed to - ); - event Sync(uint112 reserve0, uint112 reserve1); - - function MINIMUM_LIQUIDITY() external pure returns (uint256); - function factory() external view returns (address); - function token0() external view returns (address); - function token1() external view returns (address); - function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); - function price0CumulativeLast() external view returns (uint256); - function price1CumulativeLast() external view returns (uint256); - function kLast() external view returns (uint256); - - function mint(address to) external returns (uint256 liquidity); - function burn(address to) external returns (uint256 amount0, uint256 amount1); - function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data) external; - function skim(address to) external; - function sync() external; - - function initialize(address, address) external; -} - -// lib/v2-periphery/contracts/interfaces/IWETH.sol - -interface IWETH { - function deposit() external payable; - function transfer(address to, uint256 value) external returns (bool); - function withdraw(uint256) external; -} - -// lib/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol - -/// @title Callback for IUniswapV3PoolActions#swap -/// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface -interface IUniswapV3SwapCallback { - /// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap. - /// @dev In the implementation you must pay the pool tokens owed for the swap. - /// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory. - /// amount0Delta and amount1Delta can both be 0 if no tokens were swapped. - /// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by - /// the end of the swap. If positive, the callback must send that amount of token0 to the pool. - /// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by - /// the end of the swap. If positive, the callback must send that amount of token1 to the pool. - /// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call - function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata data) external; -} - -// lib/v3-core/contracts/interfaces/pool/IUniswapV3PoolActions.sol - -/// @title Permissionless pool actions -/// @notice Contains pool methods that can be called by anyone -interface IUniswapV3PoolActions { - /// @notice Sets the initial price for the pool - /// @dev Price is represented as a sqrt(amountToken1/amountToken0) Q64.96 value - /// @param sqrtPriceX96 the initial sqrt price of the pool as a Q64.96 - function initialize(uint160 sqrtPriceX96) external; - - /// @notice Adds liquidity for the given recipient/tickLower/tickUpper position - /// @dev The caller of this method receives a callback in the form of IUniswapV3MintCallback#uniswapV3MintCallback - /// in which they must pay any token0 or token1 owed for the liquidity. The amount of token0/token1 due depends - /// on tickLower, tickUpper, the amount of liquidity, and the current price. - /// @param recipient The address for which the liquidity will be created - /// @param tickLower The lower tick of the position in which to add liquidity - /// @param tickUpper The upper tick of the position in which to add liquidity - /// @param amount The amount of liquidity to mint - /// @param data Any data that should be passed through to the callback - /// @return amount0 The amount of token0 that was paid to mint the given amount of liquidity. Matches the value in the callback - /// @return amount1 The amount of token1 that was paid to mint the given amount of liquidity. Matches the value in the callback - function mint( - address recipient, - int24 tickLower, - int24 tickUpper, - uint128 amount, - bytes calldata data - ) external returns (uint256 amount0, uint256 amount1); - - /// @notice Collects tokens owed to a position - /// @dev Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity. - /// Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or - /// amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the - /// actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity. - /// @param recipient The address which should receive the fees collected - /// @param tickLower The lower tick of the position for which to collect fees - /// @param tickUpper The upper tick of the position for which to collect fees - /// @param amount0Requested How much token0 should be withdrawn from the fees owed - /// @param amount1Requested How much token1 should be withdrawn from the fees owed - /// @return amount0 The amount of fees collected in token0 - /// @return amount1 The amount of fees collected in token1 - function collect( - address recipient, - int24 tickLower, - int24 tickUpper, - uint128 amount0Requested, - uint128 amount1Requested - ) external returns (uint128 amount0, uint128 amount1); - - /// @notice Burn liquidity from the sender and account tokens owed for the liquidity to the position - /// @dev Can be used to trigger a recalculation of fees owed to a position by calling with an amount of 0 - /// @dev Fees must be collected separately via a call to #collect - /// @param tickLower The lower tick of the position for which to burn liquidity - /// @param tickUpper The upper tick of the position for which to burn liquidity - /// @param amount How much liquidity to burn - /// @return amount0 The amount of token0 sent to the recipient - /// @return amount1 The amount of token1 sent to the recipient - function burn(int24 tickLower, int24 tickUpper, uint128 amount) external returns (uint256 amount0, uint256 amount1); - - /// @notice Swap token0 for token1, or token1 for token0 - /// @dev The caller of this method receives a callback in the form of IUniswapV3SwapCallback#uniswapV3SwapCallback - /// @param recipient The address to receive the output of the swap - /// @param zeroForOne The direction of the swap, true for token0 to token1, false for token1 to token0 - /// @param amountSpecified The amount of the swap, which implicitly configures the swap as exact input (positive), or exact output (negative) - /// @param sqrtPriceLimitX96 The Q64.96 sqrt price limit. If zero for one, the price cannot be less than this - /// value after the swap. If one for zero, the price cannot be greater than this value after the swap - /// @param data Any data to be passed through to the callback - /// @return amount0 The delta of the balance of token0 of the pool, exact when negative, minimum when positive - /// @return amount1 The delta of the balance of token1 of the pool, exact when negative, minimum when positive - function swap( - address recipient, - bool zeroForOne, - int256 amountSpecified, - uint160 sqrtPriceLimitX96, - bytes calldata data - ) external returns (int256 amount0, int256 amount1); - - /// @notice Receive token0 and/or token1 and pay it back, plus a fee, in the callback - /// @dev The caller of this method receives a callback in the form of IUniswapV3FlashCallback#uniswapV3FlashCallback - /// @dev Can be used to donate underlying tokens pro-rata to currently in-range liquidity providers by calling - /// with 0 amount{0,1} and sending the donation amount(s) from the callback - /// @param recipient The address which will receive the token0 and token1 amounts - /// @param amount0 The amount of token0 to send - /// @param amount1 The amount of token1 to send - /// @param data Any data to be passed through to the callback - function flash(address recipient, uint256 amount0, uint256 amount1, bytes calldata data) external; - - /// @notice Increase the maximum number of price and liquidity observations that this pool will store - /// @dev This method is no-op if the pool already has an observationCardinalityNext greater than or equal to - /// the input observationCardinalityNext. - /// @param observationCardinalityNext The desired minimum number of observations for the pool to store - function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external; -} - -// lib/v3-core/contracts/interfaces/pool/IUniswapV3PoolDerivedState.sol - -/// @title Pool state that is not stored -/// @notice Contains view functions to provide information about the pool that is computed rather than stored on the -/// blockchain. The functions here may have variable gas costs. -interface IUniswapV3PoolDerivedState { - /// @notice Returns the cumulative tick and liquidity as of each timestamp `secondsAgo` from the current block timestamp - /// @dev To get a time weighted average tick or liquidity-in-range, you must call this with two values, one representing - /// the beginning of the period and another for the end of the period. E.g., to get the last hour time-weighted average tick, - /// you must call it with secondsAgos = [3600, 0]. - /// @dev The time weighted average tick represents the geometric time weighted average price of the pool, in - /// log base sqrt(1.0001) of token1 / token0. The TickMath library can be used to go from a tick value to a ratio. - /// @param secondsAgos From how long ago each cumulative tick and liquidity value should be returned - /// @return tickCumulatives Cumulative tick values as of each `secondsAgos` from the current block timestamp - /// @return secondsPerLiquidityCumulativeX128s Cumulative seconds per liquidity-in-range value as of each `secondsAgos` from the current block - /// timestamp - function observe( - uint32[] calldata secondsAgos - ) external view returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s); - - /// @notice Returns a snapshot of the tick cumulative, seconds per liquidity and seconds inside a tick range - /// @dev Snapshots must only be compared to other snapshots, taken over a period for which a position existed. - /// I.e., snapshots cannot be compared if a position is not held for the entire period between when the first - /// snapshot is taken and the second snapshot is taken. - /// @param tickLower The lower tick of the range - /// @param tickUpper The upper tick of the range - /// @return tickCumulativeInside The snapshot of the tick accumulator for the range - /// @return secondsPerLiquidityInsideX128 The snapshot of seconds per liquidity for the range - /// @return secondsInside The snapshot of seconds per liquidity for the range - function snapshotCumulativesInside( - int24 tickLower, - int24 tickUpper - ) external view returns (int56 tickCumulativeInside, uint160 secondsPerLiquidityInsideX128, uint32 secondsInside); -} - -// lib/v3-core/contracts/interfaces/pool/IUniswapV3PoolEvents.sol - -/// @title Events emitted by a pool -/// @notice Contains all events emitted by the pool -interface IUniswapV3PoolEvents { - /// @notice Emitted exactly once by a pool when #initialize is first called on the pool - /// @dev Mint/Burn/Swap cannot be emitted by the pool before Initialize - /// @param sqrtPriceX96 The initial sqrt price of the pool, as a Q64.96 - /// @param tick The initial tick of the pool, i.e. log base 1.0001 of the starting price of the pool - event Initialize(uint160 sqrtPriceX96, int24 tick); - - /// @notice Emitted when liquidity is minted for a given position - /// @param sender The address that minted the liquidity - /// @param owner The owner of the position and recipient of any minted liquidity - /// @param tickLower The lower tick of the position - /// @param tickUpper The upper tick of the position - /// @param amount The amount of liquidity minted to the position range - /// @param amount0 How much token0 was required for the minted liquidity - /// @param amount1 How much token1 was required for the minted liquidity - event Mint( - address sender, - address indexed owner, - int24 indexed tickLower, - int24 indexed tickUpper, - uint128 amount, - uint256 amount0, - uint256 amount1 - ); - - /// @notice Emitted when fees are collected by the owner of a position - /// @dev Collect events may be emitted with zero amount0 and amount1 when the caller chooses not to collect fees - /// @param owner The owner of the position for which fees are collected - /// @param tickLower The lower tick of the position - /// @param tickUpper The upper tick of the position - /// @param amount0 The amount of token0 fees collected - /// @param amount1 The amount of token1 fees collected - event Collect( - address indexed owner, - address recipient, - int24 indexed tickLower, - int24 indexed tickUpper, - uint128 amount0, - uint128 amount1 - ); - - /// @notice Emitted when a position's liquidity is removed - /// @dev Does not withdraw any fees earned by the liquidity position, which must be withdrawn via #collect - /// @param owner The owner of the position for which liquidity is removed - /// @param tickLower The lower tick of the position - /// @param tickUpper The upper tick of the position - /// @param amount The amount of liquidity to remove - /// @param amount0 The amount of token0 withdrawn - /// @param amount1 The amount of token1 withdrawn - event Burn( - address indexed owner, - int24 indexed tickLower, - int24 indexed tickUpper, - uint128 amount, - uint256 amount0, - uint256 amount1 - ); - - /// @notice Emitted by the pool for any swaps between token0 and token1 - /// @param sender The address that initiated the swap call, and that received the callback - /// @param recipient The address that received the output of the swap - /// @param amount0 The delta of the token0 balance of the pool - /// @param amount1 The delta of the token1 balance of the pool - /// @param sqrtPriceX96 The sqrt(price) of the pool after the swap, as a Q64.96 - /// @param liquidity The liquidity of the pool after the swap - /// @param tick The log base 1.0001 of price of the pool after the swap - event Swap( - address indexed sender, - address indexed recipient, - int256 amount0, - int256 amount1, - uint160 sqrtPriceX96, - uint128 liquidity, - int24 tick - ); - - /// @notice Emitted by the pool for any flashes of token0/token1 - /// @param sender The address that initiated the swap call, and that received the callback - /// @param recipient The address that received the tokens from flash - /// @param amount0 The amount of token0 that was flashed - /// @param amount1 The amount of token1 that was flashed - /// @param paid0 The amount of token0 paid for the flash, which can exceed the amount0 plus the fee - /// @param paid1 The amount of token1 paid for the flash, which can exceed the amount1 plus the fee - event Flash( - address indexed sender, - address indexed recipient, - uint256 amount0, - uint256 amount1, - uint256 paid0, - uint256 paid1 - ); - - /// @notice Emitted by the pool for increases to the number of observations that can be stored - /// @dev observationCardinalityNext is not the observation cardinality until an observation is written at the index - /// just before a mint/swap/burn. - /// @param observationCardinalityNextOld The previous value of the next observation cardinality - /// @param observationCardinalityNextNew The updated value of the next observation cardinality - event IncreaseObservationCardinalityNext( - uint16 observationCardinalityNextOld, - uint16 observationCardinalityNextNew - ); - - /// @notice Emitted when the protocol fee is changed by the pool - /// @param feeProtocol0Old The previous value of the token0 protocol fee - /// @param feeProtocol1Old The previous value of the token1 protocol fee - /// @param feeProtocol0New The updated value of the token0 protocol fee - /// @param feeProtocol1New The updated value of the token1 protocol fee - event SetFeeProtocol(uint8 feeProtocol0Old, uint8 feeProtocol1Old, uint8 feeProtocol0New, uint8 feeProtocol1New); - - /// @notice Emitted when the collected protocol fees are withdrawn by the factory owner - /// @param sender The address that collects the protocol fees - /// @param recipient The address that receives the collected protocol fees - /// @param amount0 The amount of token0 protocol fees that is withdrawn - /// @param amount0 The amount of token1 protocol fees that is withdrawn - event CollectProtocol(address indexed sender, address indexed recipient, uint128 amount0, uint128 amount1); -} - -// lib/v3-core/contracts/interfaces/pool/IUniswapV3PoolImmutables.sol - -/// @title Pool state that never changes -/// @notice These parameters are fixed for a pool forever, i.e., the methods will always return the same values -interface IUniswapV3PoolImmutables { - /// @notice The contract that deployed the pool, which must adhere to the IUniswapV3Factory interface - /// @return The contract address - function factory() external view returns (address); - - /// @notice The first of the two tokens of the pool, sorted by address - /// @return The token contract address - function token0() external view returns (address); - - /// @notice The second of the two tokens of the pool, sorted by address - /// @return The token contract address - function token1() external view returns (address); - - /// @notice The pool's fee in hundredths of a bip, i.e. 1e-6 - /// @return The fee - function fee() external view returns (uint24); - - /// @notice The pool tick spacing - /// @dev Ticks can only be used at multiples of this value, minimum of 1 and always positive - /// e.g.: a tickSpacing of 3 means ticks can be initialized every 3rd tick, i.e., ..., -6, -3, 0, 3, 6, ... - /// This value is an int24 to avoid casting even though it is always positive. - /// @return The tick spacing - function tickSpacing() external view returns (int24); - - /// @notice The maximum amount of position liquidity that can use any tick in the range - /// @dev This parameter is enforced per tick to prevent liquidity from overflowing a uint128 at any point, and - /// also prevents out-of-range liquidity from being used to prevent adding in-range liquidity to a pool - /// @return The max amount of liquidity per tick - function maxLiquidityPerTick() external view returns (uint128); -} - -// lib/v3-core/contracts/interfaces/pool/IUniswapV3PoolOwnerActions.sol - -/// @title Permissioned pool actions -/// @notice Contains pool methods that may only be called by the factory owner -interface IUniswapV3PoolOwnerActions { - /// @notice Set the denominator of the protocol's % share of the fees - /// @param feeProtocol0 new protocol fee for token0 of the pool - /// @param feeProtocol1 new protocol fee for token1 of the pool - function setFeeProtocol(uint8 feeProtocol0, uint8 feeProtocol1) external; - - /// @notice Collect the protocol fee accrued to the pool - /// @param recipient The address to which collected protocol fees should be sent - /// @param amount0Requested The maximum amount of token0 to send, can be 0 to collect fees in only token1 - /// @param amount1Requested The maximum amount of token1 to send, can be 0 to collect fees in only token0 - /// @return amount0 The protocol fee collected in token0 - /// @return amount1 The protocol fee collected in token1 - function collectProtocol( - address recipient, - uint128 amount0Requested, - uint128 amount1Requested - ) external returns (uint128 amount0, uint128 amount1); -} - -// lib/v3-core/contracts/interfaces/pool/IUniswapV3PoolState.sol - -/// @title Pool state that can change -/// @notice These methods compose the pool's state, and can change with any frequency including multiple times -/// per transaction -interface IUniswapV3PoolState { - /// @notice The 0th storage slot in the pool stores many values, and is exposed as a single method to save gas - /// when accessed externally. - /// @return sqrtPriceX96 The current price of the pool as a sqrt(token1/token0) Q64.96 value - /// tick The current tick of the pool, i.e. according to the last tick transition that was run. - /// This value may not always be equal to SqrtTickMath.getTickAtSqrtRatio(sqrtPriceX96) if the price is on a tick - /// boundary. - /// observationIndex The index of the last oracle observation that was written, - /// observationCardinality The current maximum number of observations stored in the pool, - /// observationCardinalityNext The next maximum number of observations, to be updated when the observation. - /// feeProtocol The protocol fee for both tokens of the pool. - /// Encoded as two 4 bit values, where the protocol fee of token1 is shifted 4 bits and the protocol fee of token0 - /// is the lower 4 bits. Used as the denominator of a fraction of the swap fee, e.g. 4 means 1/4th of the swap fee. - /// unlocked Whether the pool is currently locked to reentrancy - function slot0() - external - view - returns ( - uint160 sqrtPriceX96, - int24 tick, - uint16 observationIndex, - uint16 observationCardinality, - uint16 observationCardinalityNext, - uint8 feeProtocol, - bool unlocked - ); - - /// @notice The fee growth as a Q128.128 fees of token0 collected per unit of liquidity for the entire life of the pool - /// @dev This value can overflow the uint256 - function feeGrowthGlobal0X128() external view returns (uint256); - - /// @notice The fee growth as a Q128.128 fees of token1 collected per unit of liquidity for the entire life of the pool - /// @dev This value can overflow the uint256 - function feeGrowthGlobal1X128() external view returns (uint256); - - /// @notice The amounts of token0 and token1 that are owed to the protocol - /// @dev Protocol fees will never exceed uint128 max in either token - function protocolFees() external view returns (uint128 token0, uint128 token1); - - /// @notice The currently in range liquidity available to the pool - /// @dev This value has no relationship to the total liquidity across all ticks - function liquidity() external view returns (uint128); - - /// @notice Look up information about a specific tick in the pool - /// @param tick The tick to look up - /// @return liquidityGross the total amount of position liquidity that uses the pool either as tick lower or - /// tick upper, - /// liquidityNet how much liquidity changes when the pool price crosses the tick, - /// feeGrowthOutside0X128 the fee growth on the other side of the tick from the current tick in token0, - /// feeGrowthOutside1X128 the fee growth on the other side of the tick from the current tick in token1, - /// tickCumulativeOutside the cumulative tick value on the other side of the tick from the current tick - /// secondsPerLiquidityOutsideX128 the seconds spent per liquidity on the other side of the tick from the current tick, - /// secondsOutside the seconds spent on the other side of the tick from the current tick, - /// initialized Set to true if the tick is initialized, i.e. liquidityGross is greater than 0, otherwise equal to false. - /// Outside values can only be used if the tick is initialized, i.e. if liquidityGross is greater than 0. - /// In addition, these values are only relative and must be used only in comparison to previous snapshots for - /// a specific position. - function ticks( - int24 tick - ) - external - view - returns ( - uint128 liquidityGross, - int128 liquidityNet, - uint256 feeGrowthOutside0X128, - uint256 feeGrowthOutside1X128, - int56 tickCumulativeOutside, - uint160 secondsPerLiquidityOutsideX128, - uint32 secondsOutside, - bool initialized - ); - - /// @notice Returns 256 packed tick initialized boolean values. See TickBitmap for more information - function tickBitmap(int16 wordPosition) external view returns (uint256); - - /// @notice Returns the information about a position by the position's key - /// @param key The position's key is a hash of a preimage composed by the owner, tickLower and tickUpper - /// @return _liquidity The amount of liquidity in the position, - /// Returns feeGrowthInside0LastX128 fee growth of token0 inside the tick range as of the last mint/burn/poke, - /// Returns feeGrowthInside1LastX128 fee growth of token1 inside the tick range as of the last mint/burn/poke, - /// Returns tokensOwed0 the computed amount of token0 owed to the position as of the last mint/burn/poke, - /// Returns tokensOwed1 the computed amount of token1 owed to the position as of the last mint/burn/poke - function positions( - bytes32 key - ) - external - view - returns ( - uint128 _liquidity, - uint256 feeGrowthInside0LastX128, - uint256 feeGrowthInside1LastX128, - uint128 tokensOwed0, - uint128 tokensOwed1 - ); - - /// @notice Returns data about a specific observation index - /// @param index The element of the observations array to fetch - /// @dev You most likely want to use #observe() instead of this method to get an observation as of some amount of time - /// ago, rather than at a specific index in the array. - /// @return blockTimestamp The timestamp of the observation, - /// Returns tickCumulative the tick multiplied by seconds elapsed for the life of the pool as of the observation timestamp, - /// Returns secondsPerLiquidityCumulativeX128 the seconds per in range liquidity for the life of the pool as of the observation timestamp, - /// Returns initialized whether the observation has been initialized and the values are safe to use - function observations( - uint256 index - ) - external - view - returns ( - uint32 blockTimestamp, - int56 tickCumulative, - uint160 secondsPerLiquidityCumulativeX128, - bool initialized - ); -} - -// lib/v3-core/contracts/libraries/SafeCast.sol - -/// @title Safe casting methods -/// @notice Contains methods for safely casting between types -library SafeCast { - /// @notice Cast a uint256 to a uint160, revert on overflow - /// @param y The uint256 to be downcasted - /// @return z The downcasted integer, now type uint160 - function toUint160(uint256 y) internal pure returns (uint160 z) { - require((z = uint160(y)) == y); - } - - /// @notice Cast a int256 to a int128, revert on overflow or underflow - /// @param y The int256 to be downcasted - /// @return z The downcasted integer, now type int128 - function toInt128(int256 y) internal pure returns (int128 z) { - require((z = int128(y)) == y); - } - - /// @notice Cast a uint256 to a int256, revert on overflow - /// @param y The uint256 to be casted - /// @return z The casted integer, now type int256 - function toInt256(uint256 y) internal pure returns (int256 z) { - require(y < 2 ** 255); - z = int256(y); - } -} - -// node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol - -// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); - - /** - * @dev Returns the value of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the value of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves a `value` amount of tokens from the caller's account to `to`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address to, uint256 value) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets a `value` amount of tokens as the allowance of `spender` over the - * caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 value) external returns (bool); - - /** - * @dev Moves a `value` amount of tokens from `from` to `to` using the - * allowance mechanism. `value` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address from, address to, uint256 value) external returns (bool); -} - -// node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol - -// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) - -/** - * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in - * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. - * - * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by - * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't - * need to send a transaction, and thus is not required to hold Ether at all. - * - * ==== Security Considerations - * - * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature - * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be - * considered as an intention to spend the allowance in any specific way. The second is that because permits have - * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should - * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be - * generally recommended is: - * - * ```solidity - * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { - * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} - * doThing(..., value); - * } - * - * function doThing(..., uint256 value) public { - * token.safeTransferFrom(msg.sender, address(this), value); - * ... - * } - * ``` - * - * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of - * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also - * {SafeERC20-safeTransferFrom}). - * - * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so - * contracts should have entry points that don't rely on permit. - */ -interface IERC20Permit { - /** - * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, - * given ``owner``'s signed approval. - * - * IMPORTANT: The same issues {IERC20-approve} has related to transaction - * ordering also apply here. - * - * Emits an {Approval} event. - * - * Requirements: - * - * - `spender` cannot be the zero address. - * - `deadline` must be a timestamp in the future. - * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` - * over the EIP712-formatted function arguments. - * - the signature must use ``owner``'s current nonce (see {nonces}). - * - * For more information on the signature format, see the - * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP - * section]. - * - * CAUTION: See Security Considerations above. - */ - function permit( - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) external; - - /** - * @dev Returns the current nonce for `owner`. This value must be - * included whenever a signature is generated for {permit}. - * - * Every successful call to {permit} increases ``owner``'s nonce by one. This - * prevents a signature from being used multiple times. - */ - function nonces(address owner) external view returns (uint256); - - /** - * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. - */ - // solhint-disable-next-line func-name-mixedcase - function DOMAIN_SEPARATOR() external view returns (bytes32); -} - -// node_modules/@openzeppelin/contracts/utils/ReentrancyGuard.sol - -// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) - -/** - * @dev Contract module that helps prevent reentrant calls to a function. - * - * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier - * available, which can be applied to functions to make sure there are no nested - * (reentrant) calls to them. - * - * Note that because there is a single `nonReentrant` guard, functions marked as - * `nonReentrant` may not call one another. This can be worked around by making - * those functions `private`, and then adding `external` `nonReentrant` entry - * points to them. - * - * TIP: If you would like to learn more about reentrancy and alternative ways - * to protect against it, check out our blog post - * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. - */ -abstract contract ReentrancyGuard { - // Booleans are more expensive than uint256 or any type that takes up a full - // word because each write operation emits an extra SLOAD to first read the - // slot's contents, replace the bits taken up by the boolean, and then write - // back. This is the compiler's defense against contract upgrades and - // pointer aliasing, and it cannot be disabled. - - // The values being non-zero value makes deployment a bit more expensive, - // but in exchange the refund on every call to nonReentrant will be lower in - // amount. Since refunds are capped to a percentage of the total - // transaction's gas, it is best to keep them low in cases like this one, to - // increase the likelihood of the full refund coming into effect. - uint256 private constant NOT_ENTERED = 1; - uint256 private constant ENTERED = 2; - - uint256 private _status; - - /** - * @dev Unauthorized reentrant call. - */ - error ReentrancyGuardReentrantCall(); - - constructor() { - _status = NOT_ENTERED; - } - - /** - * @dev Prevents a contract from calling itself, directly or indirectly. - * Calling a `nonReentrant` function from another `nonReentrant` - * function is not supported. It is possible to prevent this from happening - * by making the `nonReentrant` function external, and making it call a - * `private` function that does the actual work. - */ - modifier nonReentrant() { - _nonReentrantBefore(); - _; - _nonReentrantAfter(); - } - - function _nonReentrantBefore() private { - // On the first call to nonReentrant, _status will be NOT_ENTERED - if (_status == ENTERED) { - revert ReentrancyGuardReentrantCall(); - } - - // Any calls to nonReentrant after this point will fail - _status = ENTERED; - } - - function _nonReentrantAfter() private { - // By storing the original value once again, a refund is triggered (see - // https://eips.ethereum.org/EIPS/eip-2200) - _status = NOT_ENTERED; - } - - /** - * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a - * `nonReentrant` function in the call stack. - */ - function _reentrancyGuardEntered() internal view returns (bool) { - return _status == ENTERED; - } -} - -// src/contracts/periphery/interfaces/IFraxswapRouterMultihop.sol - -interface IFraxswapRouterMultihop { - /// @notice Input to the swap function - /// @dev contains the top level info for the swap - /// @param tokenIn input token address - /// @param amountIn input token amount - /// @param tokenOut output token address - /// @param amountOutMinimum output token minimum amount (reverts if lower) - /// @param recipient recipient of the output token - /// @param deadline deadline for this swap transaction (reverts if exceeded) - /// @param v v value for permit signature if supported - /// @param r r value for permit signature if supported - /// @param s s value for permit signature if supported - /// @param route byte encoded - struct FraxswapParams { - address tokenIn; - uint256 amountIn; - address tokenOut; - uint256 amountOutMinimum; - address recipient; - uint256 deadline; - bool approveMax; - uint8 v; - bytes32 r; - bytes32 s; - bytes route; - } - - /// @notice A hop along the swap route - /// @dev a series of swaps (steps) containing the same input token and output token - /// @param tokenOut output token address - /// @param amountOut output token amount - /// @param percentOfHop amount of output tokens from the previous hop going into this hop - /// @param steps list of swaps from the same input token to the same output token - /// @param nextHops next hops from this one, the next hops' input token is the tokenOut - struct FraxswapRoute { - address tokenOut; - uint256 amountOut; - uint256 percentOfHop; - bytes[] steps; - bytes[] nextHops; - } - - /// @notice A swap step in a specific route. routes can have multiple swap steps - /// @dev a single swap to a token from the token of the previous hop in the route - /// @param swapType type of the swap performed (Uniswap V2, Fraxswap,Curve, etc) - /// @param directFundNextPool 0 = funds go via router, 1 = fund are sent directly to pool - /// @param directFundThisPool 0 = funds go via router, 1 = fund are sent directly to pool - /// @param tokenOut the target token of the step. output token address - /// @param pool address of the pool to use in the step - /// @param extraParam1 extra data used in the step - /// @param extraParam2 extra data used in the step - /// @param percentOfHop percentage of all of the steps in this route (hop) - struct FraxswapStepData { - uint8 swapType; - uint8 directFundNextPool; - uint8 directFundThisPool; - address tokenOut; - address pool; - uint256 extraParam1; - uint256 extraParam2; - uint256 percentOfHop; - } - - /// @notice struct for Uniswap V3 callback - /// @param tokenIn address of input token - /// @param directFundThisPool this pool already been funded - struct SwapCallbackData { - address tokenIn; - bool directFundThisPool; - } - - /// @notice Routing event emitted every swap - /// @param tokenIn address of the original input token - /// @param tokenOut address of the final output token - /// @param amountIn input amount for original input token - /// @param amountOut output amount for the final output token - event Routed(address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOut); - - function encodeRoute( - address tokenOut, - uint256 percentOfHop, - bytes[] memory steps, - bytes[] memory nextHops - ) external pure returns (bytes memory out); - function encodeStep( - uint8 swapType, - uint8 directFundNextPool, - uint8 directFundThisPool, - address tokenOut, - address pool, - uint256 extraParam1, - uint256 extraParam2, - uint256 percentOfHop - ) external pure returns (bytes memory out); - function swap(FraxswapParams memory params) external payable returns (uint256 amountOut); - function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes memory _data) external; -} - -// src/contracts/periphery/interfaces/IPoolInterface.sol - -/// @notice Interface used to call pool specific functions -interface IPoolInterface { - // Fraxswap - function executeVirtualOrders(uint256 blockNumber) external; - - function getAmountOut(uint256 amountIn, address tokenIn) external view returns (uint256); - - // Fraxlend - function deposit(uint256 userId, address userAddress) external returns (uint256 _sharesReceived); - - // FrxETHMinter - function submitAndGive(address recipient) external payable; - - // Curve - function exchange(uint256 i, uint256 j, uint256 dx, uint256 min_dy) external; - - function exchange(int128 i, int128 j, uint256 dx, uint256 min_dy) external payable returns (uint256); - - function exchange( - int128 i, - int128 j, - uint256 dx, - uint256 min_dy, - address receiver - ) external payable returns (uint256); - - function exchange_underlying(int128 i, int128 j, uint256 dx, uint256 min_dy) external returns (uint256); - - function exchange_received( - int128 i, - int128 j, - uint256 dx, - uint256 min_dy, - address receiver - ) external returns (uint256); - - // Saddle - function swap( - uint8 tokenIndexFrom, - uint8 tokenIndexTo, - uint256 dx, - uint256 minDy, - uint256 deadline - ) external returns (uint256); - - //FPI Mint/Redeem - function mintFPI(uint256 frax_in, uint256 min_fpi_out) external returns (uint256 fpi_out); - - function redeemFPI(uint256 fpi_in, uint256 min_frax_out) external returns (uint256 frax_out); - - // ERC4626 redeem - function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets); - - // generic swap wrapper - function swap( - address tokenIn, - address tokenOut, - uint256 amountIn, - address target - ) external returns (uint256 amountOut); -} - -// lib/v3-periphery/contracts/libraries/TransferHelper.sol - -library TransferHelper { - /// @notice Transfers tokens from the targeted address to the given destination - /// @notice Errors with 'STF' if transfer fails - /// @param token The contract address of the token to be transferred - /// @param from The originating address from which the tokens will be transferred - /// @param to The destination address of the transfer - /// @param value The amount to be transferred - function safeTransferFrom(address token, address from, address to, uint256 value) internal { - (bool success, bytes memory data) = token.call( - abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value) - ); - require(success && (data.length == 0 || abi.decode(data, (bool))), "STF"); - } - - /// @notice Transfers tokens from msg.sender to a recipient - /// @dev Errors with ST if transfer fails - /// @param token The contract address of the token which will be transferred - /// @param to The recipient of the transfer - /// @param value The value of the transfer - function safeTransfer(address token, address to, uint256 value) internal { - (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); - require(success && (data.length == 0 || abi.decode(data, (bool))), "ST"); - } - - /// @notice Approves the stipulated contract to spend the given allowance in the given token - /// @dev Errors with 'SA' if transfer fails - /// @param token The contract address of the token to be approved - /// @param to The target of the approval - /// @param value The amount of the given token the target will be allowed to spend - function safeApprove(address token, address to, uint256 value) internal { - (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value)); - require(success && (data.length == 0 || abi.decode(data, (bool))), "SA"); - } - - /// @notice Transfers ETH to the recipient address - /// @dev Fails with `STE` - /// @param to The destination of the transfer - /// @param value The value to be transferred - function safeTransferETH(address to, uint256 value) internal { - (bool success, ) = to.call{ value: value }(new bytes(0)); - require(success, "STE"); - } -} - -// lib/v3-core/contracts/interfaces/IUniswapV3Pool.sol - -/// @title The interface for a Uniswap V3 Pool -/// @notice A Uniswap pool facilitates swapping and automated market making between any two assets that strictly conform -/// to the ERC20 specification -/// @dev The pool interface is broken up into many smaller pieces -interface IUniswapV3Pool is - IUniswapV3PoolImmutables, - IUniswapV3PoolState, - IUniswapV3PoolDerivedState, - IUniswapV3PoolActions, - IUniswapV3PoolOwnerActions, - IUniswapV3PoolEvents -{} - -// src/contracts/periphery/FraxswapRouterMultihop.sol - -// ==================================================================== -// | ______ _______ | -// | / _____________ __ __ / ____(_____ ____ _____ ________ | -// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | -// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | -// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | -// | | -// ==================================================================== -// ===================== Fraxswap Router Multihop ===================== -// ==================================================================== - -/// @title Fraxswap Router Multihop -/// @dev Router for swapping across the majority of the FRAX liquidity -/// @author Frax Finance (https://github.com/FraxFinance) -contract FraxswapRouterMultihop is ReentrancyGuard, IFraxswapRouterMultihop { - using SafeCast for uint256; - using SafeCast for int256; - - IWETH public immutable WETH9; - address public immutable FRAX; - bool public immutable CHECK_AMOUNTOUT_IN_ROUTER; - - constructor(IWETH _WETH9, address _FRAX, bool _CHECK_AMOUNTOUT_IN_ROUTER) { - WETH9 = _WETH9; - FRAX = _FRAX; - CHECK_AMOUNTOUT_IN_ROUTER = _CHECK_AMOUNTOUT_IN_ROUTER; - } - - /// @notice modifier for checking deadline - modifier checkDeadline(uint256 deadline) { - require(block.timestamp <= deadline, "Transaction too old"); - _; - } - - /// @notice accept ETH - receive() external payable {} - - /// --------------------------- - /// --------- Public ---------- - /// --------------------------- - - /// @notice Main external swap function - /// @param params all parameters for this swap - /// @return amountOut output amount from this swap - function swap( - FraxswapParams memory params - ) external payable nonReentrant checkDeadline(params.deadline) returns (uint256 amountOut) { - if (params.recipient == address(0)) params.recipient = msg.sender; - FraxswapRoute memory route = abi.decode(params.route, (FraxswapRoute)); - route.tokenOut = params.tokenIn; - route.amountOut = params.amountIn; - FraxswapRoute memory firstRoute = abi.decode(route.nextHops[0], (FraxswapRoute)); - - if (params.tokenIn == address(0)) { - // ETH sent in via msg.value - require(msg.value == params.amountIn, "FSR:II"); // Insufficient input ETH - } else if (params.tokenIn == address(WETH9) && msg.value > 0) { - // ETH sent in via msg.value - require(msg.value == params.amountIn, "FSR:II"); // Insufficient input ETH - WETH9.deposit{ value: msg.value }(); - } else { - require(msg.value == 0, "FSR:IE"); // ETH transfer that is not used, prevent mistakes - if (params.v != 0) { - // use permit instead of approval - uint256 amount = params.approveMax ? type(uint256).max : params.amountIn; - IERC20Permit(params.tokenIn).permit( - msg.sender, - address(this), - amount, - params.deadline, - params.v, - params.r, - params.s - ); - } - address targetPool = address(this); - if (firstRoute.steps.length > 0) { - FraxswapStepData memory step = abi.decode(firstRoute.steps[0], (FraxswapStepData)); - if (step.directFundThisPool == 1) targetPool = step.pool; - } - // Pull tokens into the Router Contract - TransferHelper.safeTransferFrom(params.tokenIn, msg.sender, targetPool, params.amountIn); - } - bool outputETH = params.tokenOut == address(0); // save gas - uint256 initialBalance; - if (!CHECK_AMOUNTOUT_IN_ROUTER) { - initialBalance = outputETH ? params.recipient.balance : IERC20(params.tokenOut).balanceOf(params.recipient); - } - for (uint256 i; i < route.nextHops.length; ++i) { - FraxswapRoute memory nextRoute = i == 0 ? firstRoute : abi.decode(route.nextHops[i], (FraxswapRoute)); - executeAllHops(route, nextRoute, params.recipient); - } - - amountOut = outputETH ? address(this).balance : IERC20(params.tokenOut).balanceOf(address(this)); - - if (outputETH && amountOut == 0) { - amountOut = IERC20(address(WETH9)).balanceOf(address(this)); - if (amountOut > 0) WETH9.withdraw(amountOut); - } - - if (amountOut > 0) { - if (outputETH) { - // sending ETH - (bool success, ) = payable(params.recipient).call{ value: amountOut }(""); - require(success, "FSR:Invalid transfer"); - } else { - TransferHelper.safeTransfer(params.tokenOut, params.recipient, amountOut); - } - } - if (!CHECK_AMOUNTOUT_IN_ROUTER) { - amountOut = outputETH - ? params.recipient.balance - : IERC20(params.tokenOut).balanceOf(params.recipient) - initialBalance; - } - - // Check output amounts (IMPORTANT CHECK) - require(amountOut >= params.amountOutMinimum, "FSR:IO"); // Insufficient output - - emit Routed(params.tokenIn, params.tokenOut, params.amountIn, amountOut); - } - - /// @notice Uniswap V3 callback function - function uniswapV3SwapCallback(int256 amount0Delta, int256 amount1Delta, bytes calldata _data) external { - require(amount0Delta > 0 || amount1Delta > 0); - SwapCallbackData memory data = abi.decode(_data, (SwapCallbackData)); - if (!data.directFundThisPool) { - // it isn't directly funded we pay from the router address - TransferHelper.safeTransfer( - data.tokenIn, - msg.sender, - uint256(amount0Delta > 0 ? amount0Delta : amount1Delta) - ); - } - } - - /// --------------------------- - /// --------- Internal -------- - /// --------------------------- - - /// @notice Function that will execute a particular swap step - /// @param prevRoute previous hop of the route - /// @param route current hop of the route - /// @param step swap to execute - /// @return amountOut actual output from this swap step - function executeSwap( - FraxswapRoute memory prevRoute, - FraxswapRoute memory route, - FraxswapStepData memory step, - address recipient - ) internal returns (uint256 amountOut) { - uint256 amountIn = getAmountForPct(step.percentOfHop, route.percentOfHop, prevRoute.amountOut); - if (step.swapType < 2) { - // Fraxswap/Uni v2 - bool zeroForOne = (step.extraParam2 == 0 && prevRoute.tokenOut < step.tokenOut) || step.extraParam2 == 1; - if (step.swapType == 0) { - // Execute virtual orders for Fraxswap - IPoolInterface(step.pool).executeVirtualOrders(block.timestamp); - } - if (step.extraParam1 == 1) { - // Fraxswap V2 has getAmountOut in the pair (different fees) - amountOut = IPoolInterface(step.pool).getAmountOut(amountIn, prevRoute.tokenOut); - } else { - // use the reserves and helper function for Uniswap V2 and Fraxswap V1 - (uint112 reserve0, uint112 reserve1, ) = IUniswapV2Pair(step.pool).getReserves(); - amountOut = getAmountOut(amountIn, zeroForOne ? reserve0 : reserve1, zeroForOne ? reserve1 : reserve0); - } - if (step.directFundThisPool == 0) { - // this pool is funded by router - TransferHelper.safeTransfer(prevRoute.tokenOut, step.pool, amountIn); - } - IUniswapV2Pair(step.pool).swap( - zeroForOne ? 0 : amountOut, - zeroForOne ? amountOut : 0, - step.directFundNextPool == 1 ? getNextDirectFundingPool(route, recipient) : address(this), - new bytes(0) - ); - } else if (step.swapType == 2) { - // Uni v3 - bool zeroForOne = (step.extraParam2 == 0 && prevRoute.tokenOut < step.tokenOut) || step.extraParam2 == 1; - bytes memory callBackData = abi.encode( - SwapCallbackData({ tokenIn: prevRoute.tokenOut, directFundThisPool: step.directFundThisPool == 1 }) - ); - (int256 amount0, int256 amount1) = IUniswapV3Pool(step.pool).swap( - step.directFundNextPool == 1 ? getNextDirectFundingPool(route, recipient) : address(this), - zeroForOne, - amountIn.toInt256(), - zeroForOne ? 4_295_128_740 : 1_461_446_703_485_210_103_287_273_052_203_988_822_378_723_970_341, // Do not fail because of price - callBackData - ); - amountOut = uint256(zeroForOne ? -amount1 : -amount0); - } else if (step.swapType == 3) { - // Curve exchange V2 - TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); - IPoolInterface(step.pool).exchange(step.extraParam1, step.extraParam2, amountIn, 0); - amountOut = IERC20(step.tokenOut).balanceOf(address(this)); - } else if (step.swapType == 4) { - // Curve exchange, with returns (no ETH) - TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); - amountOut = IPoolInterface(step.pool).exchange( - int128(int256(step.extraParam1)), - int128(int256(step.extraParam2)), - amountIn, - 0 - ); - } else if (step.swapType == 5) { - // Curve exchange_underlying - TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); - amountOut = IPoolInterface(step.pool).exchange_underlying( - int128(int256(step.extraParam1)), - int128(int256(step.extraParam2)), - amountIn, - 0 - ); - } else if (step.swapType == 6) { - // Saddle - TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); - amountOut = IPoolInterface(step.pool).swap( - uint8(step.extraParam1), - uint8(step.extraParam2), - amountIn, - 0, - block.timestamp - ); - } else if (step.swapType == 7) { - // FPIController - TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); - if (prevRoute.tokenOut == FRAX) { - amountOut = IPoolInterface(step.pool).mintFPI(amountIn, 0); - } else { - amountOut = IPoolInterface(step.pool).redeemFPI(amountIn, 0); - } - } else if (step.swapType == 8) { - // ERC4626/Fraxlend deposit - TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); - amountOut = IPoolInterface(step.pool).deposit( - amountIn, - step.directFundNextPool == 1 ? getNextDirectFundingPool(route, recipient) : address(this) - ); - } else if (step.swapType == 9) { - // FrxETHMinter - if (step.extraParam1 == 0 && prevRoute.tokenOut == address(WETH9)) { - // Unwrap WETH - WETH9.withdraw(amountIn); - } - IPoolInterface(step.pool).submitAndGive{ value: amountIn }( - step.directFundNextPool == 1 ? getNextDirectFundingPool(route, recipient) : address(this) - ); - amountOut = amountIn; // exchange 1 for 1 - } else if (step.swapType == 10) { - // WETH - if (prevRoute.tokenOut == address(WETH9)) { - // Unwrap WETH - WETH9.withdraw(amountIn); - } else { - // Wrap the ETH - WETH9.deposit{ value: amountIn }(); - } - amountOut = amountIn; // exchange 1 for 1 - } else if (step.swapType == 11) { - // Curve exchange, with returns and ETH - uint256 value = 0; - if (prevRoute.tokenOut == address(WETH9)) { - // WETH send as ETH - WETH9.withdraw(amountIn); - value = amountIn; - } else if (prevRoute.tokenOut == address(0)) { - value = amountIn; - } else { - TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); - } - amountOut = IPoolInterface(step.pool).exchange{ value: value }( - int128(int256(step.extraParam1)), - int128(int256(step.extraParam2)), - amountIn, - 0 - ); - if (route.tokenOut == address(WETH9)) { - // Wrap the received ETH as WETH - WETH9.deposit{ value: amountOut }(); - } - } else if (step.swapType == 12) { - // Curve exchange_received (NG) - if (step.directFundThisPool == 0) { - // this pool is funded by router - TransferHelper.safeTransfer(prevRoute.tokenOut, step.pool, amountIn); - } - amountOut = IPoolInterface(step.pool).exchange_received( - int128(int256(step.extraParam1)), - int128(int256(step.extraParam2)), - amountIn, - 0, - step.directFundNextPool == 1 ? getNextDirectFundingPool(route, recipient) : address(this) - ); - } else if (step.swapType == 13) { - // Redeem ERC4626 - amountOut = IPoolInterface(step.pool).redeem( - amountIn, - step.directFundNextPool == 1 ? getNextDirectFundingPool(route, recipient) : address(this), - address(this) - ); - } else if (step.swapType == 14) { - // Curve exchange, with returns + receiver (no ETH) - TransferHelper.safeApprove(prevRoute.tokenOut, step.pool, amountIn); - amountOut = IPoolInterface(step.pool).exchange( - int128(int256(step.extraParam1)), - int128(int256(step.extraParam2)), - amountIn, - 0, - step.directFundNextPool == 1 ? getNextDirectFundingPool(route, recipient) : address(this) - ); - } else if (step.swapType == 255) { - // Delegatecall - bytes4 signature = bytes4(uint32(step.extraParam1)); - (bool success, bytes memory data) = address(address(uint160(step.extraParam1 >> 32))).delegatecall( - abi.encodeWithSelector( - signature, - prevRoute.tokenOut, - step.tokenOut, - amountIn, - step.pool, - step.directFundThisPool, - step.directFundNextPool == 1 ? getNextDirectFundingPool(route, recipient) : address(this), - step.extraParam2 - ) - ); - require(success, "FSR:Delecatecall failed"); - amountOut = abi.decode(data, (uint256)); - } - } - - /// @notice Function that will loop through and execute swap steps - /// @param prevRoute previous hop of the route - /// @param route current hop of the route - function executeAllStepsForRoute( - FraxswapRoute memory prevRoute, - FraxswapRoute memory route, - address recipient - ) internal { - for (uint256 j; j < route.steps.length; ++j) { - FraxswapStepData memory step = abi.decode(route.steps[j], (FraxswapStepData)); - route.amountOut += executeSwap( - prevRoute, - route, - step, - j == route.steps.length - 1 ? recipient : address(0) - ); - } - } - - /// @notice Function that will loop through and execute route hops and execute all steps for each hop - /// @param prevRoute previous hop of the route - /// @param route current hop of the route - function executeAllHops(FraxswapRoute memory prevRoute, FraxswapRoute memory route, address recipient) internal { - executeAllStepsForRoute(prevRoute, route, route.nextHops.length == 0 ? recipient : address(0)); - for (uint256 i; i < route.nextHops.length; ++i) { - FraxswapRoute memory nextRoute = abi.decode(route.nextHops[i], (FraxswapRoute)); - executeAllHops(route, nextRoute, recipient); - } - } - - /// --------------------------- - /// ------ Views / Pure ------- - /// --------------------------- - - /// @notice Utility function to build an encoded hop of route - /// @param tokenOut output token address - /// @param percentOfHop amount of output tokens from the previous hop going into this hop - /// @param steps list of swaps from the same input token to the same output token - /// @param nextHops next hops from this one, the next hops' input token is the tokenOut - /// @return out encoded FraxswapRoute - function encodeRoute( - address tokenOut, - uint256 percentOfHop, - bytes[] memory steps, - bytes[] memory nextHops - ) external pure returns (bytes memory out) { - FraxswapRoute memory route; - route.tokenOut = tokenOut; - route.amountOut = 0; - route.percentOfHop = percentOfHop; - route.steps = steps; - route.nextHops = nextHops; - out = abi.encode(route); - } - - /// @notice Utility function to build an encoded step - /// @param swapType type of the swap performed (Uniswap V2, Fraxswap,Curve, etc) - /// @param directFundNextPool 0 = funds go via router, 1 = fund are sent directly to pool - /// @param directFundThisPool 0 = funds go via router, 1 = fund are sent directly to pool - /// @param tokenOut the target token of the step. output token address - /// @param pool address of the pool to use in the step - /// @param extraParam1 extra data used in the step - /// @param extraParam2 extra data used in the step - /// @param percentOfHop percentage of all of the steps in this route (hop) - /// @return out encoded FraxswapStepData - function encodeStep( - uint8 swapType, - uint8 directFundNextPool, - uint8 directFundThisPool, - address tokenOut, - address pool, - uint256 extraParam1, - uint256 extraParam2, - uint256 percentOfHop - ) external pure returns (bytes memory out) { - FraxswapStepData memory step; - step.swapType = swapType; - step.directFundNextPool = directFundNextPool; - step.directFundThisPool = directFundThisPool; - step.tokenOut = tokenOut; - step.pool = pool; - step.extraParam1 = extraParam1; - step.extraParam2 = extraParam2; - step.percentOfHop = percentOfHop; - out = abi.encode(step); - } - - /// @notice Utility function to calculate the amount given the percentage of hop and route 10000 = 100% - /// @return amountOut amount of input token - function getAmountForPct( - uint256 pctOfHop1, - uint256 pctOfHop2, - uint256 amountIn - ) internal pure returns (uint256 amountOut) { - return (pctOfHop1 * pctOfHop2 * amountIn) / 100_000_000; - } - - /// @notice Utility function to get the next pool to directly fund - /// @return nextPoolAddress address of the next pool - function getNextDirectFundingPool( - FraxswapRoute memory route, - address recipient - ) internal pure returns (address nextPoolAddress) { - if (recipient != address(0)) return recipient; - require(route.steps.length == 1 && route.nextHops.length == 1, "FSR: DFRoutes"); // directFunding - FraxswapRoute memory nextRoute = abi.decode(route.nextHops[0], (FraxswapRoute)); - - require(nextRoute.steps.length == 1, "FSR: DFSteps"); // directFunding - FraxswapStepData memory nextStep = abi.decode(nextRoute.steps[0], (FraxswapStepData)); - - return nextStep.pool; // pool to send funds to - } - - /// @notice given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset - /// @return amountOut constant product curve expected output amount - function getAmountOut( - uint256 amountIn, - uint256 reserveIn, - uint256 reserveOut - ) internal pure returns (uint256 amountOut) { - require(amountIn > 0, "UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT"); - require(reserveIn > 0 && reserveOut > 0, "UniswapV2Library: INSUFFICIENT_LIQUIDITY"); - uint256 amountInWithFee = amountIn * 997; - uint256 numerator = amountInWithFee * reserveOut; - uint256 denominator = reserveIn * 1000 + amountInWithFee; - amountOut = numerator / denominator; - } -}