From 7a8f77b0d4bc6c37b041f3ea83ae1ef2dd4e4c31 Mon Sep 17 00:00:00 2001 From: Carter Carlson Date: Thu, 18 Jul 2024 13:32:30 -0700 Subject: [PATCH 01/15] feat: DeployFraxOnTron --- package.json | 2 + src/contracts/Counter.sol | 2 + src/script/DeployFraxOnTron.s.sol | 87 +++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 src/script/DeployFraxOnTron.s.sol diff --git a/package.json b/package.json index cccc6f5..aafd8dd 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,8 @@ "ds-test": "github:dapphub/ds-test", "forge-std": "github:foundry-rs/forge-std#e8a047e3f40f13fa37af6fe14e6e06283d9a060e", "frax-standard-solidity": "github:FraxFinance/frax-standard-solidity", + "fraxtal-contracts": "github:FraxFinance/fraxtal-contracts", + "frax-contracts": "github:FraxFinance/frax-solidity", "solidity-bytes-utils": "github:GNSPS/solidity-bytes-utils" } } diff --git a/src/contracts/Counter.sol b/src/contracts/Counter.sol index 78c631c..d5f4bb9 100644 --- a/src/contracts/Counter.sol +++ b/src/contracts/Counter.sol @@ -2,6 +2,8 @@ pragma solidity ^0.8.19; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import { ERC20PermitPermissionedOptiMintable} from "fraxtal-contracts/src/contracts/Fraxtal/universal/ERC20PermitPermissionedOptiMintable.sol"; +import { FraxFerry } from "frax-contracts/src/hardhat/contracts/FraxFerry/FraxFerry.sol"; contract Counter is ERC20 { uint256 public number; diff --git a/src/script/DeployFraxOnTron.s.sol b/src/script/DeployFraxOnTron.s.sol new file mode 100644 index 0000000..67ba655 --- /dev/null +++ b/src/script/DeployFraxOnTron.s.sol @@ -0,0 +1,87 @@ +// SPDX-License-Identifier: ISC +pragma solidity ^0.8.0; + +import { BaseScript } from "frax-std/BaseScript.sol"; +import { console } from "frax-std/FraxTest.sol"; +import { FraxtalL2 } from "src/contracts/chain-constants/FraxtalL2.sol"; + +import { ERC20PermitPermissionedOptiMintable} from "fraxtal-contracts/src/contracts/Fraxtal/universal/ERC20PermitPermissionedOptiMintable.sol"; +import { FraxFerry } from "frax-contracts/src/hardhat/contracts/FraxFerry/FraxFerry.sol"; + +/* +NOTICE: +Deploy FRAX, sFRAX, and FXS on Tron using the same requirements as: +https://github.com/FraxFinance/fraxtal-contracts/blob/master/src/contracts/Fraxtal/universal/ERC20PermitPermissionedOptiMintable.sol + +With the exception of no bridge minter + +*/ + +contract DeployFraxOnTron is BaseScript { + + address public frax; + address public fraxFerry; + address public sFrax; + address public sFraxFerry; + address public fxs; + address public fxsFerry; + + uint256 public deployerPk; + address public deployerAddr; + address public timelock; + + uint256 public constant TRON_CHAIN_ID = 1000; + + function setUp() public { + // TODO + + } + + function run() public broadcaster { + deployERC20sWithFerries(); + } + + function deployERC20sWithFerries() public { + (frax, fraxFerry) = deployERC20WithFerry({ + _remoteToken: FraxtalL2.FRAX, + _name: "Frax", + _symbol: "FRAX" + }); + (sFrax, sFraxFerry) = deployERC20WithFerry({ + _remoteToken: FraxtalL2.SFRAX, + _name: "Staked Frax", + _symbol: "sFRAX" + }); + (fxs, fxsFerry) = deployERC20WithFerry({ + _remoteToken: FraxtalL2.FXS, + _name: "Frax Share", + _symbol: "FXS" + }); + } + + function deployErc20WithFerry( + address _remoteToken, + string memory _name, + string memory _symbol + ) public returns (address) { + ERC20PermitPermissionedOptiMintable erc20 = new ERC20PermitPermissionedOptiMintable({ + _creator_address: deployerAddr, + _timelock_address: timelock, + _bridge: address(1), // unreachable addr + _remoteToken: _remoteToken, + _name: _name, + _symbol: _symbol + }); + FraxFerry ferry = new FraxFerry({ + _token: address(erc20), + _chainid: TRON_CHAIN_ID, + _targetToken: _remoteToken, + _targetChain: FraxtalL2.CHAIN_ID + }); + + console.log(_symbol); + console.log(address(erc20)); + console.log("Ferry:"); + console.log(address(ferry)); + } +} From 5658725d7ed9735ef2472f08b464d0d0664d7119 Mon Sep 17 00:00:00 2001 From: Carter Carlson Date: Thu, 18 Jul 2024 13:35:38 -0700 Subject: [PATCH 02/15] feat: FraxFerry --- src/contracts/FraxFerry.sol | 366 ++++++++++++++++++++++++++++++++++++ 1 file changed, 366 insertions(+) create mode 100644 src/contracts/FraxFerry.sol diff --git a/src/contracts/FraxFerry.sol b/src/contracts/FraxFerry.sol new file mode 100644 index 0000000..d137565 --- /dev/null +++ b/src/contracts/FraxFerry.sol @@ -0,0 +1,366 @@ +pragma solidity >=0.8.0; +// https://github.com/FraxFinance/frax-solidity/blob/master/src/hardhat/contracts/Fraxferry/Fraxferry.sol +// ==================================================================== +// | ______ _______ | +// | / _____________ __ __ / ____(_____ ____ _____ ________ | +// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | +// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | +// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | +// | | +// ==================================================================== +// ============================ Fraxferry ============================= +// ==================================================================== +// Ferry that can be used to ship tokens between chains + +// Frax Finance: https://github.com/FraxFinance + +// Primary Author(s) +// Dennis: https://github.com/denett + +/* +** Modus operandi: +** - User sends tokens to the contract. This transaction is stored in the contract. +** - Captain queries the source chain for transactions to ship. +** - Captain sends batch (start, end, hash) to start the trip, +** - Crewmembers check the batch and can dispute it if it is invalid. +** - Non disputed batches can be executed by the first officer by providing the transactions as calldata. +** - Hash of the transactions must be equal to the hash in the batch. User receives their tokens on the other chain. +** - In case there was a fraudulent transaction (a hacker for example), the owner can cancel a single transaction, such that it will not be executed. +** - The owner can manually manage the tokens in the contract and must make sure it has enough funds. +** +** What must happen for a false batch to be executed: +** - Captain is tricked into proposing a batch with a false hash +** - All crewmembers bots are offline/censured/compromised and no one disputes the proposal +** +** Other risks: +** - Reorgs on the source chain. Avoided, by only returning the transactions on the source chain that are at least one hour old. +** - Rollbacks of optimistic rollups. Avoided by running a node. +** - Operators do not have enough time to pause the chain after a fake proposal. Avoided by requiring a minimal amount of time between sending the proposal and executing it. +*/ +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol"; +import "@openzeppelin/contracts/utils/math/Math.sol"; +import "@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol"; + +contract Fraxferry { + IERC20 immutable public token; + IERC20 immutable public targetToken; + uint immutable public chainid; + uint immutable public targetChain; + + address public owner; + address public nominatedOwner; + address public captain; + address public firstOfficer; + mapping(address => bool) public crewmembers; + mapping(address => bool) public fee_exempt_addrs; + + bool public paused; + + uint public MIN_WAIT_PERIOD_ADD=3600; // Minimal 1 hour waiting + uint public MIN_WAIT_PERIOD_EXECUTE=79200; // Minimal 22 hour waiting + uint public FEE_RATE=10; // 0.1% fee + uint public FEE_MIN=5*1e18; // 5 token min fee + uint public FEE_MAX=100*1e18; // 100 token max fee + + uint constant MAX_FEE_RATE=100; // Max fee rate is 1% + uint constant MAX_FEE_MIN=100e18; // Max minimum fee is 100 tokens + uint constant MAX_FEE_MAX=1000e18; // Max fee is 1000 tokens + + uint constant public REDUCED_DECIMALS=1e10; + + Transaction[] public transactions; + mapping(uint => bool) public cancelled; + uint public executeIndex; + Batch[] public batches; + + struct Transaction { + address user; + uint64 amount; + uint32 timestamp; + } + + struct Batch { + uint64 start; + uint64 end; + uint64 departureTime; + uint64 status; + bytes32 hash; + } + + struct BatchData { + uint startTransactionNo; + Transaction[] transactions; + } + + constructor(address _token, uint _chainid, address _targetToken, uint _targetChain) { + //require (block.chainid==_chainid,"Wrong chain"); + chainid=_chainid; + token = IERC20(_token); + targetToken = IERC20(_targetToken); + owner = msg.sender; + targetChain = _targetChain; + } + + + // ############## Events ############## + + event Embark(address indexed sender, uint index, uint amount, uint amountAfterFee, uint timestamp); + event Disembark(uint start, uint end, bytes32 hash); + event Depart(uint batchNo,uint start,uint end,bytes32 hash); + event RemoveBatch(uint batchNo); + event DisputeBatch(uint batchNo, bytes32 hash); + event Cancelled(uint index, bool cancel); + event Pause(bool paused); + event OwnerNominated(address indexed newOwner); + event OwnerChanged(address indexed previousOwner,address indexed newOwner); + event SetCaptain(address indexed previousCaptain, address indexed newCaptain); + event SetFirstOfficer(address indexed previousFirstOfficer, address indexed newFirstOfficer); + event SetCrewmember(address indexed crewmember,bool set); + event SetFee(uint previousFeeRate, uint feeRate,uint previousFeeMin, uint feeMin,uint previousFeeMax, uint feeMax); + event SetMinWaitPeriods(uint previousMinWaitAdd,uint previousMinWaitExecute,uint minWaitAdd,uint minWaitExecute); + event FeeExemptToggled(address addr,bool is_fee_exempt); + + + // ############## Modifiers ############## + + modifier isOwner() { + require (msg.sender==owner,"Not owner"); + _; + } + + modifier isCaptain() { + require (msg.sender==captain,"Not captain"); + _; + } + + modifier isFirstOfficer() { + require (msg.sender==firstOfficer,"Not first officer"); + _; + } + + modifier isCrewmember() { + require (crewmembers[msg.sender] || msg.sender==owner || msg.sender==captain || msg.sender==firstOfficer,"Not crewmember"); + _; + } + + modifier notPaused() { + require (!paused,"Paused"); + _; + } + + // ############## Ferry actions ############## + + function embarkWithRecipient(uint amount, address recipient) public notPaused { + amount = (amount/REDUCED_DECIMALS)*REDUCED_DECIMALS; // Round amount to fit in data structure + uint fee; + if(fee_exempt_addrs[msg.sender]) fee = 0; + else { + fee = Math.min(Math.max(FEE_MIN,amount*FEE_RATE/10000),FEE_MAX); + } + require (amount>fee,"Amount too low"); + require (amount/REDUCED_DECIMALS<=type(uint64).max,"Amount too high"); + TransferHelper.safeTransferFrom(address(token),msg.sender,address(this),amount); + uint64 amountAfterFee = uint64((amount-fee)/REDUCED_DECIMALS); + emit Embark(recipient,transactions.length,amount,amountAfterFee*REDUCED_DECIMALS,block.timestamp); + transactions.push(Transaction(recipient,amountAfterFee,uint32(block.timestamp))); + } + + function embark(uint amount) public { + embarkWithRecipient(amount, msg.sender) ; + } + + function embarkWithSignature( + uint256 _amount, + address recipient, + uint256 deadline, + bool approveMax, + uint8 v, + bytes32 r, + bytes32 s + ) public { + uint amount = approveMax ? type(uint256).max : _amount; + IERC20Permit(address(token)).permit(msg.sender, address(this), amount, deadline, v, r, s); + embarkWithRecipient(amount,recipient); + } + + function depart(uint start, uint end, bytes32 hash) external notPaused isCaptain { + require ((batches.length==0 && start==0) || (batches.length>0 && start==batches[batches.length-1].end+1),"Wrong start"); + require (end>=start && end=MIN_WAIT_PERIOD_EXECUTE,"Too soon"); + + bytes32 hash = keccak256(abi.encodePacked(targetChain, targetToken, chainid, token, batch.start)); + for (uint i=0;ibatchNo) batches.pop(); + emit RemoveBatch(batchNo); + } + + function disputeBatch(uint batchNo, bytes32 hash) external isCrewmember { + require (batches[batchNo].hash==hash,"Wrong hash"); + require (executeIndex<=batchNo,"Batch already executed"); + require (batches[batchNo].status==0,"Batch already disputed"); + batches[batchNo].status=1; // Set status on disputed + _pause(true); + emit DisputeBatch(batchNo,hash); + } + + function pause() external isCrewmember { + _pause(true); + } + + function unPause() external isOwner { + _pause(false); + } + + function _pause(bool _paused) internal { + paused=_paused; + emit Pause(_paused); + } + + function _jettison(uint index, bool cancel) internal { + require (executeIndex==0 || index>batches[executeIndex-1].end,"Transaction already executed"); + cancelled[index]=cancel; + emit Cancelled(index,cancel); + } + + function jettison(uint index, bool cancel) external isOwner { + _jettison(index,cancel); + } + + function jettisonGroup(uint[] calldata indexes, bool cancel) external isOwner { + for (uint i=0;i=3600 && _MIN_WAIT_PERIOD_EXECUTE>=3600,"Period too short"); + emit SetMinWaitPeriods(MIN_WAIT_PERIOD_ADD, MIN_WAIT_PERIOD_EXECUTE,_MIN_WAIT_PERIOD_ADD, _MIN_WAIT_PERIOD_EXECUTE); + MIN_WAIT_PERIOD_ADD=_MIN_WAIT_PERIOD_ADD; + MIN_WAIT_PERIOD_EXECUTE=_MIN_WAIT_PERIOD_EXECUTE; + } + + // ############## Roles management ############## + + function nominateNewOwner(address newOwner) external isOwner { + nominatedOwner = newOwner; + emit OwnerNominated(newOwner); + } + + function acceptOwnership() external { + require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership"); + emit OwnerChanged(owner, nominatedOwner); + owner = nominatedOwner; + nominatedOwner = address(0); + } + + function setCaptain(address newCaptain) external isOwner { + emit SetCaptain(captain,newCaptain); + captain=newCaptain; + } + + function setFirstOfficer(address newFirstOfficer) external isOwner { + emit SetFirstOfficer(firstOfficer,newFirstOfficer); + firstOfficer=newFirstOfficer; + } + + function setCrewmember(address crewmember, bool set) external isOwner { + crewmembers[crewmember]=set; + emit SetCrewmember(crewmember,set); + } + + function toggleFeeExemptAddr(address addr) external isOwner { + fee_exempt_addrs[addr] = !fee_exempt_addrs[addr]; + emit FeeExemptToggled(addr,fee_exempt_addrs[addr]); + } + + + // ############## Token management ############## + + function sendTokens(address receiver, uint amount) external isOwner { + require (receiver!=address(0),"Zero address not allowed"); + TransferHelper.safeTransfer(address(token),receiver,amount); + } + + // Generic proxy + function execute(address _to, uint256 _value, bytes calldata _data) external isOwner returns (bool, bytes memory) { + require(_data.length==0 || _to.code.length>0,"Can not call a function on a EOA"); + (bool success, bytes memory result) = _to.call{value:_value}(_data); + return (success, result); + } + + // ############## Views ############## + function getNextBatch(uint _start, uint max) public view returns (uint start, uint end, bytes32 hash) { + uint cutoffTime = block.timestamp-MIN_WAIT_PERIOD_ADD; + if (_start=transactions.length) end=transactions.length-1; + while(transactions[end].timestamp>=cutoffTime) end--; + hash = getTransactionsHash(start,end); + } + } + + function getBatchData(uint start, uint end) public view returns (BatchData memory data) { + data.startTransactionNo = start; + data.transactions = new Transaction[](end-start+1); + for (uint i=start;i<=end;++i) { + data.transactions[i-start]=transactions[i]; + } + } + + function getBatchAmount(uint start, uint end) public view returns (uint totalAmount) { + for (uint i=start;i<=end;++i) { + totalAmount+=transactions[i].amount; + } + totalAmount*=REDUCED_DECIMALS; + } + + function getTransactionsHash(uint start, uint end) public view returns (bytes32) { + bytes32 result = keccak256(abi.encodePacked(chainid, token, targetChain, targetToken, uint64(start))); + for (uint i=start;i<=end;++i) { + result = keccak256(abi.encodePacked(result, transactions[i].user,transactions[i].amount)); + } + return result; + } + + function noTransactions() public view returns (uint) { + return transactions.length; + } + + function noBatches() public view returns (uint) { + return batches.length; + } +} \ No newline at end of file From ae828a88ea01169a6f9f2559a1ea49246e49b8a7 Mon Sep 17 00:00:00 2001 From: Carter Carlson Date: Thu, 18 Jul 2024 13:39:42 -0700 Subject: [PATCH 03/15] refactor: DeployFrax{'' => 'Assets'}OnTron --- .../{DeployFraxOnTron.s.sol => DeployFraxAssetsOnTron.s.sol} | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) rename src/script/{DeployFraxOnTron.s.sol => DeployFraxAssetsOnTron.s.sol} (94%) diff --git a/src/script/DeployFraxOnTron.s.sol b/src/script/DeployFraxAssetsOnTron.s.sol similarity index 94% rename from src/script/DeployFraxOnTron.s.sol rename to src/script/DeployFraxAssetsOnTron.s.sol index 67ba655..888324d 100644 --- a/src/script/DeployFraxOnTron.s.sol +++ b/src/script/DeployFraxAssetsOnTron.s.sol @@ -15,9 +15,12 @@ https://github.com/FraxFinance/fraxtal-contracts/blob/master/src/contracts/Fraxt With the exception of no bridge minter +TODO: +- differentiate owner, captain, firstOfficer, crewMember +- assert wait periods are as wanted */ -contract DeployFraxOnTron is BaseScript { +contract DeployFraxAssetsOnTron is BaseScript { address public frax; address public fraxFerry; From 3731ea701ba8e8fc178d48856f42022d4ce82eaf Mon Sep 17 00:00:00 2001 From: Carter Carlson Date: Fri, 19 Jul 2024 09:22:52 -0700 Subject: [PATCH 04/15] fix(build): fraxtal-contracts package --- package.json | 1 - pnpm-lock.yaml | 2967 +++++++++++++---------- src/contracts/Counter.sol | 3 +- src/script/DeployFraxAssetsOnTron.s.sol | 20 +- 4 files changed, 1712 insertions(+), 1279 deletions(-) diff --git a/package.json b/package.json index aafd8dd..b24edbf 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,6 @@ "forge-std": "github:foundry-rs/forge-std#e8a047e3f40f13fa37af6fe14e6e06283d9a060e", "frax-standard-solidity": "github:FraxFinance/frax-standard-solidity", "fraxtal-contracts": "github:FraxFinance/fraxtal-contracts", - "frax-contracts": "github:FraxFinance/frax-solidity", "solidity-bytes-utils": "github:GNSPS/solidity-bytes-utils" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7543ad9..97d16ad 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,121 +1,1410 @@ -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) + fraxtal-contracts: + specifier: github:FraxFinance/fraxtal-contracts + version: dev-fraxtal-contracts@https://codeload.github.com/FraxFinance/fraxtal-contracts/tar.gz/d533b607c0d32d10d9a43ada8aa5d6fadf892e8e + 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))(prettier@3.2.5) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@18.19.14)(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.7.3": + resolution: + { integrity: sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A== } + + "@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@4.7.3": + resolution: + { integrity: sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== } + + "@openzeppelin/contracts@4.9.3": + resolution: + { integrity: sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg== } + + "@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 + + "@rari-capital/solmate@git+https://git@github.com:rari-capital/solmate.git#8f9b23f8838670afda0fd8983f2c41e8037ae6bc": + resolution: + { commit: 8f9b23f8838670afda0fd8983f2c41e8037ae6bc, repo: git@github.com:rari-capital/solmate.git, type: git } + version: 7.0.0-alpha.3 + + "@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== } + + 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 } + + clones-with-immutable-args@https://codeload.github.com/Saw-mon-and-Natalie/clones-with-immutable-args/tar.gz/105efee1b9127ed7f6fedf139e1fc796ce8791f2: + resolution: + { + tarball: https://codeload.github.com/Saw-mon-and-Natalie/clones-with-immutable-args/tar.gz/105efee1b9127ed7f6fedf139e1fc796ce8791f2, + } + version: 2.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" } + + dev-fraxtal-contracts@https://codeload.github.com/FraxFinance/fraxtal-contracts/tar.gz/d533b607c0d32d10d9a43ada8aa5d6fadf892e8e: + resolution: + { + tarball: https://codeload.github.com/FraxFinance/fraxtal-contracts/tar.gz/d533b607c0d32d10d9a43ada8aa5d6fadf892e8e, + } + version: 1.0.0 + + diff@4.0.2: + resolution: + { integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== } + engines: { node: ">=0.3.1" } + + dot-case@3.0.4: + resolution: + { integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== } + + dotenv@16.4.5: + resolution: + { integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== } + engines: { node: ">=12" } + + ds-test@https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0: + resolution: { tarball: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 } + 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 } + 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, + } + 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== } + + semver@5.7.2: + resolution: + { 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" } -packages: - /@ampproject/remapping@2.2.1: + snake-case@3.0.4: resolution: - { integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== } - engines: { node: ">=6.0.0" } + { 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, + } + 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 +1413,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 +1435,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 +1447,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 +1457,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 +1509,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 +1521,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 +1536,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 +1552,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 +1598,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 +1623,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 +1632,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 +1650,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 +1674,189 @@ 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.7.3": {} - /@openzeppelin/contracts@3.4.2: - resolution: - { integrity: sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA== } - dev: false + "@openzeppelin/contracts-upgradeable@4.9.5": {} - /@openzeppelin/contracts@4.3.3: - resolution: - { integrity: sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g== } - dev: false + "@openzeppelin/contracts@3.4.2": {} - /@openzeppelin/contracts@5.0.1: - resolution: - { integrity: sha512-yQJaT5HDp9hYOOp4jTYxMsR02gdFZFXhewX5HW9Jo4fsqSVqqyIO/xTHdWDaKX5a3pv1txmf076Lziz+sO7L1w== } + "@openzeppelin/contracts@4.3.3": {} - /@prettier/sync@0.3.0(prettier@3.2.5): - resolution: - { integrity: sha512-3dcmCyAxIcxy036h1I7MQU/uEEBq8oLwf1CE3xeze+MPlgkdlb/+w6rGR/1dhp6Hqi17fRS6nvwnOzkESxEkOw== } - peerDependencies: - prettier: ^3.0.0 + "@openzeppelin/contracts@4.7.3": {} + + "@openzeppelin/contracts@4.9.3": {} + + "@openzeppelin/contracts@5.0.1": {} + + "@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== } + "@rari-capital/solmate@git+https://git@github.com:rari-capital/solmate.git#8f9b23f8838670afda0fd8983f2c41e8037ae6bc": + {} + + "@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== } - dependencies: - undici-types: 5.26.5 - dev: false - /@types/node@20.11.16: - resolution: - { integrity: sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ== } + "@types/node@18.19.14": 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 +1865,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,188 +1893,123 @@ 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== } + clones-with-immutable-args@https://codeload.github.com/Saw-mon-and-Natalie/clones-with-immutable-args/tar.gz/105efee1b9127ed7f6fedf139e1fc796ce8791f2: + {} + + 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 parse-json: 5.2.0 path-type: 4.0.0 + optionalDependencies: 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" } + dev-fraxtal-contracts@https://codeload.github.com/FraxFinance/fraxtal-contracts/tar.gz/d533b607c0d32d10d9a43ada8aa5d6fadf892e8e: + dependencies: + "@openzeppelin-4/contracts": "@openzeppelin/contracts@4.9.3" + "@openzeppelin-5/contracts": "@openzeppelin/contracts@5.0.1" + "@openzeppelin/contracts": 4.7.3 + "@openzeppelin/contracts-upgradeable": 4.7.3 + "@rari-capital/solmate": git+https://git@github.com:rari-capital/solmate.git#8f9b23f8838670afda0fd8983f2c41e8037ae6bc + clones-with-immutable-args: https://codeload.github.com/Saw-mon-and-Natalie/clones-with-immutable-args/tar.gz/105efee1b9127ed7f6fedf139e1fc796ce8791f2 + dotenv: 16.4.5 + ethers: 5.7.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate - /dot-case@3.0.4: - resolution: - { integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== } + diff@4.0.2: {} + + 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== } + dotenv@16.4.5: {} - /elliptic@6.5.4: - resolution: - { integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== } + ds-test@https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0: {} + + eastasianwidth@0.2.0: {} + + elliptic@6.5.4: dependencies: bn.js: 4.12.0 brorand: 1.1.0 @@ -1045,37 +2018,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 +2068,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 +2083,68 @@ 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): + 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))(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 +2152,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 +2248,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 +2257,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 +2271,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: 3.2.5 + svelte: 4.2.10 + + 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 +2468,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))(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 +2500,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 +2562,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 +2571,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,209 +2600,49 @@ 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 - dependencies: - "@cspotcode/source-map-support": 0.8.1 - "@tsconfig/node10": 1.0.9 - "@tsconfig/node12": 1.0.11 - "@tsconfig/node14": 1.0.3 - "@tsconfig/node16": 1.0.4 - "@types/node": 20.11.16 - acorn: 8.11.3 - acorn-walk: 8.3.2 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - 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/contracts/Counter.sol b/src/contracts/Counter.sol index d5f4bb9..aa127eb 100644 --- a/src/contracts/Counter.sol +++ b/src/contracts/Counter.sol @@ -2,8 +2,7 @@ pragma solidity ^0.8.19; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import { ERC20PermitPermissionedOptiMintable} from "fraxtal-contracts/src/contracts/Fraxtal/universal/ERC20PermitPermissionedOptiMintable.sol"; -import { FraxFerry } from "frax-contracts/src/hardhat/contracts/FraxFerry/FraxFerry.sol"; +import { ERC20PermitPermissionedOptiMintable } from "fraxtal-contracts/src/contracts/Fraxtal/universal/ERC20PermitPermissionedOptiMintable.sol"; contract Counter is ERC20 { uint256 public number; diff --git a/src/script/DeployFraxAssetsOnTron.s.sol b/src/script/DeployFraxAssetsOnTron.s.sol index 888324d..1a9fb54 100644 --- a/src/script/DeployFraxAssetsOnTron.s.sol +++ b/src/script/DeployFraxAssetsOnTron.s.sol @@ -5,7 +5,7 @@ import { BaseScript } from "frax-std/BaseScript.sol"; import { console } from "frax-std/FraxTest.sol"; import { FraxtalL2 } from "src/contracts/chain-constants/FraxtalL2.sol"; -import { ERC20PermitPermissionedOptiMintable} from "fraxtal-contracts/src/contracts/Fraxtal/universal/ERC20PermitPermissionedOptiMintable.sol"; +import { ERC20PermitPermissionedOptiMintable } from "fraxtal-contracts/src/contracts/Fraxtal/universal/ERC20PermitPermissionedOptiMintable.sol"; import { FraxFerry } from "frax-contracts/src/hardhat/contracts/FraxFerry/FraxFerry.sol"; /* @@ -21,7 +21,6 @@ TODO: */ contract DeployFraxAssetsOnTron is BaseScript { - address public frax; address public fraxFerry; address public sFrax; @@ -29,15 +28,12 @@ contract DeployFraxAssetsOnTron is BaseScript { address public fxs; address public fxsFerry; - uint256 public deployerPk; - address public deployerAddr; address public timelock; uint256 public constant TRON_CHAIN_ID = 1000; function setUp() public { // TODO - } function run() public broadcaster { @@ -45,21 +41,13 @@ contract DeployFraxAssetsOnTron is BaseScript { } function deployERC20sWithFerries() public { - (frax, fraxFerry) = deployERC20WithFerry({ - _remoteToken: FraxtalL2.FRAX, - _name: "Frax", - _symbol: "FRAX" - }); + (frax, fraxFerry) = deployERC20WithFerry({ _remoteToken: FraxtalL2.FRAX, _name: "Frax", _symbol: "FRAX" }); (sFrax, sFraxFerry) = deployERC20WithFerry({ _remoteToken: FraxtalL2.SFRAX, _name: "Staked Frax", _symbol: "sFRAX" }); - (fxs, fxsFerry) = deployERC20WithFerry({ - _remoteToken: FraxtalL2.FXS, - _name: "Frax Share", - _symbol: "FXS" - }); + (fxs, fxsFerry) = deployERC20WithFerry({ _remoteToken: FraxtalL2.FXS, _name: "Frax Share", _symbol: "FXS" }); } function deployErc20WithFerry( @@ -68,7 +56,7 @@ contract DeployFraxAssetsOnTron is BaseScript { string memory _symbol ) public returns (address) { ERC20PermitPermissionedOptiMintable erc20 = new ERC20PermitPermissionedOptiMintable({ - _creator_address: deployerAddr, + _creator_address: deployer, _timelock_address: timelock, _bridge: address(1), // unreachable addr _remoteToken: _remoteToken, From 422b7613b7a08ba60a38dae4558777011fdd7aa8 Mon Sep 17 00:00:00 2001 From: Carter Carlson Date: Fri, 19 Jul 2024 14:59:19 -0700 Subject: [PATCH 05/15] refactor: ERC20WithMinters --- src/contracts/ERC20WithMinters.sol | 90 +++++++++++++++++++++++++ src/contracts/Owned.sol | 34 ++++++++++ src/script/DeployFraxAssetsOnTron.s.sol | 17 ++--- 3 files changed, 128 insertions(+), 13 deletions(-) create mode 100644 src/contracts/ERC20WithMinters.sol create mode 100644 src/contracts/Owned.sol diff --git a/src/contracts/ERC20WithMinters.sol b/src/contracts/ERC20WithMinters.sol new file mode 100644 index 0000000..027077c --- /dev/null +++ b/src/contracts/ERC20WithMinters.sol @@ -0,0 +1,90 @@ +//SPDX-License-Identifier: Unlicense +pragma solidity ^0.8.0; + +// Ripped from +// https://github.com/FraxFinance/frax-contracts-dev/blob/travis/src/hardhat/contracts/ERC20/ERC20PermissionedMint.sol +// with the difference that minter cannot burn (no minter_burn_from()) + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; +import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; +import "@openzeppelin/contracts/utils/Pausable.sol"; +import "@openzeppelin/contracts/access/AccessControl.sol"; +import "./Owned.sol"; + +contract ERC20PermissionedMint is ERC20, ERC20Burnable, Owned { + // Core + address public timelock_address; + + // Minters + address[] public minters_array; // Allowed to mint + mapping(address => bool) public minters; // Mapping is also used for faster verification + + /* ========== CONSTRUCTOR ========== */ + + constructor( + address _creator_address, + address _timelock_address, + string memory _name, + string memory _symbol + ) ERC20(_name, _symbol) Owned(_creator_address) { + timelock_address = _timelock_address; + } + + /* ========== MODIFIERS ========== */ + + modifier onlyByOwnGov() { + require(msg.sender == timelock_address || msg.sender == owner, "Not owner or timelock"); + _; + } + + modifier onlyMinters() { + require(minters[msg.sender] == true, "Only minters"); + _; + } + + /* ========== RESTRICTED FUNCTIONS ========== */ + + // This function is what other minters will call to mint new tokens + function minter_mint(address m_address, uint256 m_amount) public onlyMinters { + super._mint(m_address, m_amount); + emit TokenMinterMinted(msg.sender, m_address, m_amount); + } + + // Adds whitelisted minters + function addMinter(address minter_address) public onlyByOwnGov { + require(minter_address != address(0), "Zero address detected"); + + require(minters[minter_address] == false, "Address already exists"); + minters[minter_address] = true; + minters_array.push(minter_address); + + emit MinterAdded(minter_address); + } + + // Remove a minter + function removeMinter(address minter_address) public onlyByOwnGov { + require(minter_address != address(0), "Zero address detected"); + require(minters[minter_address] == true, "Address nonexistent"); + + // Delete from the mapping + delete minters[minter_address]; + + // 'Delete' from the array by setting the address to 0x0 + for (uint256 i = 0; i < minters_array.length; i++) { + if (minters_array[i] == minter_address) { + minters_array[i] = address(0); // This will leave a null in the array and keep the indices the same + break; + } + } + + emit MinterRemoved(minter_address); + } + + /* ========== EVENTS ========== */ + + event TokenMinterBurned(address indexed from, address indexed to, uint256 amount); + event TokenMinterMinted(address indexed from, address indexed to, uint256 amount); + event MinterAdded(address minter_address); + event MinterRemoved(address minter_address); +} diff --git a/src/contracts/Owned.sol b/src/contracts/Owned.sol new file mode 100644 index 0000000..6fbcd70 --- /dev/null +++ b/src/contracts/Owned.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +pragma solidity >=0.6.11; + +// https://docs.synthetix.io/contracts/Owned +contract Owned { + address public owner; + address public nominatedOwner; + + constructor(address _owner) public { + require(_owner != address(0), "Owner address cannot be 0"); + owner = _owner; + emit OwnerChanged(address(0), _owner); + } + + function nominateNewOwner(address _owner) external onlyOwner { + nominatedOwner = _owner; + emit OwnerNominated(_owner); + } + + function acceptOwnership() external { + require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership"); + emit OwnerChanged(owner, nominatedOwner); + owner = nominatedOwner; + nominatedOwner = address(0); + } + + modifier onlyOwner() { + require(msg.sender == owner, "Only the contract owner may perform this action"); + _; + } + + event OwnerNominated(address newOwner); + event OwnerChanged(address oldOwner, address newOwner); +} diff --git a/src/script/DeployFraxAssetsOnTron.s.sol b/src/script/DeployFraxAssetsOnTron.s.sol index 1a9fb54..39cd1ad 100644 --- a/src/script/DeployFraxAssetsOnTron.s.sol +++ b/src/script/DeployFraxAssetsOnTron.s.sol @@ -5,16 +5,12 @@ import { BaseScript } from "frax-std/BaseScript.sol"; import { console } from "frax-std/FraxTest.sol"; import { FraxtalL2 } from "src/contracts/chain-constants/FraxtalL2.sol"; -import { ERC20PermitPermissionedOptiMintable } from "fraxtal-contracts/src/contracts/Fraxtal/universal/ERC20PermitPermissionedOptiMintable.sol"; +import { ERC20WithMinters } from "src/contracts/ERC20WithMinters.sol"; import { FraxFerry } from "frax-contracts/src/hardhat/contracts/FraxFerry/FraxFerry.sol"; /* NOTICE: -Deploy FRAX, sFRAX, and FXS on Tron using the same requirements as: -https://github.com/FraxFinance/fraxtal-contracts/blob/master/src/contracts/Fraxtal/universal/ERC20PermitPermissionedOptiMintable.sol - -With the exception of no bridge minter - +Deploy FRAX, sFRAX, and FXS on Tron TODO: - differentiate owner, captain, firstOfficer, crewMember - assert wait periods are as wanted @@ -32,10 +28,6 @@ contract DeployFraxAssetsOnTron is BaseScript { uint256 public constant TRON_CHAIN_ID = 1000; - function setUp() public { - // TODO - } - function run() public broadcaster { deployERC20sWithFerries(); } @@ -55,11 +47,9 @@ contract DeployFraxAssetsOnTron is BaseScript { string memory _name, string memory _symbol ) public returns (address) { - ERC20PermitPermissionedOptiMintable erc20 = new ERC20PermitPermissionedOptiMintable({ + ERC20WithMinters erc20 = new ERC20WithMinters({ _creator_address: deployer, _timelock_address: timelock, - _bridge: address(1), // unreachable addr - _remoteToken: _remoteToken, _name: _name, _symbol: _symbol }); @@ -69,6 +59,7 @@ contract DeployFraxAssetsOnTron is BaseScript { _targetToken: _remoteToken, _targetChain: FraxtalL2.CHAIN_ID }); + ferry.nominateNewOwner(timelock); console.log(_symbol); console.log(address(erc20)); From 25d5098d3a235121c51a39ff52b74e95949cd891 Mon Sep 17 00:00:00 2001 From: Carter Carlson Date: Mon, 22 Jul 2024 09:29:10 -0700 Subject: [PATCH 06/15] feat: DeployTronFerriesOnFraxtal --- src/script/DeployTronFerriesOnFraxtal.sol | 55 +++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/script/DeployTronFerriesOnFraxtal.sol diff --git a/src/script/DeployTronFerriesOnFraxtal.sol b/src/script/DeployTronFerriesOnFraxtal.sol new file mode 100644 index 0000000..b28be62 --- /dev/null +++ b/src/script/DeployTronFerriesOnFraxtal.sol @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: ISC +pragma solidity ^0.8.0; + +import { BaseScript } from "frax-std/BaseScript.sol"; +import { console } from "frax-std/FraxTest.sol"; +import { FraxtalL2 } from "src/contracts/chain-constants/FraxtalL2.sol"; + +import { ERC20WithMinters } from "src/contracts/ERC20WithMinters.sol"; +import { FraxFerry } from "frax-contracts/src/hardhat/contracts/FraxFerry/FraxFerry.sol"; + +/* +NOTICE: +Deploy FRAX, sFRAX, and FXS on Tron +TODO: +- differentiate owner, captain, firstOfficer, crewMember +- assert wait periods are as wanted +*/ + +contract DeployTronFerriesOnFraxtal is BaseScript { + // TODO: set assets in chain constants + address public fraxOnTron = address(0); // TODO + address public fraxFerry; + address public sFraxOnTron = address(0); // TODO + address public sFraxFerry; + address public fxsOnTron = address(0); // TODO + address public fxsFerry; + + address public timelock; + + uint256 public constant TRON_CHAIN_ID = 1000; + + function run() public broadcaster { + deployFerries(); + } + + function deployFerries() public { + fraxFerry = deployFerry({ _token: FraxtalL2.FRAX, _remoteToken: fraxOnTron }); + sFraxFerry = deployFerry({ _token: FraxtalL2.SFRAX, _remoteToken: sFraxOnTron }); + fxsFerry = deployFerry({ _token: FraxtalL2.FXS, _remoteToken: fxsOnTron1 }); + } + + function deployFerry(address _token, address _remoteToken) public returns (address) { + FraxFerry ferry = new FraxFerry({ + _token: _token, + _chainid: FraxtalL2.CHAIN_ID, + _targetToken: _remoteToken, + _targetChain: TRON_CHAIN_ID + }); + + ferry.nominateNewOwner(timelock); + + console.log("Ferry:"); + console.log(address(ferry)); + } +} From 576f7d8bc495536f7245fa053269ae96cdc3ad5d Mon Sep 17 00:00:00 2001 From: Carter Carlson Date: Mon, 22 Jul 2024 12:34:04 -0700 Subject: [PATCH 07/15] fix: Frax{'F' => 'f'}erry --- src/script/DeployFraxAssetsOnTron.s.sol | 4 ++-- src/script/DeployTronFerriesOnFraxtal.sol | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/script/DeployFraxAssetsOnTron.s.sol b/src/script/DeployFraxAssetsOnTron.s.sol index 39cd1ad..ed0656c 100644 --- a/src/script/DeployFraxAssetsOnTron.s.sol +++ b/src/script/DeployFraxAssetsOnTron.s.sol @@ -6,7 +6,7 @@ import { console } from "frax-std/FraxTest.sol"; import { FraxtalL2 } from "src/contracts/chain-constants/FraxtalL2.sol"; import { ERC20WithMinters } from "src/contracts/ERC20WithMinters.sol"; -import { FraxFerry } from "frax-contracts/src/hardhat/contracts/FraxFerry/FraxFerry.sol"; +import { Fraxferry } from "frax-contracts/src/hardhat/contracts/Fraxferry/Fraxferry.sol"; /* NOTICE: @@ -53,7 +53,7 @@ contract DeployFraxAssetsOnTron is BaseScript { _name: _name, _symbol: _symbol }); - FraxFerry ferry = new FraxFerry({ + Fraxferry ferry = new Fraxferry({ _token: address(erc20), _chainid: TRON_CHAIN_ID, _targetToken: _remoteToken, diff --git a/src/script/DeployTronFerriesOnFraxtal.sol b/src/script/DeployTronFerriesOnFraxtal.sol index b28be62..8e39bf1 100644 --- a/src/script/DeployTronFerriesOnFraxtal.sol +++ b/src/script/DeployTronFerriesOnFraxtal.sol @@ -6,7 +6,7 @@ import { console } from "frax-std/FraxTest.sol"; import { FraxtalL2 } from "src/contracts/chain-constants/FraxtalL2.sol"; import { ERC20WithMinters } from "src/contracts/ERC20WithMinters.sol"; -import { FraxFerry } from "frax-contracts/src/hardhat/contracts/FraxFerry/FraxFerry.sol"; +import { Fraxferry } from "frax-contracts/src/hardhat/contracts/Fraxferry/Fraxferry.sol"; /* NOTICE: @@ -40,7 +40,7 @@ contract DeployTronFerriesOnFraxtal is BaseScript { } function deployFerry(address _token, address _remoteToken) public returns (address) { - FraxFerry ferry = new FraxFerry({ + Fraxferry ferry = new Fraxferry({ _token: _token, _chainid: FraxtalL2.CHAIN_ID, _targetToken: _remoteToken, From 7efc76c21d235da1140e692c657a8a6ee3554876 Mon Sep 17 00:00:00 2001 From: Carter Carlson Date: Wed, 24 Jul 2024 11:01:03 -0700 Subject: [PATCH 08/15] chore: flatten --- src/contracts/Counter.sol | 1 - src/contracts/ERC20WithMinters-flattened.sol | 1229 ++++++++++++++++++ src/contracts/FraxFerry-flattened.sol | 1017 +++++++++++++++ 3 files changed, 2246 insertions(+), 1 deletion(-) create mode 100644 src/contracts/ERC20WithMinters-flattened.sol create mode 100644 src/contracts/FraxFerry-flattened.sol diff --git a/src/contracts/Counter.sol b/src/contracts/Counter.sol index aa127eb..78c631c 100644 --- a/src/contracts/Counter.sol +++ b/src/contracts/Counter.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.19; import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import { ERC20PermitPermissionedOptiMintable } from "fraxtal-contracts/src/contracts/Fraxtal/universal/ERC20PermitPermissionedOptiMintable.sol"; contract Counter is ERC20 { uint256 public number; diff --git a/src/contracts/ERC20WithMinters-flattened.sol b/src/contracts/ERC20WithMinters-flattened.sol new file mode 100644 index 0000000..b8b2fe7 --- /dev/null +++ b/src/contracts/ERC20WithMinters-flattened.sol @@ -0,0 +1,1229 @@ +//SPDX-License-Identifier: Unlicense +pragma solidity 0.8.20; + +// node_modules/@openzeppelin/contracts/access/IAccessControl.sol + +// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) + +/** + * @dev External interface of AccessControl declared to support ERC165 detection. + */ +interface IAccessControl { + /** + * @dev The `account` is missing a role. + */ + error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); + + /** + * @dev The caller of a function is not the expected one. + * + * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. + */ + error AccessControlBadConfirmation(); + + /** + * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` + * + * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite + * {RoleAdminChanged} not being emitted signaling this. + */ + event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); + + /** + * @dev Emitted when `account` is granted `role`. + * + * `sender` is the account that originated the contract call, an admin role + * bearer except when using {AccessControl-_setupRole}. + */ + event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Emitted when `account` is revoked `role`. + * + * `sender` is the account that originated the contract call: + * - if using `revokeRole`, it is the admin role bearer + * - if using `renounceRole`, it is the role bearer (i.e. `account`) + */ + event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) external view returns (bool); + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {AccessControl-_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) external view returns (bytes32); + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function grantRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + */ + function revokeRole(bytes32 role, address account) external; + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been granted `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `callerConfirmation`. + */ + function renounceRole(bytes32 role, address callerConfirmation) external; +} + +// node_modules/@openzeppelin/contracts/interfaces/draft-IERC6093.sol + +// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol) + +/** + * @dev Standard ERC20 Errors + * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. + */ +interface IERC20Errors { + /** + * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. + * @param sender Address whose tokens are being transferred. + * @param balance Current balance for the interacting account. + * @param needed Minimum amount required to perform a transfer. + */ + error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); + + /** + * @dev Indicates a failure with the token `sender`. Used in transfers. + * @param sender Address whose tokens are being transferred. + */ + error ERC20InvalidSender(address sender); + + /** + * @dev Indicates a failure with the token `receiver`. Used in transfers. + * @param receiver Address to which tokens are being transferred. + */ + error ERC20InvalidReceiver(address receiver); + + /** + * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. + * @param spender Address that may be allowed to operate on tokens without being their owner. + * @param allowance Amount of tokens a `spender` is allowed to operate with. + * @param needed Minimum amount required to perform a transfer. + */ + error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); + + /** + * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. + * @param approver Address initiating an approval operation. + */ + error ERC20InvalidApprover(address approver); + + /** + * @dev Indicates a failure with the `spender` to be approved. Used in approvals. + * @param spender Address that may be allowed to operate on tokens without being their owner. + */ + error ERC20InvalidSpender(address spender); +} + +/** + * @dev Standard ERC721 Errors + * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. + */ +interface IERC721Errors { + /** + * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. + * Used in balance queries. + * @param owner Address of the current owner of a token. + */ + error ERC721InvalidOwner(address owner); + + /** + * @dev Indicates a `tokenId` whose `owner` is the zero address. + * @param tokenId Identifier number of a token. + */ + error ERC721NonexistentToken(uint256 tokenId); + + /** + * @dev Indicates an error related to the ownership over a particular token. Used in transfers. + * @param sender Address whose tokens are being transferred. + * @param tokenId Identifier number of a token. + * @param owner Address of the current owner of a token. + */ + error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); + + /** + * @dev Indicates a failure with the token `sender`. Used in transfers. + * @param sender Address whose tokens are being transferred. + */ + error ERC721InvalidSender(address sender); + + /** + * @dev Indicates a failure with the token `receiver`. Used in transfers. + * @param receiver Address to which tokens are being transferred. + */ + error ERC721InvalidReceiver(address receiver); + + /** + * @dev Indicates a failure with the `operator`’s approval. Used in transfers. + * @param operator Address that may be allowed to operate on tokens without being their owner. + * @param tokenId Identifier number of a token. + */ + error ERC721InsufficientApproval(address operator, uint256 tokenId); + + /** + * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. + * @param approver Address initiating an approval operation. + */ + error ERC721InvalidApprover(address approver); + + /** + * @dev Indicates a failure with the `operator` to be approved. Used in approvals. + * @param operator Address that may be allowed to operate on tokens without being their owner. + */ + error ERC721InvalidOperator(address operator); +} + +/** + * @dev Standard ERC1155 Errors + * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. + */ +interface IERC1155Errors { + /** + * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. + * @param sender Address whose tokens are being transferred. + * @param balance Current balance for the interacting account. + * @param needed Minimum amount required to perform a transfer. + * @param tokenId Identifier number of a token. + */ + error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); + + /** + * @dev Indicates a failure with the token `sender`. Used in transfers. + * @param sender Address whose tokens are being transferred. + */ + error ERC1155InvalidSender(address sender); + + /** + * @dev Indicates a failure with the token `receiver`. Used in transfers. + * @param receiver Address to which tokens are being transferred. + */ + error ERC1155InvalidReceiver(address receiver); + + /** + * @dev Indicates a failure with the `operator`’s approval. Used in transfers. + * @param operator Address that may be allowed to operate on tokens without being their owner. + * @param owner Address of the current owner of a token. + */ + error ERC1155MissingApprovalForAll(address operator, address owner); + + /** + * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. + * @param approver Address initiating an approval operation. + */ + error ERC1155InvalidApprover(address approver); + + /** + * @dev Indicates a failure with the `operator` to be approved. Used in approvals. + * @param operator Address that may be allowed to operate on tokens without being their owner. + */ + error ERC1155InvalidOperator(address operator); + + /** + * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. + * Used in batch transfers. + * @param idsLength Length of the array of token identifiers + * @param valuesLength Length of the array of token amounts + */ + error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength); +} + +// 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/utils/Context.sol + +// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) + +/** + * @dev Provides information about the current execution context, including the + * sender of the transaction and its data. While these are generally available + * via msg.sender and msg.data, they should not be accessed in such a direct + * manner, since when dealing with meta-transactions the account sending and + * paying for execution may not be the actual sender (as far as an application + * is concerned). + * + * This contract is only required for intermediate, library-like contracts. + */ +abstract contract Context { + function _msgSender() internal view virtual returns (address) { + return msg.sender; + } + + function _msgData() internal view virtual returns (bytes calldata) { + return msg.data; + } + + function _contextSuffixLength() internal view virtual returns (uint256) { + return 0; + } +} + +// node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol + +// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) + +/** + * @dev Interface of the ERC165 standard, as defined in the + * https://eips.ethereum.org/EIPS/eip-165[EIP]. + * + * Implementers can declare support of contract interfaces, which can then be + * queried by others ({ERC165Checker}). + * + * For an implementation, see {ERC165}. + */ +interface IERC165 { + /** + * @dev Returns true if this contract implements the interface defined by + * `interfaceId`. See the corresponding + * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] + * to learn more about how these ids are created. + * + * This function call must use less than 30 000 gas. + */ + function supportsInterface(bytes4 interfaceId) external view returns (bool); +} + +// src/contracts/Owned.sol + +// https://docs.synthetix.io/contracts/Owned +contract Owned { + address public owner; + address public nominatedOwner; + + constructor(address _owner) { + require(_owner != address(0), "Owner address cannot be 0"); + owner = _owner; + emit OwnerChanged(address(0), _owner); + } + + function nominateNewOwner(address _owner) external onlyOwner { + nominatedOwner = _owner; + emit OwnerNominated(_owner); + } + + function acceptOwnership() external { + require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership"); + emit OwnerChanged(owner, nominatedOwner); + owner = nominatedOwner; + nominatedOwner = address(0); + } + + modifier onlyOwner() { + require(msg.sender == owner, "Only the contract owner may perform this action"); + _; + } + + event OwnerNominated(address newOwner); + event OwnerChanged(address oldOwner, address newOwner); +} + +// node_modules/@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol + +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) + +/** + * @dev Interface for the optional metadata functions from the ERC20 standard. + */ +interface IERC20Metadata is IERC20 { + /** + * @dev Returns the name of the token. + */ + function name() external view returns (string memory); + + /** + * @dev Returns the symbol of the token. + */ + function symbol() external view returns (string memory); + + /** + * @dev Returns the decimals places of the token. + */ + function decimals() external view returns (uint8); +} + +// node_modules/@openzeppelin/contracts/utils/Pausable.sol + +// OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) + +/** + * @dev Contract module which allows children to implement an emergency stop + * mechanism that can be triggered by an authorized account. + * + * This module is used through inheritance. It will make available the + * modifiers `whenNotPaused` and `whenPaused`, which can be applied to + * the functions of your contract. Note that they will not be pausable by + * simply including this module, only once the modifiers are put in place. + */ +abstract contract Pausable is Context { + bool private _paused; + + /** + * @dev Emitted when the pause is triggered by `account`. + */ + event Paused(address account); + + /** + * @dev Emitted when the pause is lifted by `account`. + */ + event Unpaused(address account); + + /** + * @dev The operation failed because the contract is paused. + */ + error EnforcedPause(); + + /** + * @dev The operation failed because the contract is not paused. + */ + error ExpectedPause(); + + /** + * @dev Initializes the contract in unpaused state. + */ + constructor() { + _paused = false; + } + + /** + * @dev Modifier to make a function callable only when the contract is not paused. + * + * Requirements: + * + * - The contract must not be paused. + */ + modifier whenNotPaused() { + _requireNotPaused(); + _; + } + + /** + * @dev Modifier to make a function callable only when the contract is paused. + * + * Requirements: + * + * - The contract must be paused. + */ + modifier whenPaused() { + _requirePaused(); + _; + } + + /** + * @dev Returns true if the contract is paused, and false otherwise. + */ + function paused() public view virtual returns (bool) { + return _paused; + } + + /** + * @dev Throws if the contract is paused. + */ + function _requireNotPaused() internal view virtual { + if (paused()) { + revert EnforcedPause(); + } + } + + /** + * @dev Throws if the contract is not paused. + */ + function _requirePaused() internal view virtual { + if (!paused()) { + revert ExpectedPause(); + } + } + + /** + * @dev Triggers stopped state. + * + * Requirements: + * + * - The contract must not be paused. + */ + function _pause() internal virtual whenNotPaused { + _paused = true; + emit Paused(_msgSender()); + } + + /** + * @dev Returns to normal state. + * + * Requirements: + * + * - The contract must be paused. + */ + function _unpause() internal virtual whenPaused { + _paused = false; + emit Unpaused(_msgSender()); + } +} + +// node_modules/@openzeppelin/contracts/utils/introspection/ERC165.sol + +// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) + +/** + * @dev Implementation of the {IERC165} interface. + * + * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check + * for the additional interface id that will be supported. For example: + * + * ```solidity + * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); + * } + * ``` + */ +abstract contract ERC165 is IERC165 { + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { + return interfaceId == type(IERC165).interfaceId; + } +} + +// node_modules/@openzeppelin/contracts/access/AccessControl.sol + +// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) + +/** + * @dev Contract module that allows children to implement role-based access + * control mechanisms. This is a lightweight version that doesn't allow enumerating role + * members except through off-chain means by accessing the contract event logs. Some + * applications may benefit from on-chain enumerability, for those cases see + * {AccessControlEnumerable}. + * + * Roles are referred to by their `bytes32` identifier. These should be exposed + * in the external API and be unique. The best way to achieve this is by + * using `public constant` hash digests: + * + * ```solidity + * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); + * ``` + * + * Roles can be used to represent a set of permissions. To restrict access to a + * function call, use {hasRole}: + * + * ```solidity + * function foo() public { + * require(hasRole(MY_ROLE, msg.sender)); + * ... + * } + * ``` + * + * Roles can be granted and revoked dynamically via the {grantRole} and + * {revokeRole} functions. Each role has an associated admin role, and only + * accounts that have a role's admin role can call {grantRole} and {revokeRole}. + * + * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means + * that only accounts with this role will be able to grant or revoke other + * roles. More complex role relationships can be created by using + * {_setRoleAdmin}. + * + * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to + * grant and revoke this role. Extra precautions should be taken to secure + * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} + * to enforce additional security measures for this role. + */ +abstract contract AccessControl is Context, IAccessControl, ERC165 { + struct RoleData { + mapping(address account => bool) hasRole; + bytes32 adminRole; + } + + mapping(bytes32 role => RoleData) private _roles; + + bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; + + /** + * @dev Modifier that checks that an account has a specific role. Reverts + * with an {AccessControlUnauthorizedAccount} error including the required role. + */ + modifier onlyRole(bytes32 role) { + _checkRole(role); + _; + } + + /** + * @dev See {IERC165-supportsInterface}. + */ + function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { + return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); + } + + /** + * @dev Returns `true` if `account` has been granted `role`. + */ + function hasRole(bytes32 role, address account) public view virtual returns (bool) { + return _roles[role].hasRole[account]; + } + + /** + * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` + * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. + */ + function _checkRole(bytes32 role) internal view virtual { + _checkRole(role, _msgSender()); + } + + /** + * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` + * is missing `role`. + */ + function _checkRole(bytes32 role, address account) internal view virtual { + if (!hasRole(role, account)) { + revert AccessControlUnauthorizedAccount(account, role); + } + } + + /** + * @dev Returns the admin role that controls `role`. See {grantRole} and + * {revokeRole}. + * + * To change a role's admin, use {_setRoleAdmin}. + */ + function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { + return _roles[role].adminRole; + } + + /** + * @dev Grants `role` to `account`. + * + * If `account` had not been already granted `role`, emits a {RoleGranted} + * event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + * + * May emit a {RoleGranted} event. + */ + function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { + _grantRole(role, account); + } + + /** + * @dev Revokes `role` from `account`. + * + * If `account` had been granted `role`, emits a {RoleRevoked} event. + * + * Requirements: + * + * - the caller must have ``role``'s admin role. + * + * May emit a {RoleRevoked} event. + */ + function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { + _revokeRole(role, account); + } + + /** + * @dev Revokes `role` from the calling account. + * + * Roles are often managed via {grantRole} and {revokeRole}: this function's + * purpose is to provide a mechanism for accounts to lose their privileges + * if they are compromised (such as when a trusted device is misplaced). + * + * If the calling account had been revoked `role`, emits a {RoleRevoked} + * event. + * + * Requirements: + * + * - the caller must be `callerConfirmation`. + * + * May emit a {RoleRevoked} event. + */ + function renounceRole(bytes32 role, address callerConfirmation) public virtual { + if (callerConfirmation != _msgSender()) { + revert AccessControlBadConfirmation(); + } + + _revokeRole(role, callerConfirmation); + } + + /** + * @dev Sets `adminRole` as ``role``'s admin role. + * + * Emits a {RoleAdminChanged} event. + */ + function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { + bytes32 previousAdminRole = getRoleAdmin(role); + _roles[role].adminRole = adminRole; + emit RoleAdminChanged(role, previousAdminRole, adminRole); + } + + /** + * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. + * + * Internal function without access restriction. + * + * May emit a {RoleGranted} event. + */ + function _grantRole(bytes32 role, address account) internal virtual returns (bool) { + if (!hasRole(role, account)) { + _roles[role].hasRole[account] = true; + emit RoleGranted(role, account, _msgSender()); + return true; + } else { + return false; + } + } + + /** + * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. + * + * Internal function without access restriction. + * + * May emit a {RoleRevoked} event. + */ + function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { + if (hasRole(role, account)) { + _roles[role].hasRole[account] = false; + emit RoleRevoked(role, account, _msgSender()); + return true; + } else { + return false; + } + } +} + +// node_modules/@openzeppelin/contracts/token/ERC20/ERC20.sol + +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol) + +/** + * @dev Implementation of the {IERC20} interface. + * + * This implementation is agnostic to the way tokens are created. This means + * that a supply mechanism has to be added in a derived contract using {_mint}. + * + * TIP: For a detailed writeup see our guide + * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How + * to implement supply mechanisms]. + * + * The default value of {decimals} is 18. To change this, you should override + * this function so it returns a different value. + * + * We have followed general OpenZeppelin Contracts guidelines: functions revert + * instead returning `false` on failure. This behavior is nonetheless + * conventional and does not conflict with the expectations of ERC20 + * applications. + * + * Additionally, an {Approval} event is emitted on calls to {transferFrom}. + * This allows applications to reconstruct the allowance for all accounts just + * by listening to said events. Other implementations of the EIP may not emit + * these events, as it isn't required by the specification. + */ +abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors { + mapping(address account => uint256) private _balances; + + mapping(address account => mapping(address spender => uint256)) private _allowances; + + uint256 private _totalSupply; + + string private _name; + string private _symbol; + + /** + * @dev Sets the values for {name} and {symbol}. + * + * All two of these values are immutable: they can only be set once during + * construction. + */ + constructor(string memory name_, string memory symbol_) { + _name = name_; + _symbol = symbol_; + } + + /** + * @dev Returns the name of the token. + */ + function name() public view virtual returns (string memory) { + return _name; + } + + /** + * @dev Returns the symbol of the token, usually a shorter version of the + * name. + */ + function symbol() public view virtual returns (string memory) { + return _symbol; + } + + /** + * @dev Returns the number of decimals used to get its user representation. + * For example, if `decimals` equals `2`, a balance of `505` tokens should + * be displayed to a user as `5.05` (`505 / 10 ** 2`). + * + * Tokens usually opt for a value of 18, imitating the relationship between + * Ether and Wei. This is the default value returned by this function, unless + * it's overridden. + * + * NOTE: This information is only used for _display_ purposes: it in + * no way affects any of the arithmetic of the contract, including + * {IERC20-balanceOf} and {IERC20-transfer}. + */ + function decimals() public view virtual returns (uint8) { + return 18; + } + + /** + * @dev See {IERC20-totalSupply}. + */ + function totalSupply() public view virtual returns (uint256) { + return _totalSupply; + } + + /** + * @dev See {IERC20-balanceOf}. + */ + function balanceOf(address account) public view virtual returns (uint256) { + return _balances[account]; + } + + /** + * @dev See {IERC20-transfer}. + * + * Requirements: + * + * - `to` cannot be the zero address. + * - the caller must have a balance of at least `value`. + */ + function transfer(address to, uint256 value) public virtual returns (bool) { + address owner = _msgSender(); + _transfer(owner, to, value); + return true; + } + + /** + * @dev See {IERC20-allowance}. + */ + function allowance(address owner, address spender) public view virtual returns (uint256) { + return _allowances[owner][spender]; + } + + /** + * @dev See {IERC20-approve}. + * + * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on + * `transferFrom`. This is semantically equivalent to an infinite approval. + * + * Requirements: + * + * - `spender` cannot be the zero address. + */ + function approve(address spender, uint256 value) public virtual returns (bool) { + address owner = _msgSender(); + _approve(owner, spender, value); + return true; + } + + /** + * @dev See {IERC20-transferFrom}. + * + * Emits an {Approval} event indicating the updated allowance. This is not + * required by the EIP. See the note at the beginning of {ERC20}. + * + * NOTE: Does not update the allowance if the current allowance + * is the maximum `uint256`. + * + * Requirements: + * + * - `from` and `to` cannot be the zero address. + * - `from` must have a balance of at least `value`. + * - the caller must have allowance for ``from``'s tokens of at least + * `value`. + */ + function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { + address spender = _msgSender(); + _spendAllowance(from, spender, value); + _transfer(from, to, value); + return true; + } + + /** + * @dev Moves a `value` amount of tokens from `from` to `to`. + * + * This internal function is equivalent to {transfer}, and can be used to + * e.g. implement automatic token fees, slashing mechanisms, etc. + * + * Emits a {Transfer} event. + * + * NOTE: This function is not virtual, {_update} should be overridden instead. + */ + function _transfer(address from, address to, uint256 value) internal { + if (from == address(0)) { + revert ERC20InvalidSender(address(0)); + } + if (to == address(0)) { + revert ERC20InvalidReceiver(address(0)); + } + _update(from, to, value); + } + + /** + * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` + * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding + * this function. + * + * Emits a {Transfer} event. + */ + function _update(address from, address to, uint256 value) internal virtual { + if (from == address(0)) { + // Overflow check required: The rest of the code assumes that totalSupply never overflows + _totalSupply += value; + } else { + uint256 fromBalance = _balances[from]; + if (fromBalance < value) { + revert ERC20InsufficientBalance(from, fromBalance, value); + } + unchecked { + // Overflow not possible: value <= fromBalance <= totalSupply. + _balances[from] = fromBalance - value; + } + } + + if (to == address(0)) { + unchecked { + // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. + _totalSupply -= value; + } + } else { + unchecked { + // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. + _balances[to] += value; + } + } + + emit Transfer(from, to, value); + } + + /** + * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). + * Relies on the `_update` mechanism + * + * Emits a {Transfer} event with `from` set to the zero address. + * + * NOTE: This function is not virtual, {_update} should be overridden instead. + */ + function _mint(address account, uint256 value) internal { + if (account == address(0)) { + revert ERC20InvalidReceiver(address(0)); + } + _update(address(0), account, value); + } + + /** + * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. + * Relies on the `_update` mechanism. + * + * Emits a {Transfer} event with `to` set to the zero address. + * + * NOTE: This function is not virtual, {_update} should be overridden instead + */ + function _burn(address account, uint256 value) internal { + if (account == address(0)) { + revert ERC20InvalidSender(address(0)); + } + _update(account, address(0), value); + } + + /** + * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens. + * + * This internal function is equivalent to `approve`, and can be used to + * e.g. set automatic allowances for certain subsystems, etc. + * + * Emits an {Approval} event. + * + * Requirements: + * + * - `owner` cannot be the zero address. + * - `spender` cannot be the zero address. + * + * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. + */ + function _approve(address owner, address spender, uint256 value) internal { + _approve(owner, spender, value, true); + } + + /** + * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. + * + * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by + * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any + * `Approval` event during `transferFrom` operations. + * + * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to + * true using the following override: + * ``` + * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { + * super._approve(owner, spender, value, true); + * } + * ``` + * + * Requirements are the same as {_approve}. + */ + function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { + if (owner == address(0)) { + revert ERC20InvalidApprover(address(0)); + } + if (spender == address(0)) { + revert ERC20InvalidSpender(address(0)); + } + _allowances[owner][spender] = value; + if (emitEvent) { + emit Approval(owner, spender, value); + } + } + + /** + * @dev Updates `owner` s allowance for `spender` based on spent `value`. + * + * Does not update the allowance value in case of infinite allowance. + * Revert if not enough allowance is available. + * + * Does not emit an {Approval} event. + */ + function _spendAllowance(address owner, address spender, uint256 value) internal virtual { + uint256 currentAllowance = allowance(owner, spender); + if (currentAllowance != type(uint256).max) { + if (currentAllowance < value) { + revert ERC20InsufficientAllowance(spender, currentAllowance, value); + } + unchecked { + _approve(owner, spender, currentAllowance - value, false); + } + } + } +} + +// node_modules/@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol + +// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Burnable.sol) + +/** + * @dev Extension of {ERC20} that allows token holders to destroy both their own + * tokens and those that they have an allowance for, in a way that can be + * recognized off-chain (via event analysis). + */ +abstract contract ERC20Burnable is Context, ERC20 { + /** + * @dev Destroys a `value` amount of tokens from the caller. + * + * See {ERC20-_burn}. + */ + function burn(uint256 value) public virtual { + _burn(_msgSender(), value); + } + + /** + * @dev Destroys a `value` amount of tokens from `account`, deducting from + * the caller's allowance. + * + * See {ERC20-_burn} and {ERC20-allowance}. + * + * Requirements: + * + * - the caller must have allowance for ``accounts``'s tokens of at least + * `value`. + */ + function burnFrom(address account, uint256 value) public virtual { + _spendAllowance(account, _msgSender(), value); + _burn(account, value); + } +} + +// src/contracts/ERC20WithMinters.sol + +// Ripped from +// https://github.com/FraxFinance/frax-contracts-dev/blob/travis/src/hardhat/contracts/ERC20/ERC20PermissionedMint.sol +// with the difference that minter cannot burn (no minter_burn_from()) + +contract ERC20PermissionedMint is ERC20, ERC20Burnable, Owned { + // Core + address public timelock_address; + + // Minters + address[] public minters_array; // Allowed to mint + mapping(address => bool) public minters; // Mapping is also used for faster verification + + /* ========== CONSTRUCTOR ========== */ + + constructor( + address _creator_address, + address _timelock_address, + string memory _name, + string memory _symbol + ) ERC20(_name, _symbol) Owned(_creator_address) { + timelock_address = _timelock_address; + } + + /* ========== MODIFIERS ========== */ + + modifier onlyByOwnGov() { + require(msg.sender == timelock_address || msg.sender == owner, "Not owner or timelock"); + _; + } + + modifier onlyMinters() { + require(minters[msg.sender] == true, "Only minters"); + _; + } + + /* ========== RESTRICTED FUNCTIONS ========== */ + + // This function is what other minters will call to mint new tokens + function minter_mint(address m_address, uint256 m_amount) public onlyMinters { + super._mint(m_address, m_amount); + emit TokenMinterMinted(msg.sender, m_address, m_amount); + } + + // Adds whitelisted minters + function addMinter(address minter_address) public onlyByOwnGov { + require(minter_address != address(0), "Zero address detected"); + + require(minters[minter_address] == false, "Address already exists"); + minters[minter_address] = true; + minters_array.push(minter_address); + + emit MinterAdded(minter_address); + } + + // Remove a minter + function removeMinter(address minter_address) public onlyByOwnGov { + require(minter_address != address(0), "Zero address detected"); + require(minters[minter_address] == true, "Address nonexistent"); + + // Delete from the mapping + delete minters[minter_address]; + + // 'Delete' from the array by setting the address to 0x0 + for (uint256 i = 0; i < minters_array.length; i++) { + if (minters_array[i] == minter_address) { + minters_array[i] = address(0); // This will leave a null in the array and keep the indices the same + break; + } + } + + emit MinterRemoved(minter_address); + } + + /* ========== EVENTS ========== */ + + event TokenMinterBurned(address indexed from, address indexed to, uint256 amount); + event TokenMinterMinted(address indexed from, address indexed to, uint256 amount); + event MinterAdded(address minter_address); + event MinterRemoved(address minter_address); +} diff --git a/src/contracts/FraxFerry-flattened.sol b/src/contracts/FraxFerry-flattened.sol new file mode 100644 index 0000000..3ab5df6 --- /dev/null +++ b/src/contracts/FraxFerry-flattened.sol @@ -0,0 +1,1017 @@ +pragma solidity 0.8.20; + +// 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/math/Math.sol + +// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) + +/** + * @dev Standard math utilities missing in the Solidity language. + */ +library Math { + /** + * @dev Muldiv operation overflow. + */ + error MathOverflowedMulDiv(); + + enum Rounding { + Floor, // Toward negative infinity + Ceil, // Toward positive infinity + Trunc, // Toward zero + Expand // Away from zero + } + + /** + * @dev Returns the addition of two unsigned integers, with an overflow flag. + */ + function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { + unchecked { + uint256 c = a + b; + if (c < a) return (false, 0); + return (true, c); + } + } + + /** + * @dev Returns the subtraction of two unsigned integers, with an overflow flag. + */ + function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { + unchecked { + if (b > a) return (false, 0); + return (true, a - b); + } + } + + /** + * @dev Returns the multiplication of two unsigned integers, with an overflow flag. + */ + function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { + unchecked { + // Gas optimization: this is cheaper than requiring 'a' not being zero, but the + // benefit is lost if 'b' is also tested. + // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 + if (a == 0) return (true, 0); + uint256 c = a * b; + if (c / a != b) return (false, 0); + return (true, c); + } + } + + /** + * @dev Returns the division of two unsigned integers, with a division by zero flag. + */ + function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { + unchecked { + if (b == 0) return (false, 0); + return (true, a / b); + } + } + + /** + * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. + */ + function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { + unchecked { + if (b == 0) return (false, 0); + return (true, a % b); + } + } + + /** + * @dev Returns the largest of two numbers. + */ + function max(uint256 a, uint256 b) internal pure returns (uint256) { + return a > b ? a : b; + } + + /** + * @dev Returns the smallest of two numbers. + */ + function min(uint256 a, uint256 b) internal pure returns (uint256) { + return a < b ? a : b; + } + + /** + * @dev Returns the average of two numbers. The result is rounded towards + * zero. + */ + function average(uint256 a, uint256 b) internal pure returns (uint256) { + // (a + b) / 2 can overflow. + return (a & b) + (a ^ b) / 2; + } + + /** + * @dev Returns the ceiling of the division of two numbers. + * + * This differs from standard division with `/` in that it rounds towards infinity instead + * of rounding towards zero. + */ + function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { + if (b == 0) { + // Guarantee the same behavior as in a regular Solidity division. + return a / b; + } + + // (a + b - 1) / b can overflow on addition, so we distribute. + return a == 0 ? 0 : (a - 1) / b + 1; + } + + /** + * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or + * denominator == 0. + * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by + * Uniswap Labs also under MIT license. + */ + function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { + unchecked { + // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use + // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 + // variables such that product = prod1 * 2^256 + prod0. + uint256 prod0 = x * y; // Least significant 256 bits of the product + uint256 prod1; // Most significant 256 bits of the product + assembly { + let mm := mulmod(x, y, not(0)) + prod1 := sub(sub(mm, prod0), lt(mm, prod0)) + } + + // Handle non-overflow cases, 256 by 256 division. + if (prod1 == 0) { + // Solidity will revert if denominator == 0, unlike the div opcode on its own. + // The surrounding unchecked block does not change this fact. + // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. + return prod0 / denominator; + } + + // Make sure the result is less than 2^256. Also prevents denominator == 0. + if (denominator <= prod1) { + revert MathOverflowedMulDiv(); + } + + /////////////////////////////////////////////// + // 512 by 256 division. + /////////////////////////////////////////////// + + // Make division exact by subtracting the remainder from [prod1 prod0]. + uint256 remainder; + assembly { + // Compute remainder using mulmod. + remainder := mulmod(x, y, denominator) + + // Subtract 256 bit number from 512 bit number. + prod1 := sub(prod1, gt(remainder, prod0)) + prod0 := sub(prod0, remainder) + } + + // Factor powers of two out of denominator and compute largest power of two divisor of denominator. + // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. + + uint256 twos = denominator & (0 - denominator); + assembly { + // Divide denominator by twos. + denominator := div(denominator, twos) + + // Divide [prod1 prod0] by twos. + prod0 := div(prod0, twos) + + // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. + twos := add(div(sub(0, twos), twos), 1) + } + + // Shift in bits from prod1 into prod0. + prod0 |= prod1 * twos; + + // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such + // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for + // four bits. That is, denominator * inv = 1 mod 2^4. + uint256 inverse = (3 * denominator) ^ 2; + + // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also + // works in modular arithmetic, doubling the correct bits in each step. + inverse *= 2 - denominator * inverse; // inverse mod 2^8 + inverse *= 2 - denominator * inverse; // inverse mod 2^16 + inverse *= 2 - denominator * inverse; // inverse mod 2^32 + inverse *= 2 - denominator * inverse; // inverse mod 2^64 + inverse *= 2 - denominator * inverse; // inverse mod 2^128 + inverse *= 2 - denominator * inverse; // inverse mod 2^256 + + // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. + // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is + // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 + // is no longer required. + result = prod0 * inverse; + return result; + } + } + + /** + * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. + */ + function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { + uint256 result = mulDiv(x, y, denominator); + if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { + result += 1; + } + return result; + } + + /** + * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded + * towards zero. + * + * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). + */ + function sqrt(uint256 a) internal pure returns (uint256) { + if (a == 0) { + return 0; + } + + // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. + // + // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have + // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. + // + // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` + // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` + // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` + // + // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. + uint256 result = 1 << (log2(a) >> 1); + + // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, + // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at + // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision + // into the expected uint128 result. + unchecked { + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + result = (result + a / result) >> 1; + return min(result, a / result); + } + } + + /** + * @notice Calculates sqrt(a), following the selected rounding direction. + */ + function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = sqrt(a); + return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); + } + } + + /** + * @dev Return the log in base 2 of a positive value rounded towards zero. + * Returns 0 if given 0. + */ + function log2(uint256 value) internal pure returns (uint256) { + uint256 result = 0; + unchecked { + if (value >> 128 > 0) { + value >>= 128; + result += 128; + } + if (value >> 64 > 0) { + value >>= 64; + result += 64; + } + if (value >> 32 > 0) { + value >>= 32; + result += 32; + } + if (value >> 16 > 0) { + value >>= 16; + result += 16; + } + if (value >> 8 > 0) { + value >>= 8; + result += 8; + } + if (value >> 4 > 0) { + value >>= 4; + result += 4; + } + if (value >> 2 > 0) { + value >>= 2; + result += 2; + } + if (value >> 1 > 0) { + result += 1; + } + } + return result; + } + + /** + * @dev Return the log in base 2, following the selected rounding direction, of a positive value. + * Returns 0 if given 0. + */ + function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = log2(value); + return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); + } + } + + /** + * @dev Return the log in base 10 of a positive value rounded towards zero. + * Returns 0 if given 0. + */ + function log10(uint256 value) internal pure returns (uint256) { + uint256 result = 0; + unchecked { + if (value >= 10 ** 64) { + value /= 10 ** 64; + result += 64; + } + if (value >= 10 ** 32) { + value /= 10 ** 32; + result += 32; + } + if (value >= 10 ** 16) { + value /= 10 ** 16; + result += 16; + } + if (value >= 10 ** 8) { + value /= 10 ** 8; + result += 8; + } + if (value >= 10 ** 4) { + value /= 10 ** 4; + result += 4; + } + if (value >= 10 ** 2) { + value /= 10 ** 2; + result += 2; + } + if (value >= 10 ** 1) { + result += 1; + } + } + return result; + } + + /** + * @dev Return the log in base 10, following the selected rounding direction, of a positive value. + * Returns 0 if given 0. + */ + function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = log10(value); + return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); + } + } + + /** + * @dev Return the log in base 256 of a positive value rounded towards zero. + * Returns 0 if given 0. + * + * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. + */ + function log256(uint256 value) internal pure returns (uint256) { + uint256 result = 0; + unchecked { + if (value >> 128 > 0) { + value >>= 128; + result += 16; + } + if (value >> 64 > 0) { + value >>= 64; + result += 8; + } + if (value >> 32 > 0) { + value >>= 32; + result += 4; + } + if (value >> 16 > 0) { + value >>= 16; + result += 2; + } + if (value >> 8 > 0) { + result += 1; + } + } + return result; + } + + /** + * @dev Return the log in base 256, following the selected rounding direction, of a positive value. + * Returns 0 if given 0. + */ + function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { + unchecked { + uint256 result = log256(value); + return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); + } + } + + /** + * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. + */ + function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { + return uint8(rounding) % 2 == 1; + } +} + +// node_modules/@uniswap/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"); + } +} + +// src/contracts/FraxFerry.sol + +// https://github.com/FraxFinance/frax-solidity/blob/master/src/hardhat/contracts/Fraxferry/Fraxferry.sol +// ==================================================================== +// | ______ _______ | +// | / _____________ __ __ / ____(_____ ____ _____ ________ | +// | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | +// | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | +// | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | +// | | +// ==================================================================== +// ============================ Fraxferry ============================= +// ==================================================================== +// Ferry that can be used to ship tokens between chains + +// Frax Finance: https://github.com/FraxFinance + +// Primary Author(s) +// Dennis: https://github.com/denett + +/* + ** Modus operandi: + ** - User sends tokens to the contract. This transaction is stored in the contract. + ** - Captain queries the source chain for transactions to ship. + ** - Captain sends batch (start, end, hash) to start the trip, + ** - Crewmembers check the batch and can dispute it if it is invalid. + ** - Non disputed batches can be executed by the first officer by providing the transactions as calldata. + ** - Hash of the transactions must be equal to the hash in the batch. User receives their tokens on the other chain. + ** - In case there was a fraudulent transaction (a hacker for example), the owner can cancel a single transaction, such that it will not be executed. + ** - The owner can manually manage the tokens in the contract and must make sure it has enough funds. + ** + ** What must happen for a false batch to be executed: + ** - Captain is tricked into proposing a batch with a false hash + ** - All crewmembers bots are offline/censured/compromised and no one disputes the proposal + ** + ** Other risks: + ** - Reorgs on the source chain. Avoided, by only returning the transactions on the source chain that are at least one hour old. + ** - Rollbacks of optimistic rollups. Avoided by running a node. + ** - Operators do not have enough time to pause the chain after a fake proposal. Avoided by requiring a minimal amount of time between sending the proposal and executing it. + */ + +contract Fraxferry { + IERC20 public immutable token; + IERC20 public immutable targetToken; + uint256 public immutable chainid; + uint256 public immutable targetChain; + + address public owner; + address public nominatedOwner; + address public captain; + address public firstOfficer; + mapping(address => bool) public crewmembers; + mapping(address => bool) public fee_exempt_addrs; + + bool public paused; + + uint256 public MIN_WAIT_PERIOD_ADD = 3600; // Minimal 1 hour waiting + uint256 public MIN_WAIT_PERIOD_EXECUTE = 79_200; // Minimal 22 hour waiting + uint256 public FEE_RATE = 10; // 0.1% fee + uint256 public FEE_MIN = 5 * 1e18; // 5 token min fee + uint256 public FEE_MAX = 100 * 1e18; // 100 token max fee + + uint256 constant MAX_FEE_RATE = 100; // Max fee rate is 1% + uint256 constant MAX_FEE_MIN = 100e18; // Max minimum fee is 100 tokens + uint256 constant MAX_FEE_MAX = 1000e18; // Max fee is 1000 tokens + + uint256 public constant REDUCED_DECIMALS = 1e10; + + Transaction[] public transactions; + mapping(uint256 => bool) public cancelled; + uint256 public executeIndex; + Batch[] public batches; + + struct Transaction { + address user; + uint64 amount; + uint32 timestamp; + } + + struct Batch { + uint64 start; + uint64 end; + uint64 departureTime; + uint64 status; + bytes32 hash; + } + + struct BatchData { + uint256 startTransactionNo; + Transaction[] transactions; + } + + constructor(address _token, uint256 _chainid, address _targetToken, uint256 _targetChain) { + //require (block.chainid==_chainid,"Wrong chain"); + chainid = _chainid; + token = IERC20(_token); + targetToken = IERC20(_targetToken); + owner = msg.sender; + targetChain = _targetChain; + } + + // ############## Events ############## + + event Embark(address indexed sender, uint256 index, uint256 amount, uint256 amountAfterFee, uint256 timestamp); + event Disembark(uint256 start, uint256 end, bytes32 hash); + event Depart(uint256 batchNo, uint256 start, uint256 end, bytes32 hash); + event RemoveBatch(uint256 batchNo); + event DisputeBatch(uint256 batchNo, bytes32 hash); + event Cancelled(uint256 index, bool cancel); + event Pause(bool paused); + event OwnerNominated(address indexed newOwner); + event OwnerChanged(address indexed previousOwner, address indexed newOwner); + event SetCaptain(address indexed previousCaptain, address indexed newCaptain); + event SetFirstOfficer(address indexed previousFirstOfficer, address indexed newFirstOfficer); + event SetCrewmember(address indexed crewmember, bool set); + event SetFee( + uint256 previousFeeRate, + uint256 feeRate, + uint256 previousFeeMin, + uint256 feeMin, + uint256 previousFeeMax, + uint256 feeMax + ); + event SetMinWaitPeriods( + uint256 previousMinWaitAdd, + uint256 previousMinWaitExecute, + uint256 minWaitAdd, + uint256 minWaitExecute + ); + event FeeExemptToggled(address addr, bool is_fee_exempt); + + // ############## Modifiers ############## + + modifier isOwner() { + require(msg.sender == owner, "Not owner"); + _; + } + + modifier isCaptain() { + require(msg.sender == captain, "Not captain"); + _; + } + + modifier isFirstOfficer() { + require(msg.sender == firstOfficer, "Not first officer"); + _; + } + + modifier isCrewmember() { + require( + crewmembers[msg.sender] || msg.sender == owner || msg.sender == captain || msg.sender == firstOfficer, + "Not crewmember" + ); + _; + } + + modifier notPaused() { + require(!paused, "Paused"); + _; + } + + // ############## Ferry actions ############## + + function embarkWithRecipient(uint256 amount, address recipient) public notPaused { + amount = (amount / REDUCED_DECIMALS) * REDUCED_DECIMALS; // Round amount to fit in data structure + uint256 fee; + if (fee_exempt_addrs[msg.sender]) fee = 0; + else fee = Math.min(Math.max(FEE_MIN, (amount * FEE_RATE) / 10_000), FEE_MAX); + require(amount > fee, "Amount too low"); + require(amount / REDUCED_DECIMALS <= type(uint64).max, "Amount too high"); + TransferHelper.safeTransferFrom(address(token), msg.sender, address(this), amount); + uint64 amountAfterFee = uint64((amount - fee) / REDUCED_DECIMALS); + emit Embark(recipient, transactions.length, amount, amountAfterFee * REDUCED_DECIMALS, block.timestamp); + transactions.push(Transaction(recipient, amountAfterFee, uint32(block.timestamp))); + } + + function embark(uint256 amount) public { + embarkWithRecipient(amount, msg.sender); + } + + function embarkWithSignature( + uint256 _amount, + address recipient, + uint256 deadline, + bool approveMax, + uint8 v, + bytes32 r, + bytes32 s + ) public { + uint256 amount = approveMax ? type(uint256).max : _amount; + IERC20Permit(address(token)).permit(msg.sender, address(this), amount, deadline, v, r, s); + embarkWithRecipient(amount, recipient); + } + + function depart(uint256 start, uint256 end, bytes32 hash) external notPaused isCaptain { + require( + (batches.length == 0 && start == 0) || (batches.length > 0 && start == batches[batches.length - 1].end + 1), + "Wrong start" + ); + require(end >= start && end < type(uint64).max, "Wrong end"); + batches.push(Batch(uint64(start), uint64(end), uint64(block.timestamp), 0, hash)); + emit Depart(batches.length - 1, start, end, hash); + } + + function disembark(BatchData calldata batchData) external notPaused isFirstOfficer { + Batch memory batch = batches[executeIndex++]; + require(batch.status == 0, "Batch disputed"); + require(batch.start == batchData.startTransactionNo, "Wrong start"); + require(batch.start + batchData.transactions.length - 1 == batch.end, "Wrong size"); + require(block.timestamp - batch.departureTime >= MIN_WAIT_PERIOD_EXECUTE, "Too soon"); + + bytes32 hash = keccak256(abi.encodePacked(targetChain, targetToken, chainid, token, batch.start)); + for (uint256 i = 0; i < batchData.transactions.length; ++i) { + if (!cancelled[batch.start + i]) { + TransferHelper.safeTransfer( + address(token), + batchData.transactions[i].user, + batchData.transactions[i].amount * REDUCED_DECIMALS + ); + } + hash = keccak256(abi.encodePacked(hash, batchData.transactions[i].user, batchData.transactions[i].amount)); + } + require(batch.hash == hash, "Wrong hash"); + emit Disembark(batch.start, batch.end, hash); + } + + function removeBatches(uint256 batchNo) external isOwner { + require(executeIndex <= batchNo, "Batch already executed"); + while (batches.length > batchNo) batches.pop(); + emit RemoveBatch(batchNo); + } + + function disputeBatch(uint256 batchNo, bytes32 hash) external isCrewmember { + require(batches[batchNo].hash == hash, "Wrong hash"); + require(executeIndex <= batchNo, "Batch already executed"); + require(batches[batchNo].status == 0, "Batch already disputed"); + batches[batchNo].status = 1; // Set status on disputed + _pause(true); + emit DisputeBatch(batchNo, hash); + } + + function pause() external isCrewmember { + _pause(true); + } + + function unPause() external isOwner { + _pause(false); + } + + function _pause(bool _paused) internal { + paused = _paused; + emit Pause(_paused); + } + + function _jettison(uint256 index, bool cancel) internal { + require(executeIndex == 0 || index > batches[executeIndex - 1].end, "Transaction already executed"); + cancelled[index] = cancel; + emit Cancelled(index, cancel); + } + + function jettison(uint256 index, bool cancel) external isOwner { + _jettison(index, cancel); + } + + function jettisonGroup(uint256[] calldata indexes, bool cancel) external isOwner { + for (uint256 i = 0; i < indexes.length; ++i) { + _jettison(indexes[i], cancel); + } + } + + // ############## Parameters management ############## + + function setFee(uint256 _FEE_RATE, uint256 _FEE_MIN, uint256 _FEE_MAX) external isOwner { + require(_FEE_RATE < MAX_FEE_RATE); + require(_FEE_MIN < MAX_FEE_MIN); + require(_FEE_MAX < MAX_FEE_MAX); + emit SetFee(FEE_RATE, _FEE_RATE, FEE_MIN, _FEE_MIN, FEE_MAX, _FEE_MAX); + FEE_RATE = _FEE_RATE; + FEE_MIN = _FEE_MIN; + FEE_MAX = _FEE_MAX; + } + + function setMinWaitPeriods(uint256 _MIN_WAIT_PERIOD_ADD, uint256 _MIN_WAIT_PERIOD_EXECUTE) external isOwner { + require(_MIN_WAIT_PERIOD_ADD >= 3600 && _MIN_WAIT_PERIOD_EXECUTE >= 3600, "Period too short"); + emit SetMinWaitPeriods( + MIN_WAIT_PERIOD_ADD, + MIN_WAIT_PERIOD_EXECUTE, + _MIN_WAIT_PERIOD_ADD, + _MIN_WAIT_PERIOD_EXECUTE + ); + MIN_WAIT_PERIOD_ADD = _MIN_WAIT_PERIOD_ADD; + MIN_WAIT_PERIOD_EXECUTE = _MIN_WAIT_PERIOD_EXECUTE; + } + + // ############## Roles management ############## + + function nominateNewOwner(address newOwner) external isOwner { + nominatedOwner = newOwner; + emit OwnerNominated(newOwner); + } + + function acceptOwnership() external { + require(msg.sender == nominatedOwner, "You must be nominated before you can accept ownership"); + emit OwnerChanged(owner, nominatedOwner); + owner = nominatedOwner; + nominatedOwner = address(0); + } + + function setCaptain(address newCaptain) external isOwner { + emit SetCaptain(captain, newCaptain); + captain = newCaptain; + } + + function setFirstOfficer(address newFirstOfficer) external isOwner { + emit SetFirstOfficer(firstOfficer, newFirstOfficer); + firstOfficer = newFirstOfficer; + } + + function setCrewmember(address crewmember, bool set) external isOwner { + crewmembers[crewmember] = set; + emit SetCrewmember(crewmember, set); + } + + function toggleFeeExemptAddr(address addr) external isOwner { + fee_exempt_addrs[addr] = !fee_exempt_addrs[addr]; + emit FeeExemptToggled(addr, fee_exempt_addrs[addr]); + } + + // ############## Token management ############## + + function sendTokens(address receiver, uint256 amount) external isOwner { + require(receiver != address(0), "Zero address not allowed"); + TransferHelper.safeTransfer(address(token), receiver, amount); + } + + // Generic proxy + function execute(address _to, uint256 _value, bytes calldata _data) external isOwner returns (bool, bytes memory) { + require(_data.length == 0 || _to.code.length > 0, "Can not call a function on a EOA"); + (bool success, bytes memory result) = _to.call{ value: _value }(_data); + return (success, result); + } + + // ############## Views ############## + function getNextBatch(uint256 _start, uint256 max) public view returns (uint256 start, uint256 end, bytes32 hash) { + uint256 cutoffTime = block.timestamp - MIN_WAIT_PERIOD_ADD; + if (_start < transactions.length && transactions[_start].timestamp < cutoffTime) { + start = _start; + end = start + max - 1; + if (end >= transactions.length) end = transactions.length - 1; + while (transactions[end].timestamp >= cutoffTime) end--; + hash = getTransactionsHash(start, end); + } + } + + function getBatchData(uint256 start, uint256 end) public view returns (BatchData memory data) { + data.startTransactionNo = start; + data.transactions = new Transaction[](end - start + 1); + for (uint256 i = start; i <= end; ++i) { + data.transactions[i - start] = transactions[i]; + } + } + + function getBatchAmount(uint256 start, uint256 end) public view returns (uint256 totalAmount) { + for (uint256 i = start; i <= end; ++i) { + totalAmount += transactions[i].amount; + } + totalAmount *= REDUCED_DECIMALS; + } + + function getTransactionsHash(uint256 start, uint256 end) public view returns (bytes32) { + bytes32 result = keccak256(abi.encodePacked(chainid, token, targetChain, targetToken, uint64(start))); + for (uint256 i = start; i <= end; ++i) { + result = keccak256(abi.encodePacked(result, transactions[i].user, transactions[i].amount)); + } + return result; + } + + function noTransactions() public view returns (uint256) { + return transactions.length; + } + + function noBatches() public view returns (uint256) { + return batches.length; + } +} From 72e2579342d219cfe98adb17509b4b897a569f51 Mon Sep 17 00:00:00 2001 From: Carter Carlson Date: Wed, 24 Jul 2024 13:13:20 -0700 Subject: [PATCH 09/15] docs: deployed addrs --- README.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d682b06..32a890f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,23 @@ -# Frax Template +# Frax Tron + +Good afternoon team, +I've successfully deployed the FRAX mintable ERC20 with Ferry on Tron. + +## Resources +- https://tronscan.org +- https://www.btcschools.net/tron/tron_tool_base58check_hex.php + - Ignore the "41" at the start when decoding Base58 + +## Addresses +- Deployer / Authorized Minter + - `TLNe6KF1dUSYBcZ4fzTstoKB8bkzQewz42` + - `0x721fc501d1fe305065dc88da0cf90406a79dfd69` +- FRAX Mintable ERC20 (test) + - `TQZTkTMbkC9923LtVHZcSrdqcW5rVhkZHP` + - `0xa00c37011018b4b11cffbbf0305a771d9d4066cf` +- FRAX Ferry + - `TGxtcNUY9q19FATX3tFxzkmBhQigVDTFJs` + - `0x4cb9873f50f69f7a3e4dcd5d2fe94c531623a298` ## Optional Setup Add: From 38aa3039e9a6b2368dfa2e7c262c6cf4db1a78b4 Mon Sep 17 00:00:00 2001 From: Carter Carlson Date: Thu, 25 Jul 2024 13:07:32 -0700 Subject: [PATCH 10/15] ops: deploy Ferry on fraxtal --- README.md | 16 +- .../252/run-1721935198.json | 104 ++++++ .../252/run-latest.json | 104 ++++++ package.json | 5 +- pnpm-lock.yaml | 339 +++++++++++++++++- remappings.txt | 3 +- src/script/DeployFraxAssetsOnTron.s.sol | 4 +- src/script/DeployTronFerriesOnFraxtal.sol | 13 +- 8 files changed, 564 insertions(+), 24 deletions(-) create mode 100644 broadcast/DeployTronFerriesOnFraxtal.sol/252/run-1721935198.json create mode 100644 broadcast/DeployTronFerriesOnFraxtal.sol/252/run-latest.json diff --git a/README.md b/README.md index 32a890f..d1c5c14 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,27 @@ # Frax Tron -Good afternoon team, -I've successfully deployed the FRAX mintable ERC20 with Ferry on Tron. - ## Resources - https://tronscan.org - https://www.btcschools.net/tron/tron_tool_base58check_hex.php - Ignore the "41" at the start when decoding Base58 ## Addresses +### Solana - Deployer / Authorized Minter - `TLNe6KF1dUSYBcZ4fzTstoKB8bkzQewz42` - - `0x721fc501d1fe305065dc88da0cf90406a79dfd69` + - `0x721fC501D1Fe305065dc88DA0cf90406A79dFD69` - FRAX Mintable ERC20 (test) - `TQZTkTMbkC9923LtVHZcSrdqcW5rVhkZHP` - - `0xa00c37011018b4b11cffbbf0305a771d9d4066cf` + - `0xA00C37011018b4B11CFFbBF0305A771D9d4066cf` - FRAX Ferry - `TGxtcNUY9q19FATX3tFxzkmBhQigVDTFJs` - - `0x4cb9873f50f69f7a3e4dcd5d2fe94c531623a298` + - `0x4Cb9873f50f69f7a3e4dCd5D2Fe94C531623a298` + +### Fraxtal +- Deployer / Ferry owner + - `0xb0E1650A9760e0f383174af042091fc544b8356f` +- FRAX Ferry + - `0xa5677a5bF6e8759D3C904d2da85D1318E398cf3A` ## Optional Setup Add: diff --git a/broadcast/DeployTronFerriesOnFraxtal.sol/252/run-1721935198.json b/broadcast/DeployTronFerriesOnFraxtal.sol/252/run-1721935198.json new file mode 100644 index 0000000..ab69328 --- /dev/null +++ b/broadcast/DeployTronFerriesOnFraxtal.sol/252/run-1721935198.json @@ -0,0 +1,104 @@ +{ + "transactions": [ + { + "hash": "0xad6f2c1ed9c1f42f7c59d857465c7283317b25b95fbb66cce258ab9939ed2493", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0xa5677a5bf6e8759d3c904d2da85d1318e398cf3a", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0e1650a9760e0f383174af042091fc544b8356f", + "gas": "0x61e835", + "value": "0x0", + "input": "0x610100604052610e1060075562013560600855600a600955674563918244f40000600a5568056bc75e2d63100000600b553480156200003d57600080fd5b50604051620058f8380380620058f88339818101604052810190620000639190620001ca565b8260c081815250508373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060e08181525050505050506200023c565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000157826200012a565b9050919050565b62000169816200014a565b81146200017557600080fd5b50565b60008151905062000189816200015e565b92915050565b6000819050919050565b620001a4816200018f565b8114620001b057600080fd5b50565b600081519050620001c48162000199565b92915050565b60008060008060808587031215620001e757620001e662000125565b5b6000620001f78782880162000178565b94505060206200020a87828801620001b3565b93505060406200021d8782880162000178565b92505060606200023087828801620001b3565b91505092959194509250565b60805160a05160c05160e05161562e620002ca6000396000818161146401528181611b4801526123820152600081816114a601528181611b060152612e680152600081816110b6015281816114850152611b690152600081816109ac01528181610b79015281816114c70152818161157601528181611b2701528181612a6a01526134d1015261562e6000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c80638456cb5911610167578063c2f6afe5116100ce578063e050be5711610087578063e050be57146107f6578063f40e349f14610826578063f55ebb8f14610842578063f7b188a514610860578063fc0c546a1461086a578063fd433ec014610888576102a0565b8063c2f6afe514610734578063cd84980e14610750578063cdbdfdc21461076e578063d2c1626c1461078c578063d9fb265d146107a8578063de7974a4146107d8576102a0565b80639b8c624a116101205780639b8c624a1461065b578063a3a6d9e814610677578063b32c4d8d14610693578063b61325cd146106c7578063b61d27f6146106e5578063c2624e1e14610716576102a0565b80638456cb59146105975780638b928bd3146105a15780638da5cb5b146105bf5780638e714a72146105dd578063907c6c2e146105f95780639ace38c214610629576102a0565b80633beaf5261161020b5780635c975abb116101c45780635c975abb146104e75780635f62fa6f14610505578063652dfc3b1461053557806366e64f971461055157806379ba50971461056f5780638304e6d214610579576102a0565b80633beaf526146104115780634a474aa314610441578063525862f91461045d57806353a47bb71461048f57806359c13403146104ad5780635b65b9ab146104cb576102a0565b8063165282c31161025d578063165282c31461034f5780632d11c58a1461037f578063327107f71461039d57806333032dd0146103bb57806333efa2b2146103d957806336f734c1146103f5576102a0565b8063024faa8c146102a557806305ab421d146102c357806305c211d2146102df57806307cca166146102fb578063081c4624146103175780631627540c14610333575b600080fd5b6102ad6108a4565b6040516102ba91906139b5565b60405180910390f35b6102dd60048036038101906102d89190613a64565b6108aa565b005b6102f960048036038101906102f49190613aa4565b6109d6565b005b61031560048036038101906103109190613b1c565b610d40565b005b610331600480360381019061032c9190613b5c565b610e77565b005b61034d60048036038101906103489190613b9c565b610f13565b005b61036960048036038101906103649190613bc9565b611028565b60405161037691906139b5565b60405180910390f35b6103876110ae565b60405161039491906139b5565b60405180910390f35b6103a56110b4565b6040516103b29190613c68565b60405180910390f35b6103c36110d8565b6040516103d091906139b5565b60405180910390f35b6103f360048036038101906103ee9190613ca7565b6110de565b005b61040f600480360381019061040a9190613d26565b611764565b005b61042b60048036038101906104269190613bc9565b611b01565b6040516104389190613d88565b60405180910390f35b61045b60048036038101906104569190613da3565b611c81565b005b61047760048036038101906104729190613bc9565b611e40565b60405161048693929190613dd0565b60405180910390f35b610497611f4a565b6040516104a49190613e16565b60405180910390f35b6104b5611f70565b6040516104c291906139b5565b60405180910390f35b6104e560048036038101906104e09190613e31565b611f76565b005b6104ef61209c565b6040516104fc9190613e93565b60405180910390f35b61051f600480360381019061051a9190613b9c565b6120af565b60405161052c9190613e93565b60405180910390f35b61054f600480360381019061054a9190613f13565b6120cf565b005b6105596121a5565b60405161056691906139b5565b60405180910390f35b6105776121ae565b005b610581612380565b60405161058e91906139b5565b60405180910390f35b61059f6123a4565b005b6105a9612542565b6040516105b691906139b5565b60405180910390f35b6105c761254f565b6040516105d49190613e16565b60405180910390f35b6105f760048036038101906105f29190613b9c565b612573565b005b610613600480360381019061060e9190613bc9565b6126c1565b6040516106209190614101565b60405180910390f35b610643600480360381019061063e9190613da3565b61286f565b60405161065293929190614141565b60405180910390f35b61067560048036038101906106709190613b9c565b6128e9565b005b610691600480360381019061068c91906141b1565b612a37565b005b6106ad60048036038101906106a89190613da3565b612b13565b6040516106be959493929190614253565b60405180910390f35b6106cf612ba9565b6040516106dc91906139b5565b60405180910390f35b6106ff60048036038101906106fa91906142fc565b612baf565b60405161070d929190614400565b60405180910390f35b61071e612d2c565b60405161072b91906139b5565b60405180910390f35b61074e60048036038101906107499190613bc9565b612d32565b005b610758612e66565b60405161076591906139b5565b60405180910390f35b610776612e8a565b60405161078391906139b5565b60405180910390f35b6107a660048036038101906107a19190613b9c565b612e97565b005b6107c260048036038101906107bd9190613b9c565b613051565b6040516107cf9190613e93565b60405180910390f35b6107e0613071565b6040516107ed9190613e16565b60405180910390f35b610810600480360381019061080b9190613da3565b613097565b60405161081d9190613e93565b60405180910390f35b610840600480360381019061083b9190614430565b6130b7565b005b61084a61340f565b6040516108579190613e16565b60405180910390f35b610868613435565b005b6108726134cf565b60405161087f9190613c68565b60405180910390f35b6108a2600480360381019061089d9190613da3565b6134f3565b005b60085481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f906144cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099e90614539565b60405180910390fd5b6109d27f00000000000000000000000000000000000000000000000000000000000000008383613500565b5050565b600660009054906101000a900460ff1615610a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1d906145a5565b60405180910390fd5b6402540be4008083610a389190614623565b610a429190614654565b91506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610aa15760009050610ad5565b610ad2610aca600a5461271060095487610abb9190614654565b610ac59190614623565b613655565b600b5461366e565b90505b808311610b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0e906146e2565b60405180910390fd5b67ffffffffffffffff80166402540be40084610b339190614623565b1115610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b9061474e565b60405180910390fd5b610ba07f0000000000000000000000000000000000000000000000000000000000000000333086613687565b60006402540be4008285610bb4919061476e565b610bbe9190614623565b90508273ffffffffffffffffffffffffffffffffffffffff167f0250c838bae2cda1e214f0925d41846180714450539039d6fd90a4121d98738e600c80549050866402540be4008567ffffffffffffffff16610c1a9190614654565b42604051610c2b94939291906147a2565b60405180910390a2600c60405180606001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018367ffffffffffffffff1681526020014263ffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550604082015181600001601c6101000a81548163ffffffff021916908363ffffffff160217905550505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc5906144cd565b60405180910390fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f6a5f1fd939b33c2480886a44e0780806ce19041ef2c91734cb752c54288ca5ac82604051610e6b9190613e93565b60405180910390a25050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc906144cd565b60405180910390fd5b610f0f82826137df565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f98906144cd565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2260405160405180910390a250565b6000808390505b82811161109457600c818154811061104a576110496147e7565b5b9060005260206000200160000160149054906101000a900467ffffffffffffffff1667ffffffffffffffff16826110819190614816565b91508061108d9061484a565b905061102f565b506402540be400816110a69190614654565b905092915050565b60095481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60075481565b600660009054906101000a900460ff161561112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906145a5565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b5906148de565b60405180910390fd5b6000600f600e60008154809291906111d59061484a565b91905055815481106111ea576111e96147e7565b5b90600052602060002090600202016040518060a00160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160018201548152505090506000816060015167ffffffffffffffff1614611328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131f9061494a565b60405180910390fd5b8160000135816000015167ffffffffffffffff161461137c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611373906149b6565b60405180910390fd5b806020015167ffffffffffffffff16600183806020019061139d91906149e5565b9050836000015167ffffffffffffffff166113b89190614816565b6113c2919061476e565b14611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990614a94565b60405180910390fd5b600854816040015167ffffffffffffffff164261141f919061476e565b1015611460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145790614b00565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000085600001516040516020016114ff959493929190614bbf565b60405160208183030381529060405280519060200120905060005b83806020019061152a91906149e5565b90508110156116d557600d600082856000015167ffffffffffffffff166115519190614816565b815260200190815260200160002060009054906101000a900460ff16611627576116267f00000000000000000000000000000000000000000000000000000000000000008580602001906115a591906149e5565b848181106115b6576115b56147e7565b5b90506060020160000160208101906115ce9190613b9c565b6402540be4008780602001906115e491906149e5565b868181106115f5576115f46147e7565b5b905060600201602001602081019061160d9190614c4a565b67ffffffffffffffff166116219190614654565b613500565b5b8184806020019061163891906149e5565b83818110611649576116486147e7565b5b90506060020160000160208101906116619190613b9c565b85806020019061167191906149e5565b84818110611682576116816147e7565b5b905060600201602001602081019061169a9190614c4a565b6040516020016116ac93929190614caf565b604051602081830303815290604052805190602001209150806116ce9061484a565b905061151a565b508082608001511461171c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171390614d38565b60405180910390fd5b7fce67cdf2a5dbd123a7aa5e9fd21b2136e06d33eb30e024ee5c491a6ec934a48b826000015183602001518360405161175793929190614d89565b60405180910390a1505050565b600660009054906101000a900460ff16156117b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ab906145a5565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183b90614e0c565b60405180910390fd5b6000600f805490501480156118595750600083145b806118d457506000600f805490501180156118d357506001600f6001600f80549050611885919061476e565b81548110611896576118956147e7565b5b906000526020600020906002020160000160089054906101000a900467ffffffffffffffff166118c69190614e2c565b67ffffffffffffffff1683145b5b611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a906149b6565b60405180910390fd5b82821015801561192c575067ffffffffffffffff801682105b61196b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196290614eb4565b60405180910390fd5b600f6040518060a001604052808567ffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff168152602001600067ffffffffffffffff16815260200183815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506080820151816001015550507fe078fb854f34cd8ca5f749fe2e680b692ef7df5e057026369a30c8965a3219ca6001600f80549050611ae1919061476e565b848484604051611af49493929190614ed4565b60405180910390a1505050565b6000807f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000087604051602001611b9d959493929190614bbf565b60405160208183030381529060405280519060200120905060008490505b838111611c765781600c8281548110611bd757611bd66147e7565b5b9060005260206000200160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c8381548110611c1957611c186147e7565b5b9060005260206000200160000160149054906101000a900467ffffffffffffffff16604051602001611c4d93929190614caf565b60405160208183030381529060405280519060200120915080611c6f9061484a565b9050611bbb565b508091505092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d06906144cd565b60405180910390fd5b80600e541115611d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4b90614f65565b60405180910390fd5b5b80600f805490501115611e0657600f805480611d7457611d73614f85565b5b6001900381819060005260206000209060020201600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff0219169055600182016000905550509055611d55565b7f992e817214d6c9aa9d52b4faf1913b1d1321ce1a6ff98258e88a5d78e71a018381604051611e3591906139b5565b60405180910390a150565b60008060008060075442611e54919061476e565b9050600c8054905086108015611ea0575080600c8781548110611e7a57611e796147e7565b5b90600052602060002001600001601c9054906101000a900463ffffffff1663ffffffff16105b15611f425785935060018585611eb69190614816565b611ec0919061476e565b9250600c805490508310611ee3576001600c80549050611ee0919061476e565b92505b5b80600c8481548110611ef957611ef86147e7565b5b90600052602060002001600001601c9054906101000a900463ffffffff1663ffffffff1610611f35578280611f2d90614fb4565b935050611ee4565b611f3f8484611b01565b91505b509250925092565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb906144cd565b60405180910390fd5b6064831061201157600080fd5b68056bc75e2d63100000821061202657600080fd5b683635c9adc5dea00000811061203b57600080fd5b7f0bc992b511038194430d3b93b01ed9d312562944591645c91130b33b0d920d1360095484600a5485600b548660405161207a96959493929190614fdd565b60405180910390a18260098190555081600a8190555080600b81905550505050565b600660009054906101000a900460ff1681565b60056020528060005260406000206000915054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461215d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612154906144cd565b60405180910390fd5b60005b8383905081101561219f5761218e848483818110612181576121806147e7565b5b90506020020135836137df565b806121989061484a565b9050612160565b50505050565b6402540be40081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461223e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612235906150b0565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612447575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061249f5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806124f75750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252d9061511c565b60405180910390fd5b61254060016138e7565b565b6000600f80549050905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f8906144cd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff18effac70e61c427eeb822dabc8c030ad0d6178e38899b5436e10f9b599028f60405160405180910390a380600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6126c961393b565b82816000018181525050600183836126e1919061476e565b6126eb9190614816565b67ffffffffffffffff8111156127045761270361513c565b5b60405190808252806020026020018201604052801561273d57816020015b61272a613955565b8152602001906001900390816127225790505b50816020018190525060008390505b82811161286857600c8181548110612767576127666147e7565b5b906000526020600020016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900463ffffffff1663ffffffff1663ffffffff16815250508260200151858361283b919061476e565b8151811061284c5761284b6147e7565b5b6020026020010181905250806128619061484a565b905061274c565b5092915050565b600c818154811061287f57600080fd5b906000526020600020016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900467ffffffffffffffff169080600001601c9054906101000a900463ffffffff16905083565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296e906144cd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd64fbe94bc529b7e39db059497f4956a94c5ade6b2df42325818876b1c013bcd60405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600084612a445787612a66565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d505accf3330848a8989896040518863ffffffff1660e01b8152600401612acd979695949392919061517a565b600060405180830381600087803b158015612ae757600080fd5b505af1158015612afb573d6000803e3d6000fd5b50505050612b0981886109d6565b5050505050505050565b600f8181548110612b2357600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900467ffffffffffffffff16908060000160089054906101000a900467ffffffffffffffff16908060000160109054906101000a900467ffffffffffffffff16908060000160189054906101000a900467ffffffffffffffff16908060010154905085565b600e5481565b6000606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c38906144cd565b60405180910390fd5b6000848490501480612c6a575060008673ffffffffffffffffffffffffffffffffffffffff163b115b612ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca090615235565b60405180910390fd5b6000808773ffffffffffffffffffffffffffffffffffffffff16878787604051612cd4929190615294565b60006040518083038185875af1925050503d8060008114612d11576040519150601f19603f3d011682016040523d82523d6000602084013e612d16565b606091505b5091509150818193509350505094509492505050565b600b5481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db7906144cd565b60405180910390fd5b610e108210158015612dd45750610e108110155b612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a906152f9565b60405180910390fd5b7f7e8d6c37faafc79578015f383c6a5d31a846c93210a9d639e01843943e9fd5f86007546008548484604051612e4c94939291906147a2565b60405180910390a181600781905550806008819055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600c80549050905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1c906144cd565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f017149285d09d144b60699c89d370abbf31f058fc660d50c3881391f93af1bd781600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16604051613046929190615319565b60405180910390a150565b60046020528060005260406000206000915054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d6020528060005260406000206000915054906101000a900460ff1681565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061315a575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806131b25750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061320a5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b613249576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132409061511c565b60405180910390fd5b80600f838154811061325e5761325d6147e7565b5b906000526020600020906002020160010154146132b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a790614d38565b60405180910390fd5b81600e5411156132f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ec90614f65565b60405180910390fd5b6000600f838154811061330b5761330a6147e7565b5b906000526020600020906002020160000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff161461337b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133729061538e565b60405180910390fd5b6001600f8381548110613391576133906147e7565b5b906000526020600020906002020160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506133d260016138e7565b7f2292bdbb5281fd856c02c8a97b23b28fd9c47e895224d5262ef02c9647c1ebc082826040516134039291906153ae565b60405180910390a15050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146134c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ba906144cd565b60405180910390fd5b6134cd60006138e7565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b6134fd81336109d6565b50565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b85856040516024016135359291906153d7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161359f9190615431565b6000604051808303816000865af19150503d80600081146135dc576040519150601f19603f3d011682016040523d82523d6000602084013e6135e1565b606091505b509150915081801561360f575060008151148061360e57508080602001905181019061360d919061545d565b5b5b61364e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613645906154d6565b60405180910390fd5b5050505050565b60008183116136645781613666565b825b905092915050565b600081831061367d578161367f565b825b905092915050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b8686866040516024016136be939291906154f6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516137289190615431565b6000604051808303816000865af19150503d8060008114613765576040519150601f19603f3d011682016040523d82523d6000602084013e61376a565b606091505b50915091508180156137985750600081511480613797575080806020019051810190613796919061545d565b5b5b6137d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137ce90615579565b60405180910390fd5b505050505050565b6000600e5414806138405750600f6001600e546137fc919061476e565b8154811061380d5761380c6147e7565b5b906000526020600020906002020160000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1682115b61387f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613876906155e5565b60405180910390fd5b80600d600084815260200190815260200160002060006101000a81548160ff0219169083151502179055507fdf11c22eefc5804dfbf9c567c2522c17e93416278a0f8a6f8e8f327ee6cb032e82826040516138db929190615605565b60405180910390a15050565b80600660006101000a81548160ff0219169083151502179055507f9422424b175dda897495a07b091ef74a3ef715cf6d866fc972954c1c7f459304816040516139309190613e93565b60405180910390a150565b604051806040016040528060008152602001606081525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff1681525090565b6000819050919050565b6139af8161399c565b82525050565b60006020820190506139ca60008301846139a6565b92915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a05826139da565b9050919050565b613a15816139fa565b8114613a2057600080fd5b50565b600081359050613a3281613a0c565b92915050565b613a418161399c565b8114613a4c57600080fd5b50565b600081359050613a5e81613a38565b92915050565b60008060408385031215613a7b57613a7a6139d0565b5b6000613a8985828601613a23565b9250506020613a9a85828601613a4f565b9150509250929050565b60008060408385031215613abb57613aba6139d0565b5b6000613ac985828601613a4f565b9250506020613ada85828601613a23565b9150509250929050565b60008115159050919050565b613af981613ae4565b8114613b0457600080fd5b50565b600081359050613b1681613af0565b92915050565b60008060408385031215613b3357613b326139d0565b5b6000613b4185828601613a23565b9250506020613b5285828601613b07565b9150509250929050565b60008060408385031215613b7357613b726139d0565b5b6000613b8185828601613a4f565b9250506020613b9285828601613b07565b9150509250929050565b600060208284031215613bb257613bb16139d0565b5b6000613bc084828501613a23565b91505092915050565b60008060408385031215613be057613bdf6139d0565b5b6000613bee85828601613a4f565b9250506020613bff85828601613a4f565b9150509250929050565b6000819050919050565b6000613c2e613c29613c24846139da565b613c09565b6139da565b9050919050565b6000613c4082613c13565b9050919050565b6000613c5282613c35565b9050919050565b613c6281613c47565b82525050565b6000602082019050613c7d6000830184613c59565b92915050565b600080fd5b600060408284031215613c9e57613c9d613c83565b5b81905092915050565b600060208284031215613cbd57613cbc6139d0565b5b600082013567ffffffffffffffff811115613cdb57613cda6139d5565b5b613ce784828501613c88565b91505092915050565b6000819050919050565b613d0381613cf0565b8114613d0e57600080fd5b50565b600081359050613d2081613cfa565b92915050565b600080600060608486031215613d3f57613d3e6139d0565b5b6000613d4d86828701613a4f565b9350506020613d5e86828701613a4f565b9250506040613d6f86828701613d11565b9150509250925092565b613d8281613cf0565b82525050565b6000602082019050613d9d6000830184613d79565b92915050565b600060208284031215613db957613db86139d0565b5b6000613dc784828501613a4f565b91505092915050565b6000606082019050613de560008301866139a6565b613df260208301856139a6565b613dff6040830184613d79565b949350505050565b613e10816139fa565b82525050565b6000602082019050613e2b6000830184613e07565b92915050565b600080600060608486031215613e4a57613e496139d0565b5b6000613e5886828701613a4f565b9350506020613e6986828701613a4f565b9250506040613e7a86828701613a4f565b9150509250925092565b613e8d81613ae4565b82525050565b6000602082019050613ea86000830184613e84565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613ed357613ed2613eae565b5b8235905067ffffffffffffffff811115613ef057613eef613eb3565b5b602083019150836020820283011115613f0c57613f0b613eb8565b5b9250929050565b600080600060408486031215613f2c57613f2b6139d0565b5b600084013567ffffffffffffffff811115613f4a57613f496139d5565b5b613f5686828701613ebd565b93509350506020613f6986828701613b07565b9150509250925092565b613f7c8161399c565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613fb7816139fa565b82525050565b600067ffffffffffffffff82169050919050565b613fda81613fbd565b82525050565b600063ffffffff82169050919050565b613ff981613fe0565b82525050565b6060820160008201516140156000850182613fae565b5060208201516140286020850182613fd1565b50604082015161403b6040850182613ff0565b50505050565b600061404d8383613fff565b60608301905092915050565b6000602082019050919050565b600061407182613f82565b61407b8185613f8d565b935061408683613f9e565b8060005b838110156140b757815161409e8882614041565b97506140a983614059565b92505060018101905061408a565b5085935050505092915050565b60006040830160008301516140dc6000860182613f73565b50602083015184820360208601526140f48282614066565b9150508091505092915050565b6000602082019050818103600083015261411b81846140c4565b905092915050565b61412c81613fbd565b82525050565b61413b81613fe0565b82525050565b60006060820190506141566000830186613e07565b6141636020830185614123565b6141706040830184614132565b949350505050565b600060ff82169050919050565b61418e81614178565b811461419957600080fd5b50565b6000813590506141ab81614185565b92915050565b600080600080600080600060e0888a0312156141d0576141cf6139d0565b5b60006141de8a828b01613a4f565b97505060206141ef8a828b01613a23565b96505060406142008a828b01613a4f565b95505060606142118a828b01613b07565b94505060806142228a828b0161419c565b93505060a06142338a828b01613d11565b92505060c06142448a828b01613d11565b91505092959891949750929550565b600060a0820190506142686000830188614123565b6142756020830187614123565b6142826040830186614123565b61428f6060830185614123565b61429c6080830184613d79565b9695505050505050565b60008083601f8401126142bc576142bb613eae565b5b8235905067ffffffffffffffff8111156142d9576142d8613eb3565b5b6020830191508360018202830111156142f5576142f4613eb8565b5b9250929050565b60008060008060608587031215614316576143156139d0565b5b600061432487828801613a23565b945050602061433587828801613a4f565b935050604085013567ffffffffffffffff811115614356576143556139d5565b5b614362878288016142a6565b925092505092959194509250565b600081519050919050565b600082825260208201905092915050565b60005b838110156143aa57808201518184015260208101905061438f565b60008484015250505050565b6000601f19601f8301169050919050565b60006143d282614370565b6143dc818561437b565b93506143ec81856020860161438c565b6143f5816143b6565b840191505092915050565b60006040820190506144156000830185613e84565b818103602083015261442781846143c7565b90509392505050565b60008060408385031215614447576144466139d0565b5b600061445585828601613a4f565b925050602061446685828601613d11565b9150509250929050565b600082825260208201905092915050565b7f4e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b60006144b7600983614470565b91506144c282614481565b602082019050919050565b600060208201905081810360008301526144e6816144aa565b9050919050565b7f5a65726f2061646472657373206e6f7420616c6c6f7765640000000000000000600082015250565b6000614523601883614470565b915061452e826144ed565b602082019050919050565b6000602082019050818103600083015261455281614516565b9050919050565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b600061458f600683614470565b915061459a82614559565b602082019050919050565b600060208201905081810360008301526145be81614582565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061462e8261399c565b91506146398361399c565b925082614649576146486145c5565b5b828204905092915050565b600061465f8261399c565b915061466a8361399c565b92508282026146788161399c565b9150828204841483151761468f5761468e6145f4565b5b5092915050565b7f416d6f756e7420746f6f206c6f77000000000000000000000000000000000000600082015250565b60006146cc600e83614470565b91506146d782614696565b602082019050919050565b600060208201905081810360008301526146fb816146bf565b9050919050565b7f416d6f756e7420746f6f20686967680000000000000000000000000000000000600082015250565b6000614738600f83614470565b915061474382614702565b602082019050919050565b600060208201905081810360008301526147678161472b565b9050919050565b60006147798261399c565b91506147848361399c565b925082820390508181111561479c5761479b6145f4565b5b92915050565b60006080820190506147b760008301876139a6565b6147c460208301866139a6565b6147d160408301856139a6565b6147de60608301846139a6565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006148218261399c565b915061482c8361399c565b9250828201905080821115614844576148436145f4565b5b92915050565b60006148558261399c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614887576148866145f4565b5b600182019050919050565b7f4e6f74206669727374206f666669636572000000000000000000000000000000600082015250565b60006148c8601183614470565b91506148d382614892565b602082019050919050565b600060208201905081810360008301526148f7816148bb565b9050919050565b7f4261746368206469737075746564000000000000000000000000000000000000600082015250565b6000614934600e83614470565b915061493f826148fe565b602082019050919050565b6000602082019050818103600083015261496381614927565b9050919050565b7f57726f6e67207374617274000000000000000000000000000000000000000000600082015250565b60006149a0600b83614470565b91506149ab8261496a565b602082019050919050565b600060208201905081810360008301526149cf81614993565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112614a0257614a016149d6565b5b80840192508235915067ffffffffffffffff821115614a2457614a236149db565b5b602083019250606082023603831315614a4057614a3f6149e0565b5b509250929050565b7f57726f6e672073697a6500000000000000000000000000000000000000000000600082015250565b6000614a7e600a83614470565b9150614a8982614a48565b602082019050919050565b60006020820190508181036000830152614aad81614a71565b9050919050565b7f546f6f20736f6f6e000000000000000000000000000000000000000000000000600082015250565b6000614aea600883614470565b9150614af582614ab4565b602082019050919050565b60006020820190508181036000830152614b1981614add565b9050919050565b6000819050919050565b614b3b614b368261399c565b614b20565b82525050565b60008160601b9050919050565b6000614b5982614b41565b9050919050565b6000614b6b82614b4e565b9050919050565b614b83614b7e82613c47565b614b60565b82525050565b60008160c01b9050919050565b6000614ba182614b89565b9050919050565b614bb9614bb482613fbd565b614b96565b82525050565b6000614bcb8288614b2a565b602082019150614bdb8287614b72565b601482019150614beb8286614b2a565b602082019150614bfb8285614b72565b601482019150614c0b8284614ba8565b6008820191508190509695505050505050565b614c2781613fbd565b8114614c3257600080fd5b50565b600081359050614c4481614c1e565b92915050565b600060208284031215614c6057614c5f6139d0565b5b6000614c6e84828501614c35565b91505092915050565b6000819050919050565b614c92614c8d82613cf0565b614c77565b82525050565b614ca9614ca4826139fa565b614b60565b82525050565b6000614cbb8286614c81565b602082019150614ccb8285614c98565b601482019150614cdb8284614ba8565b600882019150819050949350505050565b7f57726f6e67206861736800000000000000000000000000000000000000000000600082015250565b6000614d22600a83614470565b9150614d2d82614cec565b602082019050919050565b60006020820190508181036000830152614d5181614d15565b9050919050565b6000614d73614d6e614d6984613fbd565b613c09565b61399c565b9050919050565b614d8381614d58565b82525050565b6000606082019050614d9e6000830186614d7a565b614dab6020830185614d7a565b614db86040830184613d79565b949350505050565b7f4e6f74206361707461696e000000000000000000000000000000000000000000600082015250565b6000614df6600b83614470565b9150614e0182614dc0565b602082019050919050565b60006020820190508181036000830152614e2581614de9565b9050919050565b6000614e3782613fbd565b9150614e4283613fbd565b9250828201905067ffffffffffffffff811115614e6257614e616145f4565b5b92915050565b7f57726f6e6720656e640000000000000000000000000000000000000000000000600082015250565b6000614e9e600983614470565b9150614ea982614e68565b602082019050919050565b60006020820190508181036000830152614ecd81614e91565b9050919050565b6000608082019050614ee960008301876139a6565b614ef660208301866139a6565b614f0360408301856139a6565b614f106060830184613d79565b95945050505050565b7f426174636820616c726561647920657865637574656400000000000000000000600082015250565b6000614f4f601683614470565b9150614f5a82614f19565b602082019050919050565b60006020820190508181036000830152614f7e81614f42565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000614fbf8261399c565b915060008203614fd257614fd16145f4565b5b600182039050919050565b600060c082019050614ff260008301896139a6565b614fff60208301886139a6565b61500c60408301876139a6565b61501960608301866139a6565b61502660808301856139a6565b61503360a08301846139a6565b979650505050505050565b7f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560008201527f2063616e20616363657074206f776e6572736869700000000000000000000000602082015250565b600061509a603583614470565b91506150a58261503e565b604082019050919050565b600060208201905081810360008301526150c98161508d565b9050919050565b7f4e6f7420637265776d656d626572000000000000000000000000000000000000600082015250565b6000615106600e83614470565b9150615111826150d0565b602082019050919050565b60006020820190508181036000830152615135816150f9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61517481614178565b82525050565b600060e08201905061518f600083018a613e07565b61519c6020830189613e07565b6151a960408301886139a6565b6151b660608301876139a6565b6151c3608083018661516b565b6151d060a0830185613d79565b6151dd60c0830184613d79565b98975050505050505050565b7f43616e206e6f742063616c6c20612066756e6374696f6e206f6e206120454f41600082015250565b600061521f602083614470565b915061522a826151e9565b602082019050919050565b6000602082019050818103600083015261524e81615212565b9050919050565b600081905092915050565b82818337600083830152505050565b600061527b8385615255565b9350615288838584615260565b82840190509392505050565b60006152a182848661526f565b91508190509392505050565b7f506572696f6420746f6f2073686f727400000000000000000000000000000000600082015250565b60006152e3601083614470565b91506152ee826152ad565b602082019050919050565b60006020820190508181036000830152615312816152d6565b9050919050565b600060408201905061532e6000830185613e07565b61533b6020830184613e84565b9392505050565b7f426174636820616c726561647920646973707574656400000000000000000000600082015250565b6000615378601683614470565b915061538382615342565b602082019050919050565b600060208201905081810360008301526153a78161536b565b9050919050565b60006040820190506153c360008301856139a6565b6153d06020830184613d79565b9392505050565b60006040820190506153ec6000830185613e07565b6153f960208301846139a6565b9392505050565b600061540b82614370565b6154158185615255565b935061542581856020860161438c565b80840191505092915050565b600061543d8284615400565b915081905092915050565b60008151905061545781613af0565b92915050565b600060208284031215615473576154726139d0565b5b600061548184828501615448565b91505092915050565b7f5354000000000000000000000000000000000000000000000000000000000000600082015250565b60006154c0600283614470565b91506154cb8261548a565b602082019050919050565b600060208201905081810360008301526154ef816154b3565b9050919050565b600060608201905061550b6000830186613e07565b6155186020830185613e07565b61552560408301846139a6565b949350505050565b7f5354460000000000000000000000000000000000000000000000000000000000600082015250565b6000615563600383614470565b915061556e8261552d565b602082019050919050565b6000602082019050818103600083015261559281615556565b9050919050565b7f5472616e73616374696f6e20616c726561647920657865637574656400000000600082015250565b60006155cf601c83614470565b91506155da82615599565b602082019050919050565b600060208201905081810360008301526155fe816155c2565b9050919050565b600060408201905061561a60008301856139a6565b6156276020830184613e84565b939250505056000000000000000000000000fc0000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000a00c37011018b4b11cffbbf0305a771d9d4066cf00000000000000000000000000000000000000000000000000000000000003e8", + "nonce": "0xc5", + "chainId": "0xfc" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xba093ba3dc2676c847d92a9d5107ec2324513204dc3a45306abd530ae14d3b16", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xa5677a5bf6e8759d3c904d2da85d1318e398cf3a", + "function": "nominateNewOwner(address)", + "arguments": [ + "0xb0E1650A9760e0f383174af042091fc544b8356f" + ], + "transaction": { + "from": "0xb0e1650a9760e0f383174af042091fc544b8356f", + "to": "0xa5677a5bf6e8759d3c904d2da85d1318e398cf3a", + "gas": "0x10f95", + "value": "0x0", + "input": "0x1627540c000000000000000000000000b0e1650a9760e0f383174af042091fc544b8356f", + "nonce": "0xc6", + "chainId": "0xfc" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x4c0992", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xad6f2c1ed9c1f42f7c59d857465c7283317b25b95fbb66cce258ab9939ed2493", + "transactionIndex": "0x1", + "blockHash": "0x05381cb0a45bb58ead1754d05f0cde065833b9eddba515ec4299468c41f68ca9", + "blockNumber": "0x7363f5", + "gasUsed": "0x4b55c1", + "effectiveGasPrice": "0xfe", + "from": "0xb0e1650a9760e0f383174af042091fc544b8356f", + "to": null, + "contractAddress": "0xa5677a5bf6e8759d3c904d2da85d1318e398cf3a", + "l1Fee": "0x53ae0233ac31", + "l1GasPrice": "0x149b952e6", + "l1GasUsed": "0x51364" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4cc345", + "logs": [ + { + "address": "0xa5677a5bf6e8759d3c904d2da85d1318e398cf3a", + "topics": [ + "0x906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce22", + "0x000000000000000000000000b0e1650a9760e0f383174af042091fc544b8356f" + ], + "data": "0x", + "blockHash": "0x05381cb0a45bb58ead1754d05f0cde065833b9eddba515ec4299468c41f68ca9", + "blockNumber": "0x7363f5", + "transactionHash": "0xba093ba3dc2676c847d92a9d5107ec2324513204dc3a45306abd530ae14d3b16", + "transactionIndex": "0x2", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000002000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000080800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000080000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xba093ba3dc2676c847d92a9d5107ec2324513204dc3a45306abd530ae14d3b16", + "transactionIndex": "0x2", + "blockHash": "0x05381cb0a45bb58ead1754d05f0cde065833b9eddba515ec4299468c41f68ca9", + "blockNumber": "0x7363f5", + "gasUsed": "0xb9b3", + "effectiveGasPrice": "0xfe", + "from": "0xb0e1650a9760e0f383174af042091fc544b8356f", + "to": "0xa5677a5bf6e8759d3c904d2da85d1318e398cf3a", + "contractAddress": null, + "l1Fee": "0x890aa00dfe", + "l1GasPrice": "0x149b952e6", + "l1GasUsed": "0x850" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1721935198, + "chain": 252, + "commit": "72e2579" +} \ No newline at end of file diff --git a/broadcast/DeployTronFerriesOnFraxtal.sol/252/run-latest.json b/broadcast/DeployTronFerriesOnFraxtal.sol/252/run-latest.json new file mode 100644 index 0000000..ab69328 --- /dev/null +++ b/broadcast/DeployTronFerriesOnFraxtal.sol/252/run-latest.json @@ -0,0 +1,104 @@ +{ + "transactions": [ + { + "hash": "0xad6f2c1ed9c1f42f7c59d857465c7283317b25b95fbb66cce258ab9939ed2493", + "transactionType": "CREATE", + "contractName": null, + "contractAddress": "0xa5677a5bf6e8759d3c904d2da85d1318e398cf3a", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb0e1650a9760e0f383174af042091fc544b8356f", + "gas": "0x61e835", + "value": "0x0", + "input": "0x610100604052610e1060075562013560600855600a600955674563918244f40000600a5568056bc75e2d63100000600b553480156200003d57600080fd5b50604051620058f8380380620058f88339818101604052810190620000639190620001ca565b8260c081815250508373ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060e08181525050505050506200023c565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000157826200012a565b9050919050565b62000169816200014a565b81146200017557600080fd5b50565b60008151905062000189816200015e565b92915050565b6000819050919050565b620001a4816200018f565b8114620001b057600080fd5b50565b600081519050620001c48162000199565b92915050565b60008060008060808587031215620001e757620001e662000125565b5b6000620001f78782880162000178565b94505060206200020a87828801620001b3565b93505060406200021d8782880162000178565b92505060606200023087828801620001b3565b91505092959194509250565b60805160a05160c05160e05161562e620002ca6000396000818161146401528181611b4801526123820152600081816114a601528181611b060152612e680152600081816110b6015281816114850152611b690152600081816109ac01528181610b79015281816114c70152818161157601528181611b2701528181612a6a01526134d1015261562e6000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c80638456cb5911610167578063c2f6afe5116100ce578063e050be5711610087578063e050be57146107f6578063f40e349f14610826578063f55ebb8f14610842578063f7b188a514610860578063fc0c546a1461086a578063fd433ec014610888576102a0565b8063c2f6afe514610734578063cd84980e14610750578063cdbdfdc21461076e578063d2c1626c1461078c578063d9fb265d146107a8578063de7974a4146107d8576102a0565b80639b8c624a116101205780639b8c624a1461065b578063a3a6d9e814610677578063b32c4d8d14610693578063b61325cd146106c7578063b61d27f6146106e5578063c2624e1e14610716576102a0565b80638456cb59146105975780638b928bd3146105a15780638da5cb5b146105bf5780638e714a72146105dd578063907c6c2e146105f95780639ace38c214610629576102a0565b80633beaf5261161020b5780635c975abb116101c45780635c975abb146104e75780635f62fa6f14610505578063652dfc3b1461053557806366e64f971461055157806379ba50971461056f5780638304e6d214610579576102a0565b80633beaf526146104115780634a474aa314610441578063525862f91461045d57806353a47bb71461048f57806359c13403146104ad5780635b65b9ab146104cb576102a0565b8063165282c31161025d578063165282c31461034f5780632d11c58a1461037f578063327107f71461039d57806333032dd0146103bb57806333efa2b2146103d957806336f734c1146103f5576102a0565b8063024faa8c146102a557806305ab421d146102c357806305c211d2146102df57806307cca166146102fb578063081c4624146103175780631627540c14610333575b600080fd5b6102ad6108a4565b6040516102ba91906139b5565b60405180910390f35b6102dd60048036038101906102d89190613a64565b6108aa565b005b6102f960048036038101906102f49190613aa4565b6109d6565b005b61031560048036038101906103109190613b1c565b610d40565b005b610331600480360381019061032c9190613b5c565b610e77565b005b61034d60048036038101906103489190613b9c565b610f13565b005b61036960048036038101906103649190613bc9565b611028565b60405161037691906139b5565b60405180910390f35b6103876110ae565b60405161039491906139b5565b60405180910390f35b6103a56110b4565b6040516103b29190613c68565b60405180910390f35b6103c36110d8565b6040516103d091906139b5565b60405180910390f35b6103f360048036038101906103ee9190613ca7565b6110de565b005b61040f600480360381019061040a9190613d26565b611764565b005b61042b60048036038101906104269190613bc9565b611b01565b6040516104389190613d88565b60405180910390f35b61045b60048036038101906104569190613da3565b611c81565b005b61047760048036038101906104729190613bc9565b611e40565b60405161048693929190613dd0565b60405180910390f35b610497611f4a565b6040516104a49190613e16565b60405180910390f35b6104b5611f70565b6040516104c291906139b5565b60405180910390f35b6104e560048036038101906104e09190613e31565b611f76565b005b6104ef61209c565b6040516104fc9190613e93565b60405180910390f35b61051f600480360381019061051a9190613b9c565b6120af565b60405161052c9190613e93565b60405180910390f35b61054f600480360381019061054a9190613f13565b6120cf565b005b6105596121a5565b60405161056691906139b5565b60405180910390f35b6105776121ae565b005b610581612380565b60405161058e91906139b5565b60405180910390f35b61059f6123a4565b005b6105a9612542565b6040516105b691906139b5565b60405180910390f35b6105c761254f565b6040516105d49190613e16565b60405180910390f35b6105f760048036038101906105f29190613b9c565b612573565b005b610613600480360381019061060e9190613bc9565b6126c1565b6040516106209190614101565b60405180910390f35b610643600480360381019061063e9190613da3565b61286f565b60405161065293929190614141565b60405180910390f35b61067560048036038101906106709190613b9c565b6128e9565b005b610691600480360381019061068c91906141b1565b612a37565b005b6106ad60048036038101906106a89190613da3565b612b13565b6040516106be959493929190614253565b60405180910390f35b6106cf612ba9565b6040516106dc91906139b5565b60405180910390f35b6106ff60048036038101906106fa91906142fc565b612baf565b60405161070d929190614400565b60405180910390f35b61071e612d2c565b60405161072b91906139b5565b60405180910390f35b61074e60048036038101906107499190613bc9565b612d32565b005b610758612e66565b60405161076591906139b5565b60405180910390f35b610776612e8a565b60405161078391906139b5565b60405180910390f35b6107a660048036038101906107a19190613b9c565b612e97565b005b6107c260048036038101906107bd9190613b9c565b613051565b6040516107cf9190613e93565b60405180910390f35b6107e0613071565b6040516107ed9190613e16565b60405180910390f35b610810600480360381019061080b9190613da3565b613097565b60405161081d9190613e93565b60405180910390f35b610840600480360381019061083b9190614430565b6130b7565b005b61084a61340f565b6040516108579190613e16565b60405180910390f35b610868613435565b005b6108726134cf565b60405161087f9190613c68565b60405180910390f35b6108a2600480360381019061089d9190613da3565b6134f3565b005b60085481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092f906144cd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099e90614539565b60405180910390fd5b6109d27f00000000000000000000000000000000000000000000000000000000000000008383613500565b5050565b600660009054906101000a900460ff1615610a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1d906145a5565b60405180910390fd5b6402540be4008083610a389190614623565b610a429190614654565b91506000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610aa15760009050610ad5565b610ad2610aca600a5461271060095487610abb9190614654565b610ac59190614623565b613655565b600b5461366e565b90505b808311610b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0e906146e2565b60405180910390fd5b67ffffffffffffffff80166402540be40084610b339190614623565b1115610b74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6b9061474e565b60405180910390fd5b610ba07f0000000000000000000000000000000000000000000000000000000000000000333086613687565b60006402540be4008285610bb4919061476e565b610bbe9190614623565b90508273ffffffffffffffffffffffffffffffffffffffff167f0250c838bae2cda1e214f0925d41846180714450539039d6fd90a4121d98738e600c80549050866402540be4008567ffffffffffffffff16610c1a9190614654565b42604051610c2b94939291906147a2565b60405180910390a2600c60405180606001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020018367ffffffffffffffff1681526020014263ffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550604082015181600001601c6101000a81548163ffffffff021916908363ffffffff160217905550505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc5906144cd565b60405180910390fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f6a5f1fd939b33c2480886a44e0780806ce19041ef2c91734cb752c54288ca5ac82604051610e6b9190613e93565b60405180910390a25050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efc906144cd565b60405180910390fd5b610f0f82826137df565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f98906144cd565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2260405160405180910390a250565b6000808390505b82811161109457600c818154811061104a576110496147e7565b5b9060005260206000200160000160149054906101000a900467ffffffffffffffff1667ffffffffffffffff16826110819190614816565b91508061108d9061484a565b905061102f565b506402540be400816110a69190614654565b905092915050565b60095481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60075481565b600660009054906101000a900460ff161561112e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611125906145a5565b60405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b5906148de565b60405180910390fd5b6000600f600e60008154809291906111d59061484a565b91905055815481106111ea576111e96147e7565b5b90600052602060002090600202016040518060a00160405290816000820160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160109054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681526020016000820160189054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160018201548152505090506000816060015167ffffffffffffffff1614611328576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131f9061494a565b60405180910390fd5b8160000135816000015167ffffffffffffffff161461137c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611373906149b6565b60405180910390fd5b806020015167ffffffffffffffff16600183806020019061139d91906149e5565b9050836000015167ffffffffffffffff166113b89190614816565b6113c2919061476e565b14611402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f990614a94565b60405180910390fd5b600854816040015167ffffffffffffffff164261141f919061476e565b1015611460576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145790614b00565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000085600001516040516020016114ff959493929190614bbf565b60405160208183030381529060405280519060200120905060005b83806020019061152a91906149e5565b90508110156116d557600d600082856000015167ffffffffffffffff166115519190614816565b815260200190815260200160002060009054906101000a900460ff16611627576116267f00000000000000000000000000000000000000000000000000000000000000008580602001906115a591906149e5565b848181106115b6576115b56147e7565b5b90506060020160000160208101906115ce9190613b9c565b6402540be4008780602001906115e491906149e5565b868181106115f5576115f46147e7565b5b905060600201602001602081019061160d9190614c4a565b67ffffffffffffffff166116219190614654565b613500565b5b8184806020019061163891906149e5565b83818110611649576116486147e7565b5b90506060020160000160208101906116619190613b9c565b85806020019061167191906149e5565b84818110611682576116816147e7565b5b905060600201602001602081019061169a9190614c4a565b6040516020016116ac93929190614caf565b604051602081830303815290604052805190602001209150806116ce9061484a565b905061151a565b508082608001511461171c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171390614d38565b60405180910390fd5b7fce67cdf2a5dbd123a7aa5e9fd21b2136e06d33eb30e024ee5c491a6ec934a48b826000015183602001518360405161175793929190614d89565b60405180910390a1505050565b600660009054906101000a900460ff16156117b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ab906145a5565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183b90614e0c565b60405180910390fd5b6000600f805490501480156118595750600083145b806118d457506000600f805490501180156118d357506001600f6001600f80549050611885919061476e565b81548110611896576118956147e7565b5b906000526020600020906002020160000160089054906101000a900467ffffffffffffffff166118c69190614e2c565b67ffffffffffffffff1683145b5b611913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190a906149b6565b60405180910390fd5b82821015801561192c575067ffffffffffffffff801682105b61196b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196290614eb4565b60405180910390fd5b600f6040518060a001604052808567ffffffffffffffff1681526020018467ffffffffffffffff1681526020014267ffffffffffffffff168152602001600067ffffffffffffffff16815260200183815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000160006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060208201518160000160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060408201518160000160106101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060608201518160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506080820151816001015550507fe078fb854f34cd8ca5f749fe2e680b692ef7df5e057026369a30c8965a3219ca6001600f80549050611ae1919061476e565b848484604051611af49493929190614ed4565b60405180910390a1505050565b6000807f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000087604051602001611b9d959493929190614bbf565b60405160208183030381529060405280519060200120905060008490505b838111611c765781600c8281548110611bd757611bd66147e7565b5b9060005260206000200160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c8381548110611c1957611c186147e7565b5b9060005260206000200160000160149054906101000a900467ffffffffffffffff16604051602001611c4d93929190614caf565b60405160208183030381529060405280519060200120915080611c6f9061484a565b9050611bbb565b508091505092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d06906144cd565b60405180910390fd5b80600e541115611d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4b90614f65565b60405180910390fd5b5b80600f805490501115611e0657600f805480611d7457611d73614f85565b5b6001900381819060005260206000209060020201600080820160006101000a81549067ffffffffffffffff02191690556000820160086101000a81549067ffffffffffffffff02191690556000820160106101000a81549067ffffffffffffffff02191690556000820160186101000a81549067ffffffffffffffff0219169055600182016000905550509055611d55565b7f992e817214d6c9aa9d52b4faf1913b1d1321ce1a6ff98258e88a5d78e71a018381604051611e3591906139b5565b60405180910390a150565b60008060008060075442611e54919061476e565b9050600c8054905086108015611ea0575080600c8781548110611e7a57611e796147e7565b5b90600052602060002001600001601c9054906101000a900463ffffffff1663ffffffff16105b15611f425785935060018585611eb69190614816565b611ec0919061476e565b9250600c805490508310611ee3576001600c80549050611ee0919061476e565b92505b5b80600c8481548110611ef957611ef86147e7565b5b90600052602060002001600001601c9054906101000a900463ffffffff1663ffffffff1610611f35578280611f2d90614fb4565b935050611ee4565b611f3f8484611b01565b91505b509250925092565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a5481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb906144cd565b60405180910390fd5b6064831061201157600080fd5b68056bc75e2d63100000821061202657600080fd5b683635c9adc5dea00000811061203b57600080fd5b7f0bc992b511038194430d3b93b01ed9d312562944591645c91130b33b0d920d1360095484600a5485600b548660405161207a96959493929190614fdd565b60405180910390a18260098190555081600a8190555080600b81905550505050565b600660009054906101000a900460ff1681565b60056020528060005260406000206000915054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461215d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612154906144cd565b60405180910390fd5b60005b8383905081101561219f5761218e848483818110612181576121806147e7565b5b90506020020135836137df565b806121989061484a565b9050612160565b50505050565b6402540be40081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461223e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612235906150b0565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612447575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061249f5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806124f75750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b612536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252d9061511c565b60405180910390fd5b61254060016138e7565b565b6000600f80549050905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125f8906144cd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff18effac70e61c427eeb822dabc8c030ad0d6178e38899b5436e10f9b599028f60405160405180910390a380600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6126c961393b565b82816000018181525050600183836126e1919061476e565b6126eb9190614816565b67ffffffffffffffff8111156127045761270361513c565b5b60405190808252806020026020018201604052801561273d57816020015b61272a613955565b8152602001906001900390816127225790505b50816020018190525060008390505b82811161286857600c8181548110612767576127666147e7565b5b906000526020600020016040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900463ffffffff1663ffffffff1663ffffffff16815250508260200151858361283b919061476e565b8151811061284c5761284b6147e7565b5b6020026020010181905250806128619061484a565b905061274c565b5092915050565b600c818154811061287f57600080fd5b906000526020600020016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900467ffffffffffffffff169080600001601c9054906101000a900463ffffffff16905083565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296e906144cd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fd64fbe94bc529b7e39db059497f4956a94c5ade6b2df42325818876b1c013bcd60405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600084612a445787612a66565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d505accf3330848a8989896040518863ffffffff1660e01b8152600401612acd979695949392919061517a565b600060405180830381600087803b158015612ae757600080fd5b505af1158015612afb573d6000803e3d6000fd5b50505050612b0981886109d6565b5050505050505050565b600f8181548110612b2357600080fd5b90600052602060002090600202016000915090508060000160009054906101000a900467ffffffffffffffff16908060000160089054906101000a900467ffffffffffffffff16908060000160109054906101000a900467ffffffffffffffff16908060000160189054906101000a900467ffffffffffffffff16908060010154905085565b600e5481565b6000606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c38906144cd565b60405180910390fd5b6000848490501480612c6a575060008673ffffffffffffffffffffffffffffffffffffffff163b115b612ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca090615235565b60405180910390fd5b6000808773ffffffffffffffffffffffffffffffffffffffff16878787604051612cd4929190615294565b60006040518083038185875af1925050503d8060008114612d11576040519150601f19603f3d011682016040523d82523d6000602084013e612d16565b606091505b5091509150818193509350505094509492505050565b600b5481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db7906144cd565b60405180910390fd5b610e108210158015612dd45750610e108110155b612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a906152f9565b60405180910390fd5b7f7e8d6c37faafc79578015f383c6a5d31a846c93210a9d639e01843943e9fd5f86007546008548484604051612e4c94939291906147a2565b60405180910390a181600781905550806008819055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600c80549050905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1c906144cd565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f017149285d09d144b60699c89d370abbf31f058fc660d50c3881391f93af1bd781600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16604051613046929190615319565b60405180910390a150565b60046020528060005260406000206000915054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d6020528060005260406000206000915054906101000a900460ff1681565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061315a575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806131b25750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b8061320a5750600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b613249576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132409061511c565b60405180910390fd5b80600f838154811061325e5761325d6147e7565b5b906000526020600020906002020160010154146132b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a790614d38565b60405180910390fd5b81600e5411156132f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ec90614f65565b60405180910390fd5b6000600f838154811061330b5761330a6147e7565b5b906000526020600020906002020160000160189054906101000a900467ffffffffffffffff1667ffffffffffffffff161461337b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133729061538e565b60405180910390fd5b6001600f8381548110613391576133906147e7565b5b906000526020600020906002020160000160186101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506133d260016138e7565b7f2292bdbb5281fd856c02c8a97b23b28fd9c47e895224d5262ef02c9647c1ebc082826040516134039291906153ae565b60405180910390a15050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146134c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ba906144cd565b60405180910390fd5b6134cd60006138e7565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b6134fd81336109d6565b50565b6000808473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b85856040516024016135359291906153d7565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161359f9190615431565b6000604051808303816000865af19150503d80600081146135dc576040519150601f19603f3d011682016040523d82523d6000602084013e6135e1565b606091505b509150915081801561360f575060008151148061360e57508080602001905181019061360d919061545d565b5b5b61364e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613645906154d6565b60405180910390fd5b5050505050565b60008183116136645781613666565b825b905092915050565b600081831061367d578161367f565b825b905092915050565b6000808573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b8686866040516024016136be939291906154f6565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516137289190615431565b6000604051808303816000865af19150503d8060008114613765576040519150601f19603f3d011682016040523d82523d6000602084013e61376a565b606091505b50915091508180156137985750600081511480613797575080806020019051810190613796919061545d565b5b5b6137d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137ce90615579565b60405180910390fd5b505050505050565b6000600e5414806138405750600f6001600e546137fc919061476e565b8154811061380d5761380c6147e7565b5b906000526020600020906002020160000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1682115b61387f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613876906155e5565b60405180910390fd5b80600d600084815260200190815260200160002060006101000a81548160ff0219169083151502179055507fdf11c22eefc5804dfbf9c567c2522c17e93416278a0f8a6f8e8f327ee6cb032e82826040516138db929190615605565b60405180910390a15050565b80600660006101000a81548160ff0219169083151502179055507f9422424b175dda897495a07b091ef74a3ef715cf6d866fc972954c1c7f459304816040516139309190613e93565b60405180910390a150565b604051806040016040528060008152602001606081525090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600063ffffffff1681525090565b6000819050919050565b6139af8161399c565b82525050565b60006020820190506139ca60008301846139a6565b92915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a05826139da565b9050919050565b613a15816139fa565b8114613a2057600080fd5b50565b600081359050613a3281613a0c565b92915050565b613a418161399c565b8114613a4c57600080fd5b50565b600081359050613a5e81613a38565b92915050565b60008060408385031215613a7b57613a7a6139d0565b5b6000613a8985828601613a23565b9250506020613a9a85828601613a4f565b9150509250929050565b60008060408385031215613abb57613aba6139d0565b5b6000613ac985828601613a4f565b9250506020613ada85828601613a23565b9150509250929050565b60008115159050919050565b613af981613ae4565b8114613b0457600080fd5b50565b600081359050613b1681613af0565b92915050565b60008060408385031215613b3357613b326139d0565b5b6000613b4185828601613a23565b9250506020613b5285828601613b07565b9150509250929050565b60008060408385031215613b7357613b726139d0565b5b6000613b8185828601613a4f565b9250506020613b9285828601613b07565b9150509250929050565b600060208284031215613bb257613bb16139d0565b5b6000613bc084828501613a23565b91505092915050565b60008060408385031215613be057613bdf6139d0565b5b6000613bee85828601613a4f565b9250506020613bff85828601613a4f565b9150509250929050565b6000819050919050565b6000613c2e613c29613c24846139da565b613c09565b6139da565b9050919050565b6000613c4082613c13565b9050919050565b6000613c5282613c35565b9050919050565b613c6281613c47565b82525050565b6000602082019050613c7d6000830184613c59565b92915050565b600080fd5b600060408284031215613c9e57613c9d613c83565b5b81905092915050565b600060208284031215613cbd57613cbc6139d0565b5b600082013567ffffffffffffffff811115613cdb57613cda6139d5565b5b613ce784828501613c88565b91505092915050565b6000819050919050565b613d0381613cf0565b8114613d0e57600080fd5b50565b600081359050613d2081613cfa565b92915050565b600080600060608486031215613d3f57613d3e6139d0565b5b6000613d4d86828701613a4f565b9350506020613d5e86828701613a4f565b9250506040613d6f86828701613d11565b9150509250925092565b613d8281613cf0565b82525050565b6000602082019050613d9d6000830184613d79565b92915050565b600060208284031215613db957613db86139d0565b5b6000613dc784828501613a4f565b91505092915050565b6000606082019050613de560008301866139a6565b613df260208301856139a6565b613dff6040830184613d79565b949350505050565b613e10816139fa565b82525050565b6000602082019050613e2b6000830184613e07565b92915050565b600080600060608486031215613e4a57613e496139d0565b5b6000613e5886828701613a4f565b9350506020613e6986828701613a4f565b9250506040613e7a86828701613a4f565b9150509250925092565b613e8d81613ae4565b82525050565b6000602082019050613ea86000830184613e84565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613ed357613ed2613eae565b5b8235905067ffffffffffffffff811115613ef057613eef613eb3565b5b602083019150836020820283011115613f0c57613f0b613eb8565b5b9250929050565b600080600060408486031215613f2c57613f2b6139d0565b5b600084013567ffffffffffffffff811115613f4a57613f496139d5565b5b613f5686828701613ebd565b93509350506020613f6986828701613b07565b9150509250925092565b613f7c8161399c565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613fb7816139fa565b82525050565b600067ffffffffffffffff82169050919050565b613fda81613fbd565b82525050565b600063ffffffff82169050919050565b613ff981613fe0565b82525050565b6060820160008201516140156000850182613fae565b5060208201516140286020850182613fd1565b50604082015161403b6040850182613ff0565b50505050565b600061404d8383613fff565b60608301905092915050565b6000602082019050919050565b600061407182613f82565b61407b8185613f8d565b935061408683613f9e565b8060005b838110156140b757815161409e8882614041565b97506140a983614059565b92505060018101905061408a565b5085935050505092915050565b60006040830160008301516140dc6000860182613f73565b50602083015184820360208601526140f48282614066565b9150508091505092915050565b6000602082019050818103600083015261411b81846140c4565b905092915050565b61412c81613fbd565b82525050565b61413b81613fe0565b82525050565b60006060820190506141566000830186613e07565b6141636020830185614123565b6141706040830184614132565b949350505050565b600060ff82169050919050565b61418e81614178565b811461419957600080fd5b50565b6000813590506141ab81614185565b92915050565b600080600080600080600060e0888a0312156141d0576141cf6139d0565b5b60006141de8a828b01613a4f565b97505060206141ef8a828b01613a23565b96505060406142008a828b01613a4f565b95505060606142118a828b01613b07565b94505060806142228a828b0161419c565b93505060a06142338a828b01613d11565b92505060c06142448a828b01613d11565b91505092959891949750929550565b600060a0820190506142686000830188614123565b6142756020830187614123565b6142826040830186614123565b61428f6060830185614123565b61429c6080830184613d79565b9695505050505050565b60008083601f8401126142bc576142bb613eae565b5b8235905067ffffffffffffffff8111156142d9576142d8613eb3565b5b6020830191508360018202830111156142f5576142f4613eb8565b5b9250929050565b60008060008060608587031215614316576143156139d0565b5b600061432487828801613a23565b945050602061433587828801613a4f565b935050604085013567ffffffffffffffff811115614356576143556139d5565b5b614362878288016142a6565b925092505092959194509250565b600081519050919050565b600082825260208201905092915050565b60005b838110156143aa57808201518184015260208101905061438f565b60008484015250505050565b6000601f19601f8301169050919050565b60006143d282614370565b6143dc818561437b565b93506143ec81856020860161438c565b6143f5816143b6565b840191505092915050565b60006040820190506144156000830185613e84565b818103602083015261442781846143c7565b90509392505050565b60008060408385031215614447576144466139d0565b5b600061445585828601613a4f565b925050602061446685828601613d11565b9150509250929050565b600082825260208201905092915050565b7f4e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b60006144b7600983614470565b91506144c282614481565b602082019050919050565b600060208201905081810360008301526144e6816144aa565b9050919050565b7f5a65726f2061646472657373206e6f7420616c6c6f7765640000000000000000600082015250565b6000614523601883614470565b915061452e826144ed565b602082019050919050565b6000602082019050818103600083015261455281614516565b9050919050565b7f5061757365640000000000000000000000000000000000000000000000000000600082015250565b600061458f600683614470565b915061459a82614559565b602082019050919050565b600060208201905081810360008301526145be81614582565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061462e8261399c565b91506146398361399c565b925082614649576146486145c5565b5b828204905092915050565b600061465f8261399c565b915061466a8361399c565b92508282026146788161399c565b9150828204841483151761468f5761468e6145f4565b5b5092915050565b7f416d6f756e7420746f6f206c6f77000000000000000000000000000000000000600082015250565b60006146cc600e83614470565b91506146d782614696565b602082019050919050565b600060208201905081810360008301526146fb816146bf565b9050919050565b7f416d6f756e7420746f6f20686967680000000000000000000000000000000000600082015250565b6000614738600f83614470565b915061474382614702565b602082019050919050565b600060208201905081810360008301526147678161472b565b9050919050565b60006147798261399c565b91506147848361399c565b925082820390508181111561479c5761479b6145f4565b5b92915050565b60006080820190506147b760008301876139a6565b6147c460208301866139a6565b6147d160408301856139a6565b6147de60608301846139a6565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006148218261399c565b915061482c8361399c565b9250828201905080821115614844576148436145f4565b5b92915050565b60006148558261399c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614887576148866145f4565b5b600182019050919050565b7f4e6f74206669727374206f666669636572000000000000000000000000000000600082015250565b60006148c8601183614470565b91506148d382614892565b602082019050919050565b600060208201905081810360008301526148f7816148bb565b9050919050565b7f4261746368206469737075746564000000000000000000000000000000000000600082015250565b6000614934600e83614470565b915061493f826148fe565b602082019050919050565b6000602082019050818103600083015261496381614927565b9050919050565b7f57726f6e67207374617274000000000000000000000000000000000000000000600082015250565b60006149a0600b83614470565b91506149ab8261496a565b602082019050919050565b600060208201905081810360008301526149cf81614993565b9050919050565b600080fd5b600080fd5b600080fd5b60008083356001602003843603038112614a0257614a016149d6565b5b80840192508235915067ffffffffffffffff821115614a2457614a236149db565b5b602083019250606082023603831315614a4057614a3f6149e0565b5b509250929050565b7f57726f6e672073697a6500000000000000000000000000000000000000000000600082015250565b6000614a7e600a83614470565b9150614a8982614a48565b602082019050919050565b60006020820190508181036000830152614aad81614a71565b9050919050565b7f546f6f20736f6f6e000000000000000000000000000000000000000000000000600082015250565b6000614aea600883614470565b9150614af582614ab4565b602082019050919050565b60006020820190508181036000830152614b1981614add565b9050919050565b6000819050919050565b614b3b614b368261399c565b614b20565b82525050565b60008160601b9050919050565b6000614b5982614b41565b9050919050565b6000614b6b82614b4e565b9050919050565b614b83614b7e82613c47565b614b60565b82525050565b60008160c01b9050919050565b6000614ba182614b89565b9050919050565b614bb9614bb482613fbd565b614b96565b82525050565b6000614bcb8288614b2a565b602082019150614bdb8287614b72565b601482019150614beb8286614b2a565b602082019150614bfb8285614b72565b601482019150614c0b8284614ba8565b6008820191508190509695505050505050565b614c2781613fbd565b8114614c3257600080fd5b50565b600081359050614c4481614c1e565b92915050565b600060208284031215614c6057614c5f6139d0565b5b6000614c6e84828501614c35565b91505092915050565b6000819050919050565b614c92614c8d82613cf0565b614c77565b82525050565b614ca9614ca4826139fa565b614b60565b82525050565b6000614cbb8286614c81565b602082019150614ccb8285614c98565b601482019150614cdb8284614ba8565b600882019150819050949350505050565b7f57726f6e67206861736800000000000000000000000000000000000000000000600082015250565b6000614d22600a83614470565b9150614d2d82614cec565b602082019050919050565b60006020820190508181036000830152614d5181614d15565b9050919050565b6000614d73614d6e614d6984613fbd565b613c09565b61399c565b9050919050565b614d8381614d58565b82525050565b6000606082019050614d9e6000830186614d7a565b614dab6020830185614d7a565b614db86040830184613d79565b949350505050565b7f4e6f74206361707461696e000000000000000000000000000000000000000000600082015250565b6000614df6600b83614470565b9150614e0182614dc0565b602082019050919050565b60006020820190508181036000830152614e2581614de9565b9050919050565b6000614e3782613fbd565b9150614e4283613fbd565b9250828201905067ffffffffffffffff811115614e6257614e616145f4565b5b92915050565b7f57726f6e6720656e640000000000000000000000000000000000000000000000600082015250565b6000614e9e600983614470565b9150614ea982614e68565b602082019050919050565b60006020820190508181036000830152614ecd81614e91565b9050919050565b6000608082019050614ee960008301876139a6565b614ef660208301866139a6565b614f0360408301856139a6565b614f106060830184613d79565b95945050505050565b7f426174636820616c726561647920657865637574656400000000000000000000600082015250565b6000614f4f601683614470565b9150614f5a82614f19565b602082019050919050565b60006020820190508181036000830152614f7e81614f42565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000614fbf8261399c565b915060008203614fd257614fd16145f4565b5b600182039050919050565b600060c082019050614ff260008301896139a6565b614fff60208301886139a6565b61500c60408301876139a6565b61501960608301866139a6565b61502660808301856139a6565b61503360a08301846139a6565b979650505050505050565b7f596f75206d757374206265206e6f6d696e61746564206265666f726520796f7560008201527f2063616e20616363657074206f776e6572736869700000000000000000000000602082015250565b600061509a603583614470565b91506150a58261503e565b604082019050919050565b600060208201905081810360008301526150c98161508d565b9050919050565b7f4e6f7420637265776d656d626572000000000000000000000000000000000000600082015250565b6000615106600e83614470565b9150615111826150d0565b602082019050919050565b60006020820190508181036000830152615135816150f9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61517481614178565b82525050565b600060e08201905061518f600083018a613e07565b61519c6020830189613e07565b6151a960408301886139a6565b6151b660608301876139a6565b6151c3608083018661516b565b6151d060a0830185613d79565b6151dd60c0830184613d79565b98975050505050505050565b7f43616e206e6f742063616c6c20612066756e6374696f6e206f6e206120454f41600082015250565b600061521f602083614470565b915061522a826151e9565b602082019050919050565b6000602082019050818103600083015261524e81615212565b9050919050565b600081905092915050565b82818337600083830152505050565b600061527b8385615255565b9350615288838584615260565b82840190509392505050565b60006152a182848661526f565b91508190509392505050565b7f506572696f6420746f6f2073686f727400000000000000000000000000000000600082015250565b60006152e3601083614470565b91506152ee826152ad565b602082019050919050565b60006020820190508181036000830152615312816152d6565b9050919050565b600060408201905061532e6000830185613e07565b61533b6020830184613e84565b9392505050565b7f426174636820616c726561647920646973707574656400000000000000000000600082015250565b6000615378601683614470565b915061538382615342565b602082019050919050565b600060208201905081810360008301526153a78161536b565b9050919050565b60006040820190506153c360008301856139a6565b6153d06020830184613d79565b9392505050565b60006040820190506153ec6000830185613e07565b6153f960208301846139a6565b9392505050565b600061540b82614370565b6154158185615255565b935061542581856020860161438c565b80840191505092915050565b600061543d8284615400565b915081905092915050565b60008151905061545781613af0565b92915050565b600060208284031215615473576154726139d0565b5b600061548184828501615448565b91505092915050565b7f5354000000000000000000000000000000000000000000000000000000000000600082015250565b60006154c0600283614470565b91506154cb8261548a565b602082019050919050565b600060208201905081810360008301526154ef816154b3565b9050919050565b600060608201905061550b6000830186613e07565b6155186020830185613e07565b61552560408301846139a6565b949350505050565b7f5354460000000000000000000000000000000000000000000000000000000000600082015250565b6000615563600383614470565b915061556e8261552d565b602082019050919050565b6000602082019050818103600083015261559281615556565b9050919050565b7f5472616e73616374696f6e20616c726561647920657865637574656400000000600082015250565b60006155cf601c83614470565b91506155da82615599565b602082019050919050565b600060208201905081810360008301526155fe816155c2565b9050919050565b600060408201905061561a60008301856139a6565b6156276020830184613e84565b939250505056000000000000000000000000fc0000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000fc000000000000000000000000a00c37011018b4b11cffbbf0305a771d9d4066cf00000000000000000000000000000000000000000000000000000000000003e8", + "nonce": "0xc5", + "chainId": "0xfc" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xba093ba3dc2676c847d92a9d5107ec2324513204dc3a45306abd530ae14d3b16", + "transactionType": "CALL", + "contractName": null, + "contractAddress": "0xa5677a5bf6e8759d3c904d2da85d1318e398cf3a", + "function": "nominateNewOwner(address)", + "arguments": [ + "0xb0E1650A9760e0f383174af042091fc544b8356f" + ], + "transaction": { + "from": "0xb0e1650a9760e0f383174af042091fc544b8356f", + "to": "0xa5677a5bf6e8759d3c904d2da85d1318e398cf3a", + "gas": "0x10f95", + "value": "0x0", + "input": "0x1627540c000000000000000000000000b0e1650a9760e0f383174af042091fc544b8356f", + "nonce": "0xc6", + "chainId": "0xfc" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x4c0992", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xad6f2c1ed9c1f42f7c59d857465c7283317b25b95fbb66cce258ab9939ed2493", + "transactionIndex": "0x1", + "blockHash": "0x05381cb0a45bb58ead1754d05f0cde065833b9eddba515ec4299468c41f68ca9", + "blockNumber": "0x7363f5", + "gasUsed": "0x4b55c1", + "effectiveGasPrice": "0xfe", + "from": "0xb0e1650a9760e0f383174af042091fc544b8356f", + "to": null, + "contractAddress": "0xa5677a5bf6e8759d3c904d2da85d1318e398cf3a", + "l1Fee": "0x53ae0233ac31", + "l1GasPrice": "0x149b952e6", + "l1GasUsed": "0x51364" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x4cc345", + "logs": [ + { + "address": "0xa5677a5bf6e8759d3c904d2da85d1318e398cf3a", + "topics": [ + "0x906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce22", + "0x000000000000000000000000b0e1650a9760e0f383174af042091fc544b8356f" + ], + "data": "0x", + "blockHash": "0x05381cb0a45bb58ead1754d05f0cde065833b9eddba515ec4299468c41f68ca9", + "blockNumber": "0x7363f5", + "transactionHash": "0xba093ba3dc2676c847d92a9d5107ec2324513204dc3a45306abd530ae14d3b16", + "transactionIndex": "0x2", + "logIndex": "0x0", + "removed": false + } + ], + "logsBloom": "0x00000000000000002000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000080800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000080000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xba093ba3dc2676c847d92a9d5107ec2324513204dc3a45306abd530ae14d3b16", + "transactionIndex": "0x2", + "blockHash": "0x05381cb0a45bb58ead1754d05f0cde065833b9eddba515ec4299468c41f68ca9", + "blockNumber": "0x7363f5", + "gasUsed": "0xb9b3", + "effectiveGasPrice": "0xfe", + "from": "0xb0e1650a9760e0f383174af042091fc544b8356f", + "to": "0xa5677a5bf6e8759d3c904d2da85d1318e398cf3a", + "contractAddress": null, + "l1Fee": "0x890aa00dfe", + "l1GasPrice": "0x149b952e6", + "l1GasUsed": "0x850" + } + ], + "libraries": [], + "pending": [], + "returns": {}, + "timestamp": 1721935198, + "chain": 252, + "commit": "72e2579" +} \ No newline at end of file diff --git a/package.json b/package.json index b24edbf..7cec978 100644 --- a/package.json +++ b/package.json @@ -31,10 +31,13 @@ "typescript": "^5.3.3" }, "dependencies": { + "@noble/secp256k1": "^2.1.0", + "@uniswap/v3-periphery": "^1.4.4", "ds-test": "github:dapphub/ds-test", "forge-std": "github:foundry-rs/forge-std#e8a047e3f40f13fa37af6fe14e6e06283d9a060e", "frax-standard-solidity": "github:FraxFinance/frax-standard-solidity", "fraxtal-contracts": "github:FraxFinance/fraxtal-contracts", - "solidity-bytes-utils": "github:GNSPS/solidity-bytes-utils" + "solidity-bytes-utils": "github:GNSPS/solidity-bytes-utils", + "tronweb": "^5.3.2" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 97d16ad..6e09c52 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,12 @@ settings: importers: .: dependencies: + "@noble/secp256k1": + specifier: ^2.1.0 + version: 2.1.0 + "@uniswap/v3-periphery": + specifier: ^1.4.4 + version: 1.4.4 ds-test: specifier: github:dapphub/ds-test version: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 @@ -15,13 +21,16 @@ importers: 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) + version: https://codeload.github.com/FraxFinance/frax-standard-solidity/tar.gz/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6(ethers@6.13.1) fraxtal-contracts: specifier: github:FraxFinance/fraxtal-contracts version: dev-fraxtal-contracts@https://codeload.github.com/FraxFinance/fraxtal-contracts/tar.gz/d533b607c0d32d10d9a43ada8aa5d6fadf892e8e solidity-bytes-utils: specifier: github:GNSPS/solidity-bytes-utils version: https://codeload.github.com/GNSPS/solidity-bytes-utils/tar.gz/df88556cbbc267b33a787a3a6eaa32fd7247b589 + tronweb: + specifier: ^5.3.2 + version: 5.3.2 devDependencies: "@openzeppelin/contracts": specifier: ^5.0.1 @@ -55,6 +64,10 @@ importers: version: 5.3.3 packages: + "@adraffy/ens-normalize@1.10.1": + resolution: + { integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw== } + "@ampproject/remapping@2.2.1": resolution: { integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== } @@ -246,6 +259,28 @@ packages: resolution: { integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== } + "@noble/curves@1.2.0": + resolution: + { integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw== } + + "@noble/curves@1.4.2": + resolution: + { integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== } + + "@noble/hashes@1.3.2": + resolution: + { integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ== } + engines: { node: ">= 16" } + + "@noble/hashes@1.4.0": + resolution: + { integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== } + engines: { node: ">= 16" } + + "@noble/secp256k1@2.1.0": + resolution: + { integrity: sha512-XLEQQNdablO0XZOIniFQimiXsZDNwaYgL96dZwC54Q30imSbAOFf3NKtepc+cXyuZf5Q1HCgbqgZ2UFFuHVcEw== } + "@openzeppelin/contracts-upgradeable@4.7.3": resolution: { integrity: sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A== } @@ -258,6 +293,10 @@ packages: resolution: { integrity: sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA== } + "@openzeppelin/contracts@3.4.2-solc-0.7": + resolution: + { integrity: sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA== } + "@openzeppelin/contracts@4.3.3": resolution: { integrity: sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g== } @@ -285,6 +324,18 @@ packages: { commit: 8f9b23f8838670afda0fd8983f2c41e8037ae6bc, repo: git@github.com:rari-capital/solmate.git, type: git } version: 7.0.0-alpha.3 + "@scure/base@1.1.7": + resolution: + { integrity: sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g== } + + "@scure/bip32@1.4.0": + resolution: + { integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg== } + + "@scure/bip39@1.3.0": + resolution: + { integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ== } + "@solidity-parser/parser@0.16.2": resolution: { integrity: sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg== } @@ -293,6 +344,10 @@ packages: resolution: { integrity: sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw== } + "@tronweb3/google-protobuf@3.21.2": + resolution: + { integrity: sha512-IVcT2GfWX3K6tHUVhs14NP5uzKhQt4KeDya1g9ACxuZsUzsaoGUIGzceK2Ltu7xp1YV94AaHOf4yxLAivlvEkQ== } + "@tsconfig/node10@1.0.9": resolution: { integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== } @@ -321,10 +376,34 @@ packages: resolution: { integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ== } + "@types/node@18.15.13": + resolution: + { integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q== } + "@types/node@18.19.14": resolution: { integrity: sha512-EnQ4Us2rmOS64nHDWr0XqAD8DsO6f3XR6lf9UIIrZQpUzPVdN/oPuEzfDWNHSyXLvoGgjuEm/sPwFGSSs35Wtg== } + "@uniswap/lib@4.0.1-alpha": + resolution: + { integrity: sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA== } + engines: { node: ">=10" } + + "@uniswap/v2-core@1.0.1": + resolution: + { integrity: sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q== } + engines: { node: ">=10" } + + "@uniswap/v3-core@1.0.1": + resolution: + { integrity: sha512-7pVk4hEm00j9tc71Y9+ssYpO6ytkeI0y7WE9P6UcmNzhxPePwyAxImuhVsTqWK9YFvzgtvzJHi64pBl4jUzKMQ== } + engines: { node: ">=10" } + + "@uniswap/v3-periphery@1.4.4": + resolution: + { integrity: sha512-S4+m+wh8HbWSO3DKk4LwUCPZJTpCugIsHrWR86m/OrUyvSqGDTXKFfc2sMuGXCZrD1ZqO3rhQsKgdWg3Hbb2Kw== } + engines: { node: ">=10" } + acorn-walk@8.3.2: resolution: { integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== } @@ -340,6 +419,10 @@ packages: resolution: { integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== } + aes-js@4.0.0-beta.5: + resolution: + { integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== } + ajv@6.12.6: resolution: { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== } @@ -412,6 +495,14 @@ packages: { integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== } engines: { node: ">=8" } + asynckit@0.4.0: + resolution: + { integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== } + + axios@1.7.2: + resolution: + { integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== } + axobject-query@4.0.0: resolution: { integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw== } @@ -420,10 +511,18 @@ packages: resolution: { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } + base64-sol@1.0.1: + resolution: + { integrity: sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg== } + bech32@1.1.4: resolution: { integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== } + bignumber.js@9.1.2: + resolution: + { integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== } + bn.js@4.12.0: resolution: { integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== } @@ -533,6 +632,11 @@ packages: resolution: { integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== } + combined-stream@1.0.8: + resolution: + { integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== } + engines: { node: ">= 0.8" } + command-exists@1.2.9: resolution: { integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== } @@ -600,6 +704,11 @@ packages: { integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== } engines: { node: ">=6" } + delayed-stream@1.0.0: + resolution: + { integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== } + engines: { node: ">=0.4.0" } + dequal@2.0.3: resolution: { integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== } @@ -659,10 +768,23 @@ packages: resolution: { integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== } + ethereum-cryptography@2.2.1: + resolution: + { integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== } + ethers@5.7.2: resolution: { integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== } + ethers@6.13.1: + resolution: + { integrity: sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A== } + engines: { node: ">=14.0.0" } + + eventemitter3@3.1.2: + resolution: + { integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== } + eventemitter3@5.0.1: resolution: { integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== } @@ -699,6 +821,16 @@ packages: debug: optional: true + follow-redirects@1.15.6: + resolution: + { integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== } + engines: { node: ">=4.0" } + peerDependencies: + debug: "*" + peerDependenciesMeta: + debug: + optional: true + forge-std@1.1.2: resolution: { integrity: sha512-Wfb0iAS9PcfjMKtGpWQw9mXzJxrWD62kJCUqqLcyuI0+VRtJ3j20XembjF3kS20qELYdXft1vD/SPFVWVKMFOw== } @@ -708,6 +840,11 @@ packages: { tarball: https://codeload.github.com/foundry-rs/forge-std/tar.gz/e8a047e3f40f13fa37af6fe14e6e06283d9a060e } version: 1.5.6 + form-data@4.0.0: + resolution: + { integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== } + engines: { node: ">= 6" } + frax-standard-solidity@https://codeload.github.com/FraxFinance/frax-standard-solidity/tar.gz/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6: resolution: { @@ -793,6 +930,10 @@ packages: resolution: { integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== } + injectpromise@1.0.0: + resolution: + { integrity: sha512-qNq5wy4qX4uWHcVFOEU+RqZkoVG65FhvGkyDWbuBxILMjK6A1LFf5A1mgXZkD4nRx5FCorD81X/XvPKp/zVfPA== } + is-arrayish@0.2.1: resolution: { integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== } @@ -936,6 +1077,16 @@ packages: { integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== } engines: { node: ">=8.6" } + mime-db@1.52.0: + resolution: + { integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== } + engines: { node: ">= 0.6" } + + mime-types@2.1.35: + resolution: + { integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== } + engines: { node: ">= 0.6" } + mimic-fn@2.1.0: resolution: { integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== } @@ -1083,11 +1234,20 @@ packages: engines: { node: ">=14" } hasBin: true + proxy-from-env@1.1.0: + resolution: + { integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== } + punycode@2.3.1: resolution: { integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== } engines: { node: ">=6" } + querystring-es3@0.2.1: + resolution: + { integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA== } + engines: { node: ">=0.4.x" } + regenerator-runtime@0.14.1: resolution: { integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== } @@ -1264,6 +1424,10 @@ packages: resolution: { integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== } + tronweb@5.3.2: + resolution: + { integrity: sha512-iPcIjMCxb6H7FXMntAj47F3L+7jSideyQ7ZOvRj9MeZBh46SHevMrDDR57HzakUa/tT8VvlPFHtqFK4hzTLkXw== } + ts-node@10.9.2: resolution: { integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== } @@ -1279,6 +1443,10 @@ packages: "@swc/wasm": optional: true + tslib@2.4.0: + resolution: + { integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== } + tslib@2.6.2: resolution: { integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== } @@ -1324,6 +1492,11 @@ packages: resolution: { integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== } + validator@13.12.0: + resolution: + { integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg== } + engines: { node: ">= 0.10" } + which@2.0.2: resolution: { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } @@ -1352,6 +1525,19 @@ packages: utf-8-validate: optional: true + ws@8.17.1: + resolution: + { integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== } + engines: { node: ">=10.0.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== } @@ -1367,6 +1553,8 @@ packages: engines: { node: ">=6" } snapshots: + "@adraffy/ens-normalize@1.10.1": {} + "@ampproject/remapping@2.2.1": dependencies: "@jridgewell/gen-mapping": 0.3.3 @@ -1389,9 +1577,9 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - "@chainlink/contracts@0.6.1(ethers@5.7.2)": + "@chainlink/contracts@0.6.1(ethers@6.13.1)": dependencies: - "@eth-optimism/contracts": 0.5.40(ethers@5.7.2) + "@eth-optimism/contracts": 0.5.40(ethers@6.13.1) "@openzeppelin/contracts": 4.3.3 "@openzeppelin/contracts-upgradeable": 4.9.5 "@openzeppelin/contracts-v0.7": "@openzeppelin/contracts@3.4.2" @@ -1404,12 +1592,12 @@ snapshots: dependencies: "@jridgewell/trace-mapping": 0.3.9 - "@eth-optimism/contracts@0.5.40(ethers@5.7.2)": + "@eth-optimism/contracts@0.5.40(ethers@6.13.1)": dependencies: "@eth-optimism/core-utils": 0.12.0 "@ethersproject/abstract-provider": 5.7.0 "@ethersproject/abstract-signer": 5.7.0 - ethers: 5.7.2 + ethers: 6.13.1 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -1713,12 +1901,28 @@ snapshots: "@jridgewell/resolve-uri": 3.1.1 "@jridgewell/sourcemap-codec": 1.4.15 + "@noble/curves@1.2.0": + dependencies: + "@noble/hashes": 1.3.2 + + "@noble/curves@1.4.2": + dependencies: + "@noble/hashes": 1.4.0 + + "@noble/hashes@1.3.2": {} + + "@noble/hashes@1.4.0": {} + + "@noble/secp256k1@2.1.0": {} + "@openzeppelin/contracts-upgradeable@4.7.3": {} "@openzeppelin/contracts-upgradeable@4.9.5": {} "@openzeppelin/contracts@3.4.2": {} + "@openzeppelin/contracts@3.4.2-solc-0.7": {} + "@openzeppelin/contracts@4.3.3": {} "@openzeppelin/contracts@4.7.3": {} @@ -1734,12 +1938,27 @@ snapshots: "@rari-capital/solmate@git+https://git@github.com:rari-capital/solmate.git#8f9b23f8838670afda0fd8983f2c41e8037ae6bc": {} + "@scure/base@1.1.7": {} + + "@scure/bip32@1.4.0": + dependencies: + "@noble/curves": 1.4.2 + "@noble/hashes": 1.4.0 + "@scure/base": 1.1.7 + + "@scure/bip39@1.3.0": + dependencies: + "@noble/hashes": 1.4.0 + "@scure/base": 1.1.7 + "@solidity-parser/parser@0.16.2": dependencies: antlr4ts: 0.5.0-alpha.4 "@solidity-parser/parser@0.17.0": {} + "@tronweb3/google-protobuf@3.21.2": {} + "@tsconfig/node10@1.0.9": {} "@tsconfig/node12@1.0.11": {} @@ -1759,16 +1978,34 @@ snapshots: dependencies: "@types/node": 18.19.14 + "@types/node@18.15.13": {} + "@types/node@18.19.14": dependencies: undici-types: 5.26.5 + "@uniswap/lib@4.0.1-alpha": {} + + "@uniswap/v2-core@1.0.1": {} + + "@uniswap/v3-core@1.0.1": {} + + "@uniswap/v3-periphery@1.4.4": + dependencies: + "@openzeppelin/contracts": 3.4.2-solc-0.7 + "@uniswap/lib": 4.0.1-alpha + "@uniswap/v2-core": 1.0.1 + "@uniswap/v3-core": 1.0.1 + base64-sol: 1.0.1 + acorn-walk@8.3.2: {} acorn@8.11.3: {} aes-js@3.0.0: {} + aes-js@4.0.0-beta.5: {} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -1819,14 +2056,28 @@ snapshots: astral-regex@2.0.0: {} + asynckit@0.4.0: {} + + axios@1.7.2: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + axobject-query@4.0.0: dependencies: dequal: 2.0.3 balanced-match@1.0.2: {} + base64-sol@1.0.1: {} + bech32@1.1.4: {} + bignumber.js@9.1.2: {} + bn.js@4.12.0: {} bn.js@5.2.1: {} @@ -1932,6 +2183,10 @@ snapshots: colorette@2.0.20: {} + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + command-exists@1.2.9: {} commander@10.0.1: {} @@ -1980,6 +2235,8 @@ snapshots: dependencies: type-detect: 4.0.8 + delayed-stream@1.0.0: {} + dequal@2.0.3: {} dev-fraxtal-contracts@https://codeload.github.com/FraxFinance/fraxtal-contracts/tar.gz/d533b607c0d32d10d9a43ada8aa5d6fadf892e8e: @@ -2033,6 +2290,13 @@ snapshots: dependencies: "@types/estree": 1.0.5 + ethereum-cryptography@2.2.1: + dependencies: + "@noble/curves": 1.4.2 + "@noble/hashes": 1.4.0 + "@scure/bip32": 1.4.0 + "@scure/bip39": 1.3.0 + ethers@5.7.2: dependencies: "@ethersproject/abi": 5.7.0 @@ -2069,6 +2333,21 @@ snapshots: - bufferutil - utf-8-validate + ethers@6.13.1: + dependencies: + "@adraffy/ens-normalize": 1.10.1 + "@noble/curves": 1.2.0 + "@noble/hashes": 1.3.2 + "@types/node": 18.15.13 + aes-js: 4.0.0-beta.5 + tslib: 2.4.0 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + eventemitter3@3.1.2: {} + eventemitter3@5.0.1: {} execa@7.2.0: @@ -2095,13 +2374,21 @@ snapshots: follow-redirects@1.15.5: {} + follow-redirects@1.15.6: {} + forge-std@1.1.2: {} 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): + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + frax-standard-solidity@https://codeload.github.com/FraxFinance/frax-standard-solidity/tar.gz/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6(ethers@6.13.1): dependencies: - "@chainlink/contracts": 0.6.1(ethers@5.7.2) + "@chainlink/contracts": 0.6.1(ethers@6.13.1) "@openzeppelin/contracts": 5.0.1 "@types/fs-extra": 11.0.4 "@types/node": 18.19.14 @@ -2192,6 +2479,8 @@ snapshots: inherits@2.0.4: {} + injectpromise@1.0.0: {} + is-arrayish@0.2.1: {} is-fullwidth-code-point@3.0.0: {} @@ -2300,6 +2589,12 @@ snapshots: braces: 3.0.2 picomatch: 2.3.1 + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -2404,8 +2699,12 @@ snapshots: prettier@3.2.5: {} + proxy-from-env@1.1.0: {} + punycode@2.3.1: {} + querystring-es3@0.2.1: {} + regenerator-runtime@0.14.1: {} require-from-string@2.0.2: {} @@ -2583,6 +2882,26 @@ snapshots: toml@3.0.0: {} + tronweb@5.3.2: + dependencies: + "@babel/runtime": 7.23.9 + "@ethersproject/abi": 5.7.0 + "@tronweb3/google-protobuf": 3.21.2 + axios: 1.7.2 + bignumber.js: 9.1.2 + ethereum-cryptography: 2.2.1 + ethers: 6.13.1 + eventemitter3: 3.1.2 + injectpromise: 1.0.0 + lodash: 4.17.21 + querystring-es3: 0.2.1 + semver: 5.7.2 + validator: 13.12.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + ts-node@10.9.2(@types/node@18.19.14)(typescript@5.3.3): dependencies: "@cspotcode/source-map-support": 0.8.1 @@ -2601,6 +2920,8 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + tslib@2.4.0: {} + tslib@2.6.2: {} type-detect@4.0.8: {} @@ -2627,6 +2948,8 @@ snapshots: v8-compile-cache-lib@3.0.1: {} + validator@13.12.0: {} + which@2.0.2: dependencies: isexe: 2.0.0 @@ -2641,6 +2964,8 @@ snapshots: ws@7.4.6: {} + ws@8.17.1: {} + yallist@4.0.0: {} yaml@2.3.1: {} diff --git a/remappings.txt b/remappings.txt index 92f1540..4fad1d4 100644 --- a/remappings.txt +++ b/remappings.txt @@ -1,4 +1,5 @@ frax-std/=node_modules/frax-standard-solidity/src/ @prb/test/=node_modules/@prb/test/ forge-std/=node_modules/forge-std/src/ -ds-test/=node_modules/ds-test/src/ \ No newline at end of file +ds-test/=node_modules/ds-test/src/ +@openzeppelin/=node_modules/@openzeppelin/ \ No newline at end of file diff --git a/src/script/DeployFraxAssetsOnTron.s.sol b/src/script/DeployFraxAssetsOnTron.s.sol index ed0656c..e97d345 100644 --- a/src/script/DeployFraxAssetsOnTron.s.sol +++ b/src/script/DeployFraxAssetsOnTron.s.sol @@ -5,8 +5,8 @@ import { BaseScript } from "frax-std/BaseScript.sol"; import { console } from "frax-std/FraxTest.sol"; import { FraxtalL2 } from "src/contracts/chain-constants/FraxtalL2.sol"; -import { ERC20WithMinters } from "src/contracts/ERC20WithMinters.sol"; -import { Fraxferry } from "frax-contracts/src/hardhat/contracts/Fraxferry/Fraxferry.sol"; +import { ERC20WithMinters } from "src/contracts/ERC20WithMinters-flattened.sol"; +import { Fraxferry } from "src/contracts/FraxFerry-flattened.sol"; /* NOTICE: diff --git a/src/script/DeployTronFerriesOnFraxtal.sol b/src/script/DeployTronFerriesOnFraxtal.sol index 8e39bf1..4f4987d 100644 --- a/src/script/DeployTronFerriesOnFraxtal.sol +++ b/src/script/DeployTronFerriesOnFraxtal.sol @@ -5,12 +5,11 @@ import { BaseScript } from "frax-std/BaseScript.sol"; import { console } from "frax-std/FraxTest.sol"; import { FraxtalL2 } from "src/contracts/chain-constants/FraxtalL2.sol"; -import { ERC20WithMinters } from "src/contracts/ERC20WithMinters.sol"; -import { Fraxferry } from "frax-contracts/src/hardhat/contracts/Fraxferry/Fraxferry.sol"; +import { Fraxferry } from "src/contracts/FraxFerry-flattened.sol"; /* NOTICE: -Deploy FRAX, sFRAX, and FXS on Tron +Deploy Fraxtal ferries for FRAX, sFRAX, and FXS to Tron TODO: - differentiate owner, captain, firstOfficer, crewMember - assert wait periods are as wanted @@ -18,14 +17,14 @@ TODO: contract DeployTronFerriesOnFraxtal is BaseScript { // TODO: set assets in chain constants - address public fraxOnTron = address(0); // TODO + address public fraxOnTron = 0xA00C37011018b4B11CFFbBF0305A771D9d4066cf; address public fraxFerry; address public sFraxOnTron = address(0); // TODO address public sFraxFerry; address public fxsOnTron = address(0); // TODO address public fxsFerry; - address public timelock; + address public timelock = 0xb0E1650A9760e0f383174af042091fc544b8356f; uint256 public constant TRON_CHAIN_ID = 1000; @@ -35,8 +34,8 @@ contract DeployTronFerriesOnFraxtal is BaseScript { function deployFerries() public { fraxFerry = deployFerry({ _token: FraxtalL2.FRAX, _remoteToken: fraxOnTron }); - sFraxFerry = deployFerry({ _token: FraxtalL2.SFRAX, _remoteToken: sFraxOnTron }); - fxsFerry = deployFerry({ _token: FraxtalL2.FXS, _remoteToken: fxsOnTron1 }); + // sFraxFerry = deployFerry({ _token: FraxtalL2.SFRAX, _remoteToken: sFraxOnTron }); + // fxsFerry = deployFerry({ _token: FraxtalL2.FXS, _remoteToken: fxsOnTron1 }); } function deployFerry(address _token, address _remoteToken) public returns (address) { From 92f7a4135cb87cdc7636df8131ea46352f2d7921 Mon Sep 17 00:00:00 2001 From: Carter Carlson Date: Fri, 26 Jul 2024 11:55:16 -0700 Subject: [PATCH 11/15] feat(test): BaseTest deployment --- src/script/DeployFraxAssetsOnTron.s.sol | 13 ++-- src/test/BaseTest.t.sol | 81 +++++++++++++++++++++++++ src/test/Counter/TestIncrement.t.sol | 30 --------- src/test/Counter/TestSetNumber.t.sol | 35 ----------- 4 files changed, 88 insertions(+), 71 deletions(-) delete mode 100644 src/test/Counter/TestIncrement.t.sol delete mode 100644 src/test/Counter/TestSetNumber.t.sol diff --git a/src/script/DeployFraxAssetsOnTron.s.sol b/src/script/DeployFraxAssetsOnTron.s.sol index e97d345..ef7a4bb 100644 --- a/src/script/DeployFraxAssetsOnTron.s.sol +++ b/src/script/DeployFraxAssetsOnTron.s.sol @@ -5,7 +5,7 @@ import { BaseScript } from "frax-std/BaseScript.sol"; import { console } from "frax-std/FraxTest.sol"; import { FraxtalL2 } from "src/contracts/chain-constants/FraxtalL2.sol"; -import { ERC20WithMinters } from "src/contracts/ERC20WithMinters-flattened.sol"; +import { ERC20PermissionedMint } from "src/contracts/ERC20WithMinters-flattened.sol"; import { Fraxferry } from "src/contracts/FraxFerry-flattened.sol"; /* @@ -33,21 +33,21 @@ contract DeployFraxAssetsOnTron is BaseScript { } function deployERC20sWithFerries() public { - (frax, fraxFerry) = deployERC20WithFerry({ _remoteToken: FraxtalL2.FRAX, _name: "Frax", _symbol: "FRAX" }); - (sFrax, sFraxFerry) = deployERC20WithFerry({ + (frax, fraxFerry) = deployErc20WithFerry({ _remoteToken: FraxtalL2.FRAX, _name: "Frax", _symbol: "FRAX" }); + (sFrax, sFraxFerry) = deployErc20WithFerry({ _remoteToken: FraxtalL2.SFRAX, _name: "Staked Frax", _symbol: "sFRAX" }); - (fxs, fxsFerry) = deployERC20WithFerry({ _remoteToken: FraxtalL2.FXS, _name: "Frax Share", _symbol: "FXS" }); + (fxs, fxsFerry) = deployErc20WithFerry({ _remoteToken: FraxtalL2.FXS, _name: "Frax Share", _symbol: "FXS" }); } function deployErc20WithFerry( address _remoteToken, string memory _name, string memory _symbol - ) public returns (address) { - ERC20WithMinters erc20 = new ERC20WithMinters({ + ) public returns (address, address) { + ERC20PermissionedMint erc20 = new ERC20PermissionedMint({ _creator_address: deployer, _timelock_address: timelock, _name: _name, @@ -65,5 +65,6 @@ contract DeployFraxAssetsOnTron is BaseScript { console.log(address(erc20)); console.log("Ferry:"); console.log(address(ferry)); + return (address(erc20), address(ferry)); } } diff --git a/src/test/BaseTest.t.sol b/src/test/BaseTest.t.sol index 5b3602a..8d11c91 100644 --- a/src/test/BaseTest.t.sol +++ b/src/test/BaseTest.t.sol @@ -11,6 +11,9 @@ import { FraxtalL2 } from "src/contracts/chain-constants/FraxtalL2.sol"; import { FraxtalTestnetL1 } from "src/contracts/chain-constants/FraxtalTestnetL1.sol"; import { FraxtalTestnetL2 } from "src/contracts/chain-constants/FraxtalTestnetL2.sol"; +import { ERC20PermissionedMint } from "src/contracts/ERC20WithMinters-flattened.sol"; +import { Fraxferry } from "src/contracts/FraxFerry-flattened.sol"; + contract BaseTest is FraxTest { Counter public counter; @@ -32,6 +35,22 @@ contract BaseTest is FraxTest { address public FRAXSWAP_ROUTER; address public FRAXSWAP_ROUTER_MULTIHOP; + // test contracts + ERC20PermissionedMint public token0; + ERC20PermissionedMint public token1; + Fraxferry public ferry0To1; + Fraxferry public ferry1To0; + uint256 public chainIdToken0 = 111; + uint256 public chainIdToken1 = 222; + + // test users + address public captain = address(0x111111); + address public firstOfficer = address(0x222222); + address public crewmember = address(0x333333); + address public owner = address(0x4444444); + address public testerA = address(0x555555); + address public testerB = address(0x666666); + constructor() { // Setup fraxtal / fraxtal testnet L1 addresses if (block.chainid == Mainnet.CHAIN_ID) { @@ -68,4 +87,66 @@ contract BaseTest is FraxTest { FRAXSWAP_ROUTER_MULTIHOP = FraxtalTestnetL2.FRAXSWAP_ROUTER_MULTIHOP; } } + + function setUp() public virtual { + deployTokens(); + deployFerriesAndMint(); + } + + function deployTokens() internal { + token0 = deployToken({ _name: "Token 0", _symbol: "T0" }); + token1 = deployToken({ _name: "Token 1", _symbol: "T1" }); + } + + function deployToken(string memory _name, string memory _symbol) internal returns (ERC20PermissionedMint token) { + token = new ERC20PermissionedMint({ + _creator_address: owner, + _timelock_address: owner, + _name: _name, + _symbol: _symbol + }); + } + + function deployFerriesAndMint() internal { + ferry0To1 = deployFerryAndMint({ + _tokenFrom: token0, + _chainIdFrom: chainIdToken0, + _tokenTo: token1, + _chainIdTo: chainIdToken1 + }); + ferry1To0 = deployFerryAndMint({ + _tokenFrom: token1, + _chainIdFrom: chainIdToken1, + _tokenTo: token0, + _chainIdTo: chainIdToken0 + }); + } + + function deployFerryAndMint( + ERC20PermissionedMint _tokenFrom, + uint256 _chainIdFrom, + ERC20PermissionedMint _tokenTo, + uint256 _chainIdTo + ) internal returns (Fraxferry ferry) { + ferry = new Fraxferry({ + _token: address(_tokenFrom), + _chainid: _chainIdFrom, + _targetToken: address(_tokenTo), + _targetChain: _chainIdTo + }); + + vm.startPrank(owner); + + ferry.setCaptain(captain); + ferry.setFirstOfficer(firstOfficer); + ferry.setCrewmember(crewmember, true); + + _tokenFrom.addMinter(owner); + _tokenFrom.minter_mint(owner, 1e24); + _tokenFrom.minter_mint(testerA, 1e24); + _tokenFrom.minter_mint(testerB, 1e24); + _tokenFrom.minter_mint(address(ferry), 1e24); + + vm.stopPrank(); + } } diff --git a/src/test/Counter/TestIncrement.t.sol b/src/test/Counter/TestIncrement.t.sol deleted file mode 100644 index 18ff5f0..0000000 --- a/src/test/Counter/TestIncrement.t.sol +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.19; - -import "../BaseTest.t.sol"; - -contract TestIncrement is BaseTest { - function defaultSetup() public returns (uint256 _snapshotId) { - counter = new Counter(); - counter.setNumber(0); - _snapshotId = vm.snapshot(); - } - - function anotherSetup() public returns (uint256 _snapshotId) { - counter = new Counter(); - counter.setNumber(50); - _snapshotId = vm.snapshot(); - } - - function setUp() public { - uint256 _original = vm.snapshot(); - snapShotIds.push(defaultSetup()); - vm.revertTo(_original); - snapShotIds.push(anotherSetup()); - } - - function testIncrement() public useMultipleSetupFunctions { - counter.increment(); - assertEq(counter.number(), 51); - } -} diff --git a/src/test/Counter/TestSetNumber.t.sol b/src/test/Counter/TestSetNumber.t.sol deleted file mode 100644 index 8587a74..0000000 --- a/src/test/Counter/TestSetNumber.t.sol +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.19; - -import "../BaseTest.t.sol"; - -contract TestIncrement is BaseTest { - function setUp() public { - setupFunctions.push(defaultSetup); - setupFunctions.push(anotherSetup); - addSetupFunctions(setupFunctions); - } - - function defaultSetup() public { - counter = new Counter(); - counter.setNumber(0); - } - - function anotherSetup() public { - counter = new Counter(); - counter.setNumber(50); - } - - function testSetNumber(uint256 x) public useMultipleSetupFunctions { - counter.setNumber(x); - assertEq(counter.number(), x); - } - - function testFailAssertCounterDefaultSetup() public useMultipleSetupFunctions { - assertEq(counter.number(), 0); - } - - function testFailAssertCounterAnotherSetup() public useMultipleSetupFunctions { - assertEq(counter.number(), 50); - } -} From ca8aee978c6c731a2f6e2509f10a48b0248040f1 Mon Sep 17 00:00:00 2001 From: Carter Carlson Date: Fri, 26 Jul 2024 12:21:03 -0700 Subject: [PATCH 12/15] test: embark --- src/test/BaseTest.t.sol | 13 ++++--- src/test/FerryTest.t.sol | 77 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 src/test/FerryTest.t.sol diff --git a/src/test/BaseTest.t.sol b/src/test/BaseTest.t.sol index 8d11c91..e242dbf 100644 --- a/src/test/BaseTest.t.sol +++ b/src/test/BaseTest.t.sol @@ -48,8 +48,8 @@ contract BaseTest is FraxTest { address public firstOfficer = address(0x222222); address public crewmember = address(0x333333); address public owner = address(0x4444444); - address public testerA = address(0x555555); - address public testerB = address(0x666666); + address public userA = address(0x555555); + address public userB = address(0x666666); constructor() { // Setup fraxtal / fraxtal testnet L1 addresses @@ -135,18 +135,17 @@ contract BaseTest is FraxTest { _targetChain: _chainIdTo }); - vm.startPrank(owner); - ferry.setCaptain(captain); ferry.setFirstOfficer(firstOfficer); ferry.setCrewmember(crewmember, true); + ferry.nominateNewOwner(owner); + vm.startPrank(owner); _tokenFrom.addMinter(owner); _tokenFrom.minter_mint(owner, 1e24); - _tokenFrom.minter_mint(testerA, 1e24); - _tokenFrom.minter_mint(testerB, 1e24); + _tokenFrom.minter_mint(userA, 1e24); + _tokenFrom.minter_mint(userB, 1e24); _tokenFrom.minter_mint(address(ferry), 1e24); - vm.stopPrank(); } } diff --git a/src/test/FerryTest.t.sol b/src/test/FerryTest.t.sol new file mode 100644 index 0000000..e245402 --- /dev/null +++ b/src/test/FerryTest.t.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "./BaseTest.t.sol"; + +contract FerryTest is BaseTest { + uint256 bridgeAmount = 1000 * 1e18; + bytes32 hashZero = 0x0000000000000000000000000000000000000000000000000000000000000000; + + function setUp() public virtual override { + super.setUp(); + + maxApproveFerries(); + } + + function maxApproveFerries() internal { + maxApproveFerries(userA); + maxApproveFerries(userB); + } + + function maxApproveFerries(address who) internal { + vm.startPrank(who); + token0.approve(address(ferry0To1), type(uint256).max); + token1.approve(address(ferry1To0), type(uint256).max); + vm.stopPrank(); + } + + function test_embark() public { + uint256 userBalanceBefore = token0.balanceOf(userA); + uint256 ferryBalanceBefore = token0.balanceOf(address(ferry0To1)); + + vm.prank(userA); + ferry0To1.embark(bridgeAmount); + + assertEq({ + a: userBalanceBefore - token0.balanceOf(userA), + b: bridgeAmount, + err: "Bridge amount not transferred" + }); + assertEq({ + a: token0.balanceOf(address(ferry0To1)) - ferryBalanceBefore, + b: bridgeAmount, + err: "Ferry did not receive bridge amount" + }); + assertEq({ a: ferry0To1.noTransactions(), b: 1, err: "Ferry should have one tx" }); + + uint256 fee = min( + max((bridgeAmount * ferry0To1.FEE_RATE()) / 10_000, ferry0To1.FEE_MIN()), + ferry0To1.FEE_MAX() + ); + (address user, uint64 amount, uint32 timestamp) = ferry0To1.transactions(0); + + assertEq({ a: user, b: userA, err: "userA != tx.user" }); + assertEq({ + a: uint256(amount) * ferry0To1.REDUCED_DECIMALS(), + b: bridgeAmount - fee, + err: "bridgeAmount != tx.amount" + }); + assertEq({ a: uint256(timestamp), b: block.timestamp, err: "block.timestamp != tx.timestamp" }); + } + + function min(uint256 a, uint256 b) internal returns (uint256) { + if (a < b) { + return a; + } else { + return b; + } + } + + function max(uint256 a, uint256 b) internal returns (uint256) { + if (a > b) { + return a; + } else { + return b; + } + } +} From 8b243d1548f9088c37363fef7f0509895cbeb203 Mon Sep 17 00:00:00 2001 From: Carter Carlson Date: Tue, 30 Jul 2024 13:50:39 -0700 Subject: [PATCH 13/15] add: code examples of tron calls --- package.json | 3 +- pnpm-lock.yaml | 35 ++-- scripts/ERC20PermissionedMint-abi.json | 277 +++++++++++++++++++++++++ scripts/tron-tests.js | 33 +++ 4 files changed, 331 insertions(+), 17 deletions(-) create mode 100644 scripts/ERC20PermissionedMint-abi.json create mode 100644 scripts/tron-tests.js diff --git a/package.json b/package.json index 7cec978..df6eb92 100644 --- a/package.json +++ b/package.json @@ -31,9 +31,10 @@ "typescript": "^5.3.3" }, "dependencies": { - "@noble/secp256k1": "^2.1.0", + "@noble/secp256k1": "1.7.1", "@uniswap/v3-periphery": "^1.4.4", "ds-test": "github:dapphub/ds-test", + "ethers": "^6.13.2", "forge-std": "github:foundry-rs/forge-std#e8a047e3f40f13fa37af6fe14e6e06283d9a060e", "frax-standard-solidity": "github:FraxFinance/frax-standard-solidity", "fraxtal-contracts": "github:FraxFinance/fraxtal-contracts", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6e09c52..d88437f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,20 +8,23 @@ importers: .: dependencies: "@noble/secp256k1": - specifier: ^2.1.0 - version: 2.1.0 + specifier: 1.7.1 + version: 1.7.1 "@uniswap/v3-periphery": specifier: ^1.4.4 version: 1.4.4 ds-test: specifier: github:dapphub/ds-test version: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 + ethers: + specifier: ^6.13.2 + version: 6.13.2 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@6.13.1) + version: https://codeload.github.com/FraxFinance/frax-standard-solidity/tar.gz/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6(ethers@6.13.2) fraxtal-contracts: specifier: github:FraxFinance/fraxtal-contracts version: dev-fraxtal-contracts@https://codeload.github.com/FraxFinance/fraxtal-contracts/tar.gz/d533b607c0d32d10d9a43ada8aa5d6fadf892e8e @@ -277,9 +280,9 @@ packages: { integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== } engines: { node: ">= 16" } - "@noble/secp256k1@2.1.0": + "@noble/secp256k1@1.7.1": resolution: - { integrity: sha512-XLEQQNdablO0XZOIniFQimiXsZDNwaYgL96dZwC54Q30imSbAOFf3NKtepc+cXyuZf5Q1HCgbqgZ2UFFuHVcEw== } + { integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== } "@openzeppelin/contracts-upgradeable@4.7.3": resolution: @@ -776,9 +779,9 @@ packages: resolution: { integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== } - ethers@6.13.1: + ethers@6.13.2: resolution: - { integrity: sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A== } + { integrity: sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg== } engines: { node: ">=14.0.0" } eventemitter3@3.1.2: @@ -1577,9 +1580,9 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - "@chainlink/contracts@0.6.1(ethers@6.13.1)": + "@chainlink/contracts@0.6.1(ethers@6.13.2)": dependencies: - "@eth-optimism/contracts": 0.5.40(ethers@6.13.1) + "@eth-optimism/contracts": 0.5.40(ethers@6.13.2) "@openzeppelin/contracts": 4.3.3 "@openzeppelin/contracts-upgradeable": 4.9.5 "@openzeppelin/contracts-v0.7": "@openzeppelin/contracts@3.4.2" @@ -1592,12 +1595,12 @@ snapshots: dependencies: "@jridgewell/trace-mapping": 0.3.9 - "@eth-optimism/contracts@0.5.40(ethers@6.13.1)": + "@eth-optimism/contracts@0.5.40(ethers@6.13.2)": dependencies: "@eth-optimism/core-utils": 0.12.0 "@ethersproject/abstract-provider": 5.7.0 "@ethersproject/abstract-signer": 5.7.0 - ethers: 6.13.1 + ethers: 6.13.2 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -1913,7 +1916,7 @@ snapshots: "@noble/hashes@1.4.0": {} - "@noble/secp256k1@2.1.0": {} + "@noble/secp256k1@1.7.1": {} "@openzeppelin/contracts-upgradeable@4.7.3": {} @@ -2333,7 +2336,7 @@ snapshots: - bufferutil - utf-8-validate - ethers@6.13.1: + ethers@6.13.2: dependencies: "@adraffy/ens-normalize": 1.10.1 "@noble/curves": 1.2.0 @@ -2386,9 +2389,9 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 - frax-standard-solidity@https://codeload.github.com/FraxFinance/frax-standard-solidity/tar.gz/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6(ethers@6.13.1): + frax-standard-solidity@https://codeload.github.com/FraxFinance/frax-standard-solidity/tar.gz/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6(ethers@6.13.2): dependencies: - "@chainlink/contracts": 0.6.1(ethers@6.13.1) + "@chainlink/contracts": 0.6.1(ethers@6.13.2) "@openzeppelin/contracts": 5.0.1 "@types/fs-extra": 11.0.4 "@types/node": 18.19.14 @@ -2890,7 +2893,7 @@ snapshots: axios: 1.7.2 bignumber.js: 9.1.2 ethereum-cryptography: 2.2.1 - ethers: 6.13.1 + ethers: 6.13.2 eventemitter3: 3.1.2 injectpromise: 1.0.0 lodash: 4.17.21 diff --git a/scripts/ERC20PermissionedMint-abi.json b/scripts/ERC20PermissionedMint-abi.json new file mode 100644 index 0000000..1a2f0a5 --- /dev/null +++ b/scripts/ERC20PermissionedMint-abi.json @@ -0,0 +1,277 @@ +[ + { + "inputs": [ + { "internalType": "address", "name": "_creator_address", "type": "address" }, + { "internalType": "address", "name": "_timelock_address", "type": "address" }, + { "internalType": "string", "name": "_name", "type": "string" }, + { "internalType": "string", "name": "_symbol", "type": "string" } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { "internalType": "address", "name": "spender", "type": "address" }, + { "internalType": "uint256", "name": "allowance", "type": "uint256" }, + { "internalType": "uint256", "name": "needed", "type": "uint256" } + ], + "name": "ERC20InsufficientAllowance", + "type": "error" + }, + { + "inputs": [ + { "internalType": "address", "name": "sender", "type": "address" }, + { "internalType": "uint256", "name": "balance", "type": "uint256" }, + { "internalType": "uint256", "name": "needed", "type": "uint256" } + ], + "name": "ERC20InsufficientBalance", + "type": "error" + }, + { + "inputs": [{ "internalType": "address", "name": "approver", "type": "address" }], + "name": "ERC20InvalidApprover", + "type": "error" + }, + { + "inputs": [{ "internalType": "address", "name": "receiver", "type": "address" }], + "name": "ERC20InvalidReceiver", + "type": "error" + }, + { + "inputs": [{ "internalType": "address", "name": "sender", "type": "address" }], + "name": "ERC20InvalidSender", + "type": "error" + }, + { + "inputs": [{ "internalType": "address", "name": "spender", "type": "address" }], + "name": "ERC20InvalidSpender", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "spender", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address", "name": "minter_address", "type": "address" }], + "name": "MinterAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address", "name": "minter_address", "type": "address" }], + "name": "MinterRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "oldOwner", "type": "address" }, + { "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" } + ], + "name": "OwnerChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" }], + "name": "OwnerNominated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "TokenMinterBurned", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "TokenMinterMinted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "Transfer", + "type": "event" + }, + { "inputs": [], "name": "acceptOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [{ "internalType": "address", "name": "minter_address", "type": "address" }], + "name": "addMinter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "owner", "type": "address" }, + { "internalType": "address", "name": "spender", "type": "address" } + ], + "name": "allowance", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "spender", "type": "address" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "approve", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "name": "balanceOf", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "value", "type": "uint256" }], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "account", "type": "address" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "burnFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [{ "internalType": "uint8", "name": "", "type": "uint8" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "m_address", "type": "address" }, + { "internalType": "uint256", "name": "m_amount", "type": "uint256" } + ], + "name": "minter_mint", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "minters", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "name": "minters_array", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "_owner", "type": "address" }], + "name": "nominateNewOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "nominatedOwner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "minter_address", "type": "address" }], + "name": "removeMinter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "timelock_address", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "transfer", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "from", "type": "address" }, + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "name": "transferFrom", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/scripts/tron-tests.js b/scripts/tron-tests.js new file mode 100644 index 0000000..2b56a53 --- /dev/null +++ b/scripts/tron-tests.js @@ -0,0 +1,33 @@ +const TronWeb = require("tronweb"); +// NOTE: "@noble/secp256k1" needs to be @ "1.7.1" +const tronWeb = new TronWeb({ + fullHost: "https://api.trongrid.io", + headers: { "TRON-PRO-API-KEY": process.env.TRONGRID_API_KEY }, + privateKey: process.env.TRON_PK, // as hex string without the 0x +}); + +let abi = require("./ERC20PermissionedMint-abi.json"); +let fraxAddress = "TQZTkTMbkC9923LtVHZcSrdqcW5rVhkZHP"; +let ferryAddress = "TGxtcNUY9q19FATX3tFxzkmBhQigVDTFJs"; + +let fraxAsFullHex = tronWeb.address.toHex(fraxAddress); +let fraxAsEVMHex = "0x".concat(fraxAsFullHex.substr(2)); +console.log(fraxAsEVMHex); // 0xa00c37011018b4b11cffbbf0305a771d9d4066cf + +let deployerAsEVMHex = "0x721fc501d1fe305065dc88da0cf90406a79dfd69"; +let deployerAsFullHex = "41".concat(deployerAsEVMHex.substr(2)); +let deployerAddress = tronWeb.address.fromHex(deployerAsFullHex); +console.log(deployerAddress); // TLNe6KF1dUSYBcZ4fzTstoKB8bkzQewz42 + +async function main() { + let ctr = await tronWeb.contract(abi, fraxAddress); + // View call + let balance = await ctr.balanceOf(ferryAddress).call(); + // ERC20.transfer() call + // https://tronscan.org/#/transaction/a8a22abfda01745cf6475b826a0cc1bfb21ccc7e86be7d87fe76c3fed2976020 + await ctr.transfer(ferryAddress, 123456).send(); +} + +(async function () { + await main(); +})(); From 3c640e747a87c943a2295afd3fb2bd768ae044db Mon Sep 17 00:00:00 2001 From: Carter Carlson Date: Tue, 30 Jul 2024 13:54:09 -0700 Subject: [PATCH 14/15] chore(build): fix --- package.json | 1 - pnpm-lock.yaml | 224 ------------------------------------------------- 2 files changed, 225 deletions(-) diff --git a/package.json b/package.json index df6eb92..75bb918 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,6 @@ "ethers": "^6.13.2", "forge-std": "github:foundry-rs/forge-std#e8a047e3f40f13fa37af6fe14e6e06283d9a060e", "frax-standard-solidity": "github:FraxFinance/frax-standard-solidity", - "fraxtal-contracts": "github:FraxFinance/fraxtal-contracts", "solidity-bytes-utils": "github:GNSPS/solidity-bytes-utils", "tronweb": "^5.3.2" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d88437f..58f4acf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -25,9 +25,6 @@ importers: frax-standard-solidity: specifier: github:FraxFinance/frax-standard-solidity version: https://codeload.github.com/FraxFinance/frax-standard-solidity/tar.gz/65b1f01cef3de014a2d6646ebe0ca0df202cc9e6(ethers@6.13.2) - fraxtal-contracts: - specifier: github:FraxFinance/fraxtal-contracts - version: dev-fraxtal-contracts@https://codeload.github.com/FraxFinance/fraxtal-contracts/tar.gz/d533b607c0d32d10d9a43ada8aa5d6fadf892e8e solidity-bytes-utils: specifier: github:GNSPS/solidity-bytes-utils version: https://codeload.github.com/GNSPS/solidity-bytes-utils/tar.gz/df88556cbbc267b33a787a3a6eaa32fd7247b589 @@ -159,14 +156,6 @@ packages: 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== } @@ -179,10 +168,6 @@ packages: 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== } @@ -207,10 +192,6 @@ packages: 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== } @@ -219,22 +200,10 @@ packages: 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== } @@ -284,10 +253,6 @@ packages: resolution: { integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw== } - "@openzeppelin/contracts-upgradeable@4.7.3": - resolution: - { integrity: sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A== } - "@openzeppelin/contracts-upgradeable@4.9.5": resolution: { integrity: sha512-f7L1//4sLlflAN7fVzJLoRedrf5Na3Oal5PZfIq55NFcVZ90EpV1q5xOvL4lFvg3MNICSDr2hH0JUBxwlxcoPg== } @@ -304,14 +269,6 @@ packages: resolution: { integrity: sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g== } - "@openzeppelin/contracts@4.7.3": - resolution: - { integrity: sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== } - - "@openzeppelin/contracts@4.9.3": - resolution: - { integrity: sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg== } - "@openzeppelin/contracts@5.0.1": resolution: { integrity: sha512-yQJaT5HDp9hYOOp4jTYxMsR02gdFZFXhewX5HW9Jo4fsqSVqqyIO/xTHdWDaKX5a3pv1txmf076Lziz+sO7L1w== } @@ -322,11 +279,6 @@ packages: peerDependencies: prettier: ^3.0.0 - "@rari-capital/solmate@git+https://git@github.com:rari-capital/solmate.git#8f9b23f8838670afda0fd8983f2c41e8037ae6bc": - resolution: - { commit: 8f9b23f8838670afda0fd8983f2c41e8037ae6bc, repo: git@github.com:rari-capital/solmate.git, type: git } - version: 7.0.0-alpha.3 - "@scure/base@1.1.7": resolution: { integrity: sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g== } @@ -418,10 +370,6 @@ packages: engines: { node: ">=0.4.0" } hasBin: true - aes-js@3.0.0: - resolution: - { integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== } - aes-js@4.0.0-beta.5: resolution: { integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q== } @@ -603,13 +551,6 @@ packages: { integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== } engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } - clones-with-immutable-args@https://codeload.github.com/Saw-mon-and-Natalie/clones-with-immutable-args/tar.gz/105efee1b9127ed7f6fedf139e1fc796ce8791f2: - resolution: - { - tarball: https://codeload.github.com/Saw-mon-and-Natalie/clones-with-immutable-args/tar.gz/105efee1b9127ed7f6fedf139e1fc796ce8791f2, - } - version: 2.0.0 - code-red@1.0.4: resolution: { integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw== } @@ -717,13 +658,6 @@ packages: { integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== } engines: { node: ">=6" } - dev-fraxtal-contracts@https://codeload.github.com/FraxFinance/fraxtal-contracts/tar.gz/d533b607c0d32d10d9a43ada8aa5d6fadf892e8e: - resolution: - { - tarball: https://codeload.github.com/FraxFinance/fraxtal-contracts/tar.gz/d533b607c0d32d10d9a43ada8aa5d6fadf892e8e, - } - version: 1.0.0 - diff@4.0.2: resolution: { integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== } @@ -733,11 +667,6 @@ packages: resolution: { integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== } - dotenv@16.4.5: - resolution: - { integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== } - engines: { node: ">=12" } - ds-test@https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0: resolution: { tarball: https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0 } version: 1.0.0 @@ -775,10 +704,6 @@ packages: resolution: { integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg== } - ethers@5.7.2: - resolution: - { integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== } - ethers@6.13.2: resolution: { integrity: sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg== } @@ -1274,10 +1199,6 @@ packages: resolution: { integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg== } - scrypt-js@3.0.1: - resolution: - { integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== } - semver@5.7.2: resolution: { integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== } @@ -1713,37 +1634,6 @@ snapshots: "@ethersproject/properties": 5.7.0 "@ethersproject/strings": 5.7.0 - "@ethersproject/hdnode@5.7.0": - dependencies: - "@ethersproject/abstract-signer": 5.7.0 - "@ethersproject/basex": 5.7.0 - "@ethersproject/bignumber": 5.7.0 - "@ethersproject/bytes": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/pbkdf2": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/sha2": 5.7.0 - "@ethersproject/signing-key": 5.7.0 - "@ethersproject/strings": 5.7.0 - "@ethersproject/transactions": 5.7.0 - "@ethersproject/wordlists": 5.7.0 - - "@ethersproject/json-wallets@5.7.0": - dependencies: - "@ethersproject/abstract-signer": 5.7.0 - "@ethersproject/address": 5.7.0 - "@ethersproject/bytes": 5.7.0 - "@ethersproject/hdnode": 5.7.0 - "@ethersproject/keccak256": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/pbkdf2": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/random": 5.7.0 - "@ethersproject/strings": 5.7.0 - "@ethersproject/transactions": 5.7.0 - aes-js: 3.0.0 - scrypt-js: 3.0.1 - "@ethersproject/keccak256@5.7.0": dependencies: "@ethersproject/bytes": 5.7.0 @@ -1755,11 +1645,6 @@ snapshots: dependencies: "@ethersproject/logger": 5.7.0 - "@ethersproject/pbkdf2@5.7.0": - dependencies: - "@ethersproject/bytes": 5.7.0 - "@ethersproject/sha2": 5.7.0 - "@ethersproject/properties@5.7.0": dependencies: "@ethersproject/logger": 5.7.0 @@ -1815,15 +1700,6 @@ snapshots: elliptic: 6.5.4 hash.js: 1.1.7 - "@ethersproject/solidity@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/sha2": 5.7.0 - "@ethersproject/strings": 5.7.0 - "@ethersproject/strings@5.7.0": dependencies: "@ethersproject/bytes": 5.7.0 @@ -1842,30 +1718,6 @@ snapshots: "@ethersproject/rlp": 5.7.0 "@ethersproject/signing-key": 5.7.0 - "@ethersproject/units@5.7.0": - dependencies: - "@ethersproject/bignumber": 5.7.0 - "@ethersproject/constants": 5.7.0 - "@ethersproject/logger": 5.7.0 - - "@ethersproject/wallet@5.7.0": - dependencies: - "@ethersproject/abstract-provider": 5.7.0 - "@ethersproject/abstract-signer": 5.7.0 - "@ethersproject/address": 5.7.0 - "@ethersproject/bignumber": 5.7.0 - "@ethersproject/bytes": 5.7.0 - "@ethersproject/hash": 5.7.0 - "@ethersproject/hdnode": 5.7.0 - "@ethersproject/json-wallets": 5.7.0 - "@ethersproject/keccak256": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/random": 5.7.0 - "@ethersproject/signing-key": 5.7.0 - "@ethersproject/transactions": 5.7.0 - "@ethersproject/wordlists": 5.7.0 - "@ethersproject/web@5.7.1": dependencies: "@ethersproject/base64": 5.7.0 @@ -1874,14 +1726,6 @@ snapshots: "@ethersproject/properties": 5.7.0 "@ethersproject/strings": 5.7.0 - "@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 - "@jridgewell/gen-mapping@0.3.3": dependencies: "@jridgewell/set-array": 1.1.2 @@ -1918,8 +1762,6 @@ snapshots: "@noble/secp256k1@1.7.1": {} - "@openzeppelin/contracts-upgradeable@4.7.3": {} - "@openzeppelin/contracts-upgradeable@4.9.5": {} "@openzeppelin/contracts@3.4.2": {} @@ -1928,19 +1770,12 @@ snapshots: "@openzeppelin/contracts@4.3.3": {} - "@openzeppelin/contracts@4.7.3": {} - - "@openzeppelin/contracts@4.9.3": {} - "@openzeppelin/contracts@5.0.1": {} "@prettier/sync@0.3.0(prettier@3.2.5)": dependencies: prettier: 3.2.5 - "@rari-capital/solmate@git+https://git@github.com:rari-capital/solmate.git#8f9b23f8838670afda0fd8983f2c41e8037ae6bc": - {} - "@scure/base@1.1.7": {} "@scure/bip32@1.4.0": @@ -2005,8 +1840,6 @@ snapshots: acorn@8.11.3: {} - aes-js@3.0.0: {} - aes-js@4.0.0-beta.5: {} ajv@6.12.6: @@ -2161,9 +1994,6 @@ snapshots: slice-ansi: 5.0.0 string-width: 5.1.2 - clones-with-immutable-args@https://codeload.github.com/Saw-mon-and-Natalie/clones-with-immutable-args/tar.gz/105efee1b9127ed7f6fedf139e1fc796ce8791f2: - {} - code-red@1.0.4: dependencies: "@jridgewell/sourcemap-codec": 1.4.15 @@ -2242,20 +2072,6 @@ snapshots: dequal@2.0.3: {} - dev-fraxtal-contracts@https://codeload.github.com/FraxFinance/fraxtal-contracts/tar.gz/d533b607c0d32d10d9a43ada8aa5d6fadf892e8e: - dependencies: - "@openzeppelin-4/contracts": "@openzeppelin/contracts@4.9.3" - "@openzeppelin-5/contracts": "@openzeppelin/contracts@5.0.1" - "@openzeppelin/contracts": 4.7.3 - "@openzeppelin/contracts-upgradeable": 4.7.3 - "@rari-capital/solmate": git+https://git@github.com:rari-capital/solmate.git#8f9b23f8838670afda0fd8983f2c41e8037ae6bc - clones-with-immutable-args: https://codeload.github.com/Saw-mon-and-Natalie/clones-with-immutable-args/tar.gz/105efee1b9127ed7f6fedf139e1fc796ce8791f2 - dotenv: 16.4.5 - ethers: 5.7.2 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - diff@4.0.2: {} dot-case@3.0.4: @@ -2263,8 +2079,6 @@ snapshots: no-case: 3.0.4 tslib: 2.6.2 - dotenv@16.4.5: {} - ds-test@https://codeload.github.com/dapphub/ds-test/tar.gz/e282159d5170298eb2455a6c05280ab5a73a4ef0: {} eastasianwidth@0.2.0: {} @@ -2300,42 +2114,6 @@ snapshots: "@scure/bip32": 1.4.0 "@scure/bip39": 1.3.0 - ethers@5.7.2: - dependencies: - "@ethersproject/abi": 5.7.0 - "@ethersproject/abstract-provider": 5.7.0 - "@ethersproject/abstract-signer": 5.7.0 - "@ethersproject/address": 5.7.0 - "@ethersproject/base64": 5.7.0 - "@ethersproject/basex": 5.7.0 - "@ethersproject/bignumber": 5.7.0 - "@ethersproject/bytes": 5.7.0 - "@ethersproject/constants": 5.7.0 - "@ethersproject/contracts": 5.7.0 - "@ethersproject/hash": 5.7.0 - "@ethersproject/hdnode": 5.7.0 - "@ethersproject/json-wallets": 5.7.0 - "@ethersproject/keccak256": 5.7.0 - "@ethersproject/logger": 5.7.0 - "@ethersproject/networks": 5.7.1 - "@ethersproject/pbkdf2": 5.7.0 - "@ethersproject/properties": 5.7.0 - "@ethersproject/providers": 5.7.2 - "@ethersproject/random": 5.7.0 - "@ethersproject/rlp": 5.7.0 - "@ethersproject/sha2": 5.7.0 - "@ethersproject/signing-key": 5.7.0 - "@ethersproject/solidity": 5.7.0 - "@ethersproject/strings": 5.7.0 - "@ethersproject/transactions": 5.7.0 - "@ethersproject/units": 5.7.0 - "@ethersproject/wallet": 5.7.0 - "@ethersproject/web": 5.7.1 - "@ethersproject/wordlists": 5.7.0 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - ethers@6.13.2: dependencies: "@adraffy/ens-normalize": 1.10.1 @@ -2721,8 +2499,6 @@ snapshots: rfdc@1.3.1: {} - scrypt-js@3.0.1: {} - semver@5.7.2: {} semver@7.6.0: From 919a4185512289ad6fdbd68a3fbede71aff89c2a Mon Sep 17 00:00:00 2001 From: Carter Carlson Date: Tue, 6 Aug 2024 15:03:06 -0700 Subject: [PATCH 15/15] docs: e2e code ferry on tron --- scripts/Fraxferry-abi.json | 576 +++++++++++++++++++++++++++++++++++++ scripts/tron-tests.js | 53 +++- 2 files changed, 623 insertions(+), 6 deletions(-) create mode 100644 scripts/Fraxferry-abi.json diff --git a/scripts/Fraxferry-abi.json b/scripts/Fraxferry-abi.json new file mode 100644 index 0000000..5f2d976 --- /dev/null +++ b/scripts/Fraxferry-abi.json @@ -0,0 +1,576 @@ +[ + { + "inputs": [ + { "internalType": "address", "name": "_token", "type": "address" }, + { "internalType": "uint256", "name": "_chainid", "type": "uint256" }, + { "internalType": "address", "name": "_targetToken", "type": "address" }, + { "internalType": "uint256", "name": "_targetChain", "type": "uint256" } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "index", "type": "uint256" }, + { "indexed": false, "internalType": "bool", "name": "cancel", "type": "bool" } + ], + "name": "Cancelled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "batchNo", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "start", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "end", "type": "uint256" }, + { "indexed": false, "internalType": "bytes32", "name": "hash", "type": "bytes32" } + ], + "name": "Depart", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "start", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "end", "type": "uint256" }, + { "indexed": false, "internalType": "bytes32", "name": "hash", "type": "bytes32" } + ], + "name": "Disembark", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "batchNo", "type": "uint256" }, + { "indexed": false, "internalType": "bytes32", "name": "hash", "type": "bytes32" } + ], + "name": "DisputeBatch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, + { "indexed": false, "internalType": "uint256", "name": "index", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "amountAfterFee", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "timestamp", "type": "uint256" } + ], + "name": "Embark", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "address", "name": "addr", "type": "address" }, + { "indexed": false, "internalType": "bool", "name": "is_fee_exempt", "type": "bool" } + ], + "name": "FeeExemptToggled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } + ], + "name": "OwnerChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" }], + "name": "OwnerNominated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "bool", "name": "paused", "type": "bool" }], + "name": "Pause", + "type": "event" + }, + { + "anonymous": false, + "inputs": [{ "indexed": false, "internalType": "uint256", "name": "batchNo", "type": "uint256" }], + "name": "RemoveBatch", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "previousCaptain", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "newCaptain", "type": "address" } + ], + "name": "SetCaptain", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "crewmember", "type": "address" }, + { "indexed": false, "internalType": "bool", "name": "set", "type": "bool" } + ], + "name": "SetCrewmember", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "previousFeeRate", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "feeRate", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "previousFeeMin", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "feeMin", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "previousFeeMax", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "feeMax", "type": "uint256" } + ], + "name": "SetFee", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": true, "internalType": "address", "name": "previousFirstOfficer", "type": "address" }, + { "indexed": true, "internalType": "address", "name": "newFirstOfficer", "type": "address" } + ], + "name": "SetFirstOfficer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { "indexed": false, "internalType": "uint256", "name": "previousMinWaitAdd", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "previousMinWaitExecute", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "minWaitAdd", "type": "uint256" }, + { "indexed": false, "internalType": "uint256", "name": "minWaitExecute", "type": "uint256" } + ], + "name": "SetMinWaitPeriods", + "type": "event" + }, + { + "inputs": [], + "name": "FEE_MAX", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "FEE_MIN", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "FEE_RATE", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_WAIT_PERIOD_ADD", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_WAIT_PERIOD_EXECUTE", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REDUCED_DECIMALS", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { "inputs": [], "name": "acceptOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "name": "batches", + "outputs": [ + { "internalType": "uint64", "name": "start", "type": "uint64" }, + { "internalType": "uint64", "name": "end", "type": "uint64" }, + { "internalType": "uint64", "name": "departureTime", "type": "uint64" }, + { "internalType": "uint64", "name": "status", "type": "uint64" }, + { "internalType": "bytes32", "name": "hash", "type": "bytes32" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "name": "cancelled", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "captain", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "chainid", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "crewmembers", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "start", "type": "uint256" }, + { "internalType": "uint256", "name": "end", "type": "uint256" }, + { "internalType": "bytes32", "name": "hash", "type": "bytes32" } + ], + "name": "depart", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { "internalType": "uint256", "name": "startTransactionNo", "type": "uint256" }, + { + "components": [ + { "internalType": "address", "name": "user", "type": "address" }, + { "internalType": "uint64", "name": "amount", "type": "uint64" }, + { "internalType": "uint32", "name": "timestamp", "type": "uint32" } + ], + "internalType": "struct Fraxferry.Transaction[]", + "name": "transactions", + "type": "tuple[]" + } + ], + "internalType": "struct Fraxferry.BatchData", + "name": "batchData", + "type": "tuple" + } + ], + "name": "disembark", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "batchNo", "type": "uint256" }, + { "internalType": "bytes32", "name": "hash", "type": "bytes32" } + ], + "name": "disputeBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "amount", "type": "uint256" }], + "name": "embark", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "amount", "type": "uint256" }, + { "internalType": "address", "name": "recipient", "type": "address" } + ], + "name": "embarkWithRecipient", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "_amount", "type": "uint256" }, + { "internalType": "address", "name": "recipient", "type": "address" }, + { "internalType": "uint256", "name": "deadline", "type": "uint256" }, + { "internalType": "bool", "name": "approveMax", "type": "bool" }, + { "internalType": "uint8", "name": "v", "type": "uint8" }, + { "internalType": "bytes32", "name": "r", "type": "bytes32" }, + { "internalType": "bytes32", "name": "s", "type": "bytes32" } + ], + "name": "embarkWithSignature", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "_to", "type": "address" }, + { "internalType": "uint256", "name": "_value", "type": "uint256" }, + { "internalType": "bytes", "name": "_data", "type": "bytes" } + ], + "name": "execute", + "outputs": [ + { "internalType": "bool", "name": "", "type": "bool" }, + { "internalType": "bytes", "name": "", "type": "bytes" } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "executeIndex", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "", "type": "address" }], + "name": "fee_exempt_addrs", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "firstOfficer", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "start", "type": "uint256" }, + { "internalType": "uint256", "name": "end", "type": "uint256" } + ], + "name": "getBatchAmount", + "outputs": [{ "internalType": "uint256", "name": "totalAmount", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "start", "type": "uint256" }, + { "internalType": "uint256", "name": "end", "type": "uint256" } + ], + "name": "getBatchData", + "outputs": [ + { + "components": [ + { "internalType": "uint256", "name": "startTransactionNo", "type": "uint256" }, + { + "components": [ + { "internalType": "address", "name": "user", "type": "address" }, + { "internalType": "uint64", "name": "amount", "type": "uint64" }, + { "internalType": "uint32", "name": "timestamp", "type": "uint32" } + ], + "internalType": "struct Fraxferry.Transaction[]", + "name": "transactions", + "type": "tuple[]" + } + ], + "internalType": "struct Fraxferry.BatchData", + "name": "data", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "_start", "type": "uint256" }, + { "internalType": "uint256", "name": "max", "type": "uint256" } + ], + "name": "getNextBatch", + "outputs": [ + { "internalType": "uint256", "name": "start", "type": "uint256" }, + { "internalType": "uint256", "name": "end", "type": "uint256" }, + { "internalType": "bytes32", "name": "hash", "type": "bytes32" } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "start", "type": "uint256" }, + { "internalType": "uint256", "name": "end", "type": "uint256" } + ], + "name": "getTransactionsHash", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "index", "type": "uint256" }, + { "internalType": "bool", "name": "cancel", "type": "bool" } + ], + "name": "jettison", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256[]", "name": "indexes", "type": "uint256[]" }, + { "internalType": "bool", "name": "cancel", "type": "bool" } + ], + "name": "jettisonGroup", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "noBatches", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "noTransactions", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], + "name": "nominateNewOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "nominatedOwner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { "inputs": [], "name": "pause", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "paused", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "batchNo", "type": "uint256" }], + "name": "removeBatches", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "receiver", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "name": "sendTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newCaptain", "type": "address" }], + "name": "setCaptain", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "crewmember", "type": "address" }, + { "internalType": "bool", "name": "set", "type": "bool" } + ], + "name": "setCrewmember", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "_FEE_RATE", "type": "uint256" }, + { "internalType": "uint256", "name": "_FEE_MIN", "type": "uint256" }, + { "internalType": "uint256", "name": "_FEE_MAX", "type": "uint256" } + ], + "name": "setFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "newFirstOfficer", "type": "address" }], + "name": "setFirstOfficer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { "internalType": "uint256", "name": "_MIN_WAIT_PERIOD_ADD", "type": "uint256" }, + { "internalType": "uint256", "name": "_MIN_WAIT_PERIOD_EXECUTE", "type": "uint256" } + ], + "name": "setMinWaitPeriods", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "targetChain", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "targetToken", + "outputs": [{ "internalType": "contract IERC20", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }], + "name": "toggleFeeExemptAddr", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "token", + "outputs": [{ "internalType": "contract IERC20", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "name": "transactions", + "outputs": [ + { "internalType": "address", "name": "user", "type": "address" }, + { "internalType": "uint64", "name": "amount", "type": "uint64" }, + { "internalType": "uint32", "name": "timestamp", "type": "uint32" } + ], + "stateMutability": "view", + "type": "function" + }, + { "inputs": [], "name": "unPause", "outputs": [], "stateMutability": "nonpayable", "type": "function" } +] diff --git a/scripts/tron-tests.js b/scripts/tron-tests.js index 2b56a53..06a2511 100644 --- a/scripts/tron-tests.js +++ b/scripts/tron-tests.js @@ -1,3 +1,4 @@ +const BigNumber = require("bignumber.js"); const TronWeb = require("tronweb"); // NOTE: "@noble/secp256k1" needs to be @ "1.7.1" const tronWeb = new TronWeb({ @@ -6,7 +7,8 @@ const tronWeb = new TronWeb({ privateKey: process.env.TRON_PK, // as hex string without the 0x }); -let abi = require("./ERC20PermissionedMint-abi.json"); +let fraxAbi = require("./ERC20PermissionedMint-abi.json"); +let ferryAbi = require("./Fraxferry-abi.json"); let fraxAddress = "TQZTkTMbkC9923LtVHZcSrdqcW5rVhkZHP"; let ferryAddress = "TGxtcNUY9q19FATX3tFxzkmBhQigVDTFJs"; @@ -20,12 +22,51 @@ let deployerAddress = tronWeb.address.fromHex(deployerAsFullHex); console.log(deployerAddress); // TLNe6KF1dUSYBcZ4fzTstoKB8bkzQewz42 async function main() { - let ctr = await tronWeb.contract(abi, fraxAddress); - // View call - let balance = await ctr.balanceOf(ferryAddress).call(); - // ERC20.transfer() call + /// @dev: fraxAsEVMHex does NOT work here. Must use tron address + let frax = await tronWeb.contract(fraxAbi, fraxAddress); + let ferry = await tronWeb.contract(ferryAbi, ferryAddress); + + // View frax balance + let balance = await frax.balanceOf(ferryAddress).call(); + + // frax transfer + // await frax.transfer(ferryAddress, 123456).send(); // https://tronscan.org/#/transaction/a8a22abfda01745cf6475b826a0cc1bfb21ccc7e86be7d87fe76c3fed2976020 - await ctr.transfer(ferryAddress, 123456).send(); + + let amount500 = "500000000000000000000"; + + // Approve ferry to spend amount500 + // await frax.approve(ferryAddress, amount500).send(); + // https://tronscan.org/#/transaction/4b340859fc81fad541c692b5dea1c94b463a49e2e2861211b6b9a69a5d509786 + + // embark 500 FRAX + // await ferry.embark(amount500).send(); + // https://tronscan.org/#/transaction/cccdc0051cc707f7cc32ac85802edc2abe4a25fc08fbdb8107a12b605b271c67 + + // let amount200 = "200000000000000000000"; + // await frax.approve(ferryAddress, amount200).send(); + // await ferry.embark(amount200).send(); + + // From tx 0 on fraxtal + // await ferry.depart(0, 0, "0x440440273a8244ffd45d7e29a27cf70cbbe0f7bb71d34b8d6f51fadf20ca1f2b"); + + // @dev these two hashes submitted on fraxtal ferry as `depart(0, 0, 0xf4..)`, `depart(1, 1, 0x00..)` + // await ferry.getTransactionsHash(0,0) = 0xf4c84d93ec6532053d3ae296cf8bdac74b1f54cd0f1918e66c948e5ce2a040f0 + // await ferry.getTransactionsHash(1,1) = 0x00d0d1c4d700f745611e9ee8aa9b76e02c6b8a7b84354eb41e2a7627be9e52be + + let batchNo = 0; + // Converted 0xb0e to tron-hex + let user = "TS6TwX43hqn6qCQMz7nBAxHqvZuaWYY9mM"; // 0xb0e1650a9760e0f383174af042091fc544b8356f + let amount = 9500000000; + let timestamp = 1722460387; + + let batchData = [batchNo.toString(), [[user, amount.toString(), timestamp.toString()]]]; + await ferry.disembark(batchData).send(); + + /// @dev: ferry.getBatchData on tron returns "41b0e1650a9760e0f383174af042091fc544b8356f" for `user` (41 + evm hex) + let batchDataOld = await ferry.getBatchData(0, 0).call(); + console.log("data[0]"); + console.log(batchDataOld[0]); } (async function () {