diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..2c8866d --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,43 @@ +name: "CI" + +on: + workflow_dispatch: + pull_request: + push: + branches: + - "master" + +jobs: + test: + runs-on: "ubuntu-latest" + steps: + - name: "Check out the repo" + uses: "actions/checkout@v4" + + - name: "Install Node.js" + uses: "actions/setup-node@v3" + with: + node-version: "20" + + - name: "Install Yarn" + run: "npm install --global yarn" + + - name: "Install Node.js dependencies" + run: "yarn install" + + - name: "Create .env file" + run: | + echo 'PROVIDER_URL="https://mainnet.infura.io/v3/00000000000000000000000000000000"' > .env + echo 'PROVIDER_WSS="wss://mainnet.infura.io/ws/v3/00000000000000000000000000000000"' >> .env + echo 'FORWARD_URL="https://relay.flashbots.net"' >> .env + echo 'OVAL_CONFIGS="{"0x000000000000000000000000000000000000beef":{"unlockerKey":"0x000000000000000000000000000000000000000000000000000000000000beef","refundAddress":"0x000000000000000000000000000000000000beef","refundPercent":90}}"' >> .env + echo 'AUTH_PRIVATE_KEY="0x0000000000000000000000000000000000000000000000000000000000000000"' >> .env + echo 'MAINNET_BLOCK_OFFSET=5' >> .env + + - name: "Run the tests" + run: "yarn test" + + - name: "Add test summary" + run: | + echo "## Tests result" >> $GITHUB_STEP_SUMMARY + echo "✅ Passed" >> $GITHUB_STEP_SUMMARY diff --git a/.gitignore b/.gitignore index 63e3f2f..b6794c2 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ build *.log .env .DS_Store -out \ No newline at end of file +out +src/contract-types \ No newline at end of file diff --git a/.mocharc.json b/.mocharc.json new file mode 100644 index 0000000..f5f738c --- /dev/null +++ b/.mocharc.json @@ -0,0 +1,11 @@ +{ + "require": "ts-node/register", + "extension": [ + "ts" + ], + "spec": "test/**/*.ts", + "watch-files": [ + "src/**/*.ts", + "test/**/*.ts" + ] +} \ No newline at end of file diff --git a/README.md b/README.md index c6dc611..773888a 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ Define a `.env` file and define, at minimum, the following (see [here](./src/lib ``` OVAL_CONFIGS= # JSON string that maps Oval contract addresses to their specific configurations (see below). +OVAL_CONFIGS_SHARED=# JSON string for shared unlocker configurations (see below). OVAL_ADDRESS=0x420 # (Only if not using OVAL_CONFIGS) The address of the Oval contract you want to target with the Oval Node. REFUND_ADDRESS=0x42069 # (Only if not using OVAL_CONFIGS) The refund address you want to send the OEV kickback to. REFUND_PERCENT=0.5 # (Only if not using OVAL_CONFIGS) The percentage of the OEV kickback to send to the refund address. @@ -48,7 +49,6 @@ CHAIN_ID= # Chain ID of the Ethereum network `OVAL_CONFIGS` is a JSON string that maps Oval contract addresses to their specific configurations. Each entry in this JSON object should have the following format: - ```json { "": { @@ -66,6 +66,19 @@ CHAIN_ID= # Chain ID of the Ethereum network - `Refund_Address`: The Ethereum address where refunds will be sent. - `Refund_Percentage`: The percentage of the OEV kickback to send to the refund address. +`OVAL_CONFIGS_SHARED` is a JSON string that specifies the shared unlocker configurations for all Oval contracts. Each entry in this JSON object should have the following format: + +```json +[ + { + "unlockerKey": "", // Optional: Use either this or gckmsKeyId, not both. + "gckmsKeyId": "", // Optional: Use either this or unlockerKey, not both. + },... +] +``` + +Note: If an Oval instance has an instance specific configuration, it will take precedence over the shared configuration. + ### 2. Build & run the Oval Node: Build the JS with: diff --git a/package.json b/package.json index 89a5614..be539fd 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@types/uuid": "^9.0.8", "@uma/logger": "^1.1.0", "axios": "^1.5.1", + "bluebird": "^3.7.2", "body-parser": "^1.20.2", "ethers": "^6.8.0", "express": "^4.18.2", @@ -26,16 +27,27 @@ "typescript": "^5.2.2" }, "devDependencies": { + "@typechain/ethers-v6": "^0.5.1", + "@types/bluebird": "^3.5.42", + "@types/chai": "^4.3.16", "@types/eventsource": "^1.1.11", + "@types/mocha": "^10.0.7", "@types/node": "^18.14.4", + "@types/sinon": "^17.0.3", "@typescript-eslint/eslint-plugin": "^5.56.0", "@typescript-eslint/parser": "^5.56.0", - "dotenv": "^16.3.1" + "chai": "^4.4.1", + "dotenv": "^16.3.1", + "mocha": "^10.6.0", + "sinon": "^18.0.0", + "typechain": "^8.3.2" }, "scripts": { "dev": "nodemon", - "build": "tsc", + "build": "yarn generate-contract-types && tsc", + "test": "yarn generate-contract-types && mocha", "start": "node ./out/index.js", - "lint": "prettier './**/*.ts' --write" + "lint": "prettier './**/*.ts' --write", + "generate-contract-types": "rm -rf src/contract-types && mkdir -p src/contract-types && typechain --target ethers-v6 --out-dir src/contract-types 'src/abi/*.json'" } -} +} \ No newline at end of file diff --git a/src/abi/Oval.ts b/src/abi/Oval.ts deleted file mode 100644 index 502341c..0000000 --- a/src/abi/Oval.ts +++ /dev/null @@ -1,395 +0,0 @@ -// Todo: move to using typechain exports -export const ovalAbi = [ - { - inputs: [ - { internalType: "address", name: "chainlinkSource", type: "address" }, - { internalType: "address", name: "chronicleSource", type: "address" }, - { internalType: "address", name: "pythSource", type: "address" }, - { internalType: "bytes32", name: "pythPriceId", type: "bytes32" }, - { internalType: "uint8", name: "decimals", type: "uint8" }, - ], - stateMutability: "nonpayable", - type: "constructor", - }, - { - anonymous: false, - inputs: [{ indexed: true, internalType: "uint8", name: "decimals", type: "uint8" }], - name: "DecimalsSet", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "uint256", - name: "timestamp", - type: "uint256", - }, - ], - name: "LatestValueUnlocked", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "uint256", - name: "lockWindow", - type: "uint256", - }, - ], - name: "LockWindowSet", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "uint256", - name: "maxTraversal", - type: "uint256", - }, - ], - name: "MaxTraversalSet", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "previousOwner", - type: "address", - }, - { - indexed: true, - internalType: "address", - name: "newOwner", - type: "address", - }, - ], - name: "OwnershipTransferred", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: false, - internalType: "uint256", - name: "snapshotIndex", - type: "uint256", - }, - { - indexed: true, - internalType: "uint256", - name: "timestamp", - type: "uint256", - }, - { indexed: true, internalType: "int256", name: "answer", type: "int256" }, - ], - name: "SnapshotTaken", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "sourceOracle", - type: "address", - }, - { - indexed: true, - internalType: "bytes32", - name: "pythPriceId", - type: "bytes32", - }, - ], - name: "SourceSet", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "sourceOracle", - type: "address", - }, - ], - name: "SourceSet", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "sourceOracle", - type: "address", - }, - { - indexed: true, - internalType: "uint8", - name: "sourceDecimals", - type: "uint8", - }, - ], - name: "SourceSet", - type: "event", - }, - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "unlocker", - type: "address", - }, - { indexed: true, internalType: "bool", name: "allowed", type: "bool" }, - ], - name: "UnlockerSet", - type: "event", - }, - { - inputs: [], - name: "BOUNDING_TOLERANCE", - outputs: [{ internalType: "uint256", name: "", type: "uint256" }], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "CHAINLINK_SOURCE", - outputs: [ - { - internalType: "contract IAggregatorV3Source", - name: "", - type: "address", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "CHRONICLE_SOURCE", - outputs: [{ internalType: "contract IMedian", name: "", type: "address" }], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "PYTH_PRICE_ID", - outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "PYTH_SOURCE", - outputs: [{ internalType: "contract IPyth", name: "", type: "address" }], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { internalType: "address", name: "caller", type: "address" }, - { internalType: "uint256", name: "_lastUnlockTime", type: "uint256" }, - ], - name: "canUnlock", - outputs: [{ internalType: "bool", name: "", type: "bool" }], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "decimals", - outputs: [{ internalType: "uint8", name: "", type: "uint8" }], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "getLatestSourceData", - outputs: [ - { internalType: "int256", name: "answer", type: "int256" }, - { internalType: "uint256", name: "timestamp", type: "uint256" }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "internalLatestData", - outputs: [ - { internalType: "int256", name: "", type: "int256" }, - { internalType: "uint256", name: "", type: "uint256" }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "lastUnlockTime", - outputs: [{ internalType: "uint256", name: "", type: "uint256" }], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "latestAnswer", - outputs: [{ internalType: "int256", name: "", type: "int256" }], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "latestRoundData", - outputs: [ - { internalType: "uint80", name: "", type: "uint80" }, - { internalType: "int256", name: "", type: "int256" }, - { internalType: "uint256", name: "", type: "uint256" }, - { internalType: "uint256", name: "", type: "uint256" }, - { internalType: "uint80", name: "", type: "uint80" }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "latestSnapshotData", - outputs: [ - { - components: [ - { internalType: "int256", name: "answer", type: "int256" }, - { internalType: "uint256", name: "timestamp", type: "uint256" }, - ], - internalType: "struct SnapshotSource.Snapshot", - name: "", - type: "tuple", - }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "latestTimestamp", - outputs: [{ internalType: "uint256", name: "", type: "uint256" }], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "lockWindow", - outputs: [{ internalType: "uint256", name: "", type: "uint256" }], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "maxTraversal", - outputs: [{ internalType: "uint256", name: "", type: "uint256" }], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "owner", - outputs: [{ internalType: "address", name: "", type: "address" }], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "renounceOwnership", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [{ internalType: "uint256", name: "newLockWindow", type: "uint256" }], - name: "setLockWindow", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [{ internalType: "uint256", name: "newMaxTraversal", type: "uint256" }], - name: "setMaxTraversal", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { internalType: "address", name: "unlocker", type: "address" }, - { internalType: "bool", name: "allowed", type: "bool" }, - ], - name: "setUnlocker", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "snapshotData", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [{ internalType: "uint256", name: "", type: "uint256" }], - name: "snapshots", - outputs: [ - { internalType: "int256", name: "answer", type: "int256" }, - { internalType: "uint256", name: "timestamp", type: "uint256" }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [{ internalType: "address", name: "newOwner", type: "address" }], - name: "transferOwnership", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { internalType: "uint256", name: "timestamp", type: "uint256" }, - { internalType: "uint256", name: "maxTraversal", type: "uint256" }, - ], - name: "tryLatestDataAt", - outputs: [ - { internalType: "int256", name: "", type: "int256" }, - { internalType: "uint256", name: "", type: "uint256" }, - ], - stateMutability: "view", - type: "function", - }, - { - inputs: [], - name: "unlockLatestValue", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [{ internalType: "address", name: "", type: "address" }], - name: "unlockers", - outputs: [{ internalType: "bool", name: "", type: "bool" }], - stateMutability: "view", - type: "function", - }, -]; diff --git a/src/abi/PermissionProxy.json b/src/abi/PermissionProxy.json new file mode 100644 index 0000000..7b091ce --- /dev/null +++ b/src/abi/PermissionProxy.json @@ -0,0 +1 @@ +{"abi":[{"type":"function","name":"execute","inputs":[{"name":"target","type":"address","internalType":"address"},{"name":"callData","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"type":"function","name":"multicall","inputs":[{"name":"data","type":"bytes[]","internalType":"bytes[]"}],"outputs":[{"name":"results","type":"bytes[]","internalType":"bytes[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"senders","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"setSender","inputs":[{"name":"sender","type":"address","internalType":"address"},{"name":"allowed","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SenderSet","inputs":[{"name":"sender","type":"address","indexed":false,"internalType":"address"},{"name":"allowed","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"error","name":"CallFailed","inputs":[{"name":"target","type":"address","internalType":"address"},{"name":"callData","type":"bytes","internalType":"bytes"}]},{"type":"error","name":"SenderNotApproved","inputs":[{"name":"sender","type":"address","internalType":"address"}]}],"bytecode":{"object":"0x608060405234801561001057600080fd5b5061001a3361001f565b61006f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6109978061007e6000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063982fb9d81161005b578063982fb9d8146100d0578063ac9650d814610103578063cf2c550c14610123578063f2fde38b1461013657600080fd5b80631cff79cd14610082578063715018a6146100ab5780638da5cb5b146100b5575b600080fd5b61009561009036600461061c565b610149565b6040516100a2919061072e565b60405180910390f35b6100b3610211565b005b6000546040516001600160a01b0390911681526020016100a2565b6100f36100de366004610741565b60016020526000908152604090205460ff1681565b60405190151581526020016100a2565b61011661011136600461075c565b610225565b6040516100a291906107d1565b6100b3610131366004610833565b61031a565b6100b3610144366004610741565b610385565b3360009081526001602052604090205460609060ff1661018357604051636ae23d1f60e01b81523360048201526024015b60405180910390fd5b600080846001600160a01b03166000856040516101a0919061086f565b60006040518083038185875af1925050503d80600081146101dd576040519150601f19603f3d011682016040523d82523d6000602084013e6101e2565b606091505b509150915081610209578484604051636c544f3360e01b815260040161017a92919061088b565b949350505050565b6102196103fe565b6102236000610458565b565b60608167ffffffffffffffff81111561024057610240610606565b60405190808252806020026020018201604052801561027357816020015b606081526020019060019003908161025e5790505b50905060005b82811015610313576102e330858584818110610297576102976108af565b90506020028101906102a991906108c5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506104a892505050565b8282815181106102f5576102f56108af565b6020026020010181905250808061030b90610913565b915050610279565b5092915050565b6103226103fe565b6001600160a01b038216600081815260016020908152604091829020805460ff19168515159081179091558251938452908301527f8f2370569c3f86d7030114a30f04d77c85f28ab3f365eb3ebb918575841c4fa4910160405180910390a15050565b61038d6103fe565b6001600160a01b0381166103f25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161017a565b6103fb81610458565b50565b6000546001600160a01b031633146102235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161017a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60606104cd838360405180606001604052806027815260200161093b602791396104d4565b9392505050565b6060600080856001600160a01b0316856040516104f1919061086f565b600060405180830381855af49150503d806000811461052c576040519150601f19603f3d011682016040523d82523d6000602084013e610531565b606091505b50915091506105428683838761054c565b9695505050505050565b606083156105bb5782516000036105b4576001600160a01b0385163b6105b45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161017a565b5081610209565b61020983838151156105d05781518083602001fd5b8060405162461bcd60e51b815260040161017a919061072e565b80356001600160a01b038116811461060157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561062f57600080fd5b610638836105ea565b9150602083013567ffffffffffffffff8082111561065557600080fd5b818501915085601f83011261066957600080fd5b81358181111561067b5761067b610606565b604051601f8201601f19908116603f011681019083821181831017156106a3576106a3610606565b816040528281528860208487010111156106bc57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156106f95781810151838201526020016106e1565b50506000910152565b6000815180845261071a8160208601602086016106de565b601f01601f19169290920160200192915050565b6020815260006104cd6020830184610702565b60006020828403121561075357600080fd5b6104cd826105ea565b6000806020838503121561076f57600080fd5b823567ffffffffffffffff8082111561078757600080fd5b818501915085601f83011261079b57600080fd5b8135818111156107aa57600080fd5b8660208260051b85010111156107bf57600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561082657603f19888603018452610814858351610702565b945092850192908501906001016107f8565b5092979650505050505050565b6000806040838503121561084657600080fd5b61084f836105ea565b91506020830135801515811461086457600080fd5b809150509250929050565b600082516108818184602087016106de565b9190910192915050565b6001600160a01b038316815260406020820181905260009061020990830184610702565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126108dc57600080fd5b83018035915067ffffffffffffffff8211156108f757600080fd5b60200191503681900382131561090c57600080fd5b9250929050565b60006001820161093357634e487b7160e01b600052601160045260246000fd5b506001019056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122062cb28768ebad7fa180d4c11b8b16cf2b779333661631a8ea42b4b6eb584ff8864736f6c63430008110033","sourceMap":"553:1253:46:-:0;;;;;;;;;;;;-1:-1:-1;936:32:14;719:10:18;936:18:14;:32::i;:::-;553:1253:46;;2426:187:14;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:14;;;-1:-1:-1;;;;;;2534:17:14;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;553:1253:46:-;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063982fb9d81161005b578063982fb9d8146100d0578063ac9650d814610103578063cf2c550c14610123578063f2fde38b1461013657600080fd5b80631cff79cd14610082578063715018a6146100ab5780638da5cb5b146100b5575b600080fd5b61009561009036600461061c565b610149565b6040516100a2919061072e565b60405180910390f35b6100b3610211565b005b6000546040516001600160a01b0390911681526020016100a2565b6100f36100de366004610741565b60016020526000908152604090205460ff1681565b60405190151581526020016100a2565b61011661011136600461075c565b610225565b6040516100a291906107d1565b6100b3610131366004610833565b61031a565b6100b3610144366004610741565b610385565b3360009081526001602052604090205460609060ff1661018357604051636ae23d1f60e01b81523360048201526024015b60405180910390fd5b600080846001600160a01b03166000856040516101a0919061086f565b60006040518083038185875af1925050503d80600081146101dd576040519150601f19603f3d011682016040523d82523d6000602084013e6101e2565b606091505b509150915081610209578484604051636c544f3360e01b815260040161017a92919061088b565b949350505050565b6102196103fe565b6102236000610458565b565b60608167ffffffffffffffff81111561024057610240610606565b60405190808252806020026020018201604052801561027357816020015b606081526020019060019003908161025e5790505b50905060005b82811015610313576102e330858584818110610297576102976108af565b90506020028101906102a991906108c5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506104a892505050565b8282815181106102f5576102f56108af565b6020026020010181905250808061030b90610913565b915050610279565b5092915050565b6103226103fe565b6001600160a01b038216600081815260016020908152604091829020805460ff19168515159081179091558251938452908301527f8f2370569c3f86d7030114a30f04d77c85f28ab3f365eb3ebb918575841c4fa4910160405180910390a15050565b61038d6103fe565b6001600160a01b0381166103f25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161017a565b6103fb81610458565b50565b6000546001600160a01b031633146102235760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161017a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60606104cd838360405180606001604052806027815260200161093b602791396104d4565b9392505050565b6060600080856001600160a01b0316856040516104f1919061086f565b600060405180830381855af49150503d806000811461052c576040519150601f19603f3d011682016040523d82523d6000602084013e610531565b606091505b50915091506105428683838761054c565b9695505050505050565b606083156105bb5782516000036105b4576001600160a01b0385163b6105b45760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161017a565b5081610209565b61020983838151156105d05781518083602001fd5b8060405162461bcd60e51b815260040161017a919061072e565b80356001600160a01b038116811461060157600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561062f57600080fd5b610638836105ea565b9150602083013567ffffffffffffffff8082111561065557600080fd5b818501915085601f83011261066957600080fd5b81358181111561067b5761067b610606565b604051601f8201601f19908116603f011681019083821181831017156106a3576106a3610606565b816040528281528860208487010111156106bc57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60005b838110156106f95781810151838201526020016106e1565b50506000910152565b6000815180845261071a8160208601602086016106de565b601f01601f19169290920160200192915050565b6020815260006104cd6020830184610702565b60006020828403121561075357600080fd5b6104cd826105ea565b6000806020838503121561076f57600080fd5b823567ffffffffffffffff8082111561078757600080fd5b818501915085601f83011261079b57600080fd5b8135818111156107aa57600080fd5b8660208260051b85010111156107bf57600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561082657603f19888603018452610814858351610702565b945092850192908501906001016107f8565b5092979650505050505050565b6000806040838503121561084657600080fd5b61084f836105ea565b91506020830135801515811461086457600080fd5b809150509250929050565b600082516108818184602087016106de565b9190910192915050565b6001600160a01b038316815260406020820181905260009061020990830184610702565b634e487b7160e01b600052603260045260246000fd5b6000808335601e198436030181126108dc57600080fd5b83018035915067ffffffffffffffff8211156108f757600080fd5b60200191503681900382131561090c57600080fd5b9250929050565b60006001820161093357634e487b7160e01b600052601160045260246000fd5b506001019056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122062cb28768ebad7fa180d4c11b8b16cf2b779333661631a8ea42b4b6eb584ff8864736f6c63430008110033","sourceMap":"553:1253:46:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1417:387;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:14;;;:::i;:::-;;1201:85;1247:7;1273:6;1201:85;;-1:-1:-1;;;;;1273:6:14;;;2222:51:65;;2210:2;2195:18;1201:85:14;2076:203:65;758:39:46;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2640:14:65;;2633:22;2615:41;;2603:2;2588:18;758:39:46;2475:187:65;470:308:19;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;979:151:46:-;;;;;;:::i;:::-;;:::i;2074:198:14:-;;;;;;:::i;:::-;;:::i;1417:387:46:-;1528:10;1520:19;;;;:7;:19;;;;;;1491:12;;1520:19;;1515:87;;1562:29;;-1:-1:-1;;;1562:29:46;;1580:10;1562:29;;;2222:51:65;2195:18;;1562:29:46;;;;;;;;1515:87;1613:12;1627:23;1654:6;-1:-1:-1;;;;;1654:11:46;1673:1;1676:8;1654:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1612:73;;;;1701:7;1696:74;;1742:6;1750:8;1731:28;;-1:-1:-1;;;1731:28:46;;;;;;;;;:::i;1696:74::-;1787:10;1417:387;-1:-1:-1;;;;1417:387:46:o;1824:101:14:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;470:308:19:-;538:22;594:4;582:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;572:34;;621:9;616:132;636:15;;;616:132;;;685:52;722:4;729;;734:1;729:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;685:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;685:28:19;;-1:-1:-1;;;685:52:19:i;:::-;672:7;680:1;672:10;;;;;;;;:::i;:::-;;;;;;:65;;;;653:3;;;;;:::i;:::-;;;;616:132;;;;470:308;;;;:::o;979:151:46:-;1094:13:14;:11;:13::i;:::-;-1:-1:-1;;;;;1057:15:46;::::1;;::::0;;;:7:::1;:15;::::0;;;;;;;;:25;;-1:-1:-1;;1057:25:46::1;::::0;::::1;;::::0;;::::1;::::0;;;1097:26;;6129:51:65;;;6196:18;;;6189:50;1097:26:46::1;::::0;6102:18:65;1097:26:46::1;;;;;;;979:151:::0;;:::o;2074:198:14:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:14;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:14;;6452:2:65;2154:73:14::1;::::0;::::1;6434:21:65::0;6491:2;6471:18;;;6464:30;6530:34;6510:18;;;6503:62;-1:-1:-1;;;6581:18:65;;;6574:36;6627:19;;2154:73:14::1;6250:402:65::0;2154:73:14::1;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;1359:130::-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:14;719:10:18;1422:23:14;1414:68;;;;-1:-1:-1;;;1414:68:14;;6859:2:65;1414:68:14;;;6841:21:65;;;6878:18;;;6871:30;6937:34;6917:18;;;6910:62;6989:18;;1414:68:14;6657:356:65;2426:187:14;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:14;;;-1:-1:-1;;;;;;2534:17:14;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;6674:198:17:-;6757:12;6788:77;6809:6;6817:4;6788:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;6781:84;6674:198;-1:-1:-1;;;6674:198:17:o;7058:325::-;7199:12;7224;7238:23;7265:6;-1:-1:-1;;;;;7265:19:17;7285:4;7265:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7223:67;;;;7307:69;7334:6;7342:7;7351:10;7363:12;7307:26;:69::i;:::-;7300:76;7058:325;-1:-1:-1;;;;;;7058:325:17:o;7671:628::-;7851:12;7879:7;7875:418;;;7906:10;:17;7927:1;7906:22;7902:286;;-1:-1:-1;;;;;1702:19:17;;;8113:60;;;;-1:-1:-1;;;8113:60:17;;7220:2:65;8113:60:17;;;7202:21:65;7259:2;7239:18;;;7232:30;7298:31;7278:18;;;7271:59;7347:18;;8113:60:17;7018:353:65;8113:60:17;-1:-1:-1;8208:10:17;8201:17;;7875:418;8249:33;8257:10;8269:12;8980:17;;:21;8976:379;;9208:10;9202:17;9264:15;9251:10;9247:2;9243:19;9236:44;8976:379;9331:12;9324:20;;-1:-1:-1;;;9324:20:17;;;;;;;;:::i;14:173:65:-;82:20;;-1:-1:-1;;;;;131:31:65;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:127::-;253:10;248:3;244:20;241:1;234:31;284:4;281:1;274:15;308:4;305:1;298:15;324:995;401:6;409;462:2;450:9;441:7;437:23;433:32;430:52;;;478:1;475;468:12;430:52;501:29;520:9;501:29;:::i;:::-;491:39;;581:2;570:9;566:18;553:32;604:18;645:2;637:6;634:14;631:34;;;661:1;658;651:12;631:34;699:6;688:9;684:22;674:32;;744:7;737:4;733:2;729:13;725:27;715:55;;766:1;763;756:12;715:55;802:2;789:16;824:2;820;817:10;814:36;;;830:18;;:::i;:::-;905:2;899:9;873:2;959:13;;-1:-1:-1;;955:22:65;;;979:2;951:31;947:40;935:53;;;1003:18;;;1023:22;;;1000:46;997:72;;;1049:18;;:::i;:::-;1089:10;1085:2;1078:22;1124:2;1116:6;1109:18;1164:7;1159:2;1154;1150;1146:11;1142:20;1139:33;1136:53;;;1185:1;1182;1175:12;1136:53;1241:2;1236;1232;1228:11;1223:2;1215:6;1211:15;1198:46;1286:1;1281:2;1276;1268:6;1264:15;1260:24;1253:35;1307:6;1297:16;;;;;;;324:995;;;;;:::o;1324:250::-;1409:1;1419:113;1433:6;1430:1;1427:13;1419:113;;;1509:11;;;1503:18;1490:11;;;1483:39;1455:2;1448:10;1419:113;;;-1:-1:-1;;1566:1:65;1548:16;;1541:27;1324:250::o;1579:270::-;1620:3;1658:5;1652:12;1685:6;1680:3;1673:19;1701:76;1770:6;1763:4;1758:3;1754:14;1747:4;1740:5;1736:16;1701:76;:::i;:::-;1831:2;1810:15;-1:-1:-1;;1806:29:65;1797:39;;;;1838:4;1793:50;;1579:270;-1:-1:-1;;1579:270:65:o;1854:217::-;2001:2;1990:9;1983:21;1964:4;2021:44;2061:2;2050:9;2046:18;2038:6;2021:44;:::i;2284:186::-;2343:6;2396:2;2384:9;2375:7;2371:23;2367:32;2364:52;;;2412:1;2409;2402:12;2364:52;2435:29;2454:9;2435:29;:::i;2667:626::-;2764:6;2772;2825:2;2813:9;2804:7;2800:23;2796:32;2793:52;;;2841:1;2838;2831:12;2793:52;2881:9;2868:23;2910:18;2951:2;2943:6;2940:14;2937:34;;;2967:1;2964;2957:12;2937:34;3005:6;2994:9;2990:22;2980:32;;3050:7;3043:4;3039:2;3035:13;3031:27;3021:55;;3072:1;3069;3062:12;3021:55;3112:2;3099:16;3138:2;3130:6;3127:14;3124:34;;;3154:1;3151;3144:12;3124:34;3207:7;3202:2;3192:6;3189:1;3185:14;3181:2;3177:23;3173:32;3170:45;3167:65;;;3228:1;3225;3218:12;3167:65;3259:2;3251:11;;;;;3281:6;;-1:-1:-1;2667:626:65;;-1:-1:-1;;;;2667:626:65:o;3298:800::-;3458:4;3487:2;3527;3516:9;3512:18;3557:2;3546:9;3539:21;3580:6;3615;3609:13;3646:6;3638;3631:22;3684:2;3673:9;3669:18;3662:25;;3746:2;3736:6;3733:1;3729:14;3718:9;3714:30;3710:39;3696:53;;3784:2;3776:6;3772:15;3805:1;3815:254;3829:6;3826:1;3823:13;3815:254;;;3922:2;3918:7;3906:9;3898:6;3894:22;3890:36;3885:3;3878:49;3950:39;3982:6;3973;3967:13;3950:39;:::i;:::-;3940:49;-1:-1:-1;4047:12:65;;;;4012:15;;;;3851:1;3844:9;3815:254;;;-1:-1:-1;4086:6:65;;3298:800;-1:-1:-1;;;;;;;3298:800:65:o;4103:347::-;4168:6;4176;4229:2;4217:9;4208:7;4204:23;4200:32;4197:52;;;4245:1;4242;4235:12;4197:52;4268:29;4287:9;4268:29;:::i;:::-;4258:39;;4347:2;4336:9;4332:18;4319:32;4394:5;4387:13;4380:21;4373:5;4370:32;4360:60;;4416:1;4413;4406:12;4360:60;4439:5;4429:15;;;4103:347;;;;;:::o;4455:287::-;4584:3;4622:6;4616:13;4638:66;4697:6;4692:3;4685:4;4677:6;4673:17;4638:66;:::i;:::-;4720:16;;;;;4455:287;-1:-1:-1;;4455:287:65:o;4747:314::-;-1:-1:-1;;;;;4922:32:65;;4904:51;;4991:2;4986;4971:18;;4964:30;;;-1:-1:-1;;5011:44:65;;5036:18;;5028:6;5011:44;:::i;5066:127::-;5127:10;5122:3;5118:20;5115:1;5108:31;5158:4;5155:1;5148:15;5182:4;5179:1;5172:15;5198:521;5275:4;5281:6;5341:11;5328:25;5435:2;5431:7;5420:8;5404:14;5400:29;5396:43;5376:18;5372:68;5362:96;;5454:1;5451;5444:12;5362:96;5481:33;;5533:20;;;-1:-1:-1;5576:18:65;5565:30;;5562:50;;;5608:1;5605;5598:12;5562:50;5641:4;5629:17;;-1:-1:-1;5672:14:65;5668:27;;;5658:38;;5655:58;;;5709:1;5706;5699:12;5655:58;5198:521;;;;;:::o;5724:232::-;5763:3;5784:17;;;5781:140;;5843:10;5838:3;5834:20;5831:1;5824:31;5878:4;5875:1;5868:15;5906:4;5903:1;5896:15;5781:140;-1:-1:-1;5948:1:65;5937:13;;5724:232::o","linkReferences":{}},"methodIdentifiers":{"execute(address,bytes)":"1cff79cd","multicall(bytes[])":"ac9650d8","owner()":"8da5cb5b","renounceOwnership()":"715018a6","senders(address)":"982fb9d8","setSender(address,bool)":"cf2c550c","transferOwnership(address)":"f2fde38b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"name\":\"CallFailed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotApproved\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"SenderSet\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"senders\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"name\":\"setSender\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"The intended use case for this contract is to add this as a single unlocker to Oval contracts, allowing the owner of this contract to delegate that permission to many different unlocker addresses.\",\"kind\":\"dev\",\"methods\":{\"execute(address,bytes)\":{\"details\":\"Can only be called by an allowed sender.\",\"params\":{\"callData\":\"the calldata to use for the call.\",\"target\":\"the address to call.\"},\"returns\":{\"_0\":\"the data returned by the external call.\"}},\"multicall(bytes[])\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Receives and executes a batch of function calls on this contract.\"},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setSender(address,bool)\":{\"params\":{\"allowed\":\"whether the sender should be allowed.\",\"sender\":\"the sender to enable or disable.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"PermissionProxy is a proxy that extends the permissions given to it to a configurable set of addresses.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"execute(address,bytes)\":{\"notice\":\"Executes a call from this contract.\"},\"setSender(address,bool)\":{\"notice\":\"Enables or disables a sender.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/factories/PermissionProxy.sol\":\"PermissionProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@chainlink/=lib/redstone-contracts/lib/@chainlink/\",\":@openzeppelin/contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/redstone-contracts/lib/openzeppelin-contracts/contracts/\",\":@redstone-finance/evm-connector/contracts/=lib/redstone-contracts/src/evm-connector/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts/contracts/\",\":redstone-contracts/=lib/redstone-contracts/src/\",\":redstone-oracle/=lib/redstone-contracts/src/\"]},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32\",\"dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz\"]},\"lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931\",\"dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"lib/openzeppelin-contracts/contracts/utils/Multicall.sol\":{\"keccak256\":\"0xface9a29da6448061decb3506735c0c37aae8820ffaacfea982b1a8633be20d4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6b5e6f84ed95d9b7f8d6fd8b1019c0aa2114d417dd7a57728d05f6fabf30b8d0\",\"dweb:/ipfs/Qmbbgsakxi9caqBtYpAa8UKQCXvNmKnyRNyp8YAVpa91gM\"]},\"src/factories/PermissionProxy.sol\":{\"keccak256\":\"0x8b4680128049ddf5c95d7621848c9c6268f9ef26035ec1ca1fcea43185541e40\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://e18868530d8aed85ce4184cfc6fab8f0e28a25581ae11670fb7bbf1af0344461\",\"dweb:/ipfs/QmakiRESHaKbrz9prXCtC7RxgXs2hXGNVpoW3C21ymFkHZ\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.17+commit.8df45f5f"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"type":"error","name":"CallFailed"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"type":"error","name":"SenderNotApproved"},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[{"internalType":"address","name":"sender","type":"address","indexed":false},{"internalType":"bool","name":"allowed","type":"bool","indexed":false}],"type":"event","name":"SenderSet","anonymous":false},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"stateMutability":"nonpayable","type":"function","name":"execute","outputs":[{"internalType":"bytes","name":"","type":"bytes"}]},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"stateMutability":"nonpayable","type":"function","name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function","name":"senders","outputs":[{"internalType":"bool","name":"","type":"bool"}]},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"stateMutability":"nonpayable","type":"function","name":"setSender"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"}],"devdoc":{"kind":"dev","methods":{"execute(address,bytes)":{"details":"Can only be called by an allowed sender.","params":{"callData":"the calldata to use for the call.","target":"the address to call."},"returns":{"_0":"the data returned by the external call."}},"multicall(bytes[])":{"custom:oz-upgrades-unsafe-allow-reachable":"delegatecall","details":"Receives and executes a batch of function calls on this contract."},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"setSender(address,bool)":{"params":{"allowed":"whether the sender should be allowed.","sender":"the sender to enable or disable."}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{"execute(address,bytes)":{"notice":"Executes a call from this contract."},"setSender(address,bool)":{"notice":"Enables or disables a sender."}},"version":1}},"settings":{"remappings":["@chainlink/=lib/redstone-contracts/lib/@chainlink/","@openzeppelin/contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/redstone-contracts/lib/openzeppelin-contracts/contracts/","@redstone-finance/evm-connector/contracts/=lib/redstone-contracts/src/evm-connector/","ds-test/=lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","openzeppelin/=lib/openzeppelin-contracts/contracts/","redstone-contracts/=lib/redstone-contracts/src/","redstone-oracle/=lib/redstone-contracts/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/factories/PermissionProxy.sol":"PermissionProxy"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts/contracts/access/Ownable.sol":{"keccak256":"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218","urls":["bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32","dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Address.sol":{"keccak256":"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa","urls":["bzz-raw://2455248c8ddd9cc6a7af76a13973cddf222072427e7b0e2a7d1aff345145e931","dweb:/ipfs/QmfYjnjRbWqYpuxurqveE6HtzsY1Xx323J428AKQgtBJZm"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Multicall.sol":{"keccak256":"0xface9a29da6448061decb3506735c0c37aae8820ffaacfea982b1a8633be20d4","urls":["bzz-raw://6b5e6f84ed95d9b7f8d6fd8b1019c0aa2114d417dd7a57728d05f6fabf30b8d0","dweb:/ipfs/Qmbbgsakxi9caqBtYpAa8UKQCXvNmKnyRNyp8YAVpa91gM"],"license":"MIT"},"src/factories/PermissionProxy.sol":{"keccak256":"0x8b4680128049ddf5c95d7621848c9c6268f9ef26035ec1ca1fcea43185541e40","urls":["bzz-raw://e18868530d8aed85ce4184cfc6fab8f0e28a25581ae11670fb7bbf1af0344461","dweb:/ipfs/QmakiRESHaKbrz9prXCtC7RxgXs2hXGNVpoW3C21ymFkHZ"],"license":"BUSL-1.1"}},"version":1},"id":46} \ No newline at end of file diff --git a/src/abi/StandardChainlinkFactory.json b/src/abi/StandardChainlinkFactory.json new file mode 100644 index 0000000..e34c64a --- /dev/null +++ b/src/abi/StandardChainlinkFactory.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"_maxTraversal","type":"uint256","internalType":"uint256"},{"name":"_defaultUnlockers","type":"address[]","internalType":"address[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"MAX_TRAVERSAL","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"create","inputs":[{"name":"source","type":"address","internalType":"contract IAggregatorV3Source"},{"name":"lockWindow","type":"uint256","internalType":"uint256"},{"name":"maxAge","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"oval","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"defaultUnlockers","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setDefaultUnlockers","inputs":[{"name":"_defaultUnlockers","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"DefaultUnlockersSet","inputs":[{"name":"defaultUnlockers","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"OvalDeployed","inputs":[{"name":"deployer","type":"address","indexed":true,"internalType":"address"},{"name":"oval","type":"address","indexed":true,"internalType":"address"},{"name":"lockWindow","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"maxTraversal","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"owner","type":"address","indexed":false,"internalType":"address"},{"name":"unlockers","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"bytecode":{"object":"0x60a06040523480156200001157600080fd5b50604051620023a8380380620023a883398101604081905262000034916200026f565b81816200004133620000b1565b60008211620000975760405162461bcd60e51b815260206004820152601960248201527f4d61782074726176657273616c206d757374206265203e20300000000000000060448201526064015b60405180910390fd5b6080829052620000a78162000101565b505050506200039e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200010b6200015d565b805162000120906001906020840190620001bb565b507f53dcea6cd8a9fb42c53d0155aebceb09df1f90371ee9727c244f6557223bae16816040516200015291906200034f565b60405180910390a150565b6000546001600160a01b03163314620001b95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200008e565b565b82805482825590600052602060002090810192821562000213579160200282015b828111156200021357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620001dc565b506200022192915062000225565b5090565b5b8082111562000221576000815560010162000226565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200026a57600080fd5b919050565b600080604083850312156200028357600080fd5b8251602080850151919350906001600160401b0380821115620002a557600080fd5b818601915086601f830112620002ba57600080fd5b815181811115620002cf57620002cf6200023c565b8060051b604051601f19603f83011681018181108582111715620002f757620002f76200023c565b6040529182528482019250838101850191898311156200031657600080fd5b938501935b828510156200033f576200032f8562000252565b845293850193928501926200031b565b8096505050505050509250929050565b6020808252825182820181905260009190848201906040850190845b81811015620003925783516001600160a01b0316835292840192918401916001016200036b565b50909695505050505050565b608051611fe1620003c76000396000818160c60152818161016201526102030152611fe16000f3fe60806040523480156200001157600080fd5b5060043610620000875760003560e01c8063715018a61162000062578063715018a6146200010e5780638da5cb5b146200011a578063a9d14058146200012c578063f2fde38b146200014357600080fd5b80635165da30146200008c5780635878157614620000c05780635c681d1e14620000f7575b600080fd5b620000a36200009d366004620004ca565b6200015a565b6040516001600160a01b0390911681526020015b60405180910390f35b620000e87f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001620000b7565b620000a36200010836600462000502565b62000257565b6200011862000282565b005b6000546001600160a01b0316620000a3565b620001186200013d36600462000544565b6200029a565b620001186200015436600462000617565b620002f6565b6000836001847f000000000000000000000000000000000000000000000000000000000000000085620001956000546001600160a01b031690565b604051620001a39062000425565b620001b49695949392919062000689565b604051809103906000f080158015620001d1573d6000803e3d6000fd5b509050826001600160a01b038216337f5e826bc8ad243559fc75cc77b0e474a2ec85df26aeb5cd6db9d9ed1740f39afa7f0000000000000000000000000000000000000000000000000000000000000000620002356000546001600160a01b031690565b60016040516200024893929190620006d5565b60405180910390a49392505050565b600181815481106200026857600080fd5b6000918252602090912001546001600160a01b0316905081565b6200028c62000379565b620002986000620003d5565b565b620002a462000379565b8051620002b990600190602084019062000433565b507f53dcea6cd8a9fb42c53d0155aebceb09df1f90371ee9727c244f6557223bae1681604051620002eb91906200070a565b60405180910390a150565b6200030062000379565b6001600160a01b0381166200036b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6200037681620003d5565b50565b6000546001600160a01b03163314620002985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000362565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611852806200075a83390190565b8280548282559060005260206000209081019282156200048b579160200282015b828111156200048b57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000454565b50620004999291506200049d565b5090565b5b808211156200049957600081556001016200049e565b6001600160a01b03811681146200037657600080fd5b600080600060608486031215620004e057600080fd5b8335620004ed81620004b4565b95602085013595506040909401359392505050565b6000602082840312156200051557600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b80356200053f81620004b4565b919050565b600060208083850312156200055857600080fd5b823567ffffffffffffffff808211156200057157600080fd5b818501915085601f8301126200058657600080fd5b8135818111156200059b576200059b6200051c565b8060051b604051601f19603f83011681018181108582111715620005c357620005c36200051c565b604052918252848201925083810185019188831115620005e257600080fd5b938501935b828510156200060b57620005fb8562000532565b84529385019392850192620005e7565b98975050505050505050565b6000602082840312156200062a57600080fd5b81356200063781620004b4565b9392505050565b6000815480845260208085019450836000528060002060005b838110156200067e5781546001600160a01b03168752958201956001918201910162000657565b509495945050505050565b600060018060a01b03808916835260c06020840152620006ad60c08401896200063e565b915086604084015285606084015284608084015280841660a084015250979650505050505050565b8381526001600160a01b038316602082015260606040820181905260009062000701908301846200063e565b95945050505050565b6020808252825182820181905260009190848201906040850190845b818110156200074d5783516001600160a01b03168352928401929184019160010162000726565b5090969550505050505056fe6101406040523480156200001257600080fd5b50604051620018523803806200185283398101604081905262000035916200049b565b601286858588866200004733620002dc565b8381116200009c5760405162461bcd60e51b815260206004820152601d60248201527f4d617820616765206e6f742061626f7665206c6f636b2077696e646f7700000060448201526064015b60405180910390fd5b60008311620000ee5760405162461bcd60e51b815260206004820152601960248201527f4d61782074726176657273616c206d757374206265203e203000000000000000604482015260640162000093565b608084905260a083905260c081905260005b82518110156200014e5762000139838281518110620001235762000123620005b4565b602002602001015160016200032c60201b60201c565b806200014581620005ca565b91505062000100565b5060405184907f7232430c38d2db810b464dc9cd004f0e41528c6ba2eb1e2e4e3220ffd3a83a1b90600090a260405183907f9955b343f0b35bf4c2045c06550a8ec2d914db72d497a1430ca3526a248f20a590600090a260405181907f6777d8e4257e9f6a86d2f91b2b9fceaeb931d8b35249fbb63203c2dc0c08187090600090a250505050806001600160a01b031660e0816001600160a01b031681525050806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200022d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002539190620005f2565b60ff166101008190526040516001600160a01b038316907f023d13f58a0d1b57e2446bf7ee75c602447357846ca76f9b1dd6b982caa53b7d90600090a35060ff81166101208190526040517f4e500e16c773a18df7642e2d86cfe357eab156473b38c34df4e15dffb895072690600090a250620002d081620002dc565b5050505050506200061e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b62000336620003fc565b6001600160a01b03821660009081526002602052604090205481151560ff909116151503620003a85760405162461bcd60e51b815260206004820152601460248201527f556e6c6f636b6572206e6f74206368616e676564000000000000000000000000604482015260640162000093565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b6000546001600160a01b03163314620004585760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000093565b565b6001600160a01b03811681146200047057600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b805162000496816200045a565b919050565b60008060008060008060c08789031215620004b557600080fd5b8651620004c2816200045a565b602088810151919750906001600160401b0380821115620004e257600080fd5b818a0191508a601f830112620004f757600080fd5b8151818111156200050c576200050c62000473565b8060051b604051601f19603f8301168101818110858211171562000534576200053462000473565b60405291825284820192508381018501918d8311156200055357600080fd5b938501935b828510156200057c576200056c8562000489565b8452938501939285019262000558565b809a50505050505050604087015193506060870151925060808701519150620005a860a0880162000489565b90509295509295509295565b634e487b7160e01b600052603260045260246000fd5b600060018201620005eb57634e487b7160e01b600052601160045260246000fd5b5060010190565b6000602082840312156200060557600080fd5b815160ff811681146200061757600080fd5b9392505050565b60805160a05160c05160e0516101005161012051611189620006c9600039600081816102180152818161069f0152818161071a015261097f0152600081816105530152818161065801526107700152600081816101d9015281816104c6015281816105ad01528181610b610152610cf00152600081816102ac0152610c1701526000818161033a0152610401015260008181610261015281816103ce015261090b01526111896000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c8063687043c5116100c3578063a5c38b3d1161007c578063a5c38b3d1461035e578063cb53b08d14610367578063d3fff0f61461037a578063f2fde38b1461038d578063f6e1d17a146103a0578063feaf968c146103b357600080fd5b8063687043c5146102aa578063715018a6146102d05780638205bf6a146102d85780638da5cb5b146102e05780639a6fc8f5146102f1578063a3c044761461033857600080fd5b8063313ce56711610115578063313ce5671461021357806332c6534b1461024c5780633376f53a1461025f5780633d6ba5781461028f57806350d25bcd146102a25780636666d3721461018257600080fd5b80630125554b14610152578063138623641461017a578063172b09f91461018457806324a419f4146101b75780632ef9ebba146101d4575b600080fd5b61015a6103bb565b604080519384526020840192909252908201526060015b60405180910390f35b610182610430565b005b6101a7610192366004610dfc565b60026020526000908152604090205460ff1681565b6040519015158152602001610171565b6101bf6104be565b60408051928352602083019190915201610171565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610171565b61023a7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610171565b6101a761025a366004610e17565b610582565b7f00000000000000000000000000000000000000000000000000000000000000005b604051908152602001610171565b6101bf61029d366004610e41565b6105a5565b610281610688565b7f0000000000000000000000000000000000000000000000000000000000000000610281565b6101826106cb565b6102816106dd565b6000546001600160a01b03166101fb565b6103046102ff366004610e6f565b6106f0565b604080516001600160501b03968716815260208101959095528401929092526060830152909116608082015260a001610171565b7f0000000000000000000000000000000000000000000000000000000000000000610281565b61028160015481565b61015a610375366004610e8c565b610751565b610182610388366004610eae565b6107af565b61018261039b366004610dfc565b610872565b6101bf6103ae366004610e41565b6108eb565b61030461094f565b60008060006104256103ff6001546103f07f000000000000000000000000000000000000000000000000000000000000000090565b6103fa9042610f00565b6109b7565b7f0000000000000000000000000000000000000000000000000000000000000000610751565b925092509250909192565b61043c33600154610582565b61048d5760405162461bcd60e51b815260206004820152601d60248201527f436f6e74726f6c6c657220626c6f636b65643a2063616e556e6c6f636b00000060448201526064015b60405180910390fd5b4260018190556040517f3ee2ed8fd57cf3bdf05ef91fbe207825c00ef41e2303a859c67a84cd46cd69aa90600090a2565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610522573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105469190610f13565b50935050925050610579827f000000000000000000000000000000000000000000000000000000000000000060126109cf565b94909350915050565b6001600160a01b03821660009081526002602052604090205460ff165b92915050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639a6fc8f56105e387610a40565b6040516001600160e01b031960e084901b1681526001600160501b03909116600482015260240160a060405180830381865afa158015610627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064b9190610f13565b5093505092505061067e827f000000000000000000000000000000000000000000000000000000000000000060126109cf565b9590945092505050565b6000806106936103bb565b505090506106c38160127f00000000000000000000000000000000000000000000000000000000000000006109cf565b91505090565b565b6106d3610aac565b6106c96000610b06565b6000806106e86103bb565b509392505050565b600080600080600080600061070d886001600160501b03166108eb565b915091508761073e8360127f00000000000000000000000000000000000000000000000000000000000000006109cf565b9099909891975087965090945092505050565b6000806000806000806107648888610b56565b925092509250610796837f000000000000000000000000000000000000000000000000000000000000000060126109cf565b95509093506001600160501b03169150505b9250925092565b6107b7610aac565b6001600160a01b03821660009081526002602052604090205481151560ff90911615150361081e5760405162461bcd60e51b8152602060048201526014602482015273155b9b1bd8dad95c881b9bdd0818da185b99d95960621b6044820152606401610484565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b61087a610aac565b6001600160a01b0381166108df5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610484565b6108e881610b06565b50565b6000806000806108fa856105a5565b91509150600061092d6001546103f07f000000000000000000000000000000000000000000000000000000000000000090565b905080821161094157509094909350915050565b506000958695509350505050565b6000806000806000806000806109636103bb565b925092509250600061097482610a40565b9050806109a38560127f00000000000000000000000000000000000000000000000000000000000000006109cf565b909a90995092975087965094509092505050565b60008183116109c657816109c8565b825b9392505050565b60008160ff168360ff16036109e55750826109c8565b8160ff168360ff161015610a19576109fd8383610f6b565b610a0890600a611068565b610a129085611077565b90506109c8565b610a238284610f6b565b610a2e90600a611068565b610a3890856110a7565b949350505050565b60006001600160501b03821115610aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203860448201526530206269747360d01b6064820152608401610484565b5090565b6000546001600160a01b031633146106c95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be19190610f13565b5093505092509250878111610bfc57909450925090506107a8565b6000806000610c0c8b878c610c6b565b925092509250610c397f000000000000000000000000000000000000000000000000000000000000000090565b610c439042610f00565b821115610c5a57919750955093506107a892505050565b509299919850929650945050505050565b600080808080808080610c8b69ffff00000000000000008b1660016110e3565b90505b886001600160501b0316826001600160501b0316108015610cc05750806001600160501b03168a6001600160501b0316115b15610dcc5789610ccf8161110a565b604051639a6fc8f560e01b81526001600160501b0382166004820152909b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169150639a6fc8f59060240160a060405180830381865afa158015610d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d649190610f13565b50929750909550909350506001600160501b03808616908b16148015610d8a5750600083115b610da35760008060009750975097505050505050610dd7565b8a8311610dba57509195509350909150610dd79050565b81610dc48161112d565b925050610c8e565b509195509350909150505b93509350939050565b80356001600160a01b0381168114610df757600080fd5b919050565b600060208284031215610e0e57600080fd5b6109c882610de0565b60008060408385031215610e2a57600080fd5b610e3383610de0565b946020939093013593505050565b600060208284031215610e5357600080fd5b5035919050565b6001600160501b03811681146108e857600080fd5b600060208284031215610e8157600080fd5b81356109c881610e5a565b60008060408385031215610e9f57600080fd5b50508035926020909101359150565b60008060408385031215610ec157600080fd5b610eca83610de0565b915060208301358015158114610edf57600080fd5b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561059f5761059f610eea565b600080600080600060a08688031215610f2b57600080fd5b8551610f3681610e5a565b809550506020860151935060408601519250606086015191506080860151610f5d81610e5a565b809150509295509295909350565b60ff828116828216039081111561059f5761059f610eea565b600181815b80851115610fbf578160001904821115610fa557610fa5610eea565b80851615610fb257918102915b93841c9390800290610f89565b509250929050565b600082610fd65750600161059f565b81610fe35750600061059f565b8160018114610ff957600281146110035761101f565b600191505061059f565b60ff84111561101457611014610eea565b50506001821b61059f565b5060208310610133831016604e8410600b8410161715611042575081810a61059f565b61104c8383610f84565b806000190482111561106057611060610eea565b029392505050565b60006109c860ff841683610fc7565b80820260008212600160ff1b8414161561109357611093610eea565b818105831482151761059f5761059f610eea565b6000826110c457634e487b7160e01b600052601260045260246000fd5b600160ff1b8214600019841416156110de576110de610eea565b500590565b6001600160501b0381811683821601908082111561110357611103610eea565b5092915050565b60006001600160501b0382168061112357611123610eea565b6000190192915050565b60006001600160501b0380831681810361114957611149610eea565b600101939250505056fea26469706673582212208216491b98c1ecc221e059f95d494328ed8c71bec184d53aac216a82b7e3fe8664736f6c63430008110033a2646970667358221220cff7f06d390e1c21bd01cc495c94cd09826e90fdea328cf0a7a612aa369c343c64736f6c63430008110033","sourceMap":"1513:1095:47:-:0;;;1577:131;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1668:13;1683:17;936:32:14;719:10:18;936:18:14;:32::i;:::-;925:1:45;909:13;:17;901:55;;;;-1:-1:-1;;;901:55:45;;1725:2:65;901:55:45;;;1707:21:65;1764:2;1744:18;;;1737:30;1803:27;1783:18;;;1776:55;1848:18;;901:55:45;;;;;;;;;967:29;;;;1006:38;1026:17;1006:19;:38::i;:::-;820:231;;1577:131:47;;1513:1095;;2426:187:14;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:14;;;-1:-1:-1;;;;;;2534:17:14;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;1398:188:45:-;1094:13:14;:11;:13::i;:::-;1490:36:45;;::::1;::::0;:16:::1;::::0;:36:::1;::::0;::::1;::::0;::::1;:::i;:::-;;1541:38;1561:17;1541:38;;;;;;:::i;:::-;;;;;;;;1398:188:::0;:::o;1359:130:14:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:14;719:10:18;1422:23:14;1414:68;;;;-1:-1:-1;;;1414:68:14;;2742:2:65;1414:68:14;;;2724:21:65;;;2761:18;;;2754:30;2820:34;2800:18;;;2793:62;2872:18;;1414:68:14;2540:356:65;1414:68:14;1359:130::o;1513:1095:47:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1513:1095:47;-1:-1:-1;;;;;1513:1095:47;;;;;;;;;;;-1:-1:-1;1513:1095:47;;;;;;;-1:-1:-1;1513:1095:47;;;-1:-1:-1;1513:1095:47;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:127:65;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:177;225:13;;-1:-1:-1;;;;;267:31:65;;257:42;;247:70;;313:1;310;303:12;247:70;146:177;;;:::o;328:1190::-;432:6;440;493:2;481:9;472:7;468:23;464:32;461:52;;;509:1;506;499:12;461:52;532:16;;567:2;598:18;;;592:25;532:16;;-1:-1:-1;567:2:65;-1:-1:-1;;;;;666:14:65;;;663:34;;;693:1;690;683:12;663:34;731:6;720:9;716:22;706:32;;776:7;769:4;765:2;761:13;757:27;747:55;;798:1;795;788:12;747:55;827:2;821:9;849:2;845;842:10;839:36;;;855:18;;:::i;:::-;901:2;898:1;894:10;933:2;927:9;996:2;992:7;987:2;983;979:11;975:25;967:6;963:38;1051:6;1039:10;1036:22;1031:2;1019:10;1016:18;1013:46;1010:72;;;1062:18;;:::i;:::-;1098:2;1091:22;1148:18;;;1182:15;;;;-1:-1:-1;1224:11:65;;;1220:20;;;1252:19;;;1249:39;;;1284:1;1281;1274:12;1249:39;1308:11;;;;1328:159;1344:6;1339:3;1336:15;1328:159;;;1410:34;1440:3;1410:34;:::i;:::-;1398:47;;1361:12;;;;1465;;;;1328:159;;;1506:6;1496:16;;;;;;;;328:1190;;;;;:::o;1877:658::-;2048:2;2100:21;;;2170:13;;2073:18;;;2192:22;;;2019:4;;2048:2;2271:15;;;;2245:2;2230:18;;;2019:4;2314:195;2328:6;2325:1;2322:13;2314:195;;;2393:13;;-1:-1:-1;;;;;2389:39:65;2377:52;;2484:15;;;;2449:12;;;;2425:1;2343:9;2314:195;;;-1:-1:-1;2526:3:65;;1877:658;-1:-1:-1;;;;;;1877:658:65:o;2540:356::-;1513:1095:47;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040523480156200001157600080fd5b5060043610620000875760003560e01c8063715018a61162000062578063715018a6146200010e5780638da5cb5b146200011a578063a9d14058146200012c578063f2fde38b146200014357600080fd5b80635165da30146200008c5780635878157614620000c05780635c681d1e14620000f7575b600080fd5b620000a36200009d366004620004ca565b6200015a565b6040516001600160a01b0390911681526020015b60405180910390f35b620000e87f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001620000b7565b620000a36200010836600462000502565b62000257565b6200011862000282565b005b6000546001600160a01b0316620000a3565b620001186200013d36600462000544565b6200029a565b620001186200015436600462000617565b620002f6565b6000836001847f000000000000000000000000000000000000000000000000000000000000000085620001956000546001600160a01b031690565b604051620001a39062000425565b620001b49695949392919062000689565b604051809103906000f080158015620001d1573d6000803e3d6000fd5b509050826001600160a01b038216337f5e826bc8ad243559fc75cc77b0e474a2ec85df26aeb5cd6db9d9ed1740f39afa7f0000000000000000000000000000000000000000000000000000000000000000620002356000546001600160a01b031690565b60016040516200024893929190620006d5565b60405180910390a49392505050565b600181815481106200026857600080fd5b6000918252602090912001546001600160a01b0316905081565b6200028c62000379565b620002986000620003d5565b565b620002a462000379565b8051620002b990600190602084019062000433565b507f53dcea6cd8a9fb42c53d0155aebceb09df1f90371ee9727c244f6557223bae1681604051620002eb91906200070a565b60405180910390a150565b6200030062000379565b6001600160a01b0381166200036b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6200037681620003d5565b50565b6000546001600160a01b03163314620002985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000362565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611852806200075a83390190565b8280548282559060005260206000209081019282156200048b579160200282015b828111156200048b57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000454565b50620004999291506200049d565b5090565b5b808211156200049957600081556001016200049e565b6001600160a01b03811681146200037657600080fd5b600080600060608486031215620004e057600080fd5b8335620004ed81620004b4565b95602085013595506040909401359392505050565b6000602082840312156200051557600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b80356200053f81620004b4565b919050565b600060208083850312156200055857600080fd5b823567ffffffffffffffff808211156200057157600080fd5b818501915085601f8301126200058657600080fd5b8135818111156200059b576200059b6200051c565b8060051b604051601f19603f83011681018181108582111715620005c357620005c36200051c565b604052918252848201925083810185019188831115620005e257600080fd5b938501935b828510156200060b57620005fb8562000532565b84529385019392850192620005e7565b98975050505050505050565b6000602082840312156200062a57600080fd5b81356200063781620004b4565b9392505050565b6000815480845260208085019450836000528060002060005b838110156200067e5781546001600160a01b03168752958201956001918201910162000657565b509495945050505050565b600060018060a01b03808916835260c06020840152620006ad60c08401896200063e565b915086604084015285606084015284608084015280841660a084015250979650505050505050565b8381526001600160a01b038316602082015260606040820181905260009062000701908301846200063e565b95945050505050565b6020808252825182820181905260009190848201906040850190845b818110156200074d5783516001600160a01b03168352928401929184019160010162000726565b5090969550505050505056fe6101406040523480156200001257600080fd5b50604051620018523803806200185283398101604081905262000035916200049b565b601286858588866200004733620002dc565b8381116200009c5760405162461bcd60e51b815260206004820152601d60248201527f4d617820616765206e6f742061626f7665206c6f636b2077696e646f7700000060448201526064015b60405180910390fd5b60008311620000ee5760405162461bcd60e51b815260206004820152601960248201527f4d61782074726176657273616c206d757374206265203e203000000000000000604482015260640162000093565b608084905260a083905260c081905260005b82518110156200014e5762000139838281518110620001235762000123620005b4565b602002602001015160016200032c60201b60201c565b806200014581620005ca565b91505062000100565b5060405184907f7232430c38d2db810b464dc9cd004f0e41528c6ba2eb1e2e4e3220ffd3a83a1b90600090a260405183907f9955b343f0b35bf4c2045c06550a8ec2d914db72d497a1430ca3526a248f20a590600090a260405181907f6777d8e4257e9f6a86d2f91b2b9fceaeb931d8b35249fbb63203c2dc0c08187090600090a250505050806001600160a01b031660e0816001600160a01b031681525050806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200022d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002539190620005f2565b60ff166101008190526040516001600160a01b038316907f023d13f58a0d1b57e2446bf7ee75c602447357846ca76f9b1dd6b982caa53b7d90600090a35060ff81166101208190526040517f4e500e16c773a18df7642e2d86cfe357eab156473b38c34df4e15dffb895072690600090a250620002d081620002dc565b5050505050506200061e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b62000336620003fc565b6001600160a01b03821660009081526002602052604090205481151560ff909116151503620003a85760405162461bcd60e51b815260206004820152601460248201527f556e6c6f636b6572206e6f74206368616e676564000000000000000000000000604482015260640162000093565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b6000546001600160a01b03163314620004585760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000093565b565b6001600160a01b03811681146200047057600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b805162000496816200045a565b919050565b60008060008060008060c08789031215620004b557600080fd5b8651620004c2816200045a565b602088810151919750906001600160401b0380821115620004e257600080fd5b818a0191508a601f830112620004f757600080fd5b8151818111156200050c576200050c62000473565b8060051b604051601f19603f8301168101818110858211171562000534576200053462000473565b60405291825284820192508381018501918d8311156200055357600080fd5b938501935b828510156200057c576200056c8562000489565b8452938501939285019262000558565b809a50505050505050604087015193506060870151925060808701519150620005a860a0880162000489565b90509295509295509295565b634e487b7160e01b600052603260045260246000fd5b600060018201620005eb57634e487b7160e01b600052601160045260246000fd5b5060010190565b6000602082840312156200060557600080fd5b815160ff811681146200061757600080fd5b9392505050565b60805160a05160c05160e0516101005161012051611189620006c9600039600081816102180152818161069f0152818161071a015261097f0152600081816105530152818161065801526107700152600081816101d9015281816104c6015281816105ad01528181610b610152610cf00152600081816102ac0152610c1701526000818161033a0152610401015260008181610261015281816103ce015261090b01526111896000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c8063687043c5116100c3578063a5c38b3d1161007c578063a5c38b3d1461035e578063cb53b08d14610367578063d3fff0f61461037a578063f2fde38b1461038d578063f6e1d17a146103a0578063feaf968c146103b357600080fd5b8063687043c5146102aa578063715018a6146102d05780638205bf6a146102d85780638da5cb5b146102e05780639a6fc8f5146102f1578063a3c044761461033857600080fd5b8063313ce56711610115578063313ce5671461021357806332c6534b1461024c5780633376f53a1461025f5780633d6ba5781461028f57806350d25bcd146102a25780636666d3721461018257600080fd5b80630125554b14610152578063138623641461017a578063172b09f91461018457806324a419f4146101b75780632ef9ebba146101d4575b600080fd5b61015a6103bb565b604080519384526020840192909252908201526060015b60405180910390f35b610182610430565b005b6101a7610192366004610dfc565b60026020526000908152604090205460ff1681565b6040519015158152602001610171565b6101bf6104be565b60408051928352602083019190915201610171565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610171565b61023a7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610171565b6101a761025a366004610e17565b610582565b7f00000000000000000000000000000000000000000000000000000000000000005b604051908152602001610171565b6101bf61029d366004610e41565b6105a5565b610281610688565b7f0000000000000000000000000000000000000000000000000000000000000000610281565b6101826106cb565b6102816106dd565b6000546001600160a01b03166101fb565b6103046102ff366004610e6f565b6106f0565b604080516001600160501b03968716815260208101959095528401929092526060830152909116608082015260a001610171565b7f0000000000000000000000000000000000000000000000000000000000000000610281565b61028160015481565b61015a610375366004610e8c565b610751565b610182610388366004610eae565b6107af565b61018261039b366004610dfc565b610872565b6101bf6103ae366004610e41565b6108eb565b61030461094f565b60008060006104256103ff6001546103f07f000000000000000000000000000000000000000000000000000000000000000090565b6103fa9042610f00565b6109b7565b7f0000000000000000000000000000000000000000000000000000000000000000610751565b925092509250909192565b61043c33600154610582565b61048d5760405162461bcd60e51b815260206004820152601d60248201527f436f6e74726f6c6c657220626c6f636b65643a2063616e556e6c6f636b00000060448201526064015b60405180910390fd5b4260018190556040517f3ee2ed8fd57cf3bdf05ef91fbe207825c00ef41e2303a859c67a84cd46cd69aa90600090a2565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610522573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105469190610f13565b50935050925050610579827f000000000000000000000000000000000000000000000000000000000000000060126109cf565b94909350915050565b6001600160a01b03821660009081526002602052604090205460ff165b92915050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639a6fc8f56105e387610a40565b6040516001600160e01b031960e084901b1681526001600160501b03909116600482015260240160a060405180830381865afa158015610627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064b9190610f13565b5093505092505061067e827f000000000000000000000000000000000000000000000000000000000000000060126109cf565b9590945092505050565b6000806106936103bb565b505090506106c38160127f00000000000000000000000000000000000000000000000000000000000000006109cf565b91505090565b565b6106d3610aac565b6106c96000610b06565b6000806106e86103bb565b509392505050565b600080600080600080600061070d886001600160501b03166108eb565b915091508761073e8360127f00000000000000000000000000000000000000000000000000000000000000006109cf565b9099909891975087965090945092505050565b6000806000806000806107648888610b56565b925092509250610796837f000000000000000000000000000000000000000000000000000000000000000060126109cf565b95509093506001600160501b03169150505b9250925092565b6107b7610aac565b6001600160a01b03821660009081526002602052604090205481151560ff90911615150361081e5760405162461bcd60e51b8152602060048201526014602482015273155b9b1bd8dad95c881b9bdd0818da185b99d95960621b6044820152606401610484565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b61087a610aac565b6001600160a01b0381166108df5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610484565b6108e881610b06565b50565b6000806000806108fa856105a5565b91509150600061092d6001546103f07f000000000000000000000000000000000000000000000000000000000000000090565b905080821161094157509094909350915050565b506000958695509350505050565b6000806000806000806000806109636103bb565b925092509250600061097482610a40565b9050806109a38560127f00000000000000000000000000000000000000000000000000000000000000006109cf565b909a90995092975087965094509092505050565b60008183116109c657816109c8565b825b9392505050565b60008160ff168360ff16036109e55750826109c8565b8160ff168360ff161015610a19576109fd8383610f6b565b610a0890600a611068565b610a129085611077565b90506109c8565b610a238284610f6b565b610a2e90600a611068565b610a3890856110a7565b949350505050565b60006001600160501b03821115610aa85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203860448201526530206269747360d01b6064820152608401610484565b5090565b6000546001600160a01b031633146106c95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610484565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610bbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be19190610f13565b5093505092509250878111610bfc57909450925090506107a8565b6000806000610c0c8b878c610c6b565b925092509250610c397f000000000000000000000000000000000000000000000000000000000000000090565b610c439042610f00565b821115610c5a57919750955093506107a892505050565b509299919850929650945050505050565b600080808080808080610c8b69ffff00000000000000008b1660016110e3565b90505b886001600160501b0316826001600160501b0316108015610cc05750806001600160501b03168a6001600160501b0316115b15610dcc5789610ccf8161110a565b604051639a6fc8f560e01b81526001600160501b0382166004820152909b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169150639a6fc8f59060240160a060405180830381865afa158015610d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d649190610f13565b50929750909550909350506001600160501b03808616908b16148015610d8a5750600083115b610da35760008060009750975097505050505050610dd7565b8a8311610dba57509195509350909150610dd79050565b81610dc48161112d565b925050610c8e565b509195509350909150505b93509350939050565b80356001600160a01b0381168114610df757600080fd5b919050565b600060208284031215610e0e57600080fd5b6109c882610de0565b60008060408385031215610e2a57600080fd5b610e3383610de0565b946020939093013593505050565b600060208284031215610e5357600080fd5b5035919050565b6001600160501b03811681146108e857600080fd5b600060208284031215610e8157600080fd5b81356109c881610e5a565b60008060408385031215610e9f57600080fd5b50508035926020909101359150565b60008060408385031215610ec157600080fd5b610eca83610de0565b915060208301358015158114610edf57600080fd5b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561059f5761059f610eea565b600080600080600060a08688031215610f2b57600080fd5b8551610f3681610e5a565b809550506020860151935060408601519250606086015191506080860151610f5d81610e5a565b809150509295509295909350565b60ff828116828216039081111561059f5761059f610eea565b600181815b80851115610fbf578160001904821115610fa557610fa5610eea565b80851615610fb257918102915b93841c9390800290610f89565b509250929050565b600082610fd65750600161059f565b81610fe35750600061059f565b8160018114610ff957600281146110035761101f565b600191505061059f565b60ff84111561101457611014610eea565b50506001821b61059f565b5060208310610133831016604e8410600b8410161715611042575081810a61059f565b61104c8383610f84565b806000190482111561106057611060610eea565b029392505050565b60006109c860ff841683610fc7565b80820260008212600160ff1b8414161561109357611093610eea565b818105831482151761059f5761059f610eea565b6000826110c457634e487b7160e01b600052601260045260246000fd5b600160ff1b8214600019841416156110de576110de610eea565b500590565b6001600160501b0381811683821601908082111561110357611103610eea565b5092915050565b60006001600160501b0382168061112357611123610eea565b6000190192915050565b60006001600160501b0380831681810361114957611149610eea565b600101939250505056fea26469706673582212208216491b98c1ecc221e059f95d494328ed8c71bec184d53aac216a82b7e3fe8664736f6c63430008110033a2646970667358221220cff7f06d390e1c21bd01cc495c94cd09826e90fdea328cf0a7a612aa369c343c64736f6c63430008110033","sourceMap":"1513:1095:47:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2275:331;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;773:32:65;;;755:51;;743:2;728:18;2275:331:47;;;;;;;;464:38:45;;;;;;;;963:25:65;;;951:2;936:18;464:38:45;817:177:65;508:33:45;;;;;;:::i;:::-;;:::i;1824:101:14:-;;;:::i;:::-;;1201:85;1247:7;1273:6;-1:-1:-1;;;;;1273:6:14;1201:85;;1398:188:45;;;;;;:::i;:::-;;:::i;2074:198:14:-;;;;;;:::i;:::-;;:::i;2275:331:47:-;2373:12;2430:6;2438:16;2456:10;2468:13;2483:6;2491:7;1247::14;1273:6;-1:-1:-1;;;;;1273:6:14;;1201:85;2491:7:47;2412:87;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2397:103:47;-1:-1:-1;2546:10:47;-1:-1:-1;;;;;2515:84:47;;2528:10;2515:84;2558:13;2573:7;1247::14;1273:6;-1:-1:-1;;;;;1273:6:14;;1201:85;2573:7:47;2582:16;2515:84;;;;;;;;:::i;:::-;;;;;;;;2275:331;;;;;:::o;508:33:45:-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;508:33:45;;-1:-1:-1;508:33:45;:::o;1824:101:14:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;1398:188:45:-;1094:13:14;:11;:13::i;:::-;1490:36:45;;::::1;::::0;:16:::1;::::0;:36:::1;::::0;::::1;::::0;::::1;:::i;:::-;;1541:38;1561:17;1541:38;;;;;;:::i;:::-;;;;;;;;1398:188:::0;:::o;2074:198:14:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:14;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:14;;5394:2:65;2154:73:14::1;::::0;::::1;5376:21:65::0;5433:2;5413:18;;;5406:30;5472:34;5452:18;;;5445:62;-1:-1:-1;;;5523:18:65;;;5516:36;5569:19;;2154:73:14::1;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;1359:130::-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:14;719:10:18;1422:23:14;1414:68;;;;-1:-1:-1;;;1414:68:14;;5801:2:65;1414:68:14;;;5783:21:65;;;5820:18;;;5813:30;5879:34;5859:18;;;5852:62;5931:18;;1414:68:14;5599:356:65;2426:187:14;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:14;;;-1:-1:-1;;;;;;2534:17:14;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;-1:-1:-1:-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:152:65;-1:-1:-1;;;;;110:31:65;;100:42;;90:70;;156:1;153;146:12;171:433;277:6;285;293;346:2;334:9;325:7;321:23;317:32;314:52;;;362:1;359;352:12;314:52;401:9;388:23;420:52;466:5;420:52;:::i;:::-;491:5;543:2;528:18;;515:32;;-1:-1:-1;594:2:65;579:18;;;566:32;;171:433;-1:-1:-1;;;171:433:65:o;999:180::-;1058:6;1111:2;1099:9;1090:7;1086:23;1082:32;1079:52;;;1127:1;1124;1117:12;1079:52;-1:-1:-1;1150:23:65;;999:180;-1:-1:-1;999:180:65:o;1184:127::-;1245:10;1240:3;1236:20;1233:1;1226:31;1276:4;1273:1;1266:15;1300:4;1297:1;1290:15;1316:155;1384:20;;1413:52;1384:20;1413:52;:::i;:::-;1316:155;;;:::o;1476:1121::-;1560:6;1591:2;1634;1622:9;1613:7;1609:23;1605:32;1602:52;;;1650:1;1647;1640:12;1602:52;1690:9;1677:23;1719:18;1760:2;1752:6;1749:14;1746:34;;;1776:1;1773;1766:12;1746:34;1814:6;1803:9;1799:22;1789:32;;1859:7;1852:4;1848:2;1844:13;1840:27;1830:55;;1881:1;1878;1871:12;1830:55;1917:2;1904:16;1939:2;1935;1932:10;1929:36;;;1945:18;;:::i;:::-;1991:2;1988:1;1984:10;2023:2;2017:9;2086:2;2082:7;2077:2;2073;2069:11;2065:25;2057:6;2053:38;2141:6;2129:10;2126:22;2121:2;2109:10;2106:18;2103:46;2100:72;;;2152:18;;:::i;:::-;2188:2;2181:22;2238:18;;;2272:15;;;;-1:-1:-1;2314:11:65;;;2310:20;;;2342:19;;;2339:39;;;2374:1;2371;2364:12;2339:39;2398:11;;;;2418:148;2434:6;2429:3;2426:15;2418:148;;;2500:23;2519:3;2500:23;:::i;:::-;2488:36;;2451:12;;;;2544;;;;2418:148;;;2585:6;1476:1121;-1:-1:-1;;;;;;;;1476:1121:65:o;2602:268::-;2661:6;2714:2;2702:9;2693:7;2689:23;2685:32;2682:52;;;2730:1;2727;2720:12;2682:52;2769:9;2756:23;2788:52;2834:5;2788:52;:::i;:::-;2859:5;2602:268;-1:-1:-1;;;2602:268:65:o;2875:495::-;2936:3;2974:5;2968:12;3001:6;2996:3;2989:19;3027:4;3056:2;3051:3;3047:12;3040:19;;3078:5;3075:1;3068:16;3120:2;3117:1;3107:16;3141:1;3151:194;3165:6;3162:1;3159:13;3151:194;;;3230:13;;-1:-1:-1;;;;;3226:39:65;3214:52;;3286:12;;;;3262:1;3321:14;;;;3180:9;3151:194;;;-1:-1:-1;3361:3:65;;2875:495;-1:-1:-1;;;;;2875:495:65:o;3375:710::-;3683:4;3729:1;3725;3720:3;3716:11;3712:19;3770:2;3762:6;3758:15;3747:9;3740:34;3810:3;3805:2;3794:9;3790:18;3783:31;3831:65;3891:3;3880:9;3876:19;3868:6;3831:65;:::i;:::-;3823:73;;3932:6;3927:2;3916:9;3912:18;3905:34;3975:6;3970:2;3959:9;3955:18;3948:34;4019:6;4013:3;4002:9;3998:19;3991:35;4075:2;4067:6;4063:15;4057:3;4046:9;4042:19;4035:44;;3375:710;;;;;;;;;:::o;4090:434::-;4304:25;;;-1:-1:-1;;;;;4365:32:65;;4360:2;4345:18;;4338:60;4434:2;4429;4414:18;;4407:30;;;-1:-1:-1;;4454:64:65;;4499:18;;4491:6;4454:64;:::i;:::-;4446:72;4090:434;-1:-1:-1;;;;;4090:434:65:o;4529:658::-;4700:2;4752:21;;;4822:13;;4725:18;;;4844:22;;;4671:4;;4700:2;4923:15;;;;4897:2;4882:18;;;4671:4;4966:195;4980:6;4977:1;4974:13;4966:195;;;5045:13;;-1:-1:-1;;;;;5041:39:65;5029:52;;5136:15;;;;5101:12;;;;5077:1;4995:9;4966:195;;;-1:-1:-1;5178:3:65;;4529:658;-1:-1:-1;;;;;;4529:658:65:o","linkReferences":{},"immutableReferences":{"45786":[{"start":198,"length":32},{"start":354,"length":32},{"start":515,"length":32}]}},"methodIdentifiers":{"MAX_TRAVERSAL()":"58781576","create(address,uint256,uint256)":"5165da30","defaultUnlockers(uint256)":"5c681d1e","owner()":"8da5cb5b","renounceOwnership()":"715018a6","setDefaultUnlockers(address[])":"a9d14058","transferOwnership(address)":"f2fde38b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxTraversal\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_defaultUnlockers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"defaultUnlockers\",\"type\":\"address[]\"}],\"name\":\"DefaultUnlockersSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"deployer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oval\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"lockWindow\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxTraversal\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"unlockers\",\"type\":\"address[]\"}],\"name\":\"OvalDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_TRAVERSAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IAggregatorV3Source\",\"name\":\"source\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"lockWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxAge\",\"type\":\"uint256\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"oval\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"defaultUnlockers\",\"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\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_defaultUnlockers\",\"type\":\"address[]\"}],\"name\":\"setDefaultUnlockers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This is the best factory for most use cases, but there are other variants that may be needed if different mutability choices are desired.\",\"kind\":\"dev\",\"methods\":{\"create(address,uint256,uint256)\":{\"params\":{\"lockWindow\":\"the lockWindow used for this Oval instance. This is the length of the window for the Oval auction to be run and, thus, the maximum time that prices will be delayed.\",\"maxAge\":\"max age of a price that is used in place of the current price. If the only available price is older than this, OEV is not captured and the current price is provided.\",\"source\":\"the Chainlink oracle source contract.\"},\"returns\":{\"oval\":\"deployed oval address.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setDefaultUnlockers(address[])\":{\"details\":\"This and the owner, itself, is the only mutable portion of this factory.\",\"params\":{\"_defaultUnlockers\":\"default unlockers that will be used to instantiate new Oval instances.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"StandardChainlinkFactory is the recommended factory for use cases that want a Chainlink source and Chainlink interface.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address,uint256,uint256)\":{\"notice\":\"Creates the Chainlink Oval instance.\"},\"setDefaultUnlockers(address[])\":{\"notice\":\"Enables the owner to set the default unlockers that will be passed to all Oval instances created by this contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/factories/StandardChainlinkFactory.sol\":\"StandardChainlinkFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@chainlink/=lib/redstone-contracts/lib/@chainlink/\",\":@openzeppelin/contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/redstone-contracts/lib/openzeppelin-contracts/contracts/\",\":@redstone-finance/evm-connector/contracts/=lib/redstone-contracts/src/evm-connector/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts/contracts/\",\":redstone-contracts/=lib/redstone-contracts/src/\",\":redstone-oracle/=lib/redstone-contracts/src/\"]},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32\",\"dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278\",\"dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH\"]},\"src/DiamondRootOval.sol\":{\"keccak256\":\"0x54d2c3c6650a988ae636faa36e296fbf075ab5886da4a3ec9014de99512c2ee1\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://30a6f48795c2a1db3be66a80d829ebf34d2cc6bc5b7e1b0a434677cfe98221fc\",\"dweb:/ipfs/QmVoBdWELzb5AMKig5KjCisLbmFean2atNGenTbmLjqMpL\"]},\"src/Oval.sol\":{\"keccak256\":\"0x3920c6f066449678694d0587f57495a7e739682ea6da4748de26aa4c655d4bdf\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://630c2229a316b5885d4e06b6f6de8c6a0d220daf07a5c24fa225c2e2396e3449\",\"dweb:/ipfs/QmXpnDzxLU1aVCqkeeoQXsJ25KDC5qJ1WcwPXBbbXaoNxM\"]},\"src/adapters/destination-adapters/ChainlinkDestinationAdapter.sol\":{\"keccak256\":\"0xd66cb1a0c51f8c298dab85552a5156747646d31dbe66b0ce9184f05f3adee56b\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://274135de35a3f423e49ea0bbb7aeb5fd355b3bbabb2f304deb39b6022df1c7d0\",\"dweb:/ipfs/QmZkdjkTp7GLmZTuaw7bcU3zd8oSvhkdYYxssqCRMgZDnE\"]},\"src/adapters/lib/DecimalLib.sol\":{\"keccak256\":\"0x970a20a667780e91fb80ba79005863c73421cdf730ba2303e650e63d9099cde2\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://96013c450945da6d71128267f38754a07bb62223a0c07ef84925fa84636441f2\",\"dweb:/ipfs/QmSZsc8Epuan7zuQCYBcirjZ63zHwcGicfV75rRPfFrixT\"]},\"src/adapters/source-adapters/ChainlinkSourceAdapter.sol\":{\"keccak256\":\"0xa7faf4a8eeeaa5ee01e67b8808ecd816de2d84ffc655d9b8f37b2921cd0934a1\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://38cc6c58f5451f5621645f870b70436dcfd500ea416f6709708d9506d5a6b203\",\"dweb:/ipfs/QmYTyVfGhCAvAd57FLheqvLDAbn3UjfLE7Bb4zA15nx9s2\"]},\"src/controllers/MutableUnlockersController.sol\":{\"keccak256\":\"0x32e43c4a5e3abaa488a3758333f78fa6e166ca65a09ac76ca6b7e645d7863d16\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://b632392a02f26de3824929fb6e2dcfe8cc84689a489b12ba45bfd0ef4d93661f\",\"dweb:/ipfs/QmcMrnNCrM1YXBqj17HZicDvVe4fGnj66LFis6p9Gro5ob\"]},\"src/factories/BaseFactory.sol\":{\"keccak256\":\"0x94670505d6e89c9cd1cef18dfce0e65f36a97c693e5c2ed9a4f81fd0c94b26e6\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://6480e1d133f5abbe5641bc35c85a34dddf1979e68b35ee532e014fae860c4f19\",\"dweb:/ipfs/QmNsjcvQ5mnpjHnRMokhUMcYCbcYqDbJG6426CN6j5EoAq\"]},\"src/factories/StandardChainlinkFactory.sol\":{\"keccak256\":\"0x2b824a86b1cd89795129ca5ac58094e8bddceb41feb0eb6643570b5d75f0a362\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://d77374c35a937e39ca389c24f2de6d78ec79902d1fc78d46b79caf8d8ea17107\",\"dweb:/ipfs/QmPjjbctL4FN8pm2KGTZr5rsvsBZEGn95tqT91vsBCtXU8\"]},\"src/interfaces/IBaseController.sol\":{\"keccak256\":\"0x8fe524fac0b04c8415e814b1dfb1ca28d303c8de65df22c268dc1d5f4e74a9d5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b69c11d3e90c65202e184de1ece928269ccd49e82aeec1aab1d489e92d3ea5cc\",\"dweb:/ipfs/QmYNoffB6UhJXTaKVwcxH4zzZgAVv3x3vacrVMQxmnHVju\"]},\"src/interfaces/IBaseOracleAdapter.sol\":{\"keccak256\":\"0x9c4c3727631ccc8ad4d202a1b7faf8833fae0d93d0a7fca45de009ab8f7ecab9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4b904def3696b12cbef6997b34e2bb4c8aef6af52bb640840040b6b59b25f0be\",\"dweb:/ipfs/QmfReXd9EmWRDFjs2SLdn6YUqyVH9RMxCjvzPnjLDYxuQP\"]},\"src/interfaces/IOval.sol\":{\"keccak256\":\"0x8511408e4da9818a36531a464a42f99461ce38419def87f35c52c58fe4d4f6aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://501d19f2a3bcadaa8095c5808bfae348d8ebe78b34084115ee635c1ad101c953\",\"dweb:/ipfs/QmRqkEjEE9ydGrMCTJttjq6harZytTZDa8AQ2NriVU1A2H\"]},\"src/interfaces/chainlink/IAggregatorV3.sol\":{\"keccak256\":\"0xb4d26247f867a5a5614638bdee251e29b73eddc61c4b9f04f8af2d88e2f4e05d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0628c9b3a05410dee47e48ee68c2e3004b0c977c9942149a9206be7795d033d1\",\"dweb:/ipfs/QmdSGsY55cMx3CKQJ3huz9P54XVfKWnHLxQsoqweve2Z8G\"]},\"src/interfaces/chainlink/IAggregatorV3Source.sol\":{\"keccak256\":\"0xace678af82f9ae630210cc7b85cb8759b89b3d7280525ebbcb78aa7c33f5c79f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://63e72db0effebba1b9048614c1ba8e72018957dddff712be2d3a2893229e210e\",\"dweb:/ipfs/QmNLqP4G5ujrZdt2rVTrXpLHuqRUR1hugxQzbNmGReLQtZ\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.17+commit.8df45f5f"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"_maxTraversal","type":"uint256"},{"internalType":"address[]","name":"_defaultUnlockers","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address[]","name":"defaultUnlockers","type":"address[]","indexed":false}],"type":"event","name":"DefaultUnlockersSet","anonymous":false},{"inputs":[{"internalType":"address","name":"deployer","type":"address","indexed":true},{"internalType":"address","name":"oval","type":"address","indexed":true},{"internalType":"uint256","name":"lockWindow","type":"uint256","indexed":true},{"internalType":"uint256","name":"maxTraversal","type":"uint256","indexed":false},{"internalType":"address","name":"owner","type":"address","indexed":false},{"internalType":"address[]","name":"unlockers","type":"address[]","indexed":false}],"type":"event","name":"OvalDeployed","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_TRAVERSAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"contract IAggregatorV3Source","name":"source","type":"address"},{"internalType":"uint256","name":"lockWindow","type":"uint256"},{"internalType":"uint256","name":"maxAge","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"create","outputs":[{"internalType":"address","name":"oval","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"defaultUnlockers","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"address[]","name":"_defaultUnlockers","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"setDefaultUnlockers"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"}],"devdoc":{"kind":"dev","methods":{"create(address,uint256,uint256)":{"params":{"lockWindow":"the lockWindow used for this Oval instance. This is the length of the window for the Oval auction to be run and, thus, the maximum time that prices will be delayed.","maxAge":"max age of a price that is used in place of the current price. If the only available price is older than this, OEV is not captured and the current price is provided.","source":"the Chainlink oracle source contract."},"returns":{"oval":"deployed oval address."}},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"setDefaultUnlockers(address[])":{"details":"This and the owner, itself, is the only mutable portion of this factory.","params":{"_defaultUnlockers":"default unlockers that will be used to instantiate new Oval instances."}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{"create(address,uint256,uint256)":{"notice":"Creates the Chainlink Oval instance."},"setDefaultUnlockers(address[])":{"notice":"Enables the owner to set the default unlockers that will be passed to all Oval instances created by this contract."}},"version":1}},"settings":{"remappings":["@chainlink/=lib/redstone-contracts/lib/@chainlink/","@openzeppelin/contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/redstone-contracts/lib/openzeppelin-contracts/contracts/","@redstone-finance/evm-connector/contracts/=lib/redstone-contracts/src/evm-connector/","ds-test/=lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","openzeppelin/=lib/openzeppelin-contracts/contracts/","redstone-contracts/=lib/redstone-contracts/src/","redstone-oracle/=lib/redstone-contracts/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/factories/StandardChainlinkFactory.sol":"StandardChainlinkFactory"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts/contracts/access/Ownable.sol":{"keccak256":"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218","urls":["bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32","dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3","urls":["bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c","dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"keccak256":"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad","urls":["bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278","dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH"],"license":"MIT"},"src/DiamondRootOval.sol":{"keccak256":"0x54d2c3c6650a988ae636faa36e296fbf075ab5886da4a3ec9014de99512c2ee1","urls":["bzz-raw://30a6f48795c2a1db3be66a80d829ebf34d2cc6bc5b7e1b0a434677cfe98221fc","dweb:/ipfs/QmVoBdWELzb5AMKig5KjCisLbmFean2atNGenTbmLjqMpL"],"license":"BUSL-1.1"},"src/Oval.sol":{"keccak256":"0x3920c6f066449678694d0587f57495a7e739682ea6da4748de26aa4c655d4bdf","urls":["bzz-raw://630c2229a316b5885d4e06b6f6de8c6a0d220daf07a5c24fa225c2e2396e3449","dweb:/ipfs/QmXpnDzxLU1aVCqkeeoQXsJ25KDC5qJ1WcwPXBbbXaoNxM"],"license":"BUSL-1.1"},"src/adapters/destination-adapters/ChainlinkDestinationAdapter.sol":{"keccak256":"0xd66cb1a0c51f8c298dab85552a5156747646d31dbe66b0ce9184f05f3adee56b","urls":["bzz-raw://274135de35a3f423e49ea0bbb7aeb5fd355b3bbabb2f304deb39b6022df1c7d0","dweb:/ipfs/QmZkdjkTp7GLmZTuaw7bcU3zd8oSvhkdYYxssqCRMgZDnE"],"license":"BUSL-1.1"},"src/adapters/lib/DecimalLib.sol":{"keccak256":"0x970a20a667780e91fb80ba79005863c73421cdf730ba2303e650e63d9099cde2","urls":["bzz-raw://96013c450945da6d71128267f38754a07bb62223a0c07ef84925fa84636441f2","dweb:/ipfs/QmSZsc8Epuan7zuQCYBcirjZ63zHwcGicfV75rRPfFrixT"],"license":"BUSL-1.1"},"src/adapters/source-adapters/ChainlinkSourceAdapter.sol":{"keccak256":"0xa7faf4a8eeeaa5ee01e67b8808ecd816de2d84ffc655d9b8f37b2921cd0934a1","urls":["bzz-raw://38cc6c58f5451f5621645f870b70436dcfd500ea416f6709708d9506d5a6b203","dweb:/ipfs/QmYTyVfGhCAvAd57FLheqvLDAbn3UjfLE7Bb4zA15nx9s2"],"license":"BUSL-1.1"},"src/controllers/MutableUnlockersController.sol":{"keccak256":"0x32e43c4a5e3abaa488a3758333f78fa6e166ca65a09ac76ca6b7e645d7863d16","urls":["bzz-raw://b632392a02f26de3824929fb6e2dcfe8cc84689a489b12ba45bfd0ef4d93661f","dweb:/ipfs/QmcMrnNCrM1YXBqj17HZicDvVe4fGnj66LFis6p9Gro5ob"],"license":"BUSL-1.1"},"src/factories/BaseFactory.sol":{"keccak256":"0x94670505d6e89c9cd1cef18dfce0e65f36a97c693e5c2ed9a4f81fd0c94b26e6","urls":["bzz-raw://6480e1d133f5abbe5641bc35c85a34dddf1979e68b35ee532e014fae860c4f19","dweb:/ipfs/QmNsjcvQ5mnpjHnRMokhUMcYCbcYqDbJG6426CN6j5EoAq"],"license":"BUSL-1.1"},"src/factories/StandardChainlinkFactory.sol":{"keccak256":"0x2b824a86b1cd89795129ca5ac58094e8bddceb41feb0eb6643570b5d75f0a362","urls":["bzz-raw://d77374c35a937e39ca389c24f2de6d78ec79902d1fc78d46b79caf8d8ea17107","dweb:/ipfs/QmPjjbctL4FN8pm2KGTZr5rsvsBZEGn95tqT91vsBCtXU8"],"license":"BUSL-1.1"},"src/interfaces/IBaseController.sol":{"keccak256":"0x8fe524fac0b04c8415e814b1dfb1ca28d303c8de65df22c268dc1d5f4e74a9d5","urls":["bzz-raw://b69c11d3e90c65202e184de1ece928269ccd49e82aeec1aab1d489e92d3ea5cc","dweb:/ipfs/QmYNoffB6UhJXTaKVwcxH4zzZgAVv3x3vacrVMQxmnHVju"],"license":"MIT"},"src/interfaces/IBaseOracleAdapter.sol":{"keccak256":"0x9c4c3727631ccc8ad4d202a1b7faf8833fae0d93d0a7fca45de009ab8f7ecab9","urls":["bzz-raw://4b904def3696b12cbef6997b34e2bb4c8aef6af52bb640840040b6b59b25f0be","dweb:/ipfs/QmfReXd9EmWRDFjs2SLdn6YUqyVH9RMxCjvzPnjLDYxuQP"],"license":"MIT"},"src/interfaces/IOval.sol":{"keccak256":"0x8511408e4da9818a36531a464a42f99461ce38419def87f35c52c58fe4d4f6aa","urls":["bzz-raw://501d19f2a3bcadaa8095c5808bfae348d8ebe78b34084115ee635c1ad101c953","dweb:/ipfs/QmRqkEjEE9ydGrMCTJttjq6harZytTZDa8AQ2NriVU1A2H"],"license":"MIT"},"src/interfaces/chainlink/IAggregatorV3.sol":{"keccak256":"0xb4d26247f867a5a5614638bdee251e29b73eddc61c4b9f04f8af2d88e2f4e05d","urls":["bzz-raw://0628c9b3a05410dee47e48ee68c2e3004b0c977c9942149a9206be7795d033d1","dweb:/ipfs/QmdSGsY55cMx3CKQJ3huz9P54XVfKWnHLxQsoqweve2Z8G"],"license":"MIT"},"src/interfaces/chainlink/IAggregatorV3Source.sol":{"keccak256":"0xace678af82f9ae630210cc7b85cb8759b89b3d7280525ebbcb78aa7c33f5c79f","urls":["bzz-raw://63e72db0effebba1b9048614c1ba8e72018957dddff712be2d3a2893229e210e","dweb:/ipfs/QmNLqP4G5ujrZdt2rVTrXpLHuqRUR1hugxQzbNmGReLQtZ"],"license":"MIT"}},"version":1},"id":47} \ No newline at end of file diff --git a/src/abi/StandardChronicleFactory.json b/src/abi/StandardChronicleFactory.json new file mode 100644 index 0000000..b38c2f6 --- /dev/null +++ b/src/abi/StandardChronicleFactory.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"maxTraversal","type":"uint256","internalType":"uint256"},{"name":"_defaultUnlockers","type":"address[]","internalType":"address[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"MAX_TRAVERSAL","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"create","inputs":[{"name":"chronicle","type":"address","internalType":"contract IMedian"},{"name":"lockWindow","type":"uint256","internalType":"uint256"},{"name":"maxAge","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"oval","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"defaultUnlockers","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setDefaultUnlockers","inputs":[{"name":"_defaultUnlockers","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"DefaultUnlockersSet","inputs":[{"name":"defaultUnlockers","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"OvalDeployed","inputs":[{"name":"deployer","type":"address","indexed":true,"internalType":"address"},{"name":"oval","type":"address","indexed":true,"internalType":"address"},{"name":"lockWindow","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"maxTraversal","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"owner","type":"address","indexed":false,"internalType":"address"},{"name":"unlockers","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"bytecode":{"object":"0x60a06040523480156200001157600080fd5b506040516200234c3803806200234c83398101604081905262000034916200026f565b81816200004133620000b1565b60008211620000975760405162461bcd60e51b815260206004820152601960248201527f4d61782074726176657273616c206d757374206265203e20300000000000000060448201526064015b60405180910390fd5b6080829052620000a78162000101565b505050506200039e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200010b6200015d565b805162000120906001906020840190620001bb565b507f53dcea6cd8a9fb42c53d0155aebceb09df1f90371ee9727c244f6557223bae16816040516200015291906200034f565b60405180910390a150565b6000546001600160a01b03163314620001b95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200008e565b565b82805482825590600052602060002090810192821562000213579160200282015b828111156200021357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620001dc565b506200022192915062000225565b5090565b5b8082111562000221576000815560010162000226565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200026a57600080fd5b919050565b600080604083850312156200028357600080fd5b8251602080850151919350906001600160401b0380821115620002a557600080fd5b818601915086601f830112620002ba57600080fd5b815181811115620002cf57620002cf6200023c565b8060051b604051601f19603f83011681018181108582111715620002f757620002f76200023c565b6040529182528482019250838101850191898311156200031657600080fd5b938501935b828510156200033f576200032f8562000252565b845293850193928501926200031b565b8096505050505050509250929050565b6020808252825182820181905260009190848201906040850190845b81811015620003925783516001600160a01b0316835292840192918401916001016200036b565b50909695505050505050565b608051611f85620003c76000396000818160c60152818161016201526102030152611f856000f3fe60806040523480156200001157600080fd5b5060043610620000875760003560e01c8063715018a61162000062578063715018a6146200010e5780638da5cb5b146200011a578063a9d14058146200012c578063f2fde38b146200014357600080fd5b80635165da30146200008c5780635878157614620000c05780635c681d1e14620000f7575b600080fd5b620000a36200009d366004620004ca565b6200015a565b6040516001600160a01b0390911681526020015b60405180910390f35b620000e87f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001620000b7565b620000a36200010836600462000502565b62000257565b6200011862000282565b005b6000546001600160a01b0316620000a3565b620001186200013d36600462000544565b6200029a565b620001186200015436600462000617565b620002f6565b6000836001847f000000000000000000000000000000000000000000000000000000000000000085620001956000546001600160a01b031690565b604051620001a39062000425565b620001b49695949392919062000689565b604051809103906000f080158015620001d1573d6000803e3d6000fd5b509050826001600160a01b038216337f5e826bc8ad243559fc75cc77b0e474a2ec85df26aeb5cd6db9d9ed1740f39afa7f0000000000000000000000000000000000000000000000000000000000000000620002356000546001600160a01b031690565b60016040516200024893929190620006d5565b60405180910390a49392505050565b600181815481106200026857600080fd5b6000918252602090912001546001600160a01b0316905081565b6200028c62000379565b620002986000620003d5565b565b620002a462000379565b8051620002b990600190602084019062000433565b507f53dcea6cd8a9fb42c53d0155aebceb09df1f90371ee9727c244f6557223bae1681604051620002eb91906200070a565b60405180910390a150565b6200030062000379565b6001600160a01b0381166200036b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6200037681620003d5565b50565b6000546001600160a01b03163314620002985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000362565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6117f6806200075a83390190565b8280548282559060005260206000209081019282156200048b579160200282015b828111156200048b57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000454565b50620004999291506200049d565b5090565b5b808211156200049957600081556001016200049e565b6001600160a01b03811681146200037657600080fd5b600080600060608486031215620004e057600080fd5b8335620004ed81620004b4565b95602085013595506040909401359392505050565b6000602082840312156200051557600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b80356200053f81620004b4565b919050565b600060208083850312156200055857600080fd5b823567ffffffffffffffff808211156200057157600080fd5b818501915085601f8301126200058657600080fd5b8135818111156200059b576200059b6200051c565b8060051b604051601f19603f83011681018181108582111715620005c357620005c36200051c565b604052918252848201925083810185019188831115620005e257600080fd5b938501935b828510156200060b57620005fb8562000532565b84529385019392850192620005e7565b98975050505050505050565b6000602082840312156200062a57600080fd5b81356200063781620004b4565b9392505050565b6000815480845260208085019450836000528060002060005b838110156200067e5781546001600160a01b03168752958201956001918201910162000657565b509495945050505050565b600060018060a01b03808916835260c06020840152620006ad60c08401896200063e565b915086604084015285606084015284608084015280841660a084015250979650505050505050565b8381526001600160a01b038316602082015260606040820181905260009062000701908301846200063e565b95945050505050565b6020808252825182820181905260009190848201906040850190845b818110156200074d5783516001600160a01b03168352928401929184019160010162000726565b5090969550505050505056fe6101206040523480156200001257600080fd5b50604051620017f6380380620017f6833981016040819052620000359162000417565b60128685858886620000473362000258565b8381116200009c5760405162461bcd60e51b815260206004820152601d60248201527f4d617820616765206e6f742061626f7665206c6f636b2077696e646f7700000060448201526064015b60405180910390fd5b60008311620000ee5760405162461bcd60e51b815260206004820152601960248201527f4d61782074726176657273616c206d757374206265203e203000000000000000604482015260640162000093565b608084905260a083905260c081905260005b82518110156200014e576200013983828151811062000123576200012362000530565b60200260200101516001620002a860201b60201c565b80620001458162000546565b91505062000100565b5060405184907f7232430c38d2db810b464dc9cd004f0e41528c6ba2eb1e2e4e3220ffd3a83a1b90600090a260405183907f9955b343f0b35bf4c2045c06550a8ec2d914db72d497a1430ca3526a248f20a590600090a260405181907f6777d8e4257e9f6a86d2f91b2b9fceaeb931d8b35249fbb63203c2dc0c08187090600090a2505050506001600160a01b03811660e08190526040517f4c8947d84ec5b72893956872efb0653c066b1b7895c0cb617c7679ee0fd1efff90600090a25060ff81166101008190526040517f4e500e16c773a18df7642e2d86cfe357eab156473b38c34df4e15dffb895072690600090a2506200024c8162000258565b5050505050506200056e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620002b262000378565b6001600160a01b03821660009081526002602052604090205481151560ff909116151503620003245760405162461bcd60e51b815260206004820152601460248201527f556e6c6f636b6572206e6f74206368616e676564000000000000000000000000604482015260640162000093565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b6000546001600160a01b03163314620003d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000093565b565b6001600160a01b0381168114620003ec57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b80516200041281620003d6565b919050565b60008060008060008060c087890312156200043157600080fd5b86516200043e81620003d6565b602088810151919750906001600160401b03808211156200045e57600080fd5b818a0191508a601f8301126200047357600080fd5b815181811115620004885762000488620003ef565b8060051b604051601f19603f83011681018181108582111715620004b057620004b0620003ef565b60405291825284820192508381018501918d831115620004cf57600080fd5b938501935b82851015620004f857620004e88562000405565b84529385019392850192620004d4565b809a505050505050506040870151935060608701519250608087015191506200052460a0880162000405565b90509295509295509295565b634e487b7160e01b600052603260045260246000fd5b6000600182016200056757634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e05161010051611204620005f2600039600081816101ff01528181610685015281816108b20152610b050152600081816103980152818161053401526105bb01526000818161029e0152610d3a0152600081816103660152610467015260008181610248015281816104340152610a8f01526112046000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80637292eb69116100de578063bf39dd4911610097578063d6565a2d11610071578063d6565a2d146103e0578063f2fde38b146103f3578063f6e1d17a14610406578063feaf968c1461041957600080fd5b8063bf39dd4914610393578063cb53b08d146103ba578063d3fff0f6146103cd57600080fd5b80637292eb69146102ca5780638205bf6a146102ed5780638da5cb5b146102f55780639a6fc8f51461031a578063a3c0447614610364578063a5c38b3d1461038a57600080fd5b80633376f53a116101305780633376f53a146102465780633d6ba5781461027657806350d25bcd1461028c5780636666d37214610294578063687043c51461029c578063715018a6146102c257600080fd5b80630125554b1461017857806313862364146101a0578063172b09f9146101aa57806324a419f4146101dd578063313ce567146101fa57806332c6534b14610233575b600080fd5b610180610421565b604080519384526020840192909252908201526060015b60405180910390f35b6101a8610496565b005b6101cd6101b8366004610ec0565b60026020526000908152604090205460ff1681565b6040519015158152602001610197565b6101e561052c565b60408051928352602083019190915201610197565b6102217f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610197565b6101cd610241366004610edb565b61064b565b7f00000000000000000000000000000000000000000000000000000000000000005b604051908152602001610197565b6101e5610284366004610f05565b506000908190565b61026861066e565b6101a86106af565b7f0000000000000000000000000000000000000000000000000000000000000000610268565b6101a86107d8565b6102d26107ec565b60408051825181526020928301519281019290925201610197565b610268610872565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610197565b61032d610328366004610f1e565b610885565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a001610197565b7f0000000000000000000000000000000000000000000000000000000000000000610268565b61026860015481565b6103027f000000000000000000000000000000000000000000000000000000000000000081565b6101806103c8366004610f4a565b6108e9565b6101a86103db366004610f6c565b610911565b6101e56103ee366004610f05565b6109d4565b6101a8610401366004610ec0565b610a02565b6101e5610414366004610f05565b610a7b565b61032d610ad5565b600080600061048b6104656001546104567f000000000000000000000000000000000000000000000000000000000000000090565b6104609042610fbe565b610b3d565b7f00000000000000000000000000000000000000000000000000000000000000006108e9565b925092509250909192565b6104a23360015461064b565b6104f35760405162461bcd60e51b815260206004820152601d60248201527f436f6e74726f6c6c657220626c6f636b65643a2063616e556e6c6f636b00000060448201526064015b60405180910390fd5b6104fb6106af565b4260018190556040517f3ee2ed8fd57cf3bdf05ef91fbe207825c00ef41e2303a859c67a84cd46cd69aa90600090a2565b6000806105b97f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166357de26a46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b49190610fd1565b610b55565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663262a9dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b9190610fea565b909363ffffffff90911692509050565b6001600160a01b03821660009081526002602052604090205460ff165b92915050565b600080610679610421565b505090506106a98160127f0000000000000000000000000000000000000000000000000000000000000000610bc3565b91505090565b6000806106ba61052c565b6040805180820190915282815260208101829052919350915060008290036106e157505050565b6003548015801590610724575060208201516003610700600184610fbe565b8154811061071057610710611010565b906000526020600020906002020160010154145b1561072f5750505050565b60038054600181018255600091909152825160029091027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810182905560208401517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c9091018190556040517ff500358c8d5c04faf9e5b933d49e928da38afad4ff748ca6cd85428485caa508906107ca9085815260200190565b60405180910390a350505050565b6107e0610c34565b6107ea6000610c8e565b565b60408051808201909152600080825260208201526003541561085a576003805461081890600190610fbe565b8154811061082857610828611010565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050905090565b50604080518082019091526000808252602082015290565b60008061087d610421565b509392505050565b60008060008060008060006108a58869ffffffffffffffffffff16610a7b565b91509150876108d68360127f0000000000000000000000000000000000000000000000000000000000000000610bc3565b9099909891975087965090945092505050565b6000806000806108f98686610cde565b80516020909101519097909650600195509350505050565b610919610c34565b6001600160a01b03821660009081526002602052604090205481151560ff9091161515036109805760405162461bcd60e51b8152602060048201526014602482015273155b9b1bd8dad95c881b9bdd0818da185b99d95960621b60448201526064016104ea565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b600381815481106109e457600080fd5b60009182526020909120600290910201805460019091015490915082565b610a0a610c34565b6001600160a01b038116610a6f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104ea565b610a7881610c8e565b50565b6001546000908190819081908190610ab3907f0000000000000000000000000000000000000000000000000000000000000000610456565b9050808211610ac757509094909350915050565b506000958695509350505050565b600080600080600080600080610ae9610421565b9250925092506000610afa82610d7e565b905080610b298560127f0000000000000000000000000000000000000000000000000000000000000000610bc3565b909a90995092975087965094509092505050565b6000818311610b4c5781610b4e565b825b9392505050565b60006001600160ff1b03821115610bbf5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016104ea565b5090565b60008160ff168360ff1603610bd9575082610b4e565b8160ff168360ff161015610c0d57610bf18383611026565b610bfc90600a611123565b610c069085611132565b9050610b4e565b610c178284611026565b610c2290600a611123565b610c2c9085611162565b949350505050565b6000546001600160a01b031633146107ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ea565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805180820190915260008082526020820152600080610cfd61052c565b60408051808201909152828152602081018290529193509150858211610d27579250610668915050565b6000610d338787610de9565b9050610d5f7f000000000000000000000000000000000000000000000000000000000000000042610fbe565b816020015110610d7457935061066892505050565b5095945050505050565b600069ffffffffffffffffffff821115610bbf5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203860448201526530206269747360d01b60648201526084016104ea565b604080518082019091526000808252602082015260408051808201909152600080825260208201526003546000905b8482108015610e275750600081115b15610e9a5780610e368161119e565b91505060038181548110610e4c57610e4c611010565b600091825260209182902060408051808201909152600290920201805482526001015491810182905293508610610e8857829350505050610668565b81610e92816111b5565b925050610e18565b5090949350505050565b80356001600160a01b0381168114610ebb57600080fd5b919050565b600060208284031215610ed257600080fd5b610b4e82610ea4565b60008060408385031215610eee57600080fd5b610ef783610ea4565b946020939093013593505050565b600060208284031215610f1757600080fd5b5035919050565b600060208284031215610f3057600080fd5b813569ffffffffffffffffffff81168114610b4e57600080fd5b60008060408385031215610f5d57600080fd5b50508035926020909101359150565b60008060408385031215610f7f57600080fd5b610f8883610ea4565b915060208301358015158114610f9d57600080fd5b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561066857610668610fa8565b600060208284031215610fe357600080fd5b5051919050565b600060208284031215610ffc57600080fd5b815163ffffffff81168114610b4e57600080fd5b634e487b7160e01b600052603260045260246000fd5b60ff828116828216039081111561066857610668610fa8565b600181815b8085111561107a57816000190482111561106057611060610fa8565b8085161561106d57918102915b93841c9390800290611044565b509250929050565b60008261109157506001610668565b8161109e57506000610668565b81600181146110b457600281146110be576110da565b6001915050610668565b60ff8411156110cf576110cf610fa8565b50506001821b610668565b5060208310610133831016604e8410600b84101617156110fd575081810a610668565b611107838361103f565b806000190482111561111b5761111b610fa8565b029392505050565b6000610b4e60ff841683611082565b80820260008212600160ff1b8414161561114e5761114e610fa8565b818105831482151761066857610668610fa8565b60008261117f57634e487b7160e01b600052601260045260246000fd5b600160ff1b82146000198414161561119957611199610fa8565b500590565b6000816111ad576111ad610fa8565b506000190190565b6000600182016111c7576111c7610fa8565b506001019056fea2646970667358221220823402e55e5551ab500933ba22fe47fda037e52aa7a47b54f9d880498294814264736f6c63430008110033a2646970667358221220e260d64872f450ee4dddaf165b391ef1b74d817835b6f3b894af501c551524f664736f6c63430008110033","sourceMap":"1680:1079:48:-:0;;;1744:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1834:12;1848:17;936:32:14;719:10:18;936:18:14;:32::i;:::-;925:1:45;909:13;:17;901:55;;;;-1:-1:-1;;;901:55:45;;1725:2:65;901:55:45;;;1707:21:65;1764:2;1744:18;;;1737:30;1803:27;1783:18;;;1776:55;1848:18;;901:55:45;;;;;;;;;967:29;;;;1006:38;1026:17;1006:19;:38::i;:::-;820:231;;1744:129:48;;1680:1079;;2426:187:14;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:14;;;-1:-1:-1;;;;;;2534:17:14;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;1398:188:45:-;1094:13:14;:11;:13::i;:::-;1490:36:45;;::::1;::::0;:16:::1;::::0;:36:::1;::::0;::::1;::::0;::::1;:::i;:::-;;1541:38;1561:17;1541:38;;;;;;:::i;:::-;;;;;;;;1398:188:::0;:::o;1359:130:14:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:14;719:10:18;1422:23:14;1414:68;;;;-1:-1:-1;;;1414:68:14;;2742:2:65;1414:68:14;;;2724:21:65;;;2761:18;;;2754:30;2820:34;2800:18;;;2793:62;2872:18;;1414:68:14;2540:356:65;1414:68:14;1359:130::o;1680:1079:48:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1680:1079:48;-1:-1:-1;;;;;1680:1079:48;;;;;;;;;;;-1:-1:-1;1680:1079:48;;;;;;;-1:-1:-1;1680:1079:48;;;-1:-1:-1;1680:1079:48;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:127:65;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:177;225:13;;-1:-1:-1;;;;;267:31:65;;257:42;;247:70;;313:1;310;303:12;247:70;146:177;;;:::o;328:1190::-;432:6;440;493:2;481:9;472:7;468:23;464:32;461:52;;;509:1;506;499:12;461:52;532:16;;567:2;598:18;;;592:25;532:16;;-1:-1:-1;567:2:65;-1:-1:-1;;;;;666:14:65;;;663:34;;;693:1;690;683:12;663:34;731:6;720:9;716:22;706:32;;776:7;769:4;765:2;761:13;757:27;747:55;;798:1;795;788:12;747:55;827:2;821:9;849:2;845;842:10;839:36;;;855:18;;:::i;:::-;901:2;898:1;894:10;933:2;927:9;996:2;992:7;987:2;983;979:11;975:25;967:6;963:38;1051:6;1039:10;1036:22;1031:2;1019:10;1016:18;1013:46;1010:72;;;1062:18;;:::i;:::-;1098:2;1091:22;1148:18;;;1182:15;;;;-1:-1:-1;1224:11:65;;;1220:20;;;1252:19;;;1249:39;;;1284:1;1281;1274:12;1249:39;1308:11;;;;1328:159;1344:6;1339:3;1336:15;1328:159;;;1410:34;1440:3;1410:34;:::i;:::-;1398:47;;1361:12;;;;1465;;;;1328:159;;;1506:6;1496:16;;;;;;;;328:1190;;;;;:::o;1877:658::-;2048:2;2100:21;;;2170:13;;2073:18;;;2192:22;;;2019:4;;2048:2;2271:15;;;;2245:2;2230:18;;;2019:4;2314:195;2328:6;2325:1;2322:13;2314:195;;;2393:13;;-1:-1:-1;;;;;2389:39:65;2377:52;;2484:15;;;;2449:12;;;;2425:1;2343:9;2314:195;;;-1:-1:-1;2526:3:65;;1877:658;-1:-1:-1;;;;;;1877:658:65:o;2540:356::-;1680:1079:48;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040523480156200001157600080fd5b5060043610620000875760003560e01c8063715018a61162000062578063715018a6146200010e5780638da5cb5b146200011a578063a9d14058146200012c578063f2fde38b146200014357600080fd5b80635165da30146200008c5780635878157614620000c05780635c681d1e14620000f7575b600080fd5b620000a36200009d366004620004ca565b6200015a565b6040516001600160a01b0390911681526020015b60405180910390f35b620000e87f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001620000b7565b620000a36200010836600462000502565b62000257565b6200011862000282565b005b6000546001600160a01b0316620000a3565b620001186200013d36600462000544565b6200029a565b620001186200015436600462000617565b620002f6565b6000836001847f000000000000000000000000000000000000000000000000000000000000000085620001956000546001600160a01b031690565b604051620001a39062000425565b620001b49695949392919062000689565b604051809103906000f080158015620001d1573d6000803e3d6000fd5b509050826001600160a01b038216337f5e826bc8ad243559fc75cc77b0e474a2ec85df26aeb5cd6db9d9ed1740f39afa7f0000000000000000000000000000000000000000000000000000000000000000620002356000546001600160a01b031690565b60016040516200024893929190620006d5565b60405180910390a49392505050565b600181815481106200026857600080fd5b6000918252602090912001546001600160a01b0316905081565b6200028c62000379565b620002986000620003d5565b565b620002a462000379565b8051620002b990600190602084019062000433565b507f53dcea6cd8a9fb42c53d0155aebceb09df1f90371ee9727c244f6557223bae1681604051620002eb91906200070a565b60405180910390a150565b6200030062000379565b6001600160a01b0381166200036b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6200037681620003d5565b50565b6000546001600160a01b03163314620002985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000362565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6117f6806200075a83390190565b8280548282559060005260206000209081019282156200048b579160200282015b828111156200048b57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000454565b50620004999291506200049d565b5090565b5b808211156200049957600081556001016200049e565b6001600160a01b03811681146200037657600080fd5b600080600060608486031215620004e057600080fd5b8335620004ed81620004b4565b95602085013595506040909401359392505050565b6000602082840312156200051557600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b80356200053f81620004b4565b919050565b600060208083850312156200055857600080fd5b823567ffffffffffffffff808211156200057157600080fd5b818501915085601f8301126200058657600080fd5b8135818111156200059b576200059b6200051c565b8060051b604051601f19603f83011681018181108582111715620005c357620005c36200051c565b604052918252848201925083810185019188831115620005e257600080fd5b938501935b828510156200060b57620005fb8562000532565b84529385019392850192620005e7565b98975050505050505050565b6000602082840312156200062a57600080fd5b81356200063781620004b4565b9392505050565b6000815480845260208085019450836000528060002060005b838110156200067e5781546001600160a01b03168752958201956001918201910162000657565b509495945050505050565b600060018060a01b03808916835260c06020840152620006ad60c08401896200063e565b915086604084015285606084015284608084015280841660a084015250979650505050505050565b8381526001600160a01b038316602082015260606040820181905260009062000701908301846200063e565b95945050505050565b6020808252825182820181905260009190848201906040850190845b818110156200074d5783516001600160a01b03168352928401929184019160010162000726565b5090969550505050505056fe6101206040523480156200001257600080fd5b50604051620017f6380380620017f6833981016040819052620000359162000417565b60128685858886620000473362000258565b8381116200009c5760405162461bcd60e51b815260206004820152601d60248201527f4d617820616765206e6f742061626f7665206c6f636b2077696e646f7700000060448201526064015b60405180910390fd5b60008311620000ee5760405162461bcd60e51b815260206004820152601960248201527f4d61782074726176657273616c206d757374206265203e203000000000000000604482015260640162000093565b608084905260a083905260c081905260005b82518110156200014e576200013983828151811062000123576200012362000530565b60200260200101516001620002a860201b60201c565b80620001458162000546565b91505062000100565b5060405184907f7232430c38d2db810b464dc9cd004f0e41528c6ba2eb1e2e4e3220ffd3a83a1b90600090a260405183907f9955b343f0b35bf4c2045c06550a8ec2d914db72d497a1430ca3526a248f20a590600090a260405181907f6777d8e4257e9f6a86d2f91b2b9fceaeb931d8b35249fbb63203c2dc0c08187090600090a2505050506001600160a01b03811660e08190526040517f4c8947d84ec5b72893956872efb0653c066b1b7895c0cb617c7679ee0fd1efff90600090a25060ff81166101008190526040517f4e500e16c773a18df7642e2d86cfe357eab156473b38c34df4e15dffb895072690600090a2506200024c8162000258565b5050505050506200056e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620002b262000378565b6001600160a01b03821660009081526002602052604090205481151560ff909116151503620003245760405162461bcd60e51b815260206004820152601460248201527f556e6c6f636b6572206e6f74206368616e676564000000000000000000000000604482015260640162000093565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b6000546001600160a01b03163314620003d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000093565b565b6001600160a01b0381168114620003ec57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b80516200041281620003d6565b919050565b60008060008060008060c087890312156200043157600080fd5b86516200043e81620003d6565b602088810151919750906001600160401b03808211156200045e57600080fd5b818a0191508a601f8301126200047357600080fd5b815181811115620004885762000488620003ef565b8060051b604051601f19603f83011681018181108582111715620004b057620004b0620003ef565b60405291825284820192508381018501918d831115620004cf57600080fd5b938501935b82851015620004f857620004e88562000405565b84529385019392850192620004d4565b809a505050505050506040870151935060608701519250608087015191506200052460a0880162000405565b90509295509295509295565b634e487b7160e01b600052603260045260246000fd5b6000600182016200056757634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e05161010051611204620005f2600039600081816101ff01528181610685015281816108b20152610b050152600081816103980152818161053401526105bb01526000818161029e0152610d3a0152600081816103660152610467015260008181610248015281816104340152610a8f01526112046000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80637292eb69116100de578063bf39dd4911610097578063d6565a2d11610071578063d6565a2d146103e0578063f2fde38b146103f3578063f6e1d17a14610406578063feaf968c1461041957600080fd5b8063bf39dd4914610393578063cb53b08d146103ba578063d3fff0f6146103cd57600080fd5b80637292eb69146102ca5780638205bf6a146102ed5780638da5cb5b146102f55780639a6fc8f51461031a578063a3c0447614610364578063a5c38b3d1461038a57600080fd5b80633376f53a116101305780633376f53a146102465780633d6ba5781461027657806350d25bcd1461028c5780636666d37214610294578063687043c51461029c578063715018a6146102c257600080fd5b80630125554b1461017857806313862364146101a0578063172b09f9146101aa57806324a419f4146101dd578063313ce567146101fa57806332c6534b14610233575b600080fd5b610180610421565b604080519384526020840192909252908201526060015b60405180910390f35b6101a8610496565b005b6101cd6101b8366004610ec0565b60026020526000908152604090205460ff1681565b6040519015158152602001610197565b6101e561052c565b60408051928352602083019190915201610197565b6102217f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610197565b6101cd610241366004610edb565b61064b565b7f00000000000000000000000000000000000000000000000000000000000000005b604051908152602001610197565b6101e5610284366004610f05565b506000908190565b61026861066e565b6101a86106af565b7f0000000000000000000000000000000000000000000000000000000000000000610268565b6101a86107d8565b6102d26107ec565b60408051825181526020928301519281019290925201610197565b610268610872565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610197565b61032d610328366004610f1e565b610885565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a001610197565b7f0000000000000000000000000000000000000000000000000000000000000000610268565b61026860015481565b6103027f000000000000000000000000000000000000000000000000000000000000000081565b6101806103c8366004610f4a565b6108e9565b6101a86103db366004610f6c565b610911565b6101e56103ee366004610f05565b6109d4565b6101a8610401366004610ec0565b610a02565b6101e5610414366004610f05565b610a7b565b61032d610ad5565b600080600061048b6104656001546104567f000000000000000000000000000000000000000000000000000000000000000090565b6104609042610fbe565b610b3d565b7f00000000000000000000000000000000000000000000000000000000000000006108e9565b925092509250909192565b6104a23360015461064b565b6104f35760405162461bcd60e51b815260206004820152601d60248201527f436f6e74726f6c6c657220626c6f636b65643a2063616e556e6c6f636b00000060448201526064015b60405180910390fd5b6104fb6106af565b4260018190556040517f3ee2ed8fd57cf3bdf05ef91fbe207825c00ef41e2303a859c67a84cd46cd69aa90600090a2565b6000806105b97f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166357de26a46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b49190610fd1565b610b55565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663262a9dff6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063b9190610fea565b909363ffffffff90911692509050565b6001600160a01b03821660009081526002602052604090205460ff165b92915050565b600080610679610421565b505090506106a98160127f0000000000000000000000000000000000000000000000000000000000000000610bc3565b91505090565b6000806106ba61052c565b6040805180820190915282815260208101829052919350915060008290036106e157505050565b6003548015801590610724575060208201516003610700600184610fbe565b8154811061071057610710611010565b906000526020600020906002020160010154145b1561072f5750505050565b60038054600181018255600091909152825160029091027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810182905560208401517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c9091018190556040517ff500358c8d5c04faf9e5b933d49e928da38afad4ff748ca6cd85428485caa508906107ca9085815260200190565b60405180910390a350505050565b6107e0610c34565b6107ea6000610c8e565b565b60408051808201909152600080825260208201526003541561085a576003805461081890600190610fbe565b8154811061082857610828611010565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050905090565b50604080518082019091526000808252602082015290565b60008061087d610421565b509392505050565b60008060008060008060006108a58869ffffffffffffffffffff16610a7b565b91509150876108d68360127f0000000000000000000000000000000000000000000000000000000000000000610bc3565b9099909891975087965090945092505050565b6000806000806108f98686610cde565b80516020909101519097909650600195509350505050565b610919610c34565b6001600160a01b03821660009081526002602052604090205481151560ff9091161515036109805760405162461bcd60e51b8152602060048201526014602482015273155b9b1bd8dad95c881b9bdd0818da185b99d95960621b60448201526064016104ea565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b600381815481106109e457600080fd5b60009182526020909120600290910201805460019091015490915082565b610a0a610c34565b6001600160a01b038116610a6f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104ea565b610a7881610c8e565b50565b6001546000908190819081908190610ab3907f0000000000000000000000000000000000000000000000000000000000000000610456565b9050808211610ac757509094909350915050565b506000958695509350505050565b600080600080600080600080610ae9610421565b9250925092506000610afa82610d7e565b905080610b298560127f0000000000000000000000000000000000000000000000000000000000000000610bc3565b909a90995092975087965094509092505050565b6000818311610b4c5781610b4e565b825b9392505050565b60006001600160ff1b03821115610bbf5760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016104ea565b5090565b60008160ff168360ff1603610bd9575082610b4e565b8160ff168360ff161015610c0d57610bf18383611026565b610bfc90600a611123565b610c069085611132565b9050610b4e565b610c178284611026565b610c2290600a611123565b610c2c9085611162565b949350505050565b6000546001600160a01b031633146107ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ea565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805180820190915260008082526020820152600080610cfd61052c565b60408051808201909152828152602081018290529193509150858211610d27579250610668915050565b6000610d338787610de9565b9050610d5f7f000000000000000000000000000000000000000000000000000000000000000042610fbe565b816020015110610d7457935061066892505050565b5095945050505050565b600069ffffffffffffffffffff821115610bbf5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203860448201526530206269747360d01b60648201526084016104ea565b604080518082019091526000808252602082015260408051808201909152600080825260208201526003546000905b8482108015610e275750600081115b15610e9a5780610e368161119e565b91505060038181548110610e4c57610e4c611010565b600091825260209182902060408051808201909152600290920201805482526001015491810182905293508610610e8857829350505050610668565b81610e92816111b5565b925050610e18565b5090949350505050565b80356001600160a01b0381168114610ebb57600080fd5b919050565b600060208284031215610ed257600080fd5b610b4e82610ea4565b60008060408385031215610eee57600080fd5b610ef783610ea4565b946020939093013593505050565b600060208284031215610f1757600080fd5b5035919050565b600060208284031215610f3057600080fd5b813569ffffffffffffffffffff81168114610b4e57600080fd5b60008060408385031215610f5d57600080fd5b50508035926020909101359150565b60008060408385031215610f7f57600080fd5b610f8883610ea4565b915060208301358015158114610f9d57600080fd5b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561066857610668610fa8565b600060208284031215610fe357600080fd5b5051919050565b600060208284031215610ffc57600080fd5b815163ffffffff81168114610b4e57600080fd5b634e487b7160e01b600052603260045260246000fd5b60ff828116828216039081111561066857610668610fa8565b600181815b8085111561107a57816000190482111561106057611060610fa8565b8085161561106d57918102915b93841c9390800290611044565b509250929050565b60008261109157506001610668565b8161109e57506000610668565b81600181146110b457600281146110be576110da565b6001915050610668565b60ff8411156110cf576110cf610fa8565b50506001821b610668565b5060208310610133831016604e8410600b84101617156110fd575081810a610668565b611107838361103f565b806000190482111561111b5761111b610fa8565b029392505050565b6000610b4e60ff841683611082565b80820260008212600160ff1b8414161561114e5761114e610fa8565b818105831482151761066857610668610fa8565b60008261117f57634e487b7160e01b600052601260045260246000fd5b600160ff1b82146000198414161561119957611199610fa8565b500590565b6000816111ad576111ad610fa8565b506000190190565b6000600182016111c7576111c7610fa8565b506001019056fea2646970667358221220823402e55e5551ab500933ba22fe47fda037e52aa7a47b54f9d880498294814264736f6c63430008110033a2646970667358221220e260d64872f450ee4dddaf165b391ef1b74d817835b6f3b894af501c551524f664736f6c63430008110033","sourceMap":"1680:1079:48:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2432:325;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;737:32:65;;;719:51;;707:2;692:18;2432:325:48;;;;;;;;464:38:45;;;;;;;;927:25:65;;;915:2;900:18;464:38:45;781:177:65;508:33:45;;;;;;:::i;:::-;;:::i;1824:101:14:-;;;:::i;:::-;;1201:85;1247:7;1273:6;-1:-1:-1;;;;;1273:6:14;1201:85;;1398:188:45;;;;;;:::i;:::-;;:::i;2074:198:14:-;;;;;;:::i;:::-;;:::i;2432:325:48:-;2521:12;2578:9;2589:16;2607:10;2619:13;2634:6;2642:7;1247::14;1273:6;-1:-1:-1;;;;;1273:6:14;;1201:85;2642:7:48;2560:90;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2545:106:48;-1:-1:-1;2697:10:48;-1:-1:-1;;;;;2666:84:48;;2679:10;2666:84;2709:13;2724:7;1247::14;1273:6;-1:-1:-1;;;;;1273:6:14;;1201:85;2724:7:48;2733:16;2666:84;;;;;;;;:::i;:::-;;;;;;;;2432:325;;;;;:::o;508:33:45:-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;508:33:45;;-1:-1:-1;508:33:45;:::o;1824:101:14:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;1398:188:45:-;1094:13:14;:11;:13::i;:::-;1490:36:45;;::::1;::::0;:16:::1;::::0;:36:::1;::::0;::::1;::::0;::::1;:::i;:::-;;1541:38;1561:17;1541:38;;;;;;:::i;:::-;;;;;;;;1398:188:::0;:::o;2074:198:14:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:14;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:14;;5322:2:65;2154:73:14::1;::::0;::::1;5304:21:65::0;5361:2;5341:18;;;5334:30;5400:34;5380:18;;;5373:62;-1:-1:-1;;;5451:18:65;;;5444:36;5497:19;;2154:73:14::1;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;1359:130::-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:14;719:10:18;1422:23:14;1414:68;;;;-1:-1:-1;;;1414:68:14;;5729:2:65;1414:68:14;;;5711:21:65;;;5748:18;;;5741:30;5807:34;5787:18;;;5780:62;5859:18;;1414:68:14;5527:356:65;2426:187:14;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:14;;;-1:-1:-1;;;;;;2534:17:14;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;-1:-1:-1:-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:140:65;-1:-1:-1;;;;;98:31:65;;88:42;;78:70;;144:1;141;134:12;159:409;253:6;261;269;322:2;310:9;301:7;297:23;293:32;290:52;;;338:1;335;328:12;290:52;377:9;364:23;396:40;430:5;396:40;:::i;:::-;455:5;507:2;492:18;;479:32;;-1:-1:-1;558:2:65;543:18;;;530:32;;159:409;-1:-1:-1;;;159:409:65:o;963:180::-;1022:6;1075:2;1063:9;1054:7;1050:23;1046:32;1043:52;;;1091:1;1088;1081:12;1043:52;-1:-1:-1;1114:23:65;;963:180;-1:-1:-1;963:180:65:o;1148:127::-;1209:10;1204:3;1200:20;1197:1;1190:31;1240:4;1237:1;1230:15;1264:4;1261:1;1254:15;1280:143;1348:20;;1377:40;1348:20;1377:40;:::i;:::-;1280:143;;;:::o;1428:1121::-;1512:6;1543:2;1586;1574:9;1565:7;1561:23;1557:32;1554:52;;;1602:1;1599;1592:12;1554:52;1642:9;1629:23;1671:18;1712:2;1704:6;1701:14;1698:34;;;1728:1;1725;1718:12;1698:34;1766:6;1755:9;1751:22;1741:32;;1811:7;1804:4;1800:2;1796:13;1792:27;1782:55;;1833:1;1830;1823:12;1782:55;1869:2;1856:16;1891:2;1887;1884:10;1881:36;;;1897:18;;:::i;:::-;1943:2;1940:1;1936:10;1975:2;1969:9;2038:2;2034:7;2029:2;2025;2021:11;2017:25;2009:6;2005:38;2093:6;2081:10;2078:22;2073:2;2061:10;2058:18;2055:46;2052:72;;;2104:18;;:::i;:::-;2140:2;2133:22;2190:18;;;2224:15;;;;-1:-1:-1;2266:11:65;;;2262:20;;;2294:19;;;2291:39;;;2326:1;2323;2316:12;2291:39;2350:11;;;;2370:148;2386:6;2381:3;2378:15;2370:148;;;2452:23;2471:3;2452:23;:::i;:::-;2440:36;;2403:12;;;;2496;;;;2370:148;;;2537:6;1428:1121;-1:-1:-1;;;;;;;;1428:1121:65:o;2554:256::-;2613:6;2666:2;2654:9;2645:7;2641:23;2637:32;2634:52;;;2682:1;2679;2672:12;2634:52;2721:9;2708:23;2740:40;2774:5;2740:40;:::i;:::-;2799:5;2554:256;-1:-1:-1;;;2554:256:65:o;2815:495::-;2876:3;2914:5;2908:12;2941:6;2936:3;2929:19;2967:4;2996:2;2991:3;2987:12;2980:19;;3018:5;3015:1;3008:16;3060:2;3057:1;3047:16;3081:1;3091:194;3105:6;3102:1;3099:13;3091:194;;;3170:13;;-1:-1:-1;;;;;3166:39:65;3154:52;;3226:12;;;;3202:1;3261:14;;;;3120:9;3091:194;;;-1:-1:-1;3301:3:65;;2815:495;-1:-1:-1;;;;;2815:495:65:o;3315:698::-;3611:4;3657:1;3653;3648:3;3644:11;3640:19;3698:2;3690:6;3686:15;3675:9;3668:34;3738:3;3733:2;3722:9;3718:18;3711:31;3759:65;3819:3;3808:9;3804:19;3796:6;3759:65;:::i;:::-;3751:73;;3860:6;3855:2;3844:9;3840:18;3833:34;3903:6;3898:2;3887:9;3883:18;3876:34;3947:6;3941:3;3930:9;3926:19;3919:35;4003:2;3995:6;3991:15;3985:3;3974:9;3970:19;3963:44;;3315:698;;;;;;;;;:::o;4018:434::-;4232:25;;;-1:-1:-1;;;;;4293:32:65;;4288:2;4273:18;;4266:60;4362:2;4357;4342:18;;4335:30;;;-1:-1:-1;;4382:64:65;;4427:18;;4419:6;4382:64;:::i;:::-;4374:72;4018:434;-1:-1:-1;;;;;4018:434:65:o;4457:658::-;4628:2;4680:21;;;4750:13;;4653:18;;;4772:22;;;4599:4;;4628:2;4851:15;;;;4825:2;4810:18;;;4599:4;4894:195;4908:6;4905:1;4902:13;4894:195;;;4973:13;;-1:-1:-1;;;;;4969:39:65;4957:52;;5064:15;;;;5029:12;;;;5005:1;4923:9;4894:195;;;-1:-1:-1;5106:3:65;;4457:658;-1:-1:-1;;;;;;4457:658:65:o","linkReferences":{},"immutableReferences":{"45786":[{"start":198,"length":32},{"start":354,"length":32},{"start":515,"length":32}]}},"methodIdentifiers":{"MAX_TRAVERSAL()":"58781576","create(address,uint256,uint256)":"5165da30","defaultUnlockers(uint256)":"5c681d1e","owner()":"8da5cb5b","renounceOwnership()":"715018a6","setDefaultUnlockers(address[])":"a9d14058","transferOwnership(address)":"f2fde38b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxTraversal\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_defaultUnlockers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"defaultUnlockers\",\"type\":\"address[]\"}],\"name\":\"DefaultUnlockersSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"deployer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oval\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"lockWindow\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxTraversal\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"unlockers\",\"type\":\"address[]\"}],\"name\":\"OvalDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_TRAVERSAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IMedian\",\"name\":\"chronicle\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"lockWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxAge\",\"type\":\"uint256\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"oval\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"defaultUnlockers\",\"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\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_defaultUnlockers\",\"type\":\"address[]\"}],\"name\":\"setDefaultUnlockers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This is the best factory for most use cases that need a Chronicle source, but there are other variants that may be needed if different mutability or interface choices are desired.\",\"kind\":\"dev\",\"methods\":{\"create(address,uint256,uint256)\":{\"params\":{\"chronicle\":\"Chronicle source contract.\",\"lockWindow\":\"the lockWindow used for this Oval instance. This is the length of the window for the Oval auction to be run and, thus, the maximum time that prices will be delayed.\",\"maxAge\":\"max age of a price that is used in place of the current price. If the only available price is older than this, OEV is not captured and the current price is provided.\"},\"returns\":{\"oval\":\"deployed oval address.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setDefaultUnlockers(address[])\":{\"details\":\"This and the owner, itself, is the only mutable portion of this factory.\",\"params\":{\"_defaultUnlockers\":\"default unlockers that will be used to instantiate new Oval instances.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"StandardChronicleFactory is the recommended factory for use cases that want a Chronicle source and Chainlink interface.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(address,uint256,uint256)\":{\"notice\":\"Creates the Chronicle Oval instance.\"},\"setDefaultUnlockers(address[])\":{\"notice\":\"Enables the owner to set the default unlockers that will be passed to all Oval instances created by this contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/factories/StandardChronicleFactory.sol\":\"StandardChronicleFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@chainlink/=lib/redstone-contracts/lib/@chainlink/\",\":@openzeppelin/contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/redstone-contracts/lib/openzeppelin-contracts/contracts/\",\":@redstone-finance/evm-connector/contracts/=lib/redstone-contracts/src/evm-connector/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts/contracts/\",\":redstone-contracts/=lib/redstone-contracts/src/\",\":redstone-oracle/=lib/redstone-contracts/src/\"]},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32\",\"dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278\",\"dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH\"]},\"src/DiamondRootOval.sol\":{\"keccak256\":\"0x54d2c3c6650a988ae636faa36e296fbf075ab5886da4a3ec9014de99512c2ee1\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://30a6f48795c2a1db3be66a80d829ebf34d2cc6bc5b7e1b0a434677cfe98221fc\",\"dweb:/ipfs/QmVoBdWELzb5AMKig5KjCisLbmFean2atNGenTbmLjqMpL\"]},\"src/Oval.sol\":{\"keccak256\":\"0x3920c6f066449678694d0587f57495a7e739682ea6da4748de26aa4c655d4bdf\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://630c2229a316b5885d4e06b6f6de8c6a0d220daf07a5c24fa225c2e2396e3449\",\"dweb:/ipfs/QmXpnDzxLU1aVCqkeeoQXsJ25KDC5qJ1WcwPXBbbXaoNxM\"]},\"src/adapters/destination-adapters/ChainlinkDestinationAdapter.sol\":{\"keccak256\":\"0xd66cb1a0c51f8c298dab85552a5156747646d31dbe66b0ce9184f05f3adee56b\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://274135de35a3f423e49ea0bbb7aeb5fd355b3bbabb2f304deb39b6022df1c7d0\",\"dweb:/ipfs/QmZkdjkTp7GLmZTuaw7bcU3zd8oSvhkdYYxssqCRMgZDnE\"]},\"src/adapters/lib/DecimalLib.sol\":{\"keccak256\":\"0x970a20a667780e91fb80ba79005863c73421cdf730ba2303e650e63d9099cde2\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://96013c450945da6d71128267f38754a07bb62223a0c07ef84925fa84636441f2\",\"dweb:/ipfs/QmSZsc8Epuan7zuQCYBcirjZ63zHwcGicfV75rRPfFrixT\"]},\"src/adapters/source-adapters/ChronicleMedianSourceAdapter.sol\":{\"keccak256\":\"0xf87b45d30b6a449735a2d5f71e9a35af638e68918de6fff69614cb3f36d41383\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://62a8e71f98dc5004f910d6e0330ea5b1d0f54fac78f724e1dd224806edee1b53\",\"dweb:/ipfs/QmUY3K7fHHARGmUtCLhL1HVrEzeVrqceQ8nySUveC9Svxz\"]},\"src/adapters/source-adapters/SnapshotSource.sol\":{\"keccak256\":\"0x3217090f4062ecd483d1bf5f19b371a77fe84efcb87f1802243ddaf9566083d5\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://0bb20aa74b0e273225d0c12eef1827d397e703da6ba6c23669cb0a1b028fef5e\",\"dweb:/ipfs/QmRRXvPndL4ANHgjVWKAMTjMfqxeVCZuiuuUkn8qh2bpFP\"]},\"src/controllers/MutableUnlockersController.sol\":{\"keccak256\":\"0x32e43c4a5e3abaa488a3758333f78fa6e166ca65a09ac76ca6b7e645d7863d16\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://b632392a02f26de3824929fb6e2dcfe8cc84689a489b12ba45bfd0ef4d93661f\",\"dweb:/ipfs/QmcMrnNCrM1YXBqj17HZicDvVe4fGnj66LFis6p9Gro5ob\"]},\"src/factories/BaseFactory.sol\":{\"keccak256\":\"0x94670505d6e89c9cd1cef18dfce0e65f36a97c693e5c2ed9a4f81fd0c94b26e6\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://6480e1d133f5abbe5641bc35c85a34dddf1979e68b35ee532e014fae860c4f19\",\"dweb:/ipfs/QmNsjcvQ5mnpjHnRMokhUMcYCbcYqDbJG6426CN6j5EoAq\"]},\"src/factories/StandardChronicleFactory.sol\":{\"keccak256\":\"0x52cf93f2165da0c786be859d4c9b801a76a6a35d4d5dd9d3428764b20afa1af7\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://8f0db2d456738ac9b5e4e40becf07cef3d2348ef1ac14e53c82573b6e03a242f\",\"dweb:/ipfs/QmWcPathefwDZyLW6YPwMkFUYqxwhtSeiPQrXqqeKJf8C3\"]},\"src/interfaces/IBaseController.sol\":{\"keccak256\":\"0x8fe524fac0b04c8415e814b1dfb1ca28d303c8de65df22c268dc1d5f4e74a9d5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b69c11d3e90c65202e184de1ece928269ccd49e82aeec1aab1d489e92d3ea5cc\",\"dweb:/ipfs/QmYNoffB6UhJXTaKVwcxH4zzZgAVv3x3vacrVMQxmnHVju\"]},\"src/interfaces/IBaseOracleAdapter.sol\":{\"keccak256\":\"0x9c4c3727631ccc8ad4d202a1b7faf8833fae0d93d0a7fca45de009ab8f7ecab9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4b904def3696b12cbef6997b34e2bb4c8aef6af52bb640840040b6b59b25f0be\",\"dweb:/ipfs/QmfReXd9EmWRDFjs2SLdn6YUqyVH9RMxCjvzPnjLDYxuQP\"]},\"src/interfaces/IOval.sol\":{\"keccak256\":\"0x8511408e4da9818a36531a464a42f99461ce38419def87f35c52c58fe4d4f6aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://501d19f2a3bcadaa8095c5808bfae348d8ebe78b34084115ee635c1ad101c953\",\"dweb:/ipfs/QmRqkEjEE9ydGrMCTJttjq6harZytTZDa8AQ2NriVU1A2H\"]},\"src/interfaces/chainlink/IAggregatorV3.sol\":{\"keccak256\":\"0xb4d26247f867a5a5614638bdee251e29b73eddc61c4b9f04f8af2d88e2f4e05d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0628c9b3a05410dee47e48ee68c2e3004b0c977c9942149a9206be7795d033d1\",\"dweb:/ipfs/QmdSGsY55cMx3CKQJ3huz9P54XVfKWnHLxQsoqweve2Z8G\"]},\"src/interfaces/chainlink/IAggregatorV3Source.sol\":{\"keccak256\":\"0xace678af82f9ae630210cc7b85cb8759b89b3d7280525ebbcb78aa7c33f5c79f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://63e72db0effebba1b9048614c1ba8e72018957dddff712be2d3a2893229e210e\",\"dweb:/ipfs/QmNLqP4G5ujrZdt2rVTrXpLHuqRUR1hugxQzbNmGReLQtZ\"]},\"src/interfaces/chronicle/IMedian.sol\":{\"keccak256\":\"0x2fb1bf5d7440e644320d794967a022e6256eff352d1f5754280ab6337a7cbf54\",\"urls\":[\"bzz-raw://0d86c3531a84e7439a9867ccb1ec857271873337e67bc45d29a1372114ed2049\",\"dweb:/ipfs/QmQqtzY2PHGbGantaj1HsBrJUziDW1QMeToVF5fMJ7pYLS\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.17+commit.8df45f5f"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"uint256","name":"maxTraversal","type":"uint256"},{"internalType":"address[]","name":"_defaultUnlockers","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address[]","name":"defaultUnlockers","type":"address[]","indexed":false}],"type":"event","name":"DefaultUnlockersSet","anonymous":false},{"inputs":[{"internalType":"address","name":"deployer","type":"address","indexed":true},{"internalType":"address","name":"oval","type":"address","indexed":true},{"internalType":"uint256","name":"lockWindow","type":"uint256","indexed":true},{"internalType":"uint256","name":"maxTraversal","type":"uint256","indexed":false},{"internalType":"address","name":"owner","type":"address","indexed":false},{"internalType":"address[]","name":"unlockers","type":"address[]","indexed":false}],"type":"event","name":"OvalDeployed","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_TRAVERSAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[{"internalType":"contract IMedian","name":"chronicle","type":"address"},{"internalType":"uint256","name":"lockWindow","type":"uint256"},{"internalType":"uint256","name":"maxAge","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"create","outputs":[{"internalType":"address","name":"oval","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"defaultUnlockers","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"address[]","name":"_defaultUnlockers","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"setDefaultUnlockers"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"}],"devdoc":{"kind":"dev","methods":{"create(address,uint256,uint256)":{"params":{"chronicle":"Chronicle source contract.","lockWindow":"the lockWindow used for this Oval instance. This is the length of the window for the Oval auction to be run and, thus, the maximum time that prices will be delayed.","maxAge":"max age of a price that is used in place of the current price. If the only available price is older than this, OEV is not captured and the current price is provided."},"returns":{"oval":"deployed oval address."}},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"setDefaultUnlockers(address[])":{"details":"This and the owner, itself, is the only mutable portion of this factory.","params":{"_defaultUnlockers":"default unlockers that will be used to instantiate new Oval instances."}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{"create(address,uint256,uint256)":{"notice":"Creates the Chronicle Oval instance."},"setDefaultUnlockers(address[])":{"notice":"Enables the owner to set the default unlockers that will be passed to all Oval instances created by this contract."}},"version":1}},"settings":{"remappings":["@chainlink/=lib/redstone-contracts/lib/@chainlink/","@openzeppelin/contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/redstone-contracts/lib/openzeppelin-contracts/contracts/","@redstone-finance/evm-connector/contracts/=lib/redstone-contracts/src/evm-connector/","ds-test/=lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","openzeppelin/=lib/openzeppelin-contracts/contracts/","redstone-contracts/=lib/redstone-contracts/src/","redstone-oracle/=lib/redstone-contracts/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/factories/StandardChronicleFactory.sol":"StandardChronicleFactory"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts/contracts/access/Ownable.sol":{"keccak256":"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218","urls":["bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32","dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3","urls":["bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c","dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"keccak256":"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad","urls":["bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278","dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH"],"license":"MIT"},"src/DiamondRootOval.sol":{"keccak256":"0x54d2c3c6650a988ae636faa36e296fbf075ab5886da4a3ec9014de99512c2ee1","urls":["bzz-raw://30a6f48795c2a1db3be66a80d829ebf34d2cc6bc5b7e1b0a434677cfe98221fc","dweb:/ipfs/QmVoBdWELzb5AMKig5KjCisLbmFean2atNGenTbmLjqMpL"],"license":"BUSL-1.1"},"src/Oval.sol":{"keccak256":"0x3920c6f066449678694d0587f57495a7e739682ea6da4748de26aa4c655d4bdf","urls":["bzz-raw://630c2229a316b5885d4e06b6f6de8c6a0d220daf07a5c24fa225c2e2396e3449","dweb:/ipfs/QmXpnDzxLU1aVCqkeeoQXsJ25KDC5qJ1WcwPXBbbXaoNxM"],"license":"BUSL-1.1"},"src/adapters/destination-adapters/ChainlinkDestinationAdapter.sol":{"keccak256":"0xd66cb1a0c51f8c298dab85552a5156747646d31dbe66b0ce9184f05f3adee56b","urls":["bzz-raw://274135de35a3f423e49ea0bbb7aeb5fd355b3bbabb2f304deb39b6022df1c7d0","dweb:/ipfs/QmZkdjkTp7GLmZTuaw7bcU3zd8oSvhkdYYxssqCRMgZDnE"],"license":"BUSL-1.1"},"src/adapters/lib/DecimalLib.sol":{"keccak256":"0x970a20a667780e91fb80ba79005863c73421cdf730ba2303e650e63d9099cde2","urls":["bzz-raw://96013c450945da6d71128267f38754a07bb62223a0c07ef84925fa84636441f2","dweb:/ipfs/QmSZsc8Epuan7zuQCYBcirjZ63zHwcGicfV75rRPfFrixT"],"license":"BUSL-1.1"},"src/adapters/source-adapters/ChronicleMedianSourceAdapter.sol":{"keccak256":"0xf87b45d30b6a449735a2d5f71e9a35af638e68918de6fff69614cb3f36d41383","urls":["bzz-raw://62a8e71f98dc5004f910d6e0330ea5b1d0f54fac78f724e1dd224806edee1b53","dweb:/ipfs/QmUY3K7fHHARGmUtCLhL1HVrEzeVrqceQ8nySUveC9Svxz"],"license":"BUSL-1.1"},"src/adapters/source-adapters/SnapshotSource.sol":{"keccak256":"0x3217090f4062ecd483d1bf5f19b371a77fe84efcb87f1802243ddaf9566083d5","urls":["bzz-raw://0bb20aa74b0e273225d0c12eef1827d397e703da6ba6c23669cb0a1b028fef5e","dweb:/ipfs/QmRRXvPndL4ANHgjVWKAMTjMfqxeVCZuiuuUkn8qh2bpFP"],"license":"BUSL-1.1"},"src/controllers/MutableUnlockersController.sol":{"keccak256":"0x32e43c4a5e3abaa488a3758333f78fa6e166ca65a09ac76ca6b7e645d7863d16","urls":["bzz-raw://b632392a02f26de3824929fb6e2dcfe8cc84689a489b12ba45bfd0ef4d93661f","dweb:/ipfs/QmcMrnNCrM1YXBqj17HZicDvVe4fGnj66LFis6p9Gro5ob"],"license":"BUSL-1.1"},"src/factories/BaseFactory.sol":{"keccak256":"0x94670505d6e89c9cd1cef18dfce0e65f36a97c693e5c2ed9a4f81fd0c94b26e6","urls":["bzz-raw://6480e1d133f5abbe5641bc35c85a34dddf1979e68b35ee532e014fae860c4f19","dweb:/ipfs/QmNsjcvQ5mnpjHnRMokhUMcYCbcYqDbJG6426CN6j5EoAq"],"license":"BUSL-1.1"},"src/factories/StandardChronicleFactory.sol":{"keccak256":"0x52cf93f2165da0c786be859d4c9b801a76a6a35d4d5dd9d3428764b20afa1af7","urls":["bzz-raw://8f0db2d456738ac9b5e4e40becf07cef3d2348ef1ac14e53c82573b6e03a242f","dweb:/ipfs/QmWcPathefwDZyLW6YPwMkFUYqxwhtSeiPQrXqqeKJf8C3"],"license":"BUSL-1.1"},"src/interfaces/IBaseController.sol":{"keccak256":"0x8fe524fac0b04c8415e814b1dfb1ca28d303c8de65df22c268dc1d5f4e74a9d5","urls":["bzz-raw://b69c11d3e90c65202e184de1ece928269ccd49e82aeec1aab1d489e92d3ea5cc","dweb:/ipfs/QmYNoffB6UhJXTaKVwcxH4zzZgAVv3x3vacrVMQxmnHVju"],"license":"MIT"},"src/interfaces/IBaseOracleAdapter.sol":{"keccak256":"0x9c4c3727631ccc8ad4d202a1b7faf8833fae0d93d0a7fca45de009ab8f7ecab9","urls":["bzz-raw://4b904def3696b12cbef6997b34e2bb4c8aef6af52bb640840040b6b59b25f0be","dweb:/ipfs/QmfReXd9EmWRDFjs2SLdn6YUqyVH9RMxCjvzPnjLDYxuQP"],"license":"MIT"},"src/interfaces/IOval.sol":{"keccak256":"0x8511408e4da9818a36531a464a42f99461ce38419def87f35c52c58fe4d4f6aa","urls":["bzz-raw://501d19f2a3bcadaa8095c5808bfae348d8ebe78b34084115ee635c1ad101c953","dweb:/ipfs/QmRqkEjEE9ydGrMCTJttjq6harZytTZDa8AQ2NriVU1A2H"],"license":"MIT"},"src/interfaces/chainlink/IAggregatorV3.sol":{"keccak256":"0xb4d26247f867a5a5614638bdee251e29b73eddc61c4b9f04f8af2d88e2f4e05d","urls":["bzz-raw://0628c9b3a05410dee47e48ee68c2e3004b0c977c9942149a9206be7795d033d1","dweb:/ipfs/QmdSGsY55cMx3CKQJ3huz9P54XVfKWnHLxQsoqweve2Z8G"],"license":"MIT"},"src/interfaces/chainlink/IAggregatorV3Source.sol":{"keccak256":"0xace678af82f9ae630210cc7b85cb8759b89b3d7280525ebbcb78aa7c33f5c79f","urls":["bzz-raw://63e72db0effebba1b9048614c1ba8e72018957dddff712be2d3a2893229e210e","dweb:/ipfs/QmNLqP4G5ujrZdt2rVTrXpLHuqRUR1hugxQzbNmGReLQtZ"],"license":"MIT"},"src/interfaces/chronicle/IMedian.sol":{"keccak256":"0x2fb1bf5d7440e644320d794967a022e6256eff352d1f5754280ab6337a7cbf54","urls":["bzz-raw://0d86c3531a84e7439a9867ccb1ec857271873337e67bc45d29a1372114ed2049","dweb:/ipfs/QmQqtzY2PHGbGantaj1HsBrJUziDW1QMeToVF5fMJ7pYLS"],"license":null}},"version":1},"id":48} \ No newline at end of file diff --git a/src/abi/StandardCoinbaseFactory.json b/src/abi/StandardCoinbaseFactory.json new file mode 100644 index 0000000..ed40b29 --- /dev/null +++ b/src/abi/StandardCoinbaseFactory.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"_source","type":"address","internalType":"contract IAggregatorV3SourceCoinbase"},{"name":"_maxTraversal","type":"uint256","internalType":"uint256"},{"name":"_defaultUnlockers","type":"address[]","internalType":"address[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"MAX_TRAVERSAL","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"SOURCE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IAggregatorV3SourceCoinbase"}],"stateMutability":"view"},{"type":"function","name":"create","inputs":[{"name":"ticker","type":"string","internalType":"string"},{"name":"lockWindow","type":"uint256","internalType":"uint256"},{"name":"maxAge","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"oval","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"defaultUnlockers","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setDefaultUnlockers","inputs":[{"name":"_defaultUnlockers","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"DefaultUnlockersSet","inputs":[{"name":"defaultUnlockers","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"OvalDeployed","inputs":[{"name":"deployer","type":"address","indexed":true,"internalType":"address"},{"name":"oval","type":"address","indexed":true,"internalType":"address"},{"name":"lockWindow","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"maxTraversal","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"owner","type":"address","indexed":false,"internalType":"address"},{"name":"unlockers","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"bytecode":{"object":"0x60c06040523480156200001157600080fd5b506040516200286138038062002861833981016040819052620000349162000289565b81816200004133620000bd565b60008211620000975760405162461bcd60e51b815260206004820152601960248201527f4d61782074726176657273616c206d757374206265203e20300000000000000060448201526064015b60405180910390fd5b6080829052620000a7816200010d565b505050506001600160a01b031660a052620003cc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200011762000169565b80516200012c906001906020840190620001c7565b507f53dcea6cd8a9fb42c53d0155aebceb09df1f90371ee9727c244f6557223bae16816040516200015e91906200037d565b60405180910390a150565b6000546001600160a01b03163314620001c55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200008e565b565b8280548282559060005260206000209081019282156200021f579160200282015b828111156200021f57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620001e8565b506200022d92915062000231565b5090565b5b808211156200022d576000815560010162000232565b6001600160a01b03811681146200025e57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b8051620002848162000248565b919050565b6000806000606084860312156200029f57600080fd5b8351620002ac8162000248565b60208581015160408701519295509350906001600160401b0380821115620002d357600080fd5b818701915087601f830112620002e857600080fd5b815181811115620002fd57620002fd62000261565b8060051b604051601f19603f8301168101818110858211171562000325576200032562000261565b60405291825284820192508381018501918a8311156200034457600080fd5b938501935b828510156200036d576200035d8562000277565b8452938501939285019262000349565b8096505050505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015620003c05783516001600160a01b03168352928401929184019160010162000399565b50909695505050505050565b60805160a05161245b62000406600039600081816101550152610231015260008181609e0152818161025601526102f8015261245b6000f3fe60806040523480156200001157600080fd5b5060043610620000935760003560e01c8063a9d140581162000062578063a9d140581462000121578063cda3c4991462000138578063f230b4c2146200014f578063f2fde38b146200017757600080fd5b80635878157614620000985780635c681d1e14620000d3578063715018a614620001035780638da5cb5b146200010f575b600080fd5b620000c07f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b620000ea620000e43660046200050a565b6200018e565b6040516001600160a01b039091168152602001620000ca565b6200010d620001b9565b005b6000546001600160a01b0316620000ea565b6200010d620001323660046200058b565b620001d1565b620000ea6200014936600462000645565b6200022d565b620000ea7f000000000000000000000000000000000000000000000000000000000000000081565b6200010d62000188366004620006f4565b6200034c565b600181815481106200019f57600080fd5b6000918252602090912001546001600160a01b0316905081565b620001c3620003cf565b620001cf60006200042b565b565b620001db620003cf565b8051620001f09060019060208401906200047b565b507f53dcea6cd8a9fb42c53d0155aebceb09df1f90371ee9727c244f6557223bae168160405162000222919062000719565b60405180910390a150565b60007f0000000000000000000000000000000000000000000000000000000000000000846001857f000000000000000000000000000000000000000000000000000000000000000086620002896000546001600160a01b031690565b6040516200029790620004e5565b620002a99796959493929190620007b3565b604051809103906000f080158015620002c6573d6000803e3d6000fd5b509050826001600160a01b038216337f5e826bc8ad243559fc75cc77b0e474a2ec85df26aeb5cd6db9d9ed1740f39afa7f00000000000000000000000000000000000000000000000000000000000000006200032a6000546001600160a01b031690565b60016040516200033d9392919062000850565b60405180910390a49392505050565b62000356620003cf565b6001600160a01b038116620003c15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620003cc816200042b565b50565b6000546001600160a01b03163314620001cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620003b8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215620004d3579160200282015b82811115620004d357825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200049c565b50620004e1929150620004f3565b5090565b611ba0806200088683390190565b5b80821115620004e15760008155600101620004f4565b6000602082840312156200051d57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171562000566576200056662000524565b604052919050565b80356001600160a01b03811681146200058657600080fd5b919050565b600060208083850312156200059f57600080fd5b823567ffffffffffffffff80821115620005b857600080fd5b818501915085601f830112620005cd57600080fd5b813581811115620005e257620005e262000524565b8060051b9150620005f58483016200053a565b81815291830184019184810190888411156200061057600080fd5b938501935b83851015620006395762000629856200056e565b8252938501939085019062000615565b98975050505050505050565b6000806000606084860312156200065b57600080fd5b833567ffffffffffffffff808211156200067457600080fd5b818601915086601f8301126200068957600080fd5b8135602082821115620006a057620006a062000524565b620006b4601f8301601f191682016200053a565b92508183528881838601011115620006cb57600080fd5b818185018285013760009183018101919091529097908601359650604090950135949350505050565b6000602082840312156200070757600080fd5b62000712826200056e565b9392505050565b6020808252825182820181905260009190848201906040850190845b818110156200075c5783516001600160a01b03168352928401929184019160010162000735565b50909695505050505050565b6000815480845260208085019450836000528060002060005b83811015620007a85781546001600160a01b03168752958201956001918201910162000781565b509495945050505050565b60018060a01b03881681526000602060e08184015288518060e085015260005b81811015620007f2578a810183015185820161010001528201620007d3565b5061010091506000828286010152601f19601f8201168401905081848203016040850152620008248282018a62000768565b925050508560608301528460808301528360a08301526200063960c08301846001600160a01b03169052565b8381526001600160a01b03831660208201526060604082018190526000906200087c9083018462000768565b9594505050505056fe6101406040523480156200001257600080fd5b5060405162001ba038038062001ba0833981016040819052620000359162000588565b6012878786868987620000483362000303565b8381116200009d5760405162461bcd60e51b815260206004820152601d60248201527f4d617820616765206e6f742061626f7665206c6f636b2077696e646f7700000060448201526064015b60405180910390fd5b60008311620000ef5760405162461bcd60e51b815260206004820152601960248201527f4d61782074726176657273616c206d757374206265203e203000000000000000604482015260640162000094565b608084905260a083905260c081905260005b82518110156200014f576200013a838281518110620001245762000124620006a8565b602002602001015160016200035360201b60201c565b806200014681620006be565b91505062000101565b5060405184907f7232430c38d2db810b464dc9cd004f0e41528c6ba2eb1e2e4e3220ffd3a83a1b90600090a260405183907f9955b343f0b35bf4c2045c06550a8ec2d914db72d497a1430ca3526a248f20a590600090a260405181907f6777d8e4257e9f6a86d2f91b2b9fceaeb931d8b35249fbb63203c2dc0c08187090600090a250505050816001600160a01b031660e0816001600160a01b031681525050816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200022e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002549190620006e6565b60ff16610100526003620002698282620007a1565b506101005160ff16826001600160a01b03167fb7ffc5864a1db85fbcfd710dabae631a2bafb39438fe25dfcb5687aea2a9ee2c6003604051620002ad91906200086d565b60405180910390a3505060ff81166101208190526040517f4e500e16c773a18df7642e2d86cfe357eab156473b38c34df4e15dffb895072690600090a250620002f68162000303565b5050505050505062000900565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200035d62000423565b6001600160a01b03821660009081526002602052604090205481151560ff909116151503620003cf5760405162461bcd60e51b815260206004820152601460248201527f556e6c6f636b6572206e6f74206368616e676564000000000000000000000000604482015260640162000094565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b6000546001600160a01b031633146200047f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000094565b565b6001600160a01b03811681146200049757600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620004db57620004db6200049a565b604052919050565b8051620004f08162000481565b919050565b600082601f8301126200050757600080fd5b815160206001600160401b038211156200052557620005256200049a565b8160051b62000536828201620004b0565b92835284810182019282810190878511156200055157600080fd5b83870192505b848310156200057d5782516200056d8162000481565b8252918301919083019062000557565b979650505050505050565b600080600080600080600060e0888a031215620005a457600080fd5b8751620005b18162000481565b602089810151919850906001600160401b0380821115620005d157600080fd5b818b0191508b601f830112620005e657600080fd5b815181811115620005fb57620005fb6200049a565b6200060f601f8201601f19168501620004b0565b8181528d858386010111156200062457600080fd5b60005b828110156200064457848101860151828201870152850162000627565b5060009181019094015260408b0151929850808311156200066457600080fd5b5050620006748a828b01620004f5565b955050606088015193506080880151925060a088015191506200069a60c08901620004e3565b905092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b600060018201620006df57634e487b7160e01b600052601160045260246000fd5b5060010190565b600060208284031215620006f957600080fd5b815160ff811681146200070b57600080fd5b9392505050565b600181811c908216806200072757607f821691505b6020821081036200074857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200079c57600081815260208120601f850160051c81016020861015620007775750805b601f850160051c820191505b81811015620007985782815560010162000783565b5050505b505050565b81516001600160401b03811115620007bd57620007bd6200049a565b620007d581620007ce845462000712565b846200074e565b602080601f8311600181146200080d5760008415620007f45750858301515b600019600386901b1c1916600185901b17855562000798565b600085815260208120601f198616915b828110156200083e578886015182559484019460019091019084016200081d565b50858210156200085d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080835260008454620008838162000712565b80848701526040600180841660008114620008a75760018114620008c257620008f2565b60ff1985168984015283151560051b890183019550620008f2565b896000528660002060005b85811015620008ea5781548b8201860152908301908801620008cd565b8a0184019650505b509398975050505050505050565b60805160a05160c05160e05161010051610120516112036200099d600039600081816101e4015281816105e501528181610660015261093c01526000818161057c01526106b301526000818161038a015281816104e501528181610ab10152610c6c01526000818161027b0152610b6d01526000818161031d015261042001526000818161022d015281816103ed01526108c601526112036000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80638205bf6a116100c3578063d3fff0f61161007c578063d3fff0f61461035d578063d54db2c014610370578063dc46c1dd14610385578063f2fde38b146103ac578063f6e1d17a146103bf578063feaf968c146103d257600080fd5b80638205bf6a146102a75780638da5cb5b146102af5780639a6fc8f5146102d4578063a3c044761461031b578063a5c38b3d14610341578063cb53b08d1461034a57600080fd5b80633376f53a116101155780633376f53a1461022b5780633d6ba5781461025b57806350d25bcd146102715780636666d3721461018d578063687043c514610279578063715018a61461029f57600080fd5b80630125554b1461015d5780631386236414610185578063172b09f91461018f57806324a419f4146101c2578063313ce567146101df57806332c6534b14610218575b600080fd5b6101656103da565b604080519384526020840192909252908201526060015b60405180910390f35b61018d61044f565b005b6101b261019d366004610d50565b60026020526000908152604090205460ff1681565b604051901515815260200161017c565b6101ca6104dd565b6040805192835260208301919091520161017c565b6102067f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161017c565b6101b2610226366004610d6b565b6105ab565b7f00000000000000000000000000000000000000000000000000000000000000005b60405190815260200161017c565b6101ca610269366004610d95565b506000908190565b61024d6105ce565b7f000000000000000000000000000000000000000000000000000000000000000061024d565b61018d610611565b61024d610623565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161017c565b6102e76102e2366004610dc3565b610636565b604080516001600160501b03968716815260208101959095528401929092526060830152909116608082015260a00161017c565b7f000000000000000000000000000000000000000000000000000000000000000061024d565b61024d60015481565b610165610358366004610de0565b610697565b61018d61036b366004610e02565b6106e8565b6103786107ab565b60405161017c9190610e3e565b6102bc7f000000000000000000000000000000000000000000000000000000000000000081565b61018d6103ba366004610d50565b610839565b6101ca6103cd366004610d95565b6108b2565b6102e761090c565b600080600061044461041e60015461040f7f000000000000000000000000000000000000000000000000000000000000000090565b6104199042610ea2565b610974565b7f0000000000000000000000000000000000000000000000000000000000000000610697565b925092509250909192565b61045b336001546105ab565b6104ac5760405162461bcd60e51b815260206004820152601d60248201527f436f6e74726f6c6c657220626c6f636b65643a2063616e556e6c6f636b00000060448201526064015b60405180910390fd5b4260018190556040517f3ee2ed8fd57cf3bdf05ef91fbe207825c00ef41e2303a859c67a84cd46cd69aa90600090a2565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333f98c7760036040518263ffffffff1660e01b81526004016105309190610f93565b606060405180830381865afa15801561054d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105719190610fa6565b92509250506105a2827f0000000000000000000000000000000000000000000000000000000000000000601261098c565b94909350915050565b6001600160a01b03821660009081526002602052604090205460ff165b92915050565b6000806105d96103da565b505090506106098160127f000000000000000000000000000000000000000000000000000000000000000061098c565b91505090565b565b6106196109fd565b61060f6000610a57565b60008061062e6103da565b509392505050565b6000806000806000806000610653886001600160501b03166108b2565b91509150876106848360127f000000000000000000000000000000000000000000000000000000000000000061098c565b9099909891975087965090945092505050565b60008060008060006106a98787610aa7565b915091506106d9827f0000000000000000000000000000000000000000000000000000000000000000601261098c565b97909650600195509350505050565b6106f06109fd565b6001600160a01b03821660009081526002602052604090205481151560ff9091161515036107575760405162461bcd60e51b8152602060048201526014602482015273155b9b1bd8dad95c881b9bdd0818da185b99d95960621b60448201526064016104a3565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b600380546107b890610eb5565b80601f01602080910402602001604051908101604052809291908181526020018280546107e490610eb5565b80156108315780601f1061080657610100808354040283529160200191610831565b820191906000526020600020905b81548152906001019060200180831161081457829003601f168201915b505050505081565b6108416109fd565b6001600160a01b0381166108a65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104a3565b6108af81610a57565b50565b60015460009081908190819081906108ea907f000000000000000000000000000000000000000000000000000000000000000061040f565b90508082116108fe57509094909350915050565b506000958695509350505050565b6000806000806000806000806109206103da565b925092509250600061093182610bbe565b9050806109608560127f000000000000000000000000000000000000000000000000000000000000000061098c565b909a90995092975087965094509092505050565b60008183116109835781610985565b825b9392505050565b60008160ff168360ff16036109a2575082610985565b8160ff168360ff1610156109d6576109ba8383610fdd565b6109c590600a6110da565b6109cf90856110e9565b9050610985565b6109e08284610fdd565b6109eb90600a6110da565b6109f59085611119565b949350505050565b6000546001600160a01b0316331461060f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104a3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333f98c7760036040518263ffffffff1660e01b8152600401610afc9190610f93565b606060405180830381865afa158015610b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3d9190610fa6565b925092509250868111610b56579093509150610bb79050565b600080610b6489868a610c2a565b91509150610b8f7f000000000000000000000000000000000000000000000000000000000000000090565b610b999042610ea2565b811115610bae579095509350610bb792505050565b50919450925050505b9250929050565b60006001600160501b03821115610c265760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203860448201526530206269747360d01b60648201526084016104a3565b5090565b600080808060015b85816001600160501b031611158015610c5d5750806001600160501b0316876001600160501b031610155b15610d25576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016636471a6806003610c9d848b611155565b6040518363ffffffff1660e01b8152600401610cba92919061117c565b606060405180830381865afa158015610cd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfb9190610fa6565b909450925050878211610d1357509092509050610d2c565b80610d1d816111a7565b915050610c32565b5090925090505b935093915050565b80356001600160a01b0381168114610d4b57600080fd5b919050565b600060208284031215610d6257600080fd5b61098582610d34565b60008060408385031215610d7e57600080fd5b610d8783610d34565b946020939093013593505050565b600060208284031215610da757600080fd5b5035919050565b6001600160501b03811681146108af57600080fd5b600060208284031215610dd557600080fd5b813561098581610dae565b60008060408385031215610df357600080fd5b50508035926020909101359150565b60008060408385031215610e1557600080fd5b610e1e83610d34565b915060208301358015158114610e3357600080fd5b809150509250929050565b600060208083528351808285015260005b81811015610e6b57858101830151858201604001528201610e4f565b506000604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105c8576105c8610e8c565b600181811c90821680610ec957607f821691505b602082108103610ee957634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c9080831680610f0957607f831692505b60208084108203610f2a57634e487b7160e01b600052602260045260246000fd5b83885260208801828015610f455760018114610f5b57610f86565b60ff198716825285151560051b82019750610f86565b60008981526020902060005b87811015610f8057815484820152908601908401610f67565b83019850505b5050505050505092915050565b6020815260006109856020830184610eef565b600080600060608486031215610fbb57600080fd5b8351610fc681610dae565b602085015160409095015190969495509392505050565b60ff82811682821603908111156105c8576105c8610e8c565b600181815b8085111561103157816000190482111561101757611017610e8c565b8085161561102457918102915b93841c9390800290610ffb565b509250929050565b600082611048575060016105c8565b81611055575060006105c8565b816001811461106b576002811461107557611091565b60019150506105c8565b60ff84111561108657611086610e8c565b50506001821b6105c8565b5060208310610133831016604e8410600b84101617156110b4575081810a6105c8565b6110be8383610ff6565b80600019048211156110d2576110d2610e8c565b029392505050565b600061098560ff841683611039565b80820260008212600160ff1b8414161561110557611105610e8c565b81810583148215176105c8576105c8610e8c565b60008261113657634e487b7160e01b600052601260045260246000fd5b600160ff1b82146000198414161561115057611150610e8c565b500590565b6001600160501b0382811682821603908082111561117557611175610e8c565b5092915050565b60408152600061118f6040830185610eef565b90506001600160501b03831660208301529392505050565b60006001600160501b038083168181036111c3576111c3610e8c565b600101939250505056fea2646970667358221220118ad657518d5c4a3385f25c97ea62cae7b6893002200743ee1886def38211d564736f6c63430008110033a26469706673582212200d1b11783969f3f8e9b08893f3025e4452bc5b3ad6521351d8572ce27093ac4e64736f6c63430008110033","sourceMap":"1578:1212:49:-:0;;;1699:199;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1827:13;1842:17;936:32:14;719:10:18;936:18:14;:32::i;:::-;925:1:45;909:13;:17;901:55;;;;-1:-1:-1;;;901:55:45;;2074:2:65;901:55:45;;;2056:21:65;2113:2;2093:18;;;2086:30;2152:27;2132:18;;;2125:55;2197:18;;901:55:45;;;;;;;;;967:29;;;;1006:38;1026:17;1006:19;:38::i;:::-;-1:-1:-1;;;;;;;;;1875:16:49::1;;::::0;1578:1212;;2426:187:14;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:14;;;-1:-1:-1;;;;;;2534:17:14;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;1398:188:45:-;1094:13:14;:11;:13::i;:::-;1490:36:45;;::::1;::::0;:16:::1;::::0;:36:::1;::::0;::::1;::::0;::::1;:::i;:::-;;1541:38;1561:17;1541:38;;;;;;:::i;:::-;;;;;;;;1398:188:::0;:::o;1359:130:14:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:14;719:10:18;1422:23:14;1414:68;;;;-1:-1:-1;;;1414:68:14;;3091:2:65;1414:68:14;;;3073:21:65;;;3110:18;;;3103:30;3169:34;3149:18;;;3142:62;3221:18;;1414:68:14;2889:356:65;1414:68:14;1359:130::o;1578:1212:49:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1578:1212:49;-1:-1:-1;;;;;1578:1212:49;;;;;;;;;;;-1:-1:-1;1578:1212:49;;;;;;;-1:-1:-1;1578:1212:49;;;-1:-1:-1;1578:1212:49;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:160:65;-1:-1:-1;;;;;118:31:65;;108:42;;98:70;;164:1;161;154:12;98:70;14:160;:::o;179:127::-;240:10;235:3;231:20;228:1;221:31;271:4;268:1;261:15;295:4;292:1;285:15;311:167;390:13;;412:60;390:13;412:60;:::i;:::-;311:167;;;:::o;483:1384::-;633:6;641;649;702:2;690:9;681:7;677:23;673:32;670:52;;;718:1;715;708:12;670:52;750:9;744:16;769:60;823:5;769:60;:::i;:::-;872:2;899:18;;;893:25;962:2;947:18;;941:25;848:5;;-1:-1:-1;893:25:65;-1:-1:-1;872:2:65;-1:-1:-1;;;;;1015:14:65;;;1012:34;;;1042:1;1039;1032:12;1012:34;1080:6;1069:9;1065:22;1055:32;;1125:7;1118:4;1114:2;1110:13;1106:27;1096:55;;1147:1;1144;1137:12;1096:55;1176:2;1170:9;1198:2;1194;1191:10;1188:36;;;1204:18;;:::i;:::-;1250:2;1247:1;1243:10;1282:2;1276:9;1345:2;1341:7;1336:2;1332;1328:11;1324:25;1316:6;1312:38;1400:6;1388:10;1385:22;1380:2;1368:10;1365:18;1362:46;1359:72;;;1411:18;;:::i;:::-;1447:2;1440:22;1497:18;;;1531:15;;;;-1:-1:-1;1573:11:65;;;1569:20;;;1601:19;;;1598:39;;;1633:1;1630;1623:12;1598:39;1657:11;;;;1677:159;1693:6;1688:3;1685:15;1677:159;;;1759:34;1789:3;1759:34;:::i;:::-;1747:47;;1710:12;;;;1814;;;;1677:159;;;1855:6;1845:16;;;;;;;;483:1384;;;;;:::o;2226:658::-;2397:2;2449:21;;;2519:13;;2422:18;;;2541:22;;;2368:4;;2397:2;2620:15;;;;2594:2;2579:18;;;2368:4;2663:195;2677:6;2674:1;2671:13;2663:195;;;2742:13;;-1:-1:-1;;;;;2738:39:65;2726:52;;2833:15;;;;2798:12;;;;2774:1;2692:9;2663:195;;;-1:-1:-1;2875:3:65;;2226:658;-1:-1:-1;;;;;;2226:658:65:o;2889:356::-;1578:1212:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040523480156200001157600080fd5b5060043610620000935760003560e01c8063a9d140581162000062578063a9d140581462000121578063cda3c4991462000138578063f230b4c2146200014f578063f2fde38b146200017757600080fd5b80635878157614620000985780635c681d1e14620000d3578063715018a614620001035780638da5cb5b146200010f575b600080fd5b620000c07f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b620000ea620000e43660046200050a565b6200018e565b6040516001600160a01b039091168152602001620000ca565b6200010d620001b9565b005b6000546001600160a01b0316620000ea565b6200010d620001323660046200058b565b620001d1565b620000ea6200014936600462000645565b6200022d565b620000ea7f000000000000000000000000000000000000000000000000000000000000000081565b6200010d62000188366004620006f4565b6200034c565b600181815481106200019f57600080fd5b6000918252602090912001546001600160a01b0316905081565b620001c3620003cf565b620001cf60006200042b565b565b620001db620003cf565b8051620001f09060019060208401906200047b565b507f53dcea6cd8a9fb42c53d0155aebceb09df1f90371ee9727c244f6557223bae168160405162000222919062000719565b60405180910390a150565b60007f0000000000000000000000000000000000000000000000000000000000000000846001857f000000000000000000000000000000000000000000000000000000000000000086620002896000546001600160a01b031690565b6040516200029790620004e5565b620002a99796959493929190620007b3565b604051809103906000f080158015620002c6573d6000803e3d6000fd5b509050826001600160a01b038216337f5e826bc8ad243559fc75cc77b0e474a2ec85df26aeb5cd6db9d9ed1740f39afa7f00000000000000000000000000000000000000000000000000000000000000006200032a6000546001600160a01b031690565b60016040516200033d9392919062000850565b60405180910390a49392505050565b62000356620003cf565b6001600160a01b038116620003c15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620003cc816200042b565b50565b6000546001600160a01b03163314620001cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620003b8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215620004d3579160200282015b82811115620004d357825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200049c565b50620004e1929150620004f3565b5090565b611ba0806200088683390190565b5b80821115620004e15760008155600101620004f4565b6000602082840312156200051d57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171562000566576200056662000524565b604052919050565b80356001600160a01b03811681146200058657600080fd5b919050565b600060208083850312156200059f57600080fd5b823567ffffffffffffffff80821115620005b857600080fd5b818501915085601f830112620005cd57600080fd5b813581811115620005e257620005e262000524565b8060051b9150620005f58483016200053a565b81815291830184019184810190888411156200061057600080fd5b938501935b83851015620006395762000629856200056e565b8252938501939085019062000615565b98975050505050505050565b6000806000606084860312156200065b57600080fd5b833567ffffffffffffffff808211156200067457600080fd5b818601915086601f8301126200068957600080fd5b8135602082821115620006a057620006a062000524565b620006b4601f8301601f191682016200053a565b92508183528881838601011115620006cb57600080fd5b818185018285013760009183018101919091529097908601359650604090950135949350505050565b6000602082840312156200070757600080fd5b62000712826200056e565b9392505050565b6020808252825182820181905260009190848201906040850190845b818110156200075c5783516001600160a01b03168352928401929184019160010162000735565b50909695505050505050565b6000815480845260208085019450836000528060002060005b83811015620007a85781546001600160a01b03168752958201956001918201910162000781565b509495945050505050565b60018060a01b03881681526000602060e08184015288518060e085015260005b81811015620007f2578a810183015185820161010001528201620007d3565b5061010091506000828286010152601f19601f8201168401905081848203016040850152620008248282018a62000768565b925050508560608301528460808301528360a08301526200063960c08301846001600160a01b03169052565b8381526001600160a01b03831660208201526060604082018190526000906200087c9083018462000768565b9594505050505056fe6101406040523480156200001257600080fd5b5060405162001ba038038062001ba0833981016040819052620000359162000588565b6012878786868987620000483362000303565b8381116200009d5760405162461bcd60e51b815260206004820152601d60248201527f4d617820616765206e6f742061626f7665206c6f636b2077696e646f7700000060448201526064015b60405180910390fd5b60008311620000ef5760405162461bcd60e51b815260206004820152601960248201527f4d61782074726176657273616c206d757374206265203e203000000000000000604482015260640162000094565b608084905260a083905260c081905260005b82518110156200014f576200013a838281518110620001245762000124620006a8565b602002602001015160016200035360201b60201c565b806200014681620006be565b91505062000101565b5060405184907f7232430c38d2db810b464dc9cd004f0e41528c6ba2eb1e2e4e3220ffd3a83a1b90600090a260405183907f9955b343f0b35bf4c2045c06550a8ec2d914db72d497a1430ca3526a248f20a590600090a260405181907f6777d8e4257e9f6a86d2f91b2b9fceaeb931d8b35249fbb63203c2dc0c08187090600090a250505050816001600160a01b031660e0816001600160a01b031681525050816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200022e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002549190620006e6565b60ff16610100526003620002698282620007a1565b506101005160ff16826001600160a01b03167fb7ffc5864a1db85fbcfd710dabae631a2bafb39438fe25dfcb5687aea2a9ee2c6003604051620002ad91906200086d565b60405180910390a3505060ff81166101208190526040517f4e500e16c773a18df7642e2d86cfe357eab156473b38c34df4e15dffb895072690600090a250620002f68162000303565b5050505050505062000900565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200035d62000423565b6001600160a01b03821660009081526002602052604090205481151560ff909116151503620003cf5760405162461bcd60e51b815260206004820152601460248201527f556e6c6f636b6572206e6f74206368616e676564000000000000000000000000604482015260640162000094565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b6000546001600160a01b031633146200047f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000094565b565b6001600160a01b03811681146200049757600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620004db57620004db6200049a565b604052919050565b8051620004f08162000481565b919050565b600082601f8301126200050757600080fd5b815160206001600160401b038211156200052557620005256200049a565b8160051b62000536828201620004b0565b92835284810182019282810190878511156200055157600080fd5b83870192505b848310156200057d5782516200056d8162000481565b8252918301919083019062000557565b979650505050505050565b600080600080600080600060e0888a031215620005a457600080fd5b8751620005b18162000481565b602089810151919850906001600160401b0380821115620005d157600080fd5b818b0191508b601f830112620005e657600080fd5b815181811115620005fb57620005fb6200049a565b6200060f601f8201601f19168501620004b0565b8181528d858386010111156200062457600080fd5b60005b828110156200064457848101860151828201870152850162000627565b5060009181019094015260408b0151929850808311156200066457600080fd5b5050620006748a828b01620004f5565b955050606088015193506080880151925060a088015191506200069a60c08901620004e3565b905092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b600060018201620006df57634e487b7160e01b600052601160045260246000fd5b5060010190565b600060208284031215620006f957600080fd5b815160ff811681146200070b57600080fd5b9392505050565b600181811c908216806200072757607f821691505b6020821081036200074857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200079c57600081815260208120601f850160051c81016020861015620007775750805b601f850160051c820191505b81811015620007985782815560010162000783565b5050505b505050565b81516001600160401b03811115620007bd57620007bd6200049a565b620007d581620007ce845462000712565b846200074e565b602080601f8311600181146200080d5760008415620007f45750858301515b600019600386901b1c1916600185901b17855562000798565b600085815260208120601f198616915b828110156200083e578886015182559484019460019091019084016200081d565b50858210156200085d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602080835260008454620008838162000712565b80848701526040600180841660008114620008a75760018114620008c257620008f2565b60ff1985168984015283151560051b890183019550620008f2565b896000528660002060005b85811015620008ea5781548b8201860152908301908801620008cd565b8a0184019650505b509398975050505050505050565b60805160a05160c05160e05161010051610120516112036200099d600039600081816101e4015281816105e501528181610660015261093c01526000818161057c01526106b301526000818161038a015281816104e501528181610ab10152610c6c01526000818161027b0152610b6d01526000818161031d015261042001526000818161022d015281816103ed01526108c601526112036000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c80638205bf6a116100c3578063d3fff0f61161007c578063d3fff0f61461035d578063d54db2c014610370578063dc46c1dd14610385578063f2fde38b146103ac578063f6e1d17a146103bf578063feaf968c146103d257600080fd5b80638205bf6a146102a75780638da5cb5b146102af5780639a6fc8f5146102d4578063a3c044761461031b578063a5c38b3d14610341578063cb53b08d1461034a57600080fd5b80633376f53a116101155780633376f53a1461022b5780633d6ba5781461025b57806350d25bcd146102715780636666d3721461018d578063687043c514610279578063715018a61461029f57600080fd5b80630125554b1461015d5780631386236414610185578063172b09f91461018f57806324a419f4146101c2578063313ce567146101df57806332c6534b14610218575b600080fd5b6101656103da565b604080519384526020840192909252908201526060015b60405180910390f35b61018d61044f565b005b6101b261019d366004610d50565b60026020526000908152604090205460ff1681565b604051901515815260200161017c565b6101ca6104dd565b6040805192835260208301919091520161017c565b6102067f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161017c565b6101b2610226366004610d6b565b6105ab565b7f00000000000000000000000000000000000000000000000000000000000000005b60405190815260200161017c565b6101ca610269366004610d95565b506000908190565b61024d6105ce565b7f000000000000000000000000000000000000000000000000000000000000000061024d565b61018d610611565b61024d610623565b6000546001600160a01b03165b6040516001600160a01b03909116815260200161017c565b6102e76102e2366004610dc3565b610636565b604080516001600160501b03968716815260208101959095528401929092526060830152909116608082015260a00161017c565b7f000000000000000000000000000000000000000000000000000000000000000061024d565b61024d60015481565b610165610358366004610de0565b610697565b61018d61036b366004610e02565b6106e8565b6103786107ab565b60405161017c9190610e3e565b6102bc7f000000000000000000000000000000000000000000000000000000000000000081565b61018d6103ba366004610d50565b610839565b6101ca6103cd366004610d95565b6108b2565b6102e761090c565b600080600061044461041e60015461040f7f000000000000000000000000000000000000000000000000000000000000000090565b6104199042610ea2565b610974565b7f0000000000000000000000000000000000000000000000000000000000000000610697565b925092509250909192565b61045b336001546105ab565b6104ac5760405162461bcd60e51b815260206004820152601d60248201527f436f6e74726f6c6c657220626c6f636b65643a2063616e556e6c6f636b00000060448201526064015b60405180910390fd5b4260018190556040517f3ee2ed8fd57cf3bdf05ef91fbe207825c00ef41e2303a859c67a84cd46cd69aa90600090a2565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333f98c7760036040518263ffffffff1660e01b81526004016105309190610f93565b606060405180830381865afa15801561054d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105719190610fa6565b92509250506105a2827f0000000000000000000000000000000000000000000000000000000000000000601261098c565b94909350915050565b6001600160a01b03821660009081526002602052604090205460ff165b92915050565b6000806105d96103da565b505090506106098160127f000000000000000000000000000000000000000000000000000000000000000061098c565b91505090565b565b6106196109fd565b61060f6000610a57565b60008061062e6103da565b509392505050565b6000806000806000806000610653886001600160501b03166108b2565b91509150876106848360127f000000000000000000000000000000000000000000000000000000000000000061098c565b9099909891975087965090945092505050565b60008060008060006106a98787610aa7565b915091506106d9827f0000000000000000000000000000000000000000000000000000000000000000601261098c565b97909650600195509350505050565b6106f06109fd565b6001600160a01b03821660009081526002602052604090205481151560ff9091161515036107575760405162461bcd60e51b8152602060048201526014602482015273155b9b1bd8dad95c881b9bdd0818da185b99d95960621b60448201526064016104a3565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b600380546107b890610eb5565b80601f01602080910402602001604051908101604052809291908181526020018280546107e490610eb5565b80156108315780601f1061080657610100808354040283529160200191610831565b820191906000526020600020905b81548152906001019060200180831161081457829003601f168201915b505050505081565b6108416109fd565b6001600160a01b0381166108a65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104a3565b6108af81610a57565b50565b60015460009081908190819081906108ea907f000000000000000000000000000000000000000000000000000000000000000061040f565b90508082116108fe57509094909350915050565b506000958695509350505050565b6000806000806000806000806109206103da565b925092509250600061093182610bbe565b9050806109608560127f000000000000000000000000000000000000000000000000000000000000000061098c565b909a90995092975087965094509092505050565b60008183116109835781610985565b825b9392505050565b60008160ff168360ff16036109a2575082610985565b8160ff168360ff1610156109d6576109ba8383610fdd565b6109c590600a6110da565b6109cf90856110e9565b9050610985565b6109e08284610fdd565b6109eb90600a6110da565b6109f59085611119565b949350505050565b6000546001600160a01b0316331461060f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104a3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008060008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166333f98c7760036040518263ffffffff1660e01b8152600401610afc9190610f93565b606060405180830381865afa158015610b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3d9190610fa6565b925092509250868111610b56579093509150610bb79050565b600080610b6489868a610c2a565b91509150610b8f7f000000000000000000000000000000000000000000000000000000000000000090565b610b999042610ea2565b811115610bae579095509350610bb792505050565b50919450925050505b9250929050565b60006001600160501b03821115610c265760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203860448201526530206269747360d01b60648201526084016104a3565b5090565b600080808060015b85816001600160501b031611158015610c5d5750806001600160501b0316876001600160501b031610155b15610d25576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016636471a6806003610c9d848b611155565b6040518363ffffffff1660e01b8152600401610cba92919061117c565b606060405180830381865afa158015610cd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfb9190610fa6565b909450925050878211610d1357509092509050610d2c565b80610d1d816111a7565b915050610c32565b5090925090505b935093915050565b80356001600160a01b0381168114610d4b57600080fd5b919050565b600060208284031215610d6257600080fd5b61098582610d34565b60008060408385031215610d7e57600080fd5b610d8783610d34565b946020939093013593505050565b600060208284031215610da757600080fd5b5035919050565b6001600160501b03811681146108af57600080fd5b600060208284031215610dd557600080fd5b813561098581610dae565b60008060408385031215610df357600080fd5b50508035926020909101359150565b60008060408385031215610e1557600080fd5b610e1e83610d34565b915060208301358015158114610e3357600080fd5b809150509250929050565b600060208083528351808285015260005b81811015610e6b57858101830151858201604001528201610e4f565b506000604082860101526040601f19601f8301168501019250505092915050565b634e487b7160e01b600052601160045260246000fd5b818103818111156105c8576105c8610e8c565b600181811c90821680610ec957607f821691505b602082108103610ee957634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c9080831680610f0957607f831692505b60208084108203610f2a57634e487b7160e01b600052602260045260246000fd5b83885260208801828015610f455760018114610f5b57610f86565b60ff198716825285151560051b82019750610f86565b60008981526020902060005b87811015610f8057815484820152908601908401610f67565b83019850505b5050505050505092915050565b6020815260006109856020830184610eef565b600080600060608486031215610fbb57600080fd5b8351610fc681610dae565b602085015160409095015190969495509392505050565b60ff82811682821603908111156105c8576105c8610e8c565b600181815b8085111561103157816000190482111561101757611017610e8c565b8085161561102457918102915b93841c9390800290610ffb565b509250929050565b600082611048575060016105c8565b81611055575060006105c8565b816001811461106b576002811461107557611091565b60019150506105c8565b60ff84111561108657611086610e8c565b50506001821b6105c8565b5060208310610133831016604e8410600b84101617156110b4575081810a6105c8565b6110be8383610ff6565b80600019048211156110d2576110d2610e8c565b029392505050565b600061098560ff841683611039565b80820260008212600160ff1b8414161561110557611105610e8c565b81810583148215176105c8576105c8610e8c565b60008261113657634e487b7160e01b600052601260045260246000fd5b600160ff1b82146000198414161561115057611150610e8c565b500590565b6001600160501b0382811682821603908082111561117557611175610e8c565b5092915050565b60408152600061118f6040830185610eef565b90506001600160501b03831660208301529392505050565b60006001600160501b038083168181036111c3576111c3610e8c565b600101939250505056fea2646970667358221220118ad657518d5c4a3385f25c97ea62cae7b6893002200743ee1886def38211d564736f6c63430008110033a26469706673582212200d1b11783969f3f8e9b08893f3025e4452bc5b3ad6521351d8572ce27093ac4e64736f6c63430008110033","sourceMap":"1578:1212:49:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;464:38:45;;;;;;;;160:25:65;;;148:2;133:18;464:38:45;;;;;;;;508:33;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;654:32:65;;;636:51;;624:2;609:18;508:33:45;490:203:65;1824:101:14;;;:::i;:::-;;1201:85;1247:7;1273:6;-1:-1:-1;;;;;1273:6:14;1201:85;;1398:188:45;;;;;;:::i;:::-;;:::i;2456:332:49:-;;;;;;:::i;:::-;;:::i;1641:51::-;;;;;2074:198:14;;;;;;:::i;:::-;;:::i;508:33:45:-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;508:33:45;;-1:-1:-1;508:33:45;:::o;1824:101:14:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;1398:188:45:-;1094:13:14;:11;:13::i;:::-;1490:36:45;;::::1;::::0;:16:::1;::::0;:36:::1;::::0;::::1;::::0;::::1;:::i;:::-;;1541:38;1561:17;1541:38;;;;;;:::i;:::-;;;;;;;;1398:188:::0;:::o;2456:332:49:-;2548:12;2604:6;2612;2620:16;2638:10;2650:13;2665:6;2673:7;1247::14;1273:6;-1:-1:-1;;;;;1273:6:14;;1201:85;2673:7:49;2587:94;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2572:110:49;-1:-1:-1;2728:10:49;-1:-1:-1;;;;;2697:84:49;;2710:10;2697:84;2740:13;2755:7;1247::14;1273:6;-1:-1:-1;;;;;1273:6:14;;1201:85;2755:7:49;2764:16;2697:84;;;;;;;;:::i;:::-;;;;;;;;2456:332;;;;;:::o;2074:198:14:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:14;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:14;;6609:2:65;2154:73:14::1;::::0;::::1;6591:21:65::0;6648:2;6628:18;;;6621:30;6687:34;6667:18;;;6660:62;-1:-1:-1;;;6738:18:65;;;6731:36;6784:19;;2154:73:14::1;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;1359:130::-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:14;719:10:18;1422:23:14;1414:68;;;;-1:-1:-1;;;1414:68:14;;7016:2:65;1414:68:14;;;6998:21:65;;;7035:18;;;7028:30;7094:34;7074:18;;;7067:62;7146:18;;1414:68:14;6814:356:65;2426:187:14;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:14;;;-1:-1:-1;;;;;;2534:17:14;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;196:180:65;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;347:23:65;;196:180;-1:-1:-1;196:180:65:o;698:127::-;759:10;754:3;750:20;747:1;740:31;790:4;787:1;780:15;814:4;811:1;804:15;830:275;901:2;895:9;966:2;947:13;;-1:-1:-1;;943:27:65;931:40;;1001:18;986:34;;1022:22;;;983:62;980:88;;;1048:18;;:::i;:::-;1084:2;1077:22;830:275;;-1:-1:-1;830:275:65:o;1110:173::-;1178:20;;-1:-1:-1;;;;;1227:31:65;;1217:42;;1207:70;;1273:1;1270;1263:12;1207:70;1110:173;;;:::o;1288:952::-;1372:6;1403:2;1446;1434:9;1425:7;1421:23;1417:32;1414:52;;;1462:1;1459;1452:12;1414:52;1502:9;1489:23;1531:18;1572:2;1564:6;1561:14;1558:34;;;1588:1;1585;1578:12;1558:34;1626:6;1615:9;1611:22;1601:32;;1671:7;1664:4;1660:2;1656:13;1652:27;1642:55;;1693:1;1690;1683:12;1642:55;1729:2;1716:16;1751:2;1747;1744:10;1741:36;;;1757:18;;:::i;:::-;1803:2;1800:1;1796:10;1786:20;;1826:28;1850:2;1846;1842:11;1826:28;:::i;:::-;1888:15;;;1958:11;;;1954:20;;;1919:12;;;;1986:19;;;1983:39;;;2018:1;2015;2008:12;1983:39;2042:11;;;;2062:148;2078:6;2073:3;2070:15;2062:148;;;2144:23;2163:3;2144:23;:::i;:::-;2132:36;;2095:12;;;;2188;;;;2062:148;;;2229:5;1288:952;-1:-1:-1;;;;;;;;1288:952:65:o;2245:902::-;2332:6;2340;2348;2401:2;2389:9;2380:7;2376:23;2372:32;2369:52;;;2417:1;2414;2407:12;2369:52;2457:9;2444:23;2486:18;2527:2;2519:6;2516:14;2513:34;;;2543:1;2540;2533:12;2513:34;2581:6;2570:9;2566:22;2556:32;;2626:7;2619:4;2615:2;2611:13;2607:27;2597:55;;2648:1;2645;2638:12;2597:55;2684:2;2671:16;2706:4;2729:2;2725;2722:10;2719:36;;;2735:18;;:::i;:::-;2777:53;2820:2;2801:13;;-1:-1:-1;;2797:27:65;2793:36;;2777:53;:::i;:::-;2764:66;;2853:2;2846:5;2839:17;2893:7;2888:2;2883;2879;2875:11;2871:20;2868:33;2865:53;;;2914:1;2911;2904:12;2865:53;2969:2;2964;2960;2956:11;2951:2;2944:5;2940:14;2927:45;3013:1;2992:14;;;2988:23;;2981:34;;;;2996:5;;3071:18;;;3058:32;;-1:-1:-1;3137:2:65;3122:18;;;3109:32;;2245:902;-1:-1:-1;;;;2245:902:65:o;3397:186::-;3456:6;3509:2;3497:9;3488:7;3484:23;3480:32;3477:52;;;3525:1;3522;3515:12;3477:52;3548:29;3567:9;3548:29;:::i;:::-;3538:39;3397:186;-1:-1:-1;;;3397:186:65:o;3588:658::-;3759:2;3811:21;;;3881:13;;3784:18;;;3903:22;;;3730:4;;3759:2;3982:15;;;;3956:2;3941:18;;;3730:4;4025:195;4039:6;4036:1;4033:13;4025:195;;;4104:13;;-1:-1:-1;;;;;4100:39:65;4088:52;;4195:15;;;;4160:12;;;;4136:1;4054:9;4025:195;;;-1:-1:-1;4237:3:65;;3588:658;-1:-1:-1;;;;;;3588:658:65:o;4251:495::-;4312:3;4350:5;4344:12;4377:6;4372:3;4365:19;4403:4;4432:2;4427:3;4423:12;4416:19;;4454:5;4451:1;4444:16;4496:2;4493:1;4483:16;4517:1;4527:194;4541:6;4538:1;4535:13;4527:194;;;4606:13;;-1:-1:-1;;;;;4602:39:65;4590:52;;4662:12;;;;4638:1;4697:14;;;;4556:9;4527:194;;;-1:-1:-1;4737:3:65;;4251:495;-1:-1:-1;;;;;4251:495:65:o;4751:1212::-;5181:1;5177;5172:3;5168:11;5164:19;5156:6;5152:32;5141:9;5134:51;5115:4;5204:2;5242:3;5237:2;5226:9;5222:18;5215:31;5275:6;5269:13;5319:6;5313:3;5302:9;5298:19;5291:35;5344:1;5354:141;5368:6;5365:1;5362:13;5354:141;;;5464:14;;;5460:23;;5454:30;5429:17;;;5448:3;5425:27;5418:67;5383:10;;5354:141;;;5358:3;5514;5504:13;;5566:1;5561:2;5552:6;5541:9;5537:22;5533:31;5526:42;5627:2;5623:7;5618:2;5610:6;5606:15;5602:29;5591:9;5587:45;5577:55;;5692:2;5680:9;5676:2;5672:18;5668:27;5663:2;5652:9;5648:18;5641:55;5713:57;5766:2;5762;5758:11;5750:6;5713:57;:::i;:::-;5705:65;;;;5806:6;5801:2;5790:9;5786:18;5779:34;5850:6;5844:3;5833:9;5829:19;5822:35;5894:6;5888:3;5877:9;5873:19;5866:35;5910:47;5952:3;5941:9;5937:19;5929:6;-1:-1:-1;;;;;447:31:65;435:44;;381:104;5968:434;6182:25;;;-1:-1:-1;;;;;6243:32:65;;6238:2;6223:18;;6216:60;6312:2;6307;6292:18;;6285:30;;;-1:-1:-1;;6332:64:65;;6377:18;;6369:6;6332:64;:::i;:::-;6324:72;5968:434;-1:-1:-1;;;;;5968:434:65:o","linkReferences":{},"immutableReferences":{"45786":[{"start":158,"length":32},{"start":598,"length":32},{"start":760,"length":32}],"46254":[{"start":341,"length":32},{"start":561,"length":32}]}},"methodIdentifiers":{"MAX_TRAVERSAL()":"58781576","SOURCE()":"f230b4c2","create(string,uint256,uint256)":"cda3c499","defaultUnlockers(uint256)":"5c681d1e","owner()":"8da5cb5b","renounceOwnership()":"715018a6","setDefaultUnlockers(address[])":"a9d14058","transferOwnership(address)":"f2fde38b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IAggregatorV3SourceCoinbase\",\"name\":\"_source\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTraversal\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_defaultUnlockers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"defaultUnlockers\",\"type\":\"address[]\"}],\"name\":\"DefaultUnlockersSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"deployer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oval\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"lockWindow\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxTraversal\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"unlockers\",\"type\":\"address[]\"}],\"name\":\"OvalDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_TRAVERSAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SOURCE\",\"outputs\":[{\"internalType\":\"contract IAggregatorV3SourceCoinbase\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"ticker\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"lockWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxAge\",\"type\":\"uint256\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"oval\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"defaultUnlockers\",\"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\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_defaultUnlockers\",\"type\":\"address[]\"}],\"name\":\"setDefaultUnlockers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This is the best factory for most use cases, but there are other variants that may be needed if different mutability choices are desired.\",\"kind\":\"dev\",\"methods\":{\"create(string,uint256,uint256)\":{\"params\":{\"lockWindow\":\"the lockWindow used for this Oval instance. This is the length of the window for the Oval auction to be run and, thus, the maximum time that prices will be delayed.\",\"maxAge\":\"max age of a price that is used in place of the current price. If the only available price is older than this, OEV is not captured and the current price is provided.\",\"ticker\":\"the Coinbase oracle's ticker.\"},\"returns\":{\"oval\":\"deployed oval address.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setDefaultUnlockers(address[])\":{\"details\":\"This and the owner, itself, is the only mutable portion of this factory.\",\"params\":{\"_defaultUnlockers\":\"default unlockers that will be used to instantiate new Oval instances.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"StandardCoinbaseFactory is the recommended factory for use cases that want a Coinbase source and Chainlink interface.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(string,uint256,uint256)\":{\"notice\":\"Creates the Coinbase Oval instance.\"},\"setDefaultUnlockers(address[])\":{\"notice\":\"Enables the owner to set the default unlockers that will be passed to all Oval instances created by this contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/factories/StandardCoinbaseFactory.sol\":\"StandardCoinbaseFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@chainlink/=lib/redstone-contracts/lib/@chainlink/\",\":@openzeppelin/contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/redstone-contracts/lib/openzeppelin-contracts/contracts/\",\":@redstone-finance/evm-connector/contracts/=lib/redstone-contracts/src/evm-connector/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts/contracts/\",\":redstone-contracts/=lib/redstone-contracts/src/\",\":redstone-oracle/=lib/redstone-contracts/src/\"]},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32\",\"dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278\",\"dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH\"]},\"src/DiamondRootOval.sol\":{\"keccak256\":\"0x54d2c3c6650a988ae636faa36e296fbf075ab5886da4a3ec9014de99512c2ee1\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://30a6f48795c2a1db3be66a80d829ebf34d2cc6bc5b7e1b0a434677cfe98221fc\",\"dweb:/ipfs/QmVoBdWELzb5AMKig5KjCisLbmFean2atNGenTbmLjqMpL\"]},\"src/Oval.sol\":{\"keccak256\":\"0x3920c6f066449678694d0587f57495a7e739682ea6da4748de26aa4c655d4bdf\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://630c2229a316b5885d4e06b6f6de8c6a0d220daf07a5c24fa225c2e2396e3449\",\"dweb:/ipfs/QmXpnDzxLU1aVCqkeeoQXsJ25KDC5qJ1WcwPXBbbXaoNxM\"]},\"src/adapters/destination-adapters/ChainlinkDestinationAdapter.sol\":{\"keccak256\":\"0xd66cb1a0c51f8c298dab85552a5156747646d31dbe66b0ce9184f05f3adee56b\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://274135de35a3f423e49ea0bbb7aeb5fd355b3bbabb2f304deb39b6022df1c7d0\",\"dweb:/ipfs/QmZkdjkTp7GLmZTuaw7bcU3zd8oSvhkdYYxssqCRMgZDnE\"]},\"src/adapters/lib/DecimalLib.sol\":{\"keccak256\":\"0x970a20a667780e91fb80ba79005863c73421cdf730ba2303e650e63d9099cde2\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://96013c450945da6d71128267f38754a07bb62223a0c07ef84925fa84636441f2\",\"dweb:/ipfs/QmSZsc8Epuan7zuQCYBcirjZ63zHwcGicfV75rRPfFrixT\"]},\"src/adapters/source-adapters/CoinbaseSourceAdapter.sol\":{\"keccak256\":\"0x7172bef20da50a4d9e0526ccb7a9c56e202e7238527169e983f2d351e309fa67\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://553ee19da688e7c382a9096320126f90d1a755c192fbcc466d217a3a87cf92b9\",\"dweb:/ipfs/QmTX9Memty7XSJpwDorLnUde1keiU5SFABGVjTt4cxzAfe\"]},\"src/controllers/MutableUnlockersController.sol\":{\"keccak256\":\"0x32e43c4a5e3abaa488a3758333f78fa6e166ca65a09ac76ca6b7e645d7863d16\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://b632392a02f26de3824929fb6e2dcfe8cc84689a489b12ba45bfd0ef4d93661f\",\"dweb:/ipfs/QmcMrnNCrM1YXBqj17HZicDvVe4fGnj66LFis6p9Gro5ob\"]},\"src/factories/BaseFactory.sol\":{\"keccak256\":\"0x94670505d6e89c9cd1cef18dfce0e65f36a97c693e5c2ed9a4f81fd0c94b26e6\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://6480e1d133f5abbe5641bc35c85a34dddf1979e68b35ee532e014fae860c4f19\",\"dweb:/ipfs/QmNsjcvQ5mnpjHnRMokhUMcYCbcYqDbJG6426CN6j5EoAq\"]},\"src/factories/StandardCoinbaseFactory.sol\":{\"keccak256\":\"0x8318ab3bbea3ea2563fc7e662b86c16006bb836fc56c457076ddb081ecbc0906\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://a5c9f631e4aca4211c6ef42dd94b2dcb83ac7e0d10b7faa81bce6a1eb48c8f07\",\"dweb:/ipfs/QmaHHPtorCdDX2CBoeC5FGVpUPwc46oBkJfywwbg9qBEM5\"]},\"src/interfaces/IBaseController.sol\":{\"keccak256\":\"0x8fe524fac0b04c8415e814b1dfb1ca28d303c8de65df22c268dc1d5f4e74a9d5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b69c11d3e90c65202e184de1ece928269ccd49e82aeec1aab1d489e92d3ea5cc\",\"dweb:/ipfs/QmYNoffB6UhJXTaKVwcxH4zzZgAVv3x3vacrVMQxmnHVju\"]},\"src/interfaces/IBaseOracleAdapter.sol\":{\"keccak256\":\"0x9c4c3727631ccc8ad4d202a1b7faf8833fae0d93d0a7fca45de009ab8f7ecab9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4b904def3696b12cbef6997b34e2bb4c8aef6af52bb640840040b6b59b25f0be\",\"dweb:/ipfs/QmfReXd9EmWRDFjs2SLdn6YUqyVH9RMxCjvzPnjLDYxuQP\"]},\"src/interfaces/IOval.sol\":{\"keccak256\":\"0x8511408e4da9818a36531a464a42f99461ce38419def87f35c52c58fe4d4f6aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://501d19f2a3bcadaa8095c5808bfae348d8ebe78b34084115ee635c1ad101c953\",\"dweb:/ipfs/QmRqkEjEE9ydGrMCTJttjq6harZytTZDa8AQ2NriVU1A2H\"]},\"src/interfaces/chainlink/IAggregatorV3.sol\":{\"keccak256\":\"0xb4d26247f867a5a5614638bdee251e29b73eddc61c4b9f04f8af2d88e2f4e05d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0628c9b3a05410dee47e48ee68c2e3004b0c977c9942149a9206be7795d033d1\",\"dweb:/ipfs/QmdSGsY55cMx3CKQJ3huz9P54XVfKWnHLxQsoqweve2Z8G\"]},\"src/interfaces/coinbase/IAggregatorV3SourceCoinbase.sol\":{\"keccak256\":\"0x8bca465d65974641437e07953879c4c7c141ffe3c720c040cd91406e390ecf20\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://65cdfc3b14bb6713f03a931d11d90a199a5ae3bda6f41a9a363380323111208c\",\"dweb:/ipfs/Qmd3tVZ5Q9EHigQq85M2qQTmHmRng9tTcYi2hDYFpnZdYA\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.17+commit.8df45f5f"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"contract IAggregatorV3SourceCoinbase","name":"_source","type":"address"},{"internalType":"uint256","name":"_maxTraversal","type":"uint256"},{"internalType":"address[]","name":"_defaultUnlockers","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address[]","name":"defaultUnlockers","type":"address[]","indexed":false}],"type":"event","name":"DefaultUnlockersSet","anonymous":false},{"inputs":[{"internalType":"address","name":"deployer","type":"address","indexed":true},{"internalType":"address","name":"oval","type":"address","indexed":true},{"internalType":"uint256","name":"lockWindow","type":"uint256","indexed":true},{"internalType":"uint256","name":"maxTraversal","type":"uint256","indexed":false},{"internalType":"address","name":"owner","type":"address","indexed":false},{"internalType":"address[]","name":"unlockers","type":"address[]","indexed":false}],"type":"event","name":"OvalDeployed","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_TRAVERSAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"SOURCE","outputs":[{"internalType":"contract IAggregatorV3SourceCoinbase","name":"","type":"address"}]},{"inputs":[{"internalType":"string","name":"ticker","type":"string"},{"internalType":"uint256","name":"lockWindow","type":"uint256"},{"internalType":"uint256","name":"maxAge","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"create","outputs":[{"internalType":"address","name":"oval","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"defaultUnlockers","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"address[]","name":"_defaultUnlockers","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"setDefaultUnlockers"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"}],"devdoc":{"kind":"dev","methods":{"create(string,uint256,uint256)":{"params":{"lockWindow":"the lockWindow used for this Oval instance. This is the length of the window for the Oval auction to be run and, thus, the maximum time that prices will be delayed.","maxAge":"max age of a price that is used in place of the current price. If the only available price is older than this, OEV is not captured and the current price is provided.","ticker":"the Coinbase oracle's ticker."},"returns":{"oval":"deployed oval address."}},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"setDefaultUnlockers(address[])":{"details":"This and the owner, itself, is the only mutable portion of this factory.","params":{"_defaultUnlockers":"default unlockers that will be used to instantiate new Oval instances."}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{"create(string,uint256,uint256)":{"notice":"Creates the Coinbase Oval instance."},"setDefaultUnlockers(address[])":{"notice":"Enables the owner to set the default unlockers that will be passed to all Oval instances created by this contract."}},"version":1}},"settings":{"remappings":["@chainlink/=lib/redstone-contracts/lib/@chainlink/","@openzeppelin/contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/redstone-contracts/lib/openzeppelin-contracts/contracts/","@redstone-finance/evm-connector/contracts/=lib/redstone-contracts/src/evm-connector/","ds-test/=lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","openzeppelin/=lib/openzeppelin-contracts/contracts/","redstone-contracts/=lib/redstone-contracts/src/","redstone-oracle/=lib/redstone-contracts/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/factories/StandardCoinbaseFactory.sol":"StandardCoinbaseFactory"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts/contracts/access/Ownable.sol":{"keccak256":"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218","urls":["bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32","dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3","urls":["bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c","dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"keccak256":"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad","urls":["bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278","dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH"],"license":"MIT"},"src/DiamondRootOval.sol":{"keccak256":"0x54d2c3c6650a988ae636faa36e296fbf075ab5886da4a3ec9014de99512c2ee1","urls":["bzz-raw://30a6f48795c2a1db3be66a80d829ebf34d2cc6bc5b7e1b0a434677cfe98221fc","dweb:/ipfs/QmVoBdWELzb5AMKig5KjCisLbmFean2atNGenTbmLjqMpL"],"license":"BUSL-1.1"},"src/Oval.sol":{"keccak256":"0x3920c6f066449678694d0587f57495a7e739682ea6da4748de26aa4c655d4bdf","urls":["bzz-raw://630c2229a316b5885d4e06b6f6de8c6a0d220daf07a5c24fa225c2e2396e3449","dweb:/ipfs/QmXpnDzxLU1aVCqkeeoQXsJ25KDC5qJ1WcwPXBbbXaoNxM"],"license":"BUSL-1.1"},"src/adapters/destination-adapters/ChainlinkDestinationAdapter.sol":{"keccak256":"0xd66cb1a0c51f8c298dab85552a5156747646d31dbe66b0ce9184f05f3adee56b","urls":["bzz-raw://274135de35a3f423e49ea0bbb7aeb5fd355b3bbabb2f304deb39b6022df1c7d0","dweb:/ipfs/QmZkdjkTp7GLmZTuaw7bcU3zd8oSvhkdYYxssqCRMgZDnE"],"license":"BUSL-1.1"},"src/adapters/lib/DecimalLib.sol":{"keccak256":"0x970a20a667780e91fb80ba79005863c73421cdf730ba2303e650e63d9099cde2","urls":["bzz-raw://96013c450945da6d71128267f38754a07bb62223a0c07ef84925fa84636441f2","dweb:/ipfs/QmSZsc8Epuan7zuQCYBcirjZ63zHwcGicfV75rRPfFrixT"],"license":"BUSL-1.1"},"src/adapters/source-adapters/CoinbaseSourceAdapter.sol":{"keccak256":"0x7172bef20da50a4d9e0526ccb7a9c56e202e7238527169e983f2d351e309fa67","urls":["bzz-raw://553ee19da688e7c382a9096320126f90d1a755c192fbcc466d217a3a87cf92b9","dweb:/ipfs/QmTX9Memty7XSJpwDorLnUde1keiU5SFABGVjTt4cxzAfe"],"license":"BUSL-1.1"},"src/controllers/MutableUnlockersController.sol":{"keccak256":"0x32e43c4a5e3abaa488a3758333f78fa6e166ca65a09ac76ca6b7e645d7863d16","urls":["bzz-raw://b632392a02f26de3824929fb6e2dcfe8cc84689a489b12ba45bfd0ef4d93661f","dweb:/ipfs/QmcMrnNCrM1YXBqj17HZicDvVe4fGnj66LFis6p9Gro5ob"],"license":"BUSL-1.1"},"src/factories/BaseFactory.sol":{"keccak256":"0x94670505d6e89c9cd1cef18dfce0e65f36a97c693e5c2ed9a4f81fd0c94b26e6","urls":["bzz-raw://6480e1d133f5abbe5641bc35c85a34dddf1979e68b35ee532e014fae860c4f19","dweb:/ipfs/QmNsjcvQ5mnpjHnRMokhUMcYCbcYqDbJG6426CN6j5EoAq"],"license":"BUSL-1.1"},"src/factories/StandardCoinbaseFactory.sol":{"keccak256":"0x8318ab3bbea3ea2563fc7e662b86c16006bb836fc56c457076ddb081ecbc0906","urls":["bzz-raw://a5c9f631e4aca4211c6ef42dd94b2dcb83ac7e0d10b7faa81bce6a1eb48c8f07","dweb:/ipfs/QmaHHPtorCdDX2CBoeC5FGVpUPwc46oBkJfywwbg9qBEM5"],"license":"BUSL-1.1"},"src/interfaces/IBaseController.sol":{"keccak256":"0x8fe524fac0b04c8415e814b1dfb1ca28d303c8de65df22c268dc1d5f4e74a9d5","urls":["bzz-raw://b69c11d3e90c65202e184de1ece928269ccd49e82aeec1aab1d489e92d3ea5cc","dweb:/ipfs/QmYNoffB6UhJXTaKVwcxH4zzZgAVv3x3vacrVMQxmnHVju"],"license":"MIT"},"src/interfaces/IBaseOracleAdapter.sol":{"keccak256":"0x9c4c3727631ccc8ad4d202a1b7faf8833fae0d93d0a7fca45de009ab8f7ecab9","urls":["bzz-raw://4b904def3696b12cbef6997b34e2bb4c8aef6af52bb640840040b6b59b25f0be","dweb:/ipfs/QmfReXd9EmWRDFjs2SLdn6YUqyVH9RMxCjvzPnjLDYxuQP"],"license":"MIT"},"src/interfaces/IOval.sol":{"keccak256":"0x8511408e4da9818a36531a464a42f99461ce38419def87f35c52c58fe4d4f6aa","urls":["bzz-raw://501d19f2a3bcadaa8095c5808bfae348d8ebe78b34084115ee635c1ad101c953","dweb:/ipfs/QmRqkEjEE9ydGrMCTJttjq6harZytTZDa8AQ2NriVU1A2H"],"license":"MIT"},"src/interfaces/chainlink/IAggregatorV3.sol":{"keccak256":"0xb4d26247f867a5a5614638bdee251e29b73eddc61c4b9f04f8af2d88e2f4e05d","urls":["bzz-raw://0628c9b3a05410dee47e48ee68c2e3004b0c977c9942149a9206be7795d033d1","dweb:/ipfs/QmdSGsY55cMx3CKQJ3huz9P54XVfKWnHLxQsoqweve2Z8G"],"license":"MIT"},"src/interfaces/coinbase/IAggregatorV3SourceCoinbase.sol":{"keccak256":"0x8bca465d65974641437e07953879c4c7c141ffe3c720c040cd91406e390ecf20","urls":["bzz-raw://65cdfc3b14bb6713f03a931d11d90a199a5ae3bda6f41a9a363380323111208c","dweb:/ipfs/Qmd3tVZ5Q9EHigQq85M2qQTmHmRng9tTcYi2hDYFpnZdYA"],"license":"MIT"}},"version":1},"id":49} \ No newline at end of file diff --git a/src/abi/StandardPythFactory.json b/src/abi/StandardPythFactory.json new file mode 100644 index 0000000..caccada --- /dev/null +++ b/src/abi/StandardPythFactory.json @@ -0,0 +1 @@ +{"abi":[{"type":"constructor","inputs":[{"name":"_pyth","type":"address","internalType":"contract IPyth"},{"name":"_maxTraversal","type":"uint256","internalType":"uint256"},{"name":"_defaultUnlockers","type":"address[]","internalType":"address[]"}],"stateMutability":"nonpayable"},{"type":"function","name":"MAX_TRAVERSAL","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"PYTH","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IPyth"}],"stateMutability":"view"},{"type":"function","name":"create","inputs":[{"name":"pythPriceId","type":"bytes32","internalType":"bytes32"},{"name":"lockWindow","type":"uint256","internalType":"uint256"},{"name":"maxAge","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"oval","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"defaultUnlockers","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"renounceOwnership","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setDefaultUnlockers","inputs":[{"name":"_defaultUnlockers","type":"address[]","internalType":"address[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"transferOwnership","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"DefaultUnlockersSet","inputs":[{"name":"defaultUnlockers","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"OvalDeployed","inputs":[{"name":"deployer","type":"address","indexed":true,"internalType":"address"},{"name":"oval","type":"address","indexed":true,"internalType":"address"},{"name":"lockWindow","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"maxTraversal","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"owner","type":"address","indexed":false,"internalType":"address"},{"name":"unlockers","type":"address[]","indexed":false,"internalType":"address[]"}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false}],"bytecode":{"object":"0x60c06040523480156200001157600080fd5b506040516200247538038062002475833981016040819052620000349162000289565b81816200004133620000bd565b60008211620000975760405162461bcd60e51b815260206004820152601960248201527f4d61782074726176657273616c206d757374206265203e20300000000000000060448201526064015b60405180910390fd5b6080829052620000a7816200010d565b505050506001600160a01b031660a052620003cc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6200011762000169565b80516200012c906001906020840190620001c7565b507f53dcea6cd8a9fb42c53d0155aebceb09df1f90371ee9727c244f6557223bae16816040516200015e91906200037d565b60405180910390a150565b6000546001600160a01b03163314620001c55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200008e565b565b8280548282559060005260206000209081019282156200021f579160200282015b828111156200021f57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620001e8565b506200022d92915062000231565b5090565b5b808211156200022d576000815560010162000232565b6001600160a01b03811681146200025e57600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b8051620002848162000248565b919050565b6000806000606084860312156200029f57600080fd5b8351620002ac8162000248565b60208581015160408701519295509350906001600160401b0380821115620002d357600080fd5b818701915087601f830112620002e857600080fd5b815181811115620002fd57620002fd62000261565b8060051b604051601f19603f8301168101818110858211171562000325576200032562000261565b60405291825284820192508381018501918a8311156200034457600080fd5b938501935b828510156200036d576200035d8562000277565b8452938501939285019262000349565b8096505050505050509250925092565b6020808252825182820181905260009190848201906040850190845b81811015620003c05783516001600160a01b03168352928401929184019160010162000399565b50909695505050505050565b60805160a05161206f62000406600039600081816101090152610231015260008181609e0152818161025601526102f8015261206f6000f3fe60806040523480156200001157600080fd5b5060043610620000935760003560e01c80638da5cb5b11620000625780638da5cb5b1462000137578063a9d140581462000149578063b5f8c36b1462000160578063f2fde38b146200017757600080fd5b80635878157614620000985780635c681d1e14620000d357806367e406d51462000103578063715018a6146200012b575b600080fd5b620000c07f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b620000ea620000e43660046200050a565b6200018e565b6040516001600160a01b039091168152602001620000ca565b620000ea7f000000000000000000000000000000000000000000000000000000000000000081565b62000135620001b9565b005b6000546001600160a01b0316620000ea565b620001356200015a36600462000557565b620001d1565b620000ea620001713660046200062a565b6200022d565b620001356200018836600462000657565b6200034c565b600181815481106200019f57600080fd5b6000918252602090912001546001600160a01b0316905081565b620001c3620003cf565b620001cf60006200042b565b565b620001db620003cf565b8051620001f09060019060208401906200047b565b507f53dcea6cd8a9fb42c53d0155aebceb09df1f90371ee9727c244f6557223bae16816040516200022291906200067c565b60405180910390a150565b60007f0000000000000000000000000000000000000000000000000000000000000000846001857f000000000000000000000000000000000000000000000000000000000000000086620002896000546001600160a01b031690565b6040516200029790620004e5565b620002a9979695949392919062000716565b604051809103906000f080158015620002c6573d6000803e3d6000fd5b509050826001600160a01b038216337f5e826bc8ad243559fc75cc77b0e474a2ec85df26aeb5cd6db9d9ed1740f39afa7f00000000000000000000000000000000000000000000000000000000000000006200032a6000546001600160a01b031690565b60016040516200033d9392919062000769565b60405180910390a49392505050565b62000356620003cf565b6001600160a01b038116620003c15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620003cc816200042b565b50565b6000546001600160a01b03163314620001cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620003b8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215620004d3579160200282015b82811115620004d357825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200049c565b50620004e1929150620004f3565b5090565b61189b806200079f83390190565b5b80821115620004e15760008155600101620004f4565b6000602082840312156200051d57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b03811681146200055257600080fd5b919050565b600060208083850312156200056b57600080fd5b823567ffffffffffffffff808211156200058457600080fd5b818501915085601f8301126200059957600080fd5b813581811115620005ae57620005ae62000524565b8060051b604051601f19603f83011681018181108582111715620005d657620005d662000524565b604052918252848201925083810185019188831115620005f557600080fd5b938501935b828510156200061e576200060e856200053a565b84529385019392850192620005fa565b98975050505050505050565b6000806000606084860312156200064057600080fd5b505081359360208301359350604090920135919050565b6000602082840312156200066a57600080fd5b62000675826200053a565b9392505050565b6020808252825182820181905260009190848201906040850190845b81811015620006bf5783516001600160a01b03168352928401929184019160010162000698565b50909695505050505050565b6000815480845260208085019450836000528060002060005b838110156200070b5781546001600160a01b031687529582019560019182019101620006e4565b509495945050505050565b600060018060a01b03808a16835288602084015260e060408401526200074060e0840189620006cb565b91508660608401528560808401528460a084015280841660c08401525098975050505050505050565b8381526001600160a01b03831660208201526060604082018190526000906200079590830184620006cb565b9594505050505056fe6101406040523480156200001257600080fd5b506040516200189b3803806200189b833981016040819052620000359162000422565b6012878786868987620000483362000263565b8381116200009d5760405162461bcd60e51b815260206004820152601d60248201527f4d617820616765206e6f742061626f7665206c6f636b2077696e646f7700000060448201526064015b60405180910390fd5b60008311620000ef5760405162461bcd60e51b815260206004820152601960248201527f4d61782074726176657273616c206d757374206265203e203000000000000000604482015260640162000094565b608084905260a083905260c081905260005b82518110156200014f576200013a83828151811062000124576200012462000546565b60200260200101516001620002b360201b60201c565b8062000146816200055c565b91505062000101565b5060405184907f7232430c38d2db810b464dc9cd004f0e41528c6ba2eb1e2e4e3220ffd3a83a1b90600090a260405183907f9955b343f0b35bf4c2045c06550a8ec2d914db72d497a1430ca3526a248f20a590600090a260405181907f6777d8e4257e9f6a86d2f91b2b9fceaeb931d8b35249fbb63203c2dc0c08187090600090a25050506001600160a01b03831660e08190526101008390526040518392507f352ffb84cbc39305b8921ad0af26cbf5ecd6bb8034fe313ce472d107f5650f6290600090a3505060ff81166101208190526040517f4e500e16c773a18df7642e2d86cfe357eab156473b38c34df4e15dffb895072690600090a250620002568162000263565b5050505050505062000584565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620002bd62000383565b6001600160a01b03821660009081526002602052604090205481151560ff9091161515036200032f5760405162461bcd60e51b815260206004820152601460248201527f556e6c6f636b6572206e6f74206368616e676564000000000000000000000000604482015260640162000094565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b6000546001600160a01b03163314620003df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000094565b565b6001600160a01b0381168114620003f757600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b80516200041d81620003e1565b919050565b600080600080600080600060e0888a0312156200043e57600080fd5b87516200044b81620003e1565b60208981015160408b01519299509750906001600160401b03808211156200047257600080fd5b818b0191508b601f8301126200048757600080fd5b8151818111156200049c576200049c620003fa565b8060051b604051601f19603f83011681018181108582111715620004c457620004c4620003fa565b60405291825284820192508381018501918e831115620004e357600080fd5b938501935b828510156200050c57620004fc8562000410565b84529385019392850192620004e8565b809a50505050505050606088015193506080880151925060a088015191506200053860c0890162000410565b905092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b6000600182016200057d57634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e0516101005161012051611288620006136000396000818161024f01528181610684015281816108b10152610b040152600081816101c001526105850152600081816102df01526105ba0152600081816103230152610d030152600081816103d701526104b10152600081816102980152818161047e0152610a8e01526112886000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063715018a6116100de578063a5c38b3d11610097578063d6565a2d11610071578063d6565a2d1461042a578063f2fde38b1461043d578063f6e1d17a14610450578063feaf968c1461046357600080fd5b8063a5c38b3d146103fb578063cb53b08d14610404578063d3fff0f61461041757600080fd5b8063715018a6146103475780637292eb691461034f5780638205bf6a146103725780638da5cb5b1461037a5780639a6fc8f51461038b578063a3c04476146103d557600080fd5b806332c6534b1161014b57806350d25bcd1161012557806350d25bcd146102d257806363a890a5146102da5780636666d37214610319578063687043c51461032157600080fd5b806332c6534b146102835780633376f53a146102965780633d6ba578146102bc57600080fd5b80630125554b146101935780630cb0f4fa146101bb57806313862364146101f0578063172b09f9146101fa57806324a419f41461022d578063313ce5671461024a575b600080fd5b61019b61046b565b604080519384526020840192909252908201526060015b60405180910390f35b6101e27f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101b2565b6101f86104e0565b005b61021d610208366004610e8d565b60026020526000908152604090205460ff1681565b60405190151581526020016101b2565b610235610576565b604080519283526020830191909152016101b2565b6102717f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016101b2565b61021d610291366004610ea8565b61064a565b7f00000000000000000000000000000000000000000000000000000000000000006101e2565b6102356102ca366004610ed2565b506000908190565b6101e261066d565b6103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101b2565b6101f86106ae565b7f00000000000000000000000000000000000000000000000000000000000000006101e2565b6101f86107d7565b6103576107eb565b604080518251815260209283015192810192909252016101b2565b6101e2610871565b6000546001600160a01b0316610301565b61039e610399366004610eeb565b610884565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a0016101b2565b7f00000000000000000000000000000000000000000000000000000000000000006101e2565b6101e260015481565b61019b610412366004610f17565b6108e8565b6101f8610425366004610f39565b610910565b610235610438366004610ed2565b6109d3565b6101f861044b366004610e8d565b610a01565b61023561045e366004610ed2565b610a7a565b61039e610ad4565b60008060006104d56104af6001546104a07f000000000000000000000000000000000000000000000000000000000000000090565b6104aa9042610f8b565b610b3c565b7f00000000000000000000000000000000000000000000000000000000000000006108e8565b925092509250909192565b6104ec3360015461064a565b61053d5760405162461bcd60e51b815260206004820152601d60248201527f436f6e74726f6c6c657220626c6f636b65643a2063616e556e6c6f636b00000060448201526064015b60405180910390fd5b6105456106ae565b4260018190556040517f3ee2ed8fd57cf3bdf05ef91fbe207825c00ef41e2303a859c67a84cd46cd69aa90600090a2565b6040516396834ad360e01b81527f00000000000000000000000000000000000000000000000000000000000000006004820152600090819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906396834ad390602401608060405180830381865afa158015610601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106259190610fc8565b905061063c816000015160070b8260400151610b54565b816060015192509250509091565b6001600160a01b03821660009081526002602052604090205460ff165b92915050565b60008061067861046b565b505090506106a88160127f0000000000000000000000000000000000000000000000000000000000000000610b8c565b91505090565b6000806106b9610576565b6040805180820190915282815260208101829052919350915060008290036106e057505050565b60035480158015906107235750602082015160036106ff600184610f8b565b8154811061070f5761070f611058565b906000526020600020906002020160010154145b1561072e5750505050565b60038054600181018255600091909152825160029091027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810182905560208401517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c9091018190556040517ff500358c8d5c04faf9e5b933d49e928da38afad4ff748ca6cd85428485caa508906107c99085815260200190565b60405180910390a350505050565b6107df610bfd565b6107e96000610c57565b565b604080518082019091526000808252602082015260035415610859576003805461081790600190610f8b565b8154811061082757610827611058565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050905090565b50604080518082019091526000808252602082015290565b60008061087c61046b565b509392505050565b60008060008060008060006108a48869ffffffffffffffffffff16610a7a565b91509150876108d58360127f0000000000000000000000000000000000000000000000000000000000000000610b8c565b9099909891975087965090945092505050565b6000806000806108f88686610ca7565b80516020909101519097909650600195509350505050565b610918610bfd565b6001600160a01b03821660009081526002602052604090205481151560ff90911615150361097f5760405162461bcd60e51b8152602060048201526014602482015273155b9b1bd8dad95c881b9bdd0818da185b99d95960621b6044820152606401610534565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b600381815481106109e357600080fd5b60009182526020909120600290910201805460019091015490915082565b610a09610bfd565b6001600160a01b038116610a6e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610534565b610a7781610c57565b50565b6001546000908190819081908190610ab2907f00000000000000000000000000000000000000000000000000000000000000006104a0565b9050808211610ac657509094909350915050565b506000958695509350505050565b600080600080600080600080610ae861046b565b9250925092506000610af982610d47565b905080610b288560127f0000000000000000000000000000000000000000000000000000000000000000610b8c565b909a90995092975087965094509092505050565b6000818311610b4b5781610b4d565b825b9392505050565b6000808260030b13610b7b57610b7483610b6d8461106e565b6012610b8c565b9050610667565b610b74836000610b8c856012611091565b60008160ff168360ff1603610ba2575082610b4d565b8160ff168360ff161015610bd657610bba83836110aa565b610bc590600a6111a7565b610bcf90856111b6565b9050610b4d565b610be082846110aa565b610beb90600a6111a7565b610bf590856111e6565b949350505050565b6000546001600160a01b031633146107e95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610534565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805180820190915260008082526020820152600080610cc6610576565b60408051808201909152828152602081018290529193509150858211610cf0579250610667915050565b6000610cfc8787610db6565b9050610d287f000000000000000000000000000000000000000000000000000000000000000042610f8b565b816020015110610d3d57935061066792505050565b5095945050505050565b600069ffffffffffffffffffff821115610db25760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203860448201526530206269747360d01b6064820152608401610534565b5090565b604080518082019091526000808252602082015260408051808201909152600080825260208201526003546000905b8482108015610df45750600081115b15610e675780610e0381611222565b91505060038181548110610e1957610e19611058565b600091825260209182902060408051808201909152600290920201805482526001015491810182905293508610610e5557829350505050610667565b81610e5f81611239565b925050610de5565b5090949350505050565b80356001600160a01b0381168114610e8857600080fd5b919050565b600060208284031215610e9f57600080fd5b610b4d82610e71565b60008060408385031215610ebb57600080fd5b610ec483610e71565b946020939093013593505050565b600060208284031215610ee457600080fd5b5035919050565b600060208284031215610efd57600080fd5b813569ffffffffffffffffffff81168114610b4d57600080fd5b60008060408385031215610f2a57600080fd5b50508035926020909101359150565b60008060408385031215610f4c57600080fd5b610f5583610e71565b915060208301358015158114610f6a57600080fd5b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561066757610667610f75565b805167ffffffffffffffff81168114610e8857600080fd5b8051600381900b8114610e8857600080fd5b600060808284031215610fda57600080fd5b6040516080810181811067ffffffffffffffff8211171561100b57634e487b7160e01b600052604160045260246000fd5b6040528251600781900b811461102057600080fd5b815261102e60208401610f9e565b602082015261103f60408401610fb6565b6040820152606083015160608201528091505092915050565b634e487b7160e01b600052603260045260246000fd5b60008160030b637fffffff19810361108857611088610f75565b60000392915050565b60ff818116838216019081111561066757610667610f75565b60ff828116828216039081111561066757610667610f75565b600181815b808511156110fe5781600019048211156110e4576110e4610f75565b808516156110f157918102915b93841c93908002906110c8565b509250929050565b60008261111557506001610667565b8161112257506000610667565b816001811461113857600281146111425761115e565b6001915050610667565b60ff84111561115357611153610f75565b50506001821b610667565b5060208310610133831016604e8410600b8410161715611181575081810a610667565b61118b83836110c3565b806000190482111561119f5761119f610f75565b029392505050565b6000610b4d60ff841683611106565b80820260008212600160ff1b841416156111d2576111d2610f75565b818105831482151761066757610667610f75565b60008261120357634e487b7160e01b600052601260045260246000fd5b600160ff1b82146000198414161561121d5761121d610f75565b500590565b60008161123157611231610f75565b506000190190565b60006001820161124b5761124b610f75565b506001019056fea2646970667358221220662f7349fbc887eb9f161c891dd25d33d52ca8972b31ab24bae686207dea5a5b64736f6c63430008110033a2646970667358221220dfead5361a611dc3d5db7724f56838800d56fa4c22436670a9c438451b33be6664736f6c63430008110033","sourceMap":"1625:1144:50:-:0;;;1718:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1822:13;1837:17;936:32:14;719:10:18;936:18:14;:32::i;:::-;925:1:45;909:13;:17;901:55;;;;-1:-1:-1;;;901:55:45;;1986:2:65;901:55:45;;;1968:21:65;2025:2;2005:18;;;1998:30;2064:27;2044:18;;;2037:55;2109:18;;901:55:45;;;;;;;;;967:29;;;;1006:38;1026:17;1006:19;:38::i;:::-;-1:-1:-1;;;;;;;;;1870:12:50::1;;::::0;1625:1144;;2426:187:14;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:14;;;-1:-1:-1;;;;;;2534:17:14;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;1398:188:45:-;1094:13:14;:11;:13::i;:::-;1490:36:45;;::::1;::::0;:16:::1;::::0;:36:::1;::::0;::::1;::::0;::::1;:::i;:::-;;1541:38;1561:17;1541:38;;;;;;:::i;:::-;;;;;;;;1398:188:::0;:::o;1359:130:14:-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:14;719:10:18;1422:23:14;1414:68;;;;-1:-1:-1;;;1414:68:14;;3003:2:65;1414:68:14;;;2985:21:65;;;3022:18;;;3015:30;3081:34;3061:18;;;3054:62;3133:18;;1414:68:14;2801:356:65;1414:68:14;1359:130::o;1625:1144:50:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1625:1144:50;-1:-1:-1;;;;;1625:1144:50;;;;;;;;;;;-1:-1:-1;1625:1144:50;;;;;;;-1:-1:-1;1625:1144:50;;;-1:-1:-1;1625:1144:50;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:138:65;-1:-1:-1;;;;;96:31:65;;86:42;;76:70;;142:1;139;132:12;76:70;14:138;:::o;157:127::-;218:10;213:3;209:20;206:1;199:31;249:4;246:1;239:15;273:4;270:1;263:15;289:145;368:13;;390:38;368:13;390:38;:::i;:::-;289:145;;;:::o;439:1340::-;567:6;575;583;636:2;624:9;615:7;611:23;607:32;604:52;;;652:1;649;642:12;604:52;684:9;678:16;703:38;735:5;703:38;:::i;:::-;784:2;811:18;;;805:25;874:2;859:18;;853:25;760:5;;-1:-1:-1;805:25:65;-1:-1:-1;784:2:65;-1:-1:-1;;;;;927:14:65;;;924:34;;;954:1;951;944:12;924:34;992:6;981:9;977:22;967:32;;1037:7;1030:4;1026:2;1022:13;1018:27;1008:55;;1059:1;1056;1049:12;1008:55;1088:2;1082:9;1110:2;1106;1103:10;1100:36;;;1116:18;;:::i;:::-;1162:2;1159:1;1155:10;1194:2;1188:9;1257:2;1253:7;1248:2;1244;1240:11;1236:25;1228:6;1224:38;1312:6;1300:10;1297:22;1292:2;1280:10;1277:18;1274:46;1271:72;;;1323:18;;:::i;:::-;1359:2;1352:22;1409:18;;;1443:15;;;;-1:-1:-1;1485:11:65;;;1481:20;;;1513:19;;;1510:39;;;1545:1;1542;1535:12;1510:39;1569:11;;;;1589:159;1605:6;1600:3;1597:15;1589:159;;;1671:34;1701:3;1671:34;:::i;:::-;1659:47;;1622:12;;;;1726;;;;1589:159;;;1767:6;1757:16;;;;;;;;439:1340;;;;;:::o;2138:658::-;2309:2;2361:21;;;2431:13;;2334:18;;;2453:22;;;2280:4;;2309:2;2532:15;;;;2506:2;2491:18;;;2280:4;2575:195;2589:6;2586:1;2583:13;2575:195;;;2654:13;;-1:-1:-1;;;;;2650:39:65;2638:52;;2745:15;;;;2710:12;;;;2686:1;2604:9;2575:195;;;-1:-1:-1;2787:3:65;;2138:658;-1:-1:-1;;;;;;2138:658:65:o;2801:356::-;1625:1144:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"0x60806040523480156200001157600080fd5b5060043610620000935760003560e01c80638da5cb5b11620000625780638da5cb5b1462000137578063a9d140581462000149578063b5f8c36b1462000160578063f2fde38b146200017757600080fd5b80635878157614620000985780635c681d1e14620000d357806367e406d51462000103578063715018a6146200012b575b600080fd5b620000c07f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b620000ea620000e43660046200050a565b6200018e565b6040516001600160a01b039091168152602001620000ca565b620000ea7f000000000000000000000000000000000000000000000000000000000000000081565b62000135620001b9565b005b6000546001600160a01b0316620000ea565b620001356200015a36600462000557565b620001d1565b620000ea620001713660046200062a565b6200022d565b620001356200018836600462000657565b6200034c565b600181815481106200019f57600080fd5b6000918252602090912001546001600160a01b0316905081565b620001c3620003cf565b620001cf60006200042b565b565b620001db620003cf565b8051620001f09060019060208401906200047b565b507f53dcea6cd8a9fb42c53d0155aebceb09df1f90371ee9727c244f6557223bae16816040516200022291906200067c565b60405180910390a150565b60007f0000000000000000000000000000000000000000000000000000000000000000846001857f000000000000000000000000000000000000000000000000000000000000000086620002896000546001600160a01b031690565b6040516200029790620004e5565b620002a9979695949392919062000716565b604051809103906000f080158015620002c6573d6000803e3d6000fd5b509050826001600160a01b038216337f5e826bc8ad243559fc75cc77b0e474a2ec85df26aeb5cd6db9d9ed1740f39afa7f00000000000000000000000000000000000000000000000000000000000000006200032a6000546001600160a01b031690565b60016040516200033d9392919062000769565b60405180910390a49392505050565b62000356620003cf565b6001600160a01b038116620003c15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b620003cc816200042b565b50565b6000546001600160a01b03163314620001cf5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620003b8565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054828255906000526020600020908101928215620004d3579160200282015b82811115620004d357825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200049c565b50620004e1929150620004f3565b5090565b61189b806200079f83390190565b5b80821115620004e15760008155600101620004f4565b6000602082840312156200051d57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b80356001600160a01b03811681146200055257600080fd5b919050565b600060208083850312156200056b57600080fd5b823567ffffffffffffffff808211156200058457600080fd5b818501915085601f8301126200059957600080fd5b813581811115620005ae57620005ae62000524565b8060051b604051601f19603f83011681018181108582111715620005d657620005d662000524565b604052918252848201925083810185019188831115620005f557600080fd5b938501935b828510156200061e576200060e856200053a565b84529385019392850192620005fa565b98975050505050505050565b6000806000606084860312156200064057600080fd5b505081359360208301359350604090920135919050565b6000602082840312156200066a57600080fd5b62000675826200053a565b9392505050565b6020808252825182820181905260009190848201906040850190845b81811015620006bf5783516001600160a01b03168352928401929184019160010162000698565b50909695505050505050565b6000815480845260208085019450836000528060002060005b838110156200070b5781546001600160a01b031687529582019560019182019101620006e4565b509495945050505050565b600060018060a01b03808a16835288602084015260e060408401526200074060e0840189620006cb565b91508660608401528560808401528460a084015280841660c08401525098975050505050505050565b8381526001600160a01b03831660208201526060604082018190526000906200079590830184620006cb565b9594505050505056fe6101406040523480156200001257600080fd5b506040516200189b3803806200189b833981016040819052620000359162000422565b6012878786868987620000483362000263565b8381116200009d5760405162461bcd60e51b815260206004820152601d60248201527f4d617820616765206e6f742061626f7665206c6f636b2077696e646f7700000060448201526064015b60405180910390fd5b60008311620000ef5760405162461bcd60e51b815260206004820152601960248201527f4d61782074726176657273616c206d757374206265203e203000000000000000604482015260640162000094565b608084905260a083905260c081905260005b82518110156200014f576200013a83828151811062000124576200012462000546565b60200260200101516001620002b360201b60201c565b8062000146816200055c565b91505062000101565b5060405184907f7232430c38d2db810b464dc9cd004f0e41528c6ba2eb1e2e4e3220ffd3a83a1b90600090a260405183907f9955b343f0b35bf4c2045c06550a8ec2d914db72d497a1430ca3526a248f20a590600090a260405181907f6777d8e4257e9f6a86d2f91b2b9fceaeb931d8b35249fbb63203c2dc0c08187090600090a25050506001600160a01b03831660e08190526101008390526040518392507f352ffb84cbc39305b8921ad0af26cbf5ecd6bb8034fe313ce472d107f5650f6290600090a3505060ff81166101208190526040517f4e500e16c773a18df7642e2d86cfe357eab156473b38c34df4e15dffb895072690600090a250620002568162000263565b5050505050505062000584565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620002bd62000383565b6001600160a01b03821660009081526002602052604090205481151560ff9091161515036200032f5760405162461bcd60e51b815260206004820152601460248201527f556e6c6f636b6572206e6f74206368616e676564000000000000000000000000604482015260640162000094565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b6000546001600160a01b03163314620003df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000094565b565b6001600160a01b0381168114620003f757600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b80516200041d81620003e1565b919050565b600080600080600080600060e0888a0312156200043e57600080fd5b87516200044b81620003e1565b60208981015160408b01519299509750906001600160401b03808211156200047257600080fd5b818b0191508b601f8301126200048757600080fd5b8151818111156200049c576200049c620003fa565b8060051b604051601f19603f83011681018181108582111715620004c457620004c4620003fa565b60405291825284820192508381018501918e831115620004e357600080fd5b938501935b828510156200050c57620004fc8562000410565b84529385019392850192620004e8565b809a50505050505050606088015193506080880151925060a088015191506200053860c0890162000410565b905092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b6000600182016200057d57634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e0516101005161012051611288620006136000396000818161024f01528181610684015281816108b10152610b040152600081816101c001526105850152600081816102df01526105ba0152600081816103230152610d030152600081816103d701526104b10152600081816102980152818161047e0152610a8e01526112886000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063715018a6116100de578063a5c38b3d11610097578063d6565a2d11610071578063d6565a2d1461042a578063f2fde38b1461043d578063f6e1d17a14610450578063feaf968c1461046357600080fd5b8063a5c38b3d146103fb578063cb53b08d14610404578063d3fff0f61461041757600080fd5b8063715018a6146103475780637292eb691461034f5780638205bf6a146103725780638da5cb5b1461037a5780639a6fc8f51461038b578063a3c04476146103d557600080fd5b806332c6534b1161014b57806350d25bcd1161012557806350d25bcd146102d257806363a890a5146102da5780636666d37214610319578063687043c51461032157600080fd5b806332c6534b146102835780633376f53a146102965780633d6ba578146102bc57600080fd5b80630125554b146101935780630cb0f4fa146101bb57806313862364146101f0578063172b09f9146101fa57806324a419f41461022d578063313ce5671461024a575b600080fd5b61019b61046b565b604080519384526020840192909252908201526060015b60405180910390f35b6101e27f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101b2565b6101f86104e0565b005b61021d610208366004610e8d565b60026020526000908152604090205460ff1681565b60405190151581526020016101b2565b610235610576565b604080519283526020830191909152016101b2565b6102717f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016101b2565b61021d610291366004610ea8565b61064a565b7f00000000000000000000000000000000000000000000000000000000000000006101e2565b6102356102ca366004610ed2565b506000908190565b6101e261066d565b6103017f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101b2565b6101f86106ae565b7f00000000000000000000000000000000000000000000000000000000000000006101e2565b6101f86107d7565b6103576107eb565b604080518251815260209283015192810192909252016101b2565b6101e2610871565b6000546001600160a01b0316610301565b61039e610399366004610eeb565b610884565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a0016101b2565b7f00000000000000000000000000000000000000000000000000000000000000006101e2565b6101e260015481565b61019b610412366004610f17565b6108e8565b6101f8610425366004610f39565b610910565b610235610438366004610ed2565b6109d3565b6101f861044b366004610e8d565b610a01565b61023561045e366004610ed2565b610a7a565b61039e610ad4565b60008060006104d56104af6001546104a07f000000000000000000000000000000000000000000000000000000000000000090565b6104aa9042610f8b565b610b3c565b7f00000000000000000000000000000000000000000000000000000000000000006108e8565b925092509250909192565b6104ec3360015461064a565b61053d5760405162461bcd60e51b815260206004820152601d60248201527f436f6e74726f6c6c657220626c6f636b65643a2063616e556e6c6f636b00000060448201526064015b60405180910390fd5b6105456106ae565b4260018190556040517f3ee2ed8fd57cf3bdf05ef91fbe207825c00ef41e2303a859c67a84cd46cd69aa90600090a2565b6040516396834ad360e01b81527f00000000000000000000000000000000000000000000000000000000000000006004820152600090819081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906396834ad390602401608060405180830381865afa158015610601573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106259190610fc8565b905061063c816000015160070b8260400151610b54565b816060015192509250509091565b6001600160a01b03821660009081526002602052604090205460ff165b92915050565b60008061067861046b565b505090506106a88160127f0000000000000000000000000000000000000000000000000000000000000000610b8c565b91505090565b6000806106b9610576565b6040805180820190915282815260208101829052919350915060008290036106e057505050565b60035480158015906107235750602082015160036106ff600184610f8b565b8154811061070f5761070f611058565b906000526020600020906002020160010154145b1561072e5750505050565b60038054600181018255600091909152825160029091027fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b810182905560208401517fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c9091018190556040517ff500358c8d5c04faf9e5b933d49e928da38afad4ff748ca6cd85428485caa508906107c99085815260200190565b60405180910390a350505050565b6107df610bfd565b6107e96000610c57565b565b604080518082019091526000808252602082015260035415610859576003805461081790600190610f8b565b8154811061082757610827611058565b906000526020600020906002020160405180604001604052908160008201548152602001600182015481525050905090565b50604080518082019091526000808252602082015290565b60008061087c61046b565b509392505050565b60008060008060008060006108a48869ffffffffffffffffffff16610a7a565b91509150876108d58360127f0000000000000000000000000000000000000000000000000000000000000000610b8c565b9099909891975087965090945092505050565b6000806000806108f88686610ca7565b80516020909101519097909650600195509350505050565b610918610bfd565b6001600160a01b03821660009081526002602052604090205481151560ff90911615150361097f5760405162461bcd60e51b8152602060048201526014602482015273155b9b1bd8dad95c881b9bdd0818da185b99d95960621b6044820152606401610534565b6001600160a01b038216600081815260026020526040808220805460ff191685151590811790915590519092917f60209f49f531418079ff149eb1d71f100566dcaba03bf5a34930e08111df20c491a35050565b600381815481106109e357600080fd5b60009182526020909120600290910201805460019091015490915082565b610a09610bfd565b6001600160a01b038116610a6e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610534565b610a7781610c57565b50565b6001546000908190819081908190610ab2907f00000000000000000000000000000000000000000000000000000000000000006104a0565b9050808211610ac657509094909350915050565b506000958695509350505050565b600080600080600080600080610ae861046b565b9250925092506000610af982610d47565b905080610b288560127f0000000000000000000000000000000000000000000000000000000000000000610b8c565b909a90995092975087965094509092505050565b6000818311610b4b5781610b4d565b825b9392505050565b6000808260030b13610b7b57610b7483610b6d8461106e565b6012610b8c565b9050610667565b610b74836000610b8c856012611091565b60008160ff168360ff1603610ba2575082610b4d565b8160ff168360ff161015610bd657610bba83836110aa565b610bc590600a6111a7565b610bcf90856111b6565b9050610b4d565b610be082846110aa565b610beb90600a6111a7565b610bf590856111e6565b949350505050565b6000546001600160a01b031633146107e95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610534565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040805180820190915260008082526020820152600080610cc6610576565b60408051808201909152828152602081018290529193509150858211610cf0579250610667915050565b6000610cfc8787610db6565b9050610d287f000000000000000000000000000000000000000000000000000000000000000042610f8b565b816020015110610d3d57935061066792505050565b5095945050505050565b600069ffffffffffffffffffff821115610db25760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203860448201526530206269747360d01b6064820152608401610534565b5090565b604080518082019091526000808252602082015260408051808201909152600080825260208201526003546000905b8482108015610df45750600081115b15610e675780610e0381611222565b91505060038181548110610e1957610e19611058565b600091825260209182902060408051808201909152600290920201805482526001015491810182905293508610610e5557829350505050610667565b81610e5f81611239565b925050610de5565b5090949350505050565b80356001600160a01b0381168114610e8857600080fd5b919050565b600060208284031215610e9f57600080fd5b610b4d82610e71565b60008060408385031215610ebb57600080fd5b610ec483610e71565b946020939093013593505050565b600060208284031215610ee457600080fd5b5035919050565b600060208284031215610efd57600080fd5b813569ffffffffffffffffffff81168114610b4d57600080fd5b60008060408385031215610f2a57600080fd5b50508035926020909101359150565b60008060408385031215610f4c57600080fd5b610f5583610e71565b915060208301358015158114610f6a57600080fd5b809150509250929050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561066757610667610f75565b805167ffffffffffffffff81168114610e8857600080fd5b8051600381900b8114610e8857600080fd5b600060808284031215610fda57600080fd5b6040516080810181811067ffffffffffffffff8211171561100b57634e487b7160e01b600052604160045260246000fd5b6040528251600781900b811461102057600080fd5b815261102e60208401610f9e565b602082015261103f60408401610fb6565b6040820152606083015160608201528091505092915050565b634e487b7160e01b600052603260045260246000fd5b60008160030b637fffffff19810361108857611088610f75565b60000392915050565b60ff818116838216019081111561066757610667610f75565b60ff828116828216039081111561066757610667610f75565b600181815b808511156110fe5781600019048211156110e4576110e4610f75565b808516156110f157918102915b93841c93908002906110c8565b509250929050565b60008261111557506001610667565b8161112257506000610667565b816001811461113857600281146111425761115e565b6001915050610667565b60ff84111561115357611153610f75565b50506001821b610667565b5060208310610133831016604e8410600b8410161715611181575081810a610667565b61118b83836110c3565b806000190482111561119f5761119f610f75565b029392505050565b6000610b4d60ff841683611106565b80820260008212600160ff1b841416156111d2576111d2610f75565b818105831482151761066757610667610f75565b60008261120357634e487b7160e01b600052601260045260246000fd5b600160ff1b82146000198414161561121d5761121d610f75565b500590565b60008161123157611231610f75565b506000190190565b60006001820161124b5761124b610f75565b506001019056fea2646970667358221220662f7349fbc887eb9f161c891dd25d33d52ca8972b31ab24bae686207dea5a5b64736f6c63430008110033a2646970667358221220dfead5361a611dc3d5db7724f56838800d56fa4c22436670a9c438451b33be6664736f6c63430008110033","sourceMap":"1625:1144:50:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;464:38:45;;;;;;;;160:25:65;;;148:2;133:18;464:38:45;;;;;;;;508:33;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;545:32:65;;;527:51;;515:2;500:18;508:33:45;381:203:65;1684:27:50;;;;;1824:101:14;;;:::i;:::-;;1201:85;1247:7;1273:6;-1:-1:-1;;;;;1273:6:14;1201:85;;1398:188:45;;;;;;:::i;:::-;;:::i;2437:330:50:-;;;;;;:::i;:::-;;:::i;2074:198:14:-;;;;;;:::i;:::-;;:::i;508:33:45:-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;508:33:45;;-1:-1:-1;508:33:45;:::o;1824:101:14:-;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;1398:188:45:-;1094:13:14;:11;:13::i;:::-;1490:36:45;;::::1;::::0;:16:::1;::::0;:36:::1;::::0;::::1;::::0;::::1;:::i;:::-;;1541:38;1561:17;1541:38;;;;;;:::i;:::-;;;;;;;;1398:188:::0;:::o;2437:330:50:-;2528:12;2580:4;2586:11;2599:16;2617:10;2629:13;2644:6;2652:7;1247::14;1273:6;-1:-1:-1;;;;;1273:6:14;;1201:85;2652:7:50;2567:93;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2552:109:50;-1:-1:-1;2707:10:50;-1:-1:-1;;;;;2676:84:50;;2689:10;2676:84;2719:13;2734:7;1247::14;1273:6;-1:-1:-1;;;;;1273:6:14;;1201:85;2734:7:50;2743:16;2676:84;;;;;;;;:::i;:::-;;;;;;;;2437:330;;;;;:::o;2074:198:14:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:14;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:14;;5337:2:65;2154:73:14::1;::::0;::::1;5319:21:65::0;5376:2;5356:18;;;5349:30;5415:34;5395:18;;;5388:62;-1:-1:-1;;;5466:18:65;;;5459:36;5512:19;;2154:73:14::1;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;1359:130::-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:14;719:10:18;1422:23:14;1414:68;;;;-1:-1:-1;;;1414:68:14;;5744:2:65;1414:68:14;;;5726:21:65;;;5763:18;;;5756:30;5822:34;5802:18;;;5795:62;5874:18;;1414:68:14;5542:356:65;2426:187:14;2499:16;2518:6;;-1:-1:-1;;;;;2534:17:14;;;-1:-1:-1;;;;;;2534:17:14;;;;;;2566:40;;2518:6;;;;;;;2566:40;;2499:16;2566:40;2489:124;2426:187;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;196:180:65;255:6;308:2;296:9;287:7;283:23;279:32;276:52;;;324:1;321;314:12;276:52;-1:-1:-1;347:23:65;;196:180;-1:-1:-1;196:180:65:o;812:127::-;873:10;868:3;864:20;861:1;854:31;904:4;901:1;894:15;928:4;925:1;918:15;944:173;1012:20;;-1:-1:-1;;;;;1061:31:65;;1051:42;;1041:70;;1107:1;1104;1097:12;1041:70;944:173;;;:::o;1122:1121::-;1206:6;1237:2;1280;1268:9;1259:7;1255:23;1251:32;1248:52;;;1296:1;1293;1286:12;1248:52;1336:9;1323:23;1365:18;1406:2;1398:6;1395:14;1392:34;;;1422:1;1419;1412:12;1392:34;1460:6;1449:9;1445:22;1435:32;;1505:7;1498:4;1494:2;1490:13;1486:27;1476:55;;1527:1;1524;1517:12;1476:55;1563:2;1550:16;1585:2;1581;1578:10;1575:36;;;1591:18;;:::i;:::-;1637:2;1634:1;1630:10;1669:2;1663:9;1732:2;1728:7;1723:2;1719;1715:11;1711:25;1703:6;1699:38;1787:6;1775:10;1772:22;1767:2;1755:10;1752:18;1749:46;1746:72;;;1798:18;;:::i;:::-;1834:2;1827:22;1884:18;;;1918:15;;;;-1:-1:-1;1960:11:65;;;1956:20;;;1988:19;;;1985:39;;;2020:1;2017;2010:12;1985:39;2044:11;;;;2064:148;2080:6;2075:3;2072:15;2064:148;;;2146:23;2165:3;2146:23;:::i;:::-;2134:36;;2097:12;;;;2190;;;;2064:148;;;2231:6;1122:1121;-1:-1:-1;;;;;;;;1122:1121:65:o;2248:316::-;2325:6;2333;2341;2394:2;2382:9;2373:7;2369:23;2365:32;2362:52;;;2410:1;2407;2400:12;2362:52;-1:-1:-1;;2433:23:65;;;2503:2;2488:18;;2475:32;;-1:-1:-1;2554:2:65;2539:18;;;2526:32;;2248:316;-1:-1:-1;2248:316:65:o;2569:186::-;2628:6;2681:2;2669:9;2660:7;2656:23;2652:32;2649:52;;;2697:1;2694;2687:12;2649:52;2720:29;2739:9;2720:29;:::i;:::-;2710:39;2569:186;-1:-1:-1;;;2569:186:65:o;2760:658::-;2931:2;2983:21;;;3053:13;;2956:18;;;3075:22;;;2902:4;;2931:2;3154:15;;;;3128:2;3113:18;;;2902:4;3197:195;3211:6;3208:1;3205:13;3197:195;;;3276:13;;-1:-1:-1;;;;;3272:39:65;3260:52;;3367:15;;;;3332:12;;;;3308:1;3226:9;3197:195;;;-1:-1:-1;3409:3:65;;2760:658;-1:-1:-1;;;;;;2760:658:65:o;3423:495::-;3484:3;3522:5;3516:12;3549:6;3544:3;3537:19;3575:4;3604:2;3599:3;3595:12;3588:19;;3626:5;3623:1;3616:16;3668:2;3665:1;3655:16;3689:1;3699:194;3713:6;3710:1;3707:13;3699:194;;;3778:13;;-1:-1:-1;;;;;3774:39:65;3762:52;;3834:12;;;;3810:1;3869:14;;;;3728:9;3699:194;;;-1:-1:-1;3909:3:65;;3423:495;-1:-1:-1;;;;;3423:495:65:o;3923:768::-;4245:4;4291:1;4287;4282:3;4278:11;4274:19;4332:2;4324:6;4320:15;4309:9;4302:34;4372:6;4367:2;4356:9;4352:18;4345:34;4415:3;4410:2;4399:9;4395:18;4388:31;4436:65;4496:3;4485:9;4481:19;4473:6;4436:65;:::i;:::-;4428:73;;4537:6;4532:2;4521:9;4517:18;4510:34;4581:6;4575:3;4564:9;4560:19;4553:35;4625:6;4619:3;4608:9;4604:19;4597:35;4681:2;4673:6;4669:15;4663:3;4652:9;4648:19;4641:44;;3923:768;;;;;;;;;;:::o;4696:434::-;4910:25;;;-1:-1:-1;;;;;4971:32:65;;4966:2;4951:18;;4944:60;5040:2;5035;5020:18;;5013:30;;;-1:-1:-1;;5060:64:65;;5105:18;;5097:6;5060:64;:::i;:::-;5052:72;4696:434;-1:-1:-1;;;;;4696:434:65:o","linkReferences":{},"immutableReferences":{"45786":[{"start":158,"length":32},{"start":598,"length":32},{"start":760,"length":32}],"46386":[{"start":265,"length":32},{"start":561,"length":32}]}},"methodIdentifiers":{"MAX_TRAVERSAL()":"58781576","PYTH()":"67e406d5","create(bytes32,uint256,uint256)":"b5f8c36b","defaultUnlockers(uint256)":"5c681d1e","owner()":"8da5cb5b","renounceOwnership()":"715018a6","setDefaultUnlockers(address[])":"a9d14058","transferOwnership(address)":"f2fde38b"},"rawMetadata":"{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract IPyth\",\"name\":\"_pyth\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxTraversal\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_defaultUnlockers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"defaultUnlockers\",\"type\":\"address[]\"}],\"name\":\"DefaultUnlockersSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"deployer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oval\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"lockWindow\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"maxTraversal\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"unlockers\",\"type\":\"address[]\"}],\"name\":\"OvalDeployed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MAX_TRAVERSAL\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"PYTH\",\"outputs\":[{\"internalType\":\"contract IPyth\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"pythPriceId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"lockWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxAge\",\"type\":\"uint256\"}],\"name\":\"create\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"oval\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"defaultUnlockers\",\"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\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_defaultUnlockers\",\"type\":\"address[]\"}],\"name\":\"setDefaultUnlockers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This is the best factory for most use cases that need a Pyth source, but there are other variants that may be needed if different mutability or interface choices are desired.\",\"kind\":\"dev\",\"methods\":{\"create(bytes32,uint256,uint256)\":{\"params\":{\"lockWindow\":\"the lockWindow used for this Oval instance. This is the length of the window for the Oval auction to be run and, thus, the maximum time that prices will be delayed.\",\"maxAge\":\"max age of a price that is used in place of the current price. If the only available price is older than this, OEV is not captured and the current price is provided.\",\"pythPriceId\":\"the Pyth price id.\"},\"returns\":{\"oval\":\"deployed oval address.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setDefaultUnlockers(address[])\":{\"details\":\"This and the owner, itself, is the only mutable portion of this factory.\",\"params\":{\"_defaultUnlockers\":\"default unlockers that will be used to instantiate new Oval instances.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"StandardPythFactory is the recommended factory for use cases that want a Pyth source and Chainlink interface.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"create(bytes32,uint256,uint256)\":{\"notice\":\"Creates the Pyth Oval instance.\"},\"setDefaultUnlockers(address[])\":{\"notice\":\"Enables the owner to set the default unlockers that will be passed to all Oval instances created by this contract.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/factories/StandardPythFactory.sol\":\"StandardPythFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@chainlink/=lib/redstone-contracts/lib/@chainlink/\",\":@openzeppelin/contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/redstone-contracts/lib/openzeppelin-contracts/contracts/\",\":@redstone-finance/evm-connector/contracts/=lib/redstone-contracts/src/evm-connector/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":openzeppelin/=lib/openzeppelin-contracts/contracts/\",\":redstone-contracts/=lib/redstone-contracts/src/\",\":redstone-oracle/=lib/redstone-contracts/src/\"]},\"sources\":{\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32\",\"dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"lib/openzeppelin-contracts/contracts/utils/math/Math.sol\":{\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c\",\"dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278\",\"dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH\"]},\"src/DiamondRootOval.sol\":{\"keccak256\":\"0x54d2c3c6650a988ae636faa36e296fbf075ab5886da4a3ec9014de99512c2ee1\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://30a6f48795c2a1db3be66a80d829ebf34d2cc6bc5b7e1b0a434677cfe98221fc\",\"dweb:/ipfs/QmVoBdWELzb5AMKig5KjCisLbmFean2atNGenTbmLjqMpL\"]},\"src/Oval.sol\":{\"keccak256\":\"0x3920c6f066449678694d0587f57495a7e739682ea6da4748de26aa4c655d4bdf\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://630c2229a316b5885d4e06b6f6de8c6a0d220daf07a5c24fa225c2e2396e3449\",\"dweb:/ipfs/QmXpnDzxLU1aVCqkeeoQXsJ25KDC5qJ1WcwPXBbbXaoNxM\"]},\"src/adapters/destination-adapters/ChainlinkDestinationAdapter.sol\":{\"keccak256\":\"0xd66cb1a0c51f8c298dab85552a5156747646d31dbe66b0ce9184f05f3adee56b\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://274135de35a3f423e49ea0bbb7aeb5fd355b3bbabb2f304deb39b6022df1c7d0\",\"dweb:/ipfs/QmZkdjkTp7GLmZTuaw7bcU3zd8oSvhkdYYxssqCRMgZDnE\"]},\"src/adapters/lib/DecimalLib.sol\":{\"keccak256\":\"0x970a20a667780e91fb80ba79005863c73421cdf730ba2303e650e63d9099cde2\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://96013c450945da6d71128267f38754a07bb62223a0c07ef84925fa84636441f2\",\"dweb:/ipfs/QmSZsc8Epuan7zuQCYBcirjZ63zHwcGicfV75rRPfFrixT\"]},\"src/adapters/source-adapters/PythSourceAdapter.sol\":{\"keccak256\":\"0xf1550a5f57ce3e18fa20ee3e551c2fd16aa4f1c3e445162fafc3358e2848f338\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://abf2e0dee9eb6796ae8fd344b39c1d5ce4a34d32b299e2a61a77492a2e26e132\",\"dweb:/ipfs/QmZBRYhJRPPov6jz39KBC3FfaZtmh3Row1fNccMhYknNcT\"]},\"src/adapters/source-adapters/SnapshotSource.sol\":{\"keccak256\":\"0x3217090f4062ecd483d1bf5f19b371a77fe84efcb87f1802243ddaf9566083d5\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://0bb20aa74b0e273225d0c12eef1827d397e703da6ba6c23669cb0a1b028fef5e\",\"dweb:/ipfs/QmRRXvPndL4ANHgjVWKAMTjMfqxeVCZuiuuUkn8qh2bpFP\"]},\"src/controllers/MutableUnlockersController.sol\":{\"keccak256\":\"0x32e43c4a5e3abaa488a3758333f78fa6e166ca65a09ac76ca6b7e645d7863d16\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://b632392a02f26de3824929fb6e2dcfe8cc84689a489b12ba45bfd0ef4d93661f\",\"dweb:/ipfs/QmcMrnNCrM1YXBqj17HZicDvVe4fGnj66LFis6p9Gro5ob\"]},\"src/factories/BaseFactory.sol\":{\"keccak256\":\"0x94670505d6e89c9cd1cef18dfce0e65f36a97c693e5c2ed9a4f81fd0c94b26e6\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://6480e1d133f5abbe5641bc35c85a34dddf1979e68b35ee532e014fae860c4f19\",\"dweb:/ipfs/QmNsjcvQ5mnpjHnRMokhUMcYCbcYqDbJG6426CN6j5EoAq\"]},\"src/factories/StandardPythFactory.sol\":{\"keccak256\":\"0x6f660f7b847e9bad762cbca398703dc91a4b4765b70679e5b0e93dabea0b01dd\",\"license\":\"BUSL-1.1\",\"urls\":[\"bzz-raw://12fb98634a4e818bb8ebce8af71811a5561842a9e48ccd85f749cd481c0b335d\",\"dweb:/ipfs/QmPMbnsrxKYNVsThNve79mnjFRzn816Qz1Y3TYorwkAUcY\"]},\"src/interfaces/IBaseController.sol\":{\"keccak256\":\"0x8fe524fac0b04c8415e814b1dfb1ca28d303c8de65df22c268dc1d5f4e74a9d5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b69c11d3e90c65202e184de1ece928269ccd49e82aeec1aab1d489e92d3ea5cc\",\"dweb:/ipfs/QmYNoffB6UhJXTaKVwcxH4zzZgAVv3x3vacrVMQxmnHVju\"]},\"src/interfaces/IBaseOracleAdapter.sol\":{\"keccak256\":\"0x9c4c3727631ccc8ad4d202a1b7faf8833fae0d93d0a7fca45de009ab8f7ecab9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4b904def3696b12cbef6997b34e2bb4c8aef6af52bb640840040b6b59b25f0be\",\"dweb:/ipfs/QmfReXd9EmWRDFjs2SLdn6YUqyVH9RMxCjvzPnjLDYxuQP\"]},\"src/interfaces/IOval.sol\":{\"keccak256\":\"0x8511408e4da9818a36531a464a42f99461ce38419def87f35c52c58fe4d4f6aa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://501d19f2a3bcadaa8095c5808bfae348d8ebe78b34084115ee635c1ad101c953\",\"dweb:/ipfs/QmRqkEjEE9ydGrMCTJttjq6harZytTZDa8AQ2NriVU1A2H\"]},\"src/interfaces/chainlink/IAggregatorV3.sol\":{\"keccak256\":\"0xb4d26247f867a5a5614638bdee251e29b73eddc61c4b9f04f8af2d88e2f4e05d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0628c9b3a05410dee47e48ee68c2e3004b0c977c9942149a9206be7795d033d1\",\"dweb:/ipfs/QmdSGsY55cMx3CKQJ3huz9P54XVfKWnHLxQsoqweve2Z8G\"]},\"src/interfaces/chainlink/IAggregatorV3Source.sol\":{\"keccak256\":\"0xace678af82f9ae630210cc7b85cb8759b89b3d7280525ebbcb78aa7c33f5c79f\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://63e72db0effebba1b9048614c1ba8e72018957dddff712be2d3a2893229e210e\",\"dweb:/ipfs/QmNLqP4G5ujrZdt2rVTrXpLHuqRUR1hugxQzbNmGReLQtZ\"]},\"src/interfaces/pyth/IPyth.sol\":{\"keccak256\":\"0xd875a50c93c26dcc5cf034ac231806129796ff7db0fb3474da16b5217cad9c54\",\"urls\":[\"bzz-raw://58045931882a6c876897dd6253f8fc87fb651d04c790bd9641116e2aba8ba26e\",\"dweb:/ipfs/QmbWR6JVdkXsKTueQAca1wur7mQNLf8vDspM1bkYNc5zMv\"]}},\"version\":1}","metadata":{"compiler":{"version":"0.8.17+commit.8df45f5f"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"contract IPyth","name":"_pyth","type":"address"},{"internalType":"uint256","name":"_maxTraversal","type":"uint256"},{"internalType":"address[]","name":"_defaultUnlockers","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address[]","name":"defaultUnlockers","type":"address[]","indexed":false}],"type":"event","name":"DefaultUnlockersSet","anonymous":false},{"inputs":[{"internalType":"address","name":"deployer","type":"address","indexed":true},{"internalType":"address","name":"oval","type":"address","indexed":true},{"internalType":"uint256","name":"lockWindow","type":"uint256","indexed":true},{"internalType":"uint256","name":"maxTraversal","type":"uint256","indexed":false},{"internalType":"address","name":"owner","type":"address","indexed":false},{"internalType":"address[]","name":"unlockers","type":"address[]","indexed":false}],"type":"event","name":"OvalDeployed","anonymous":false},{"inputs":[{"internalType":"address","name":"previousOwner","type":"address","indexed":true},{"internalType":"address","name":"newOwner","type":"address","indexed":true}],"type":"event","name":"OwnershipTransferred","anonymous":false},{"inputs":[],"stateMutability":"view","type":"function","name":"MAX_TRAVERSAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"PYTH","outputs":[{"internalType":"contract IPyth","name":"","type":"address"}]},{"inputs":[{"internalType":"bytes32","name":"pythPriceId","type":"bytes32"},{"internalType":"uint256","name":"lockWindow","type":"uint256"},{"internalType":"uint256","name":"maxAge","type":"uint256"}],"stateMutability":"nonpayable","type":"function","name":"create","outputs":[{"internalType":"address","name":"oval","type":"address"}]},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function","name":"defaultUnlockers","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"view","type":"function","name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}]},{"inputs":[],"stateMutability":"nonpayable","type":"function","name":"renounceOwnership"},{"inputs":[{"internalType":"address[]","name":"_defaultUnlockers","type":"address[]"}],"stateMutability":"nonpayable","type":"function","name":"setDefaultUnlockers"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"stateMutability":"nonpayable","type":"function","name":"transferOwnership"}],"devdoc":{"kind":"dev","methods":{"create(bytes32,uint256,uint256)":{"params":{"lockWindow":"the lockWindow used for this Oval instance. This is the length of the window for the Oval auction to be run and, thus, the maximum time that prices will be delayed.","maxAge":"max age of a price that is used in place of the current price. If the only available price is older than this, OEV is not captured and the current price is provided.","pythPriceId":"the Pyth price id."},"returns":{"oval":"deployed oval address."}},"owner()":{"details":"Returns the address of the current owner."},"renounceOwnership()":{"details":"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner."},"setDefaultUnlockers(address[])":{"details":"This and the owner, itself, is the only mutable portion of this factory.","params":{"_defaultUnlockers":"default unlockers that will be used to instantiate new Oval instances."}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"version":1},"userdoc":{"kind":"user","methods":{"create(bytes32,uint256,uint256)":{"notice":"Creates the Pyth Oval instance."},"setDefaultUnlockers(address[])":{"notice":"Enables the owner to set the default unlockers that will be passed to all Oval instances created by this contract."}},"version":1}},"settings":{"remappings":["@chainlink/=lib/redstone-contracts/lib/@chainlink/","@openzeppelin/contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/redstone-contracts/lib/openzeppelin-contracts/contracts/","@redstone-finance/evm-connector/contracts/=lib/redstone-contracts/src/evm-connector/","ds-test/=lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","openzeppelin-contracts-upgradeable/=lib/redstone-contracts/lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","openzeppelin/=lib/openzeppelin-contracts/contracts/","redstone-contracts/=lib/redstone-contracts/src/","redstone-oracle/=lib/redstone-contracts/src/"],"optimizer":{"enabled":true,"runs":200},"metadata":{"bytecodeHash":"ipfs"},"compilationTarget":{"src/factories/StandardPythFactory.sol":"StandardPythFactory"},"evmVersion":"london","libraries":{}},"sources":{"lib/openzeppelin-contracts/contracts/access/Ownable.sol":{"keccak256":"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218","urls":["bzz-raw://fc980984badf3984b6303b377711220e067722bbd6a135b24669ff5069ef9f32","dweb:/ipfs/QmPHXMSXj99XjSVM21YsY6aNtLLjLVXDbyN76J5HQYvvrz"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/Context.sol":{"keccak256":"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7","urls":["bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92","dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/Math.sol":{"keccak256":"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3","urls":["bzz-raw://cc8841b3cd48ad125e2f46323c8bad3aa0e88e399ec62acb9e57efa7e7c8058c","dweb:/ipfs/QmSqE4mXHA2BXW58deDbXE8MTcsL5JSKNDbm23sVQxRLPS"],"license":"MIT"},"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol":{"keccak256":"0x52a8cfb0f5239d11b457dcdd1b326992ef672714ca8da71a157255bddd13f3ad","urls":["bzz-raw://495145362c7ff1c9ca88c58bbbbcb412e3c2004406647412394486552ff6c278","dweb:/ipfs/QmNNCeng6d5eRPDn6tkWSQhjE39XWfQEfjA63rRwHmr1iH"],"license":"MIT"},"src/DiamondRootOval.sol":{"keccak256":"0x54d2c3c6650a988ae636faa36e296fbf075ab5886da4a3ec9014de99512c2ee1","urls":["bzz-raw://30a6f48795c2a1db3be66a80d829ebf34d2cc6bc5b7e1b0a434677cfe98221fc","dweb:/ipfs/QmVoBdWELzb5AMKig5KjCisLbmFean2atNGenTbmLjqMpL"],"license":"BUSL-1.1"},"src/Oval.sol":{"keccak256":"0x3920c6f066449678694d0587f57495a7e739682ea6da4748de26aa4c655d4bdf","urls":["bzz-raw://630c2229a316b5885d4e06b6f6de8c6a0d220daf07a5c24fa225c2e2396e3449","dweb:/ipfs/QmXpnDzxLU1aVCqkeeoQXsJ25KDC5qJ1WcwPXBbbXaoNxM"],"license":"BUSL-1.1"},"src/adapters/destination-adapters/ChainlinkDestinationAdapter.sol":{"keccak256":"0xd66cb1a0c51f8c298dab85552a5156747646d31dbe66b0ce9184f05f3adee56b","urls":["bzz-raw://274135de35a3f423e49ea0bbb7aeb5fd355b3bbabb2f304deb39b6022df1c7d0","dweb:/ipfs/QmZkdjkTp7GLmZTuaw7bcU3zd8oSvhkdYYxssqCRMgZDnE"],"license":"BUSL-1.1"},"src/adapters/lib/DecimalLib.sol":{"keccak256":"0x970a20a667780e91fb80ba79005863c73421cdf730ba2303e650e63d9099cde2","urls":["bzz-raw://96013c450945da6d71128267f38754a07bb62223a0c07ef84925fa84636441f2","dweb:/ipfs/QmSZsc8Epuan7zuQCYBcirjZ63zHwcGicfV75rRPfFrixT"],"license":"BUSL-1.1"},"src/adapters/source-adapters/PythSourceAdapter.sol":{"keccak256":"0xf1550a5f57ce3e18fa20ee3e551c2fd16aa4f1c3e445162fafc3358e2848f338","urls":["bzz-raw://abf2e0dee9eb6796ae8fd344b39c1d5ce4a34d32b299e2a61a77492a2e26e132","dweb:/ipfs/QmZBRYhJRPPov6jz39KBC3FfaZtmh3Row1fNccMhYknNcT"],"license":"BUSL-1.1"},"src/adapters/source-adapters/SnapshotSource.sol":{"keccak256":"0x3217090f4062ecd483d1bf5f19b371a77fe84efcb87f1802243ddaf9566083d5","urls":["bzz-raw://0bb20aa74b0e273225d0c12eef1827d397e703da6ba6c23669cb0a1b028fef5e","dweb:/ipfs/QmRRXvPndL4ANHgjVWKAMTjMfqxeVCZuiuuUkn8qh2bpFP"],"license":"BUSL-1.1"},"src/controllers/MutableUnlockersController.sol":{"keccak256":"0x32e43c4a5e3abaa488a3758333f78fa6e166ca65a09ac76ca6b7e645d7863d16","urls":["bzz-raw://b632392a02f26de3824929fb6e2dcfe8cc84689a489b12ba45bfd0ef4d93661f","dweb:/ipfs/QmcMrnNCrM1YXBqj17HZicDvVe4fGnj66LFis6p9Gro5ob"],"license":"BUSL-1.1"},"src/factories/BaseFactory.sol":{"keccak256":"0x94670505d6e89c9cd1cef18dfce0e65f36a97c693e5c2ed9a4f81fd0c94b26e6","urls":["bzz-raw://6480e1d133f5abbe5641bc35c85a34dddf1979e68b35ee532e014fae860c4f19","dweb:/ipfs/QmNsjcvQ5mnpjHnRMokhUMcYCbcYqDbJG6426CN6j5EoAq"],"license":"BUSL-1.1"},"src/factories/StandardPythFactory.sol":{"keccak256":"0x6f660f7b847e9bad762cbca398703dc91a4b4765b70679e5b0e93dabea0b01dd","urls":["bzz-raw://12fb98634a4e818bb8ebce8af71811a5561842a9e48ccd85f749cd481c0b335d","dweb:/ipfs/QmPMbnsrxKYNVsThNve79mnjFRzn816Qz1Y3TYorwkAUcY"],"license":"BUSL-1.1"},"src/interfaces/IBaseController.sol":{"keccak256":"0x8fe524fac0b04c8415e814b1dfb1ca28d303c8de65df22c268dc1d5f4e74a9d5","urls":["bzz-raw://b69c11d3e90c65202e184de1ece928269ccd49e82aeec1aab1d489e92d3ea5cc","dweb:/ipfs/QmYNoffB6UhJXTaKVwcxH4zzZgAVv3x3vacrVMQxmnHVju"],"license":"MIT"},"src/interfaces/IBaseOracleAdapter.sol":{"keccak256":"0x9c4c3727631ccc8ad4d202a1b7faf8833fae0d93d0a7fca45de009ab8f7ecab9","urls":["bzz-raw://4b904def3696b12cbef6997b34e2bb4c8aef6af52bb640840040b6b59b25f0be","dweb:/ipfs/QmfReXd9EmWRDFjs2SLdn6YUqyVH9RMxCjvzPnjLDYxuQP"],"license":"MIT"},"src/interfaces/IOval.sol":{"keccak256":"0x8511408e4da9818a36531a464a42f99461ce38419def87f35c52c58fe4d4f6aa","urls":["bzz-raw://501d19f2a3bcadaa8095c5808bfae348d8ebe78b34084115ee635c1ad101c953","dweb:/ipfs/QmRqkEjEE9ydGrMCTJttjq6harZytTZDa8AQ2NriVU1A2H"],"license":"MIT"},"src/interfaces/chainlink/IAggregatorV3.sol":{"keccak256":"0xb4d26247f867a5a5614638bdee251e29b73eddc61c4b9f04f8af2d88e2f4e05d","urls":["bzz-raw://0628c9b3a05410dee47e48ee68c2e3004b0c977c9942149a9206be7795d033d1","dweb:/ipfs/QmdSGsY55cMx3CKQJ3huz9P54XVfKWnHLxQsoqweve2Z8G"],"license":"MIT"},"src/interfaces/chainlink/IAggregatorV3Source.sol":{"keccak256":"0xace678af82f9ae630210cc7b85cb8759b89b3d7280525ebbcb78aa7c33f5c79f","urls":["bzz-raw://63e72db0effebba1b9048614c1ba8e72018957dddff712be2d3a2893229e210e","dweb:/ipfs/QmNLqP4G5ujrZdt2rVTrXpLHuqRUR1hugxQzbNmGReLQtZ"],"license":"MIT"},"src/interfaces/pyth/IPyth.sol":{"keccak256":"0xd875a50c93c26dcc5cf034ac231806129796ff7db0fb3474da16b5217cad9c54","urls":["bzz-raw://58045931882a6c876897dd6253f8fc87fb651d04c790bd9641116e2aba8ba26e","dweb:/ipfs/QmbWR6JVdkXsKTueQAca1wur7mQNLf8vDspM1bkYNc5zMv"],"license":null}},"version":1},"id":50} \ No newline at end of file diff --git a/src/abi/index.ts b/src/abi/index.ts deleted file mode 100644 index 1647d16..0000000 --- a/src/abi/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./Oval"; diff --git a/src/abi/oval.json b/src/abi/oval.json new file mode 100644 index 0000000..e8c4c06 --- /dev/null +++ b/src/abi/oval.json @@ -0,0 +1,623 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "chainlinkSource", + "type": "address" + }, + { + "internalType": "address", + "name": "chronicleSource", + "type": "address" + }, + { + "internalType": "address", + "name": "pythSource", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "pythPriceId", + "type": "bytes32" + }, + { + "internalType": "uint8", + "name": "decimals", + "type": "uint8" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint8", + "name": "decimals", + "type": "uint8" + } + ], + "name": "DecimalsSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "LatestValueUnlocked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "lockWindow", + "type": "uint256" + } + ], + "name": "LockWindowSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "maxTraversal", + "type": "uint256" + } + ], + "name": "MaxTraversalSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "snapshotIndex", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "int256", + "name": "answer", + "type": "int256" + } + ], + "name": "SnapshotTaken", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sourceOracle", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "pythPriceId", + "type": "bytes32" + } + ], + "name": "SourceSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sourceOracle", + "type": "address" + } + ], + "name": "SourceSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "sourceOracle", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint8", + "name": "sourceDecimals", + "type": "uint8" + } + ], + "name": "SourceSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "unlocker", + "type": "address" + }, + { + "indexed": true, + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "UnlockerSet", + "type": "event" + }, + { + "inputs": [], + "name": "BOUNDING_TOLERANCE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "CHAINLINK_SOURCE", + "outputs": [ + { + "internalType": "contract IAggregatorV3Source", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "CHRONICLE_SOURCE", + "outputs": [ + { + "internalType": "contract IMedian", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PYTH_PRICE_ID", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PYTH_SOURCE", + "outputs": [ + { + "internalType": "contract IPyth", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_lastUnlockTime", + "type": "uint256" + } + ], + "name": "canUnlock", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLatestSourceData", + "outputs": [ + { + "internalType": "int256", + "name": "answer", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "internalLatestData", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lastUnlockTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "latestAnswer", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "latestRoundData", + "outputs": [ + { + "internalType": "uint80", + "name": "", + "type": "uint80" + }, + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint80", + "name": "", + "type": "uint80" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "latestSnapshotData", + "outputs": [ + { + "components": [ + { + "internalType": "int256", + "name": "answer", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "internalType": "struct SnapshotSource.Snapshot", + "name": "", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "latestTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "lockWindow", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "maxTraversal", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newLockWindow", + "type": "uint256" + } + ], + "name": "setLockWindow", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newMaxTraversal", + "type": "uint256" + } + ], + "name": "setMaxTraversal", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "unlocker", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowed", + "type": "bool" + } + ], + "name": "setUnlocker", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "snapshotData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "snapshots", + "outputs": [ + { + "internalType": "int256", + "name": "answer", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxTraversal", + "type": "uint256" + } + ], + "name": "tryLatestDataAt", + "outputs": [ + { + "internalType": "int256", + "name": "", + "type": "int256" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unlockLatestValue", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "unlockers", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } +] \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 8111971..c6e79c8 100644 --- a/src/index.ts +++ b/src/index.ts @@ -34,6 +34,8 @@ import { isEthSendBundleParams, sendBundle, verifyBundleSignature, + getOvalRefundConfig, + OvalDiscovery } from "./lib"; const app = express(); @@ -45,11 +47,15 @@ app.use((req, res, next) => { }); const provider = getProvider(); -const { ovalConfigs } = env; +const { ovalConfigs, ovalConfigsShared } = env; // Initialize unlocker wallets for each Oval instance. -const keyManager = WalletManager.getInstance(); -keyManager.initialize(ovalConfigs); +const walletManager = WalletManager.getInstance(); +walletManager.initialize(provider, ovalConfigs, ovalConfigsShared); + +// Initialize Oval discovery +const ovalDiscovery = OvalDiscovery.getInstance(); +ovalDiscovery.initialize(provider); // Start restful API server to listen for root inbound post requests. app.post("/", async (req, res, next) => { @@ -67,8 +73,7 @@ app.post("/", async (req, res, next) => { // Get Oval header configs if present. const { ovalAddresses: headerOvalAddresses, errorMessage } = getOvalHeaderConfigs( - req.headers[OVAL_ADDRESSES_HEADER], - ovalConfigs, + req.headers[OVAL_ADDRESSES_HEADER] ); if (errorMessage) { await handleUnsupportedRequest(req, res, "Error parsing Oval header configs: " + errorMessage); @@ -122,7 +127,7 @@ app.post("/", async (req, res, next) => { { bodyIdx: 0, // Next line is dependent on all Oval addresses having the same refund address - percent: ovalConfigs[headerOvalAddresses[0]].refundPercent, + percent: getOvalRefundConfig(headerOvalAddresses[0]).refundPercent, }, ]; @@ -151,7 +156,7 @@ app.post("/", async (req, res, next) => { // costs exceed refund value. const adjustedRefundPercent = adjustRefundPercent( unlock.simulationResponse.coinbaseDiff, - ovalConfigs[unlock.ovalAddress].refundPercent, + getOvalRefundConfig(unlock.ovalAddress).refundPercent, ); if (adjustedRefundPercent <= 0) { Logger.debug(req.transactionId, `Insufficient builder payment ${unlock.simulationResponse.coinbaseDiff}`); @@ -167,7 +172,7 @@ app.post("/", async (req, res, next) => { // Construct the inner bundle with call to Oval to unlock the latest value. const unlockBundle = createUnlockLatestValueBundle( unlock.signedUnlockTx, - ovalConfigs[unlock.ovalAddress].refundAddress, + getOvalRefundConfig(unlock.ovalAddress).refundAddress, targetBlock, ); diff --git a/src/lib/bundleUtils.ts b/src/lib/bundleUtils.ts index 6000af7..63dcb68 100644 --- a/src/lib/bundleUtils.ts +++ b/src/lib/bundleUtils.ts @@ -1,25 +1,25 @@ import { Interface, Transaction, TransactionRequest, Wallet } from "ethers"; import express from "express"; import { FlashbotsBundleProvider } from "flashbots-ethers-v6-provider-bundle"; -import { WalletManager, getBaseFee, getMaxBlockByChainId, getProvider } from "./helpers"; +import { getBaseFee, getMaxBlockByChainId, getOvalAddresses, getOvalRefundConfig, getProvider, isOvalSharedUnlockerKey } from "./helpers"; +import { WalletManager } from "./walletManager"; import MevShareClient, { BundleParams } from "@flashbots/mev-share-client"; import { JSONRPCID, createJSONRPCSuccessResponse } from "json-rpc-2.0"; -import { ovalAbi } from "../abi"; import { env } from "./env"; import { Logger } from "./logging"; import { Refund } from "./types"; -const { ovalConfigs } = env; +import { Oval__factory, PermissionProxy__factory } from "../contract-types"; -export const ovalInterface = Interface.from(ovalAbi); +export const ovalInterface = Oval__factory.createInterface(); export const createUnlockLatestValueTx = async ( wallet: Wallet, baseFee: bigint, data: string, chainId: bigint, - ovalAddress: string, + target: string, ) => { const nonce = await wallet.getNonce(); @@ -27,7 +27,7 @@ export const createUnlockLatestValueTx = async ( const unlockTx: TransactionRequest = { type: 2, chainId, - to: ovalAddress, + to: target, nonce, value: 0, gasLimit: 200000, @@ -55,15 +55,24 @@ export const prepareUnlockTransaction = async ( simulate = true, ) => { const provider = getProvider(); - const unlockerWallet = WalletManager.getInstance().getWallet(ovalAddress, provider); const [baseFee, network] = await Promise.all([getBaseFee(provider, req), provider.getNetwork()]); - const data = ovalInterface.encodeFunctionData("unlockLatestValue"); + const unlockerWallet = WalletManager.getInstance().getWallet(ovalAddress, targetBlock, req.transactionId); + const isSharedWallet = isOvalSharedUnlockerKey(unlockerWallet.address); + + // Encode the unlockLatestValue function call depending on whether the unlocker is a shared wallet or not. + let data = ovalInterface.encodeFunctionData("unlockLatestValue"); + let target = ovalAddress; + if (isSharedWallet) { + target = env.permissionProxyAddress; + data = PermissionProxy__factory.createInterface().encodeFunctionData("execute", [ovalAddress, data]); + } + const { unlockTxHash, signedUnlockTx } = await createUnlockLatestValueTx( unlockerWallet, baseFee, data, network.chainId, - ovalAddress, + target, ); if (!simulate) return { ovalAddress, unlockTxHash, signedUnlockTx }; @@ -80,9 +89,9 @@ export const getUnlockBundlesFromOvalAddresses = async ( ovalAddresses: string[], req: express.Request, ) => { - const unlockBundles = []; - const unlockSignedTransactions = []; - const unlockTxHashes = []; + const unlockBundles: { bundle: BundleParams }[] = []; + const unlockSignedTransactions: string[] = []; + const unlockTxHashes: string[] = []; for (const ovalAddress of ovalAddresses) { const unlock = await prepareUnlockTransaction( flashbotsBundleProvider, @@ -96,7 +105,7 @@ export const getUnlockBundlesFromOvalAddresses = async ( // Construct the inner bundle with call to Oval to unlock the latest value. const unlockBundle = createUnlockLatestValueBundle( unlock.signedUnlockTx, - ovalConfigs[ovalAddress].refundAddress, + getOvalRefundConfig(ovalAddress).refundAddress, targetBlock, ); @@ -116,7 +125,7 @@ export const findUnlock = async ( req: express.Request, ) => { const unlocks = await Promise.all( - Object.keys(ovalConfigs).map(async (ovalAddress) => + getOvalAddresses().map(async (ovalAddress) => prepareUnlockTransaction(flashbotsBundleProvider, backrunTxs, targetBlock, ovalAddress, req), ), ); diff --git a/src/lib/constants.ts b/src/lib/constants.ts index d45b6d7..b7f578b 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -64,3 +64,5 @@ export const flashbotsSupportedNetworks: { export const FLASHBOTS_SIGNATURE_HEADER = "x-flashbots-signature"; export const OVAL_ADDRESSES_HEADER = "x-oval-addresses"; + +export const FACTORIES_GENESIS_BLOCK = 20268518; \ No newline at end of file diff --git a/src/lib/env.ts b/src/lib/env.ts index cd76060..9ac851c 100644 --- a/src/lib/env.ts +++ b/src/lib/env.ts @@ -1,8 +1,8 @@ import dotenv from "dotenv"; import { getAddress, parseEther } from "ethers"; import { MAINNET_CHAIN_ID, SEPOLIA_CHAIN_ID, fallback, supportedNetworks } from "./constants"; -import { getBoolean, getFloat, getInt, getOvalConfigs, getPrivateKey, getStringArray } from "./helpers"; -import { OvalConfigs } from "./types"; +import { getBoolean, getFloat, getInt, getOvalConfigs, getOvalConfigsShared, getPrivateKey, getStringArray } from "./helpers"; +import { OvalConfigs, OvalConfigsShared } from "./types"; dotenv.config({ path: ".env" }); function getEnvVar(varName: string, defaultValue?: string): string { @@ -38,6 +38,7 @@ type EnvironmentVariables = { chainId: number; providerUrl: string; ovalConfigs: OvalConfigs; + ovalConfigsShared: OvalConfigsShared; forwardUrl: string; builders: string[]; minNetBuilderPaymentWei: bigint; @@ -48,6 +49,15 @@ type EnvironmentVariables = { chainIdBlockOffsets: { [key: number]: number; }; + sharedWalletUsageCleanupInterval: number; + standardCoinbaseFactory: string; + standardChainlinkFactory: string; + standardChronicleFactory: string; + standardPythFactory: string; + permissionProxyAddress: string; + defaultRefundAddress: string; + defaultRefundPercent: number; + ovalDiscoveryInterval: number; }; export const env: EnvironmentVariables = { @@ -57,6 +67,7 @@ export const env: EnvironmentVariables = { chainId, providerUrl: getEnvVar("PROVIDER_URL"), ovalConfigs: getOvalConfigs(getEnvVar("OVAL_CONFIGS", stringifiedFallbackOvalConfigs)), + ovalConfigsShared: getOvalConfigsShared(getEnvVar("OVAL_CONFIGS_SHARED", "[]")), forwardUrl: getEnvVar("FORWARD_URL", fallback.forwardUrl), builders: getStringArray(getEnvVar("BUILDERS", JSON.stringify(fallback.builders))), minNetBuilderPaymentWei: parseEther(getEnvVar("MIN_NET_BUILDER_PAYMENT", fallback.minNetBuilderPayment)), @@ -69,4 +80,13 @@ export const env: EnvironmentVariables = { [MAINNET_CHAIN_ID]: getInt(getEnvVar("MAINNET_BLOCK_OFFSET", "0")), [SEPOLIA_CHAIN_ID]: getInt(getEnvVar("SEPOLIA_BLOCK_OFFSET", "24")), }, + sharedWalletUsageCleanupInterval: getInt(getEnvVar("SHARED_WALLET_USAGE_CLEANUP_INTERVAL", "60")), + ovalDiscoveryInterval: getInt(getEnvVar("OVAL_DISCOVERY_INTERVAL", "180")), + standardCoinbaseFactory: getAddress(getEnvVar("STANDARD_COINBASE_FACTORY", "0x0e3d2b8220C0f74A287B85690a8cfeE5b45C2D44")), + standardChainlinkFactory: getAddress(getEnvVar("STANDARD_CHAINLINK_FACTORY", "0x6d0cbebdeBc5060E6264fcC497d5A277B5748Cf9")), + standardChronicleFactory: getAddress(getEnvVar("STANDARD_CHRONICLE_FACTORY", "0xE0225B5224512868814D9b10A14F705d99Ba0EdF")), + standardPythFactory: getAddress(getEnvVar("STANDARD_PYTH_FACTORY", "0x53A2a7C0cBb76B20782C6842A25876C5377B64e8")), + permissionProxyAddress: getAddress(getEnvVar("PERMISSION_PROXY_ADDRESS", "0xb9b7584ea2f605182f73b8c63f116cb3f17086b5")), + defaultRefundAddress: getAddress(getEnvVar("DEFAULT_REFUND_ADDRESS", "0x9Cc5b1bc0E1970D44B5Adc7ba51d76a5DD375434")), + defaultRefundPercent: getFloat(getEnvVar("DEFAULT_REFUND_PERCENT", fallback.refundPercent)), }; \ No newline at end of file diff --git a/src/lib/events.ts b/src/lib/events.ts new file mode 100644 index 0000000..94ffe72 --- /dev/null +++ b/src/lib/events.ts @@ -0,0 +1,105 @@ +import { Promise } from "bluebird"; +import { BaseContract, Contract, ContractEventName, EventLog } from "ethers"; + +const defaultConcurrency = 200; +const maxRetries = 3; +const retrySleepTime = 10; + +function delay(s: number) { + return new Promise((resolve) => setTimeout(resolve, s * 1000)); +} +export interface EventSearchConfig { + fromBlock: number; + toBlock: number; + maxBlockLookBack?: number; + concurrency?: number; +} + +export async function paginatedEventQuery( + contract: Contract | BaseContract, + filter: ContractEventName, + searchConfig: EventSearchConfig, + retryCount = 0 +): Promise> { + // If the max block look back is set to 0 then we dont need to do any pagination and can query over the whole range. + if (searchConfig.maxBlockLookBack === 0) + return (await contract.queryFilter(filter, searchConfig.fromBlock, searchConfig.toBlock)) as Array; + + // Compute the number of queries needed. If there is no maxBlockLookBack set then we can execute the whole query in + // one go. Else, the number of queries is the range over which we are searching, divided by the maxBlockLookBack, + // rounded up. This gives us the number of queries we need to execute to traverse the whole block range. + const paginatedRanges = getPaginatedBlockRanges(searchConfig); + + try { + return ( + ( + await Promise.map(paginatedRanges, ([fromBlock, toBlock]) => contract.queryFilter(filter, fromBlock, toBlock), { + concurrency: typeof searchConfig.concurrency == "number" ? searchConfig.concurrency : defaultConcurrency, + }) + ) + .flat() + // Filter events by block number because ranges can include blocks that are outside the range specified for caching reasons. + .filter( + (event: any) => event?.blockNumber >= searchConfig.fromBlock && event.blockNumber <= searchConfig.toBlock + ) as Array + ); + } catch (error) { + if (retryCount < maxRetries) { + await delay(retrySleepTime); + return await paginatedEventQuery(contract, filter, searchConfig, retryCount + 1); + } else throw error; + } +} + +/** + * @dev Warning: this is a specialized function!! Its functionality is not obvious. + * This function attempts to return block ranges to repeat ranges as much as possible. To do so, it may include blocks that + * are outside the provided range. The guarantee is that it will always include _at least_ the blocks requested. + * @param eventSearchConfig contains fromBlock, toBlock, and maxBlockLookBack. + * The range is inclusive, so the results will include events in the fromBlock and in the toBlock. + * maxBlockLookback defined the maximum number of blocks to search. Because the range is inclusive, the maximum diff + * in the returned pairs is maxBlockLookBack - 1. This is a bit non-intuitive here, but this is meant so that this + * parameter more closely aligns with the more commonly understood definition of a max query range that node providers + * use. + * @returns an array of disjoint fromBlock, toBlock ranges that should be queried. These cover at least the entire + * input range, but can include blocks outside of the desired range, so results should be filtered. Results + * are ordered from smallest to largest. + */ +export function getPaginatedBlockRanges({ + fromBlock, + toBlock, + maxBlockLookBack, +}: EventSearchConfig): [number, number][] { + // If the maxBlockLookBack is undefined, we can look back as far as we like. Just return the entire range. + if (maxBlockLookBack === undefined) return [[fromBlock, toBlock]]; + + // If the fromBlock is > toBlock, then return no ranges. + if (fromBlock > toBlock) return []; + + // A maxBlockLookBack of 0 is not allowed. + if (maxBlockLookBack <= 0) throw new Error("Cannot set maxBlockLookBack <= 0"); + + // Floor the requestedFromBlock to the nearest smaller multiple of the maxBlockLookBack to enhance caching. + // This means that a range like 5 - 45 with a maxBlockLookBack of 20 would look like: + // 0-19, 20-39, 40-45. + // This allows us to get the max number of repeated node queries. The maximum number of "nonstandard" queries per + // call of this function is 1. + const flooredStartBlock = Math.floor(fromBlock / maxBlockLookBack) * maxBlockLookBack; + + // Note: range is inclusive, so we have to add one to the number of blocks to query. + const iterations = Math.ceil((toBlock + 1 - flooredStartBlock) / maxBlockLookBack); + + const ranges: [number, number][] = []; + for (let i = 0; i < iterations; i++) { + // Each inner range start is just a multiple of the maxBlockLookBack added to the start block. + const innerFromBlock = flooredStartBlock + maxBlockLookBack * i; + + // The innerFromBlock is just the max range from the innerFromBlock or the outer toBlock, whichever is smaller. + // The end block should never be larger than the outer toBlock. This is to avoid querying blocks that are in the + // future. + const innerToBlock = Math.min(innerFromBlock + maxBlockLookBack - 1, toBlock); + ranges.push([innerFromBlock, innerToBlock]); + } + + return ranges; +} diff --git a/src/lib/helpers.ts b/src/lib/helpers.ts index 96860b0..c67135f 100644 --- a/src/lib/helpers.ts +++ b/src/lib/helpers.ts @@ -13,11 +13,11 @@ import { import { Request } from "express"; import { FlashbotsBundleProvider } from "flashbots-ethers-v6-provider-bundle"; import { JSONRPCRequest } from "json-rpc-2.0"; +import { OvalDiscovery, WalletManager } from "./"; import { flashbotsSupportedNetworks, supportedNetworks } from "./constants"; import { env } from "./env"; import { Logger } from "./logging"; -import { OvalAddressConfigList, OvalConfig, OvalConfigs } from "./types"; -import { retrieveGckmsKey } from "./gckms"; +import { OvalAddressConfigList, OvalConfig, OvalConfigShared, OvalConfigs, OvalConfigsShared, RefundConfig } from "./types"; export function getProvider() { const network = new Network(supportedNetworks[env.chainId], env.chainId); @@ -176,14 +176,12 @@ function isOvalConfig(input: unknown): input is OvalConfig { typeof input === "object" && input !== null && !Array.isArray(input) && - ( - ("unlockerKey" in input && typeof input["unlockerKey"] === "string" && - ((!input["unlockerKey"].startsWith("0x") && isHexString("0x" + input["unlockerKey"], 32)) || - isHexString(input["unlockerKey"], 32)) && - !("gckmsKeyId" in input)) || - ("gckmsKeyId" in input && typeof input["gckmsKeyId"] === "string" && - !("unlockerKey" in input)) - ) && + (("unlockerKey" in input && + typeof input["unlockerKey"] === "string" && + ((!input["unlockerKey"].startsWith("0x") && isHexString("0x" + input["unlockerKey"], 32)) || + isHexString(input["unlockerKey"], 32)) && + !("gckmsKeyId" in input)) || + ("gckmsKeyId" in input && typeof input["gckmsKeyId"] === "string" && !("unlockerKey" in input))) && "refundAddress" in input && typeof input["refundAddress"] === "string" && isAddress(input["refundAddress"]) && @@ -204,7 +202,8 @@ function isOvalConfigs(input: unknown): input is OvalConfigs { Object.keys(input).length === new Set(Object.keys(input)).size && Object.keys(input).every((key) => isAddress(key)) && Object.values(input).every((value) => isOvalConfig(value)) && - Object.values(input).length === new Set(Object.values(input).map((value) => value.unlockerKey || value.gckmsKeyId)).size + Object.values(input).length === + new Set(Object.values(input).map((value) => value.unlockerKey || value.gckmsKeyId)).size ); } @@ -237,10 +236,70 @@ export function getOvalConfigs(input: string): OvalConfigs { throw new Error(`Value "${input}" is valid JSON but is not OvalConfigs records`); } +// Type guard for OvalConfigShared. +function isOvalConfigShared(input: unknown): input is OvalConfigShared { + return ( + typeof input === "object" && + input !== null && + !Array.isArray(input) && + ( + ("unlockerKey" in input && typeof input["unlockerKey"] === "string" && + ((!input["unlockerKey"].startsWith("0x") && isHexString("0x" + input["unlockerKey"], 32)) || + isHexString(input["unlockerKey"], 32)) && + !("gckmsKeyId" in input)) || + ("gckmsKeyId" in input && typeof input["gckmsKeyId"] === "string" && + !("unlockerKey" in input)) + ) + ); +} + +// Type guard for OvalConfigsShared. +function isOvalConfigsShared(input: unknown): input is OvalConfigsShared { + return ( + Array.isArray(input) && + input.every((value) => isOvalConfigShared(value)) && + input.length === new Set(input.map((value) => value.unlockerKey || value.gckmsKeyId)).size + ); +} + +export function getOvalConfigsShared(input: string): OvalConfigsShared { + let parsedInput: unknown; + + try { + parsedInput = JSON.parse(input); + } catch (error) { + throw new Error(`Value "${input}" cannot be converted to OvalConfigsShared records`); + } + + if (isOvalConfigsShared(parsedInput)) { + return parsedInput; + } + + throw new Error(`Value "${input}" is valid JSON but is not OvalConfigsShared records`); +} + +export const getOvalAddresses = (): string[] => { + const factoryInstances = OvalDiscovery.getInstance().getOvalFactoryInstances(); + return [...Object.keys(env.ovalConfigs), ...factoryInstances].map(getAddress); +}; + +export const isOvalSharedUnlockerKey = (unlockerKey: string): boolean => { + return WalletManager.getInstance().isOvalSharedUnlocker(unlockerKey); +}; + +export const getOvalRefundConfig = (ovalAddress: string): RefundConfig => { + if (env.ovalConfigs[ovalAddress]) { + return env.ovalConfigs[ovalAddress]; + } + return { + refundAddress: getAddress(env.defaultRefundAddress), + refundPercent: env.defaultRefundPercent, + }; +}; + // Get OvalAddressConfigList from the header string or throw an error if the header is invalid. export const getOvalHeaderConfigs = ( - header: string | string[] | undefined, - ovalConfigs: OvalConfigs, + header: string | string[] | undefined ): { errorMessage?: string; ovalAddresses: OvalAddressConfigList | undefined } => { if (!header) return { ovalAddresses: undefined }; if (typeof header !== "string") return { ovalAddresses: undefined }; @@ -251,10 +310,10 @@ export const getOvalHeaderConfigs = ( } // Normalise addresses and check if they are valid Oval instances. const normalisedAddresses = ovalAddresses.map(getAddress); - if (normalisedAddresses.some((ovalAddress) => !ovalConfigs[ovalAddress])) { + if (normalisedAddresses.some((ovalAddress) => !getOvalAddresses().includes(ovalAddress))) { throw new Error(`Some addresses in "${header}" are not valid Oval instances`); } - const uniqueRefundAddresses = new Set(normalisedAddresses.map((address) => ovalConfigs[address].refundAddress)); + const uniqueRefundAddresses = new Set(normalisedAddresses.map((address) => getOvalRefundConfig(address).refundAddress)); if (uniqueRefundAddresses.size > 1) { throw new Error(`Value "${header}" only supports a single refund address`); } @@ -283,8 +342,23 @@ export function verifyBundleSignature( return null; } - const bundleSignaturePublicKey = xFlashbotsSignatureHeader.split(":")[0]; - const bundleSignedMessage = xFlashbotsSignatureHeader.split(":")[1]; + const xFlashbotsSignatureHeaderParts = xFlashbotsSignatureHeader.split(":"); + if (xFlashbotsSignatureHeaderParts.length !== 2) { + Logger.debug( + req.transactionId, + `Invalid signature header: ${xFlashbotsSignatureHeader}, expected address and signature separated by a colon`, + ); + return null; + } + + const bundleSignaturePublicKey = xFlashbotsSignatureHeaderParts[0]; + if (!isAddress(bundleSignaturePublicKey)) { + Logger.debug(req.transactionId, `Invalid signature header: ${xFlashbotsSignatureHeader}, expected valid address`); + return null; + } + const bundleSignatureAddress = getAddress(bundleSignaturePublicKey); + + const bundleSignedMessage = xFlashbotsSignatureHeaderParts[1]; const serializedBody = JSON.stringify(body); @@ -292,7 +366,7 @@ export function verifyBundleSignature( const recoveredAddress = ethers.verifyMessage(hash, bundleSignedMessage); - const verified = recoveredAddress === bundleSignaturePublicKey; + const verified = recoveredAddress === bundleSignatureAddress; return verified ? recoveredAddress : null; } @@ -310,40 +384,7 @@ export function getMaxBlockByChainId(chainId: number, targetBlock: number) { // In mainnet this is always the targetBlock, but in Goerli we add 24 blocks to the targetBlock. return targetBlock + env.chainIdBlockOffsets[chainId]; } -export class WalletManager { - private static instance: WalletManager; - private wallets: Record = {}; - - private constructor() { } - - public static getInstance(): WalletManager { - if (!WalletManager.instance) { - WalletManager.instance = new WalletManager(); - } - return WalletManager.instance; - } - public async initialize(ovalConfigs: OvalConfigs) { - // Oval Config addresses are already checksummed. - for (const [address, config] of Object.entries(ovalConfigs)) { - if (config.unlockerKey) { - this.wallets[address] = new Wallet(config.unlockerKey); - } else if (config.gckmsKeyId) { - const gckmsKey = await retrieveGckmsKey({ - ...JSON.parse(env.gckmsConfig), - cryptoKeyId: config.gckmsKeyId, - ciphertextFilename: `${config.gckmsKeyId}.enc`, - }); - this.wallets[address] = new Wallet(gckmsKey); - } - } - } - - public getWallet(address: string, provider: JsonRpcProvider): Wallet { - const checkSummedAddress = getAddress(address); - if (!this.wallets[checkSummedAddress]) { - throw new Error(`No unlocker key or GCKMS key ID found for Oval address ${address}`); - } - return this.wallets[checkSummedAddress].connect(provider); - } -} \ No newline at end of file +export function isMochaTest() { + return typeof global.it === 'function'; +} diff --git a/src/lib/index.ts b/src/lib/index.ts index b20bd8f..dc6c586 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -4,3 +4,5 @@ export * from "./types"; export * from "./logging"; export * from "./bundleUtils"; export * from "./constants"; +export * from "./walletManager"; +export * from "./ovalDiscovery"; diff --git a/src/lib/ovalDiscovery.ts b/src/lib/ovalDiscovery.ts new file mode 100644 index 0000000..b420988 --- /dev/null +++ b/src/lib/ovalDiscovery.ts @@ -0,0 +1,111 @@ +import { EventLog, JsonRpcProvider, getAddress } from "ethers"; +import { env } from "./env"; +import { EventSearchConfig, paginatedEventQuery } from "./events"; + +import { StandardCoinbaseFactory } from "../contract-types/StandardCoinbaseFactory"; +import { StandardCoinbaseFactory__factory } from "../contract-types/factories/StandardCoinbaseFactory__factory"; + +import { StandardChainlinkFactory } from "../contract-types/StandardChainlinkFactory"; +import { StandardChainlinkFactory__factory } from "../contract-types/factories/StandardChainlinkFactory__factory"; + +import { StandardChronicleFactory } from "../contract-types/StandardChronicleFactory"; +import { StandardChronicleFactory__factory } from "../contract-types/factories/StandardChronicleFactory__factory"; + +import { StandardPythFactory } from "../contract-types/StandardPythFactory"; +import { StandardPythFactory__factory } from "../contract-types/factories/StandardPythFactory__factory"; +import { FACTORIES_GENESIS_BLOCK } from "./constants"; +import { Logger } from "./"; + +// Singleton class to discover Oval instances +export class OvalDiscovery { + private static instance: OvalDiscovery; + private provider: JsonRpcProvider | undefined; + private standardCoinbaseFactory: StandardCoinbaseFactory; + private standardChainlinkFactory: StandardChainlinkFactory; + private standardChronicleFactory: StandardChronicleFactory; + private standardPythFactory: StandardPythFactory; + private ovalInstances: Set = new Set(); + + private constructor() { + this.standardCoinbaseFactory = StandardCoinbaseFactory__factory.connect(env.standardCoinbaseFactory); + this.standardChainlinkFactory = StandardChainlinkFactory__factory.connect(env.standardChainlinkFactory); + this.standardChronicleFactory = StandardChronicleFactory__factory.connect(env.standardChronicleFactory); + this.standardPythFactory = StandardPythFactory__factory.connect(env.standardPythFactory); + } + + // Singleton pattern to get an instance of OvalDiscovery + public static getInstance(): OvalDiscovery { + if (!OvalDiscovery.instance) { + OvalDiscovery.instance = new OvalDiscovery(); + } + return OvalDiscovery.instance; + } + + public async initialize(provider: JsonRpcProvider) { + if (this.provider) return; + this.provider = provider; + Logger.debug("OvalDiscovery", `Updating instances from factories genesis block (${FACTORIES_GENESIS_BLOCK})`); + this.updateInstances(FACTORIES_GENESIS_BLOCK); + } + + // Updates the list of Oval instances from the factories + public async updateInstances(fromBlock: number) { + if (!this.provider) return; + let lastBlock = fromBlock; + + try { + lastBlock = await this.provider.getBlockNumber(); + const factories = [ + this.standardCoinbaseFactory, + this.standardChainlinkFactory, + this.standardChronicleFactory, + this.standardPythFactory + ]; + + for (const factory of factories) { + await this.updateFactoryInstances(factory, fromBlock, lastBlock); + } + } catch (error) { + Logger.error("OvalDiscovery", `Error updating instances: ${error}`); + } + + // Schedule next update after the current one completes + setTimeout(() => { + this.updateInstances(lastBlock); + }, env.ovalDiscoveryInterval * 1000); + } + + // Update instances for a specific factory + private async updateFactoryInstances(factory: any, fromBlock: number, toBlock: number) { + const searchConfig: EventSearchConfig = { + fromBlock, + toBlock, + maxBlockLookBack: 20000 + }; + + try { + const ovalDeployments = await paginatedEventQuery( + factory.connect(this.provider!), + factory.filters.OvalDeployed(undefined, undefined, undefined, undefined, undefined, undefined), + searchConfig + ); + + ovalDeployments.forEach((ovalDeployment: EventLog) => { + Logger.debug("OvalDiscovery", `Found Oval deployment: ${ovalDeployment.args[1]}`); + this.ovalInstances.add(getAddress(ovalDeployment.args[1])); + }); + } catch (error) { + Logger.error("OvalDiscovery", `Error querying factory ${factory.address}: ${error}`); + } + } + + // Returns all discovered Oval instances + public getOvalFactoryInstances(): Array { + return Array.from(this.ovalInstances); + } + + // Checks if the given address is an Oval instance + public isOval(address: string): boolean { + return this.ovalInstances.has(address); + } +} \ No newline at end of file diff --git a/src/lib/types.ts b/src/lib/types.ts index fb62a58..9418707 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -1,13 +1,21 @@ -export interface OvalConfig { - unlockerKey?: string; - gckmsKeyId?: string; +export interface RefundConfig { refundAddress: string; refundPercent: number; } +export interface OvalConfigShared { + unlockerKey?: string; + gckmsKeyId?: string; +} + +export interface OvalConfig extends OvalConfigShared, RefundConfig { } + // Records to store supported Oval instances and their configs. export type OvalConfigs = Record; +// Shared Oval configs +export type OvalConfigsShared = Array; + export type Refund = { bodyIdx: number; percent: number; @@ -19,4 +27,4 @@ export interface UnlockAddress { ovalAddress: EthereumAddress; } -export type OvalAddressConfigList = string[]; +export type OvalAddressConfigList = string[]; \ No newline at end of file diff --git a/src/lib/walletManager.ts b/src/lib/walletManager.ts new file mode 100644 index 0000000..2cfb197 --- /dev/null +++ b/src/lib/walletManager.ts @@ -0,0 +1,227 @@ +import { JsonRpcProvider, Wallet, getAddress } from "ethers"; +import { Logger, OvalDiscovery } from "./"; +import { env } from "./env"; +import { retrieveGckmsKey } from "./gckms"; +import { isMochaTest } from "./helpers"; +import { OvalConfigs, OvalConfigsShared } from "./types"; +import { PermissionProxy__factory } from "../contract-types"; + +type WalletConfig = { + unlockerKey?: string; + gckmsKeyId?: string; +}; + +type WalletUsed = { + count: number; + walletPubKey: string; + ovalInstances: Set; +}; + +// WalletManager class to handle wallet operations. +export class WalletManager { + private static instance: WalletManager; + private ovalDiscovery: OvalDiscovery; + private wallets: Record = {}; + private sharedWallets: Map = new Map(); + private sharedWalletUsage: Map> = new Map(); + private provider: JsonRpcProvider | undefined; + + private constructor() { + this.ovalDiscovery = OvalDiscovery.getInstance(); + } + + // Singleton pattern to get an instance of WalletManager + public static getInstance(): WalletManager { + if (!WalletManager.instance) { + WalletManager.instance = new WalletManager(); + } + return WalletManager.instance; + } + + // Initialize wallets with configurations + public async initialize(provider: JsonRpcProvider, ovalConfigs: OvalConfigs, sharedConfigs?: OvalConfigsShared): Promise { + this.provider = provider; + await this.initializeWallets(ovalConfigs); + if (sharedConfigs) { + await this.initializeSharedWallets(sharedConfigs); + } + this.setupCleanupInterval(); + } + + // Get a wallet for a given address + public getWallet(address: string, targetBlock: number, transactionId: string): Wallet { + if (!this.provider) { + throw new Error("Provider is not initialized"); + } + const checkSummedAddress = getAddress(address); + const wallet = this.wallets[checkSummedAddress]; + if (!wallet) { + return this.getSharedWallet(address, targetBlock, transactionId); + } + return wallet.connect(this.provider); + } + + // Get a shared wallet for a given Oval instance and target block + private getSharedWallet(ovalInstance: string, targetBlock: number, transactionId: string): Wallet { + if (!this.provider) { + throw new Error("Provider is not initialized"); + } + if (!this.ovalDiscovery.isOval(ovalInstance)) { + throw new Error(`Oval instance ${ovalInstance} is not found`); + } + + let selectedWallet: Wallet | undefined; + + // Check if a wallet has already been assigned to this Oval instance + for (const [walletPubKey, instanceUsage] of this.sharedWalletUsage.entries()) { + for (const [_, record] of instanceUsage.entries()) { + if (record.ovalInstances && record.ovalInstances.has(ovalInstance)) { + selectedWallet = this.sharedWallets.get(walletPubKey)!.connect(this.provider!); + } + } + } + + // If no wallet has been assigned, find the least used wallet + if (!selectedWallet) { + selectedWallet = this.findLeastUsedWallet(transactionId); + } + + // Update the usage of the selected wallet + if (selectedWallet) { + this.updateWalletUsage(ovalInstance, selectedWallet, targetBlock); + return selectedWallet.connect(this.provider); + } + + throw new Error(`No available shared wallets for Oval instance ${ovalInstance} at block ${targetBlock}`); + } + + public isOvalSharedUnlocker(unlockerPublicKey: string): boolean { + return this.sharedWallets.has(unlockerPublicKey); + } + + // Private helper methods + private setupCleanupInterval(): void { + if (isMochaTest() || !this.provider) return; + setInterval(async () => { + if (!this.provider) return; + const currentBlock = await this.provider.getBlockNumber(); + this.cleanupOldRecords(currentBlock); + }, env.sharedWalletUsageCleanupInterval * 1000); + } + + // Initialize regular wallets + private async initializeWallets(configs: OvalConfigs): Promise { + for (const [address, config] of Object.entries(configs)) { + this.wallets[getAddress(address)] = await this.createWallet(config); + } + } + + // Initialize shared wallets + private async initializeSharedWallets(configs: OvalConfigsShared): Promise { + for (const config of configs) { + const wallet = await this.createWallet(config); + if (wallet) { + const walletPubKey = await wallet.getAddress(); + + // Check if the wallet is a sender in the PermissionProxy contract. + const isSender = await PermissionProxy__factory.connect(env.permissionProxyAddress, this.provider!).senders(wallet.address); + if (!isSender) { + throw new Error(`Wallet ${wallet.address} is not a sender in the PermissionProxy contract.`); + } + + this.sharedWallets.set(walletPubKey, wallet); + } + } + } + + // Create a wallet based on configuration + private async createWallet(config: WalletConfig): Promise { + if (config.unlockerKey) { + return new Wallet(config.unlockerKey); + } + if (config.gckmsKeyId) { + const gckmsKey = await retrieveGckmsKey({ + ...JSON.parse(env.gckmsConfig), + cryptoKeyId: config.gckmsKeyId, + ciphertextFilename: `${config.gckmsKeyId}.enc`, + }); + return new Wallet(gckmsKey); + } + throw new Error('Invalid wallet configuration'); + } + + // Find the least used wallet to avoid nonce collisions + private findLeastUsedWallet(transactionId: string): Wallet | undefined { + let selectedWallet: Wallet | undefined; + const totalUsage = new Map; + }>(); + + // Initialize total usage counts for each wallet + this.sharedWallets.forEach((wallet) => { + totalUsage.set(wallet.address, { totalCount: 0, ovalInstances: new Set() }); + }); + + // Sum usage counts for each wallet and collect all Oval instances + this.sharedWalletUsage.forEach((instanceUsage) => { + instanceUsage.forEach((record) => { + const totalInstanceUsage = totalUsage.get(record.walletPubKey)!; + totalInstanceUsage.totalCount += record.count; + record.ovalInstances.forEach(instance => totalInstanceUsage.ovalInstances.add(instance)); + totalUsage.set(record.walletPubKey, totalInstanceUsage); + }); + }); + + // Find the wallet with the least usage + let minInstances = Infinity; + let minUsage = Infinity; + totalUsage.forEach((usage, walletPubKey) => { + const instanceCount = usage.ovalInstances.size; + // If the wallet has been used in less Oval instances or the same number of instances but less total usage, select it + if (instanceCount < minInstances || (instanceCount === minInstances && usage.totalCount < minUsage)) { + minInstances = instanceCount; + minUsage = usage.totalCount; + selectedWallet = this.sharedWallets.get(walletPubKey); + } + }); + + // Log an error if a wallet is reused across multiple Oval instances + if (minInstances !== Infinity && minInstances !== 0) { + Logger.error(transactionId, `Public key ${selectedWallet?.address} is reused in multiple Oval instances because no free wallets are available.`); + } + + return selectedWallet; + } + + // Update the usage statistics for a wallet + private async updateWalletUsage(ovalInstance: string, wallet: Wallet, targetBlock: number): Promise { + const walletPubKey = await wallet.getAddress(); + const instanceUsage = this.sharedWalletUsage.get(walletPubKey) || new Map(); + const existingRecord = instanceUsage.get(targetBlock); + + if (existingRecord) { + (existingRecord as WalletUsed).count += 1; + (existingRecord as WalletUsed).ovalInstances.add(ovalInstance); + } else { + instanceUsage.set(targetBlock, { walletPubKey, count: 1, ovalInstances: new Set([ovalInstance]) }); + } + + this.sharedWalletUsage.set(walletPubKey, instanceUsage); + } + + // Cleanup old usage records that are no longer relevant + private cleanupOldRecords(currentBlock: number): void { + this.sharedWalletUsage.forEach((instanceUsage, ovalInstance) => { + instanceUsage.forEach((_, blockNumber) => { + // Delete record older than current block as they are no longer relevant + if (blockNumber < currentBlock - 1) { + instanceUsage.delete(blockNumber); + } + }); + if (instanceUsage.size === 0) { + this.sharedWalletUsage.delete(ovalInstance); + } + }); + } +} \ No newline at end of file diff --git a/test/walletManager.ts b/test/walletManager.ts new file mode 100644 index 0000000..1d17c0b --- /dev/null +++ b/test/walletManager.ts @@ -0,0 +1,162 @@ +import { expect } from 'chai'; +import sinon from 'sinon'; +import { WalletManager } from '../src/lib/walletManager'; +import { JsonRpcProvider, Wallet } from 'ethers'; +import "../src/lib/express-extensions"; +import * as gckms from '../src/lib/gckms'; +import * as ovalDiscovery from '../src/lib/ovalDiscovery'; +import * as logger from '../src/lib/logging'; +import { PermissionProxy__factory } from "../src/contract-types"; +import { OvalConfigs, OvalConfigsShared } from '../src/lib/types'; +import { env } from '../src/lib'; + + +const mockProvider = new JsonRpcProvider(); + +const getRandomAddressAndKey = () => { + const wallet = Wallet.createRandom(); + return { + address: wallet.address, + privateKey: wallet.privateKey, + }; +}; + +describe('WalletManager Tests', () => { + + beforeEach(() => { + const ovalDiscoveryInstance = { + isOval: sinon.stub().resolves(true), + updateInstances: sinon.stub().resolves() + }; + sinon.stub(ovalDiscovery.OvalDiscovery, 'getInstance').returns(ovalDiscoveryInstance as any); + // Cleanup old records + WalletManager.getInstance()['cleanupOldRecords'](Infinity); + WalletManager['instance'] = undefined as any; + + sinon.stub(PermissionProxy__factory, 'connect').returns({ + senders: sinon.stub().resolves(true) + } as any); + }); + + afterEach(() => { + sinon.restore(); + }); + + it('should return a singleton instance', () => { + const instance1 = WalletManager.getInstance(); + const instance2 = WalletManager.getInstance(); + expect(instance1).to.equal(instance2); + }); + + it('should initialize with valid ovalConfigs', async () => { + const gckmsRandom = getRandomAddressAndKey(); + const unlockerRandom = getRandomAddressAndKey(); + const refundRandom = getRandomAddressAndKey().address; + const oval1 = getRandomAddressAndKey().address; + const oval2 = getRandomAddressAndKey().address; + const ovalConfigs: OvalConfigs = { + [oval1]: { unlockerKey: unlockerRandom.privateKey, refundAddress: refundRandom, refundPercent: 10 }, + [oval2]: { gckmsKeyId: 'gckmsKeyId456', refundAddress: refundRandom, refundPercent: 20 }, + }; + sinon.stub(gckms, 'retrieveGckmsKey').resolves(gckmsRandom.privateKey); + const walletManager = WalletManager.getInstance(); + await walletManager.initialize(mockProvider, ovalConfigs); + + const walletRandom = walletManager.getWallet(oval1, 123, "transactionId"); + expect(walletRandom?.privateKey).to.equal(unlockerRandom.privateKey); + + const walletGckms = walletManager.getWallet(oval2, 123, "transactionId"); + expect(walletGckms?.privateKey).to.equal(gckmsRandom.privateKey); + }); + + it('should initialize with valid ovalConfigs and sharedConfigs', async () => { + const gckmsRandom = getRandomAddressAndKey(); + const unlockerRandom = getRandomAddressAndKey(); + const sharedConfigs: OvalConfigsShared = [ + { unlockerKey: unlockerRandom.privateKey }, + { gckmsKeyId: 'gckmsKeyId456' }, + ]; + sinon.stub(gckms, 'retrieveGckmsKey').resolves(gckmsRandom.privateKey); + const walletManager = WalletManager.getInstance(); + await walletManager.initialize(mockProvider, {}, sharedConfigs); + + // Check if shared wallets are initialized + const sharedWallets = Array.from(walletManager['sharedWallets'].values()); + expect(sharedWallets).to.have.lengthOf(2); + }); + + it('should return the same shared wallet for the same ovalInstance', async () => { + const unlockerRandom = getRandomAddressAndKey(); + const sharedConfigs: OvalConfigsShared = [ + { unlockerKey: unlockerRandom.privateKey }, + ]; + const walletManager = WalletManager.getInstance(); + + await walletManager.initialize(mockProvider, {}, sharedConfigs); + + const ovalInstance = getRandomAddressAndKey().address; + const targetBlock = 123; + + + const wallet1 = await walletManager.getWallet(ovalInstance, targetBlock, "transactionId"); + const wallet2 = await walletManager.getWallet(ovalInstance, targetBlock + 1, "transactionId"); + + expect(wallet1.address).to.equal(wallet2.address); + }); + + it('should assign the least used shared wallet when no previous assignment exists', async () => { + const unlockerRandom1 = getRandomAddressAndKey(); + const unlockerRandom2 = getRandomAddressAndKey(); + + const sharedConfigs: OvalConfigsShared = [ + { unlockerKey: unlockerRandom1.privateKey }, + { unlockerKey: unlockerRandom2.privateKey }, + ]; + const walletManager = WalletManager.getInstance(); + await walletManager.initialize(mockProvider, {}, sharedConfigs); + + const ovalInstance1 = getRandomAddressAndKey().address; + const ovalInstance2 = getRandomAddressAndKey().address; + const ovalInstance3 = getRandomAddressAndKey().address; + const targetBlock = 123; + + const wallet1 = walletManager.getWallet(ovalInstance1, targetBlock, "transactionId"); + await walletManager.getWallet(ovalInstance1, targetBlock, "transactionId"); + + const walletUsageOne = walletManager['sharedWalletUsage']?.get(wallet1.address)?.get(targetBlock) + expect(walletUsageOne?.count).to.equal(2); + expect(walletUsageOne?.ovalInstances.size).to.equal(1); + + const wallet2 = await walletManager.getWallet(ovalInstance2, targetBlock, "transactionId"); + + // As these are the first assignments, wallet1 and wallet2 should be different + expect(wallet1.address).to.not.equal(wallet2.address); + + const errorSpy = sinon.spy(logger.Logger, 'error'); // Create a spy on logger.Logger.error + + const wallet3 = await walletManager.getWallet(ovalInstance3, targetBlock, "transactionId"); + expect(wallet3.address).to.equal(wallet2.address); + + expect(errorSpy.calledOnce).to.be.true; + expect(errorSpy.args[0][1]).to.include(`Public key ${wallet2.address} is reused in multiple Oval instances because no free wallets are available.`); + }); + + it('should cleanup old records correctly', async () => { + const unlockerRandom = getRandomAddressAndKey(); + const sharedConfigs: OvalConfigsShared = [ + { unlockerKey: unlockerRandom.privateKey }, + ]; + const walletManager = WalletManager.getInstance(); + await walletManager.initialize(mockProvider, {}, sharedConfigs); + + const ovalInstance = getRandomAddressAndKey().address; + const targetBlock = 123; + + await walletManager.getWallet(ovalInstance, targetBlock, "transactionId"); + + walletManager['cleanupOldRecords'](targetBlock + 2); + + const sharedWalletUsage = walletManager['sharedWalletUsage'].get(ovalInstance); + expect(sharedWalletUsage).to.be.undefined; + }); +}); \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index ec42caf..401bb1c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es2022", + "target": "ES2022", "module": "commonjs", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, @@ -8,5 +8,11 @@ "skipLibCheck": true, "outDir": "./out" }, - "exclude": ["node_modules", "build/**/*"] -} + "exclude": [ + "node_modules", + "build/**/*" + ], + "include": [ + "src/**/*.ts" + ] +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 8ada48b..4a7f585 100644 --- a/yarn.lock +++ b/yarn.lock @@ -866,6 +866,41 @@ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/commons@^3.0.0", "@sinonjs/commons@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^11.2.2": + version "11.2.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz#50063cc3574f4a27bd8453180a04171c85cc9699" + integrity sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@sinonjs/samsam@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-8.0.0.tgz#0d488c91efb3fa1442e26abea81759dfc8b5ac60" + integrity sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew== + dependencies: + "@sinonjs/commons" "^2.0.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.2": + version "0.7.2" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" + integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== + "@szmarczak/http-timer@^4.0.5": version "4.0.6" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" @@ -910,6 +945,14 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@typechain/ethers-v6@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz#42fe214a19a8b687086c93189b301e2b878797ea" + integrity sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA== + dependencies: + lodash "^4.17.15" + ts-essentials "^7.0.1" + "@types/axios@^0.14.0": version "0.14.0" resolved "https://registry.yarnpkg.com/@types/axios/-/axios-0.14.0.tgz#ec2300fbe7d7dddd7eb9d3abf87999964cafce46" @@ -917,6 +960,11 @@ dependencies: axios "*" +"@types/bluebird@^3.5.42": + version "3.5.42" + resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.42.tgz#7ec05f1ce9986d920313c1377a5662b1b563d366" + integrity sha512-Jhy+MWRlro6UjVi578V/4ZGNfeCOcNCp0YaFNIUGFKlImowqwb1O/22wDVk3FDGMLqxdpOV3qQHD5fPEH4hK6A== + "@types/bn.js@^5.1.0", "@types/bn.js@^5.1.1": version "5.1.5" resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.5.tgz#2e0dacdcce2c0f16b905d20ff87aedbc6f7b4bf0" @@ -947,6 +995,11 @@ resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.5.tgz#db9468cb1b1b5a925b8f34822f1669df0c5472f5" integrity sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg== +"@types/chai@^4.3.16": + version "4.3.16" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.16.tgz#b1572967f0b8b60bf3f87fe1d854a5604ea70c82" + integrity sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ== + "@types/connect@*": version "3.4.37" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.37.tgz#c66a96689fd3127c8772eb3e9e5c6028ec1a9af5" @@ -1016,6 +1069,11 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.4.tgz#a4ed836e069491414bab92c31fdea9e557aca0d9" integrity sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw== +"@types/mocha@^10.0.7": + version "10.0.7" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.7.tgz#4c620090f28ca7f905a94b706f74dc5b57b44f2f" + integrity sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw== + "@types/morgan@^1.9.7": version "1.9.7" resolved "https://registry.yarnpkg.com/@types/morgan/-/morgan-1.9.7.tgz#ba1e980841be06cd164eedfba7e3e1e2f4d0c911" @@ -1059,6 +1117,11 @@ dependencies: "@types/node" "*" +"@types/prettier@^2.1.1": + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + "@types/qs@*": version "6.9.9" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.9.tgz#66f7b26288f6799d279edf13da7ccd40d2fa9197" @@ -1115,6 +1178,18 @@ "@types/mime" "*" "@types/node" "*" +"@types/sinon@^17.0.3": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-17.0.3.tgz#9aa7e62f0a323b9ead177ed23a36ea757141a5fa" + integrity sha512-j3uovdn8ewky9kRBG19bOwaZbexJu/XjtkHyjvUgt4xfPFz18dcORIMqnYh66Fx3Powhcr85NT5+er3+oViapw== + dependencies: + "@types/sinonjs__fake-timers" "*" + +"@types/sinonjs__fake-timers@*": + version "8.1.5" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz#5fd3592ff10c1e9695d377020c033116cc2889f2" + integrity sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ== + "@types/tough-cookie@*": version "4.0.5" resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" @@ -1330,6 +1405,11 @@ ajv@^6.12.3: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ansi-colors@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -1345,6 +1425,13 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -1406,6 +1493,21 @@ arg@^4.1.0: resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1, array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -1438,6 +1540,11 @@ assert-plus@1.0.0, assert-plus@^1.0.0: resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" @@ -1557,7 +1664,7 @@ blakejs@^1.1.0: resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== -bluebird@^3.5.0: +bluebird@^3.5.0, bluebird@^3.7.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== @@ -1621,6 +1728,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -1638,6 +1752,11 @@ browser-or-node@^2.0.0: resolved "https://registry.yarnpkg.com/browser-or-node/-/browser-or-node-2.1.1.tgz#738790b3a86a8fc020193fa581273fbe65eaea0f" integrity sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg== +browser-stdout@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" @@ -1780,11 +1899,38 @@ call-bind@^1.0.2, call-bind@^1.0.4: get-intrinsic "^1.2.1" set-function-length "^1.1.1" +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +chai@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" + integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.0.8" + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -1793,6 +1939,13 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + chokidar@^3.5.2: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -1808,6 +1961,21 @@ chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" +chokidar@^3.5.3: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chownr@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" @@ -1913,7 +2081,7 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== -color-convert@^1.9.3: +color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -1981,6 +2149,26 @@ combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +command-line-args@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.0: + version "6.1.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + common-ancestor-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" @@ -2141,11 +2329,23 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.3.1, debug@^4.3.5: + version "4.3.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" + integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== + dependencies: + ms "2.1.2" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw== +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + decode-uri-component@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" @@ -2165,6 +2365,18 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" +deep-eql@^4.1.3: + version "4.1.4" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== + dependencies: + type-detect "^4.0.0" + +deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + deepmerge@4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" @@ -2229,6 +2441,11 @@ diff@^5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -2428,6 +2645,16 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" @@ -2721,11 +2948,31 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + flashbots-ethers-v6-provider-bundle@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/flashbots-ethers-v6-provider-bundle/-/flashbots-ethers-v6-provider-bundle-0.6.1.tgz#217ed5cee653c45ef6713813c932c43589f72fd4" integrity sha512-plWHWdBMUtZvcsPtjnxdG7H80K973wvCYZwp0mQ4AO5p2scdzy7MqLhJIMLJqVs9IRmIkajme/W6cTIWXIOxzw== +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + fn.name@1.x.x: version "1.1.0" resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" @@ -2799,6 +3046,15 @@ fs-extra@^4.0.2: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" @@ -2905,6 +3161,11 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + get-intrinsic@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" @@ -2951,6 +3212,18 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -2963,6 +3236,17 @@ glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + global@~4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" @@ -3205,6 +3489,11 @@ hasown@^2.0.0: dependencies: function-bind "^1.1.2" +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + hex2dec@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/hex2dec/-/hex2dec-1.1.2.tgz#8e1ce4bef36a74f7d5723c3fb3090c2860077338" @@ -3522,6 +3811,11 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + is-stream-ended@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-stream-ended/-/is-stream-ended-0.1.4.tgz#f50224e95e06bce0e356d440a4827cd35b267eda" @@ -3544,6 +3838,11 @@ is-typedarray@^1.0.0, is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + is@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/is/-/is-3.3.0.tgz#61cff6dd3c4193db94a3d62582072b44e5645d79" @@ -3574,6 +3873,13 @@ js-sha3@^0.5.7: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -3653,6 +3959,11 @@ just-diff@^3.0.1: resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-3.1.1.tgz#d50c597c6fd4776495308c63bdee1b6839082647" integrity sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ== +just-extend@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-6.2.0.tgz#b816abfb3d67ee860482e7401564672558163947" + integrity sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw== + jwa@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc" @@ -3801,11 +4112,23 @@ libnpmversion@^1.2.1: semver "^7.3.5" stringify-package "^1.0.1" +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== + lodash.mapvalues@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" @@ -3816,7 +4139,7 @@ lodash.snakecase@4.1.1: resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== -lodash@^4.13.1, lodash@^4.17.21: +lodash@^4.13.1, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3826,6 +4149,14 @@ log-driver@^1.2.7: resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8" integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg== +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + logform@^2.3.2, logform@^2.4.0: version "2.6.0" resolved "https://registry.yarnpkg.com/logform/-/logform-2.6.0.tgz#8c82a983f05d6eaeb2d75e3decae7a768b2bf9b5" @@ -3848,6 +4179,13 @@ long@^5.0.0: resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + lowercase-keys@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" @@ -3995,6 +4333,13 @@ minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1, minimatch@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" @@ -4115,6 +4460,32 @@ mkdirp@^1.0.3, mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== +mocha@^10.6.0: + version "10.6.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.6.0.tgz#465fc66c52613088e10018989a3b98d5e11954b9" + integrity sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw== + dependencies: + ansi-colors "^4.1.3" + browser-stdout "^1.3.1" + chokidar "^3.5.3" + debug "^4.3.5" + diff "^5.2.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^8.1.0" + he "^1.2.0" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^5.1.6" + ms "^2.1.3" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^6.5.1" + yargs "^16.2.0" + yargs-parser "^20.2.9" + yargs-unparser "^2.0.0" + mock-fs@^4.1.0: version "4.14.0" resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" @@ -4146,7 +4517,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.2: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.2, ms@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -4216,6 +4587,17 @@ next-tick@^1.1.0: resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== +nise@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nise/-/nise-6.0.0.tgz#ae56fccb5d912037363c3b3f29ebbfa28bde8b48" + integrity sha512-K8ePqo9BFvN31HXwEtTNGzgrPpmvgciDsFz8aztFjt4LqKO/JeFD8tBOeuDiCMXrIl/m1YvfH8auSpxfaD09wg== + dependencies: + "@sinonjs/commons" "^3.0.0" + "@sinonjs/fake-timers" "^11.2.2" + "@sinonjs/text-encoding" "^0.7.2" + just-extend "^6.2.0" + path-to-regexp "^6.2.1" + node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" @@ -4579,13 +4961,20 @@ p-cancelable@^3.0.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== -p-limit@^3.0.1: +p-limit@^3.0.1, p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== dependencies: yocto-queue "^0.1.0" +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -4637,6 +5026,11 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -4652,11 +5046,21 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-to-regexp@^6.2.1: + version "6.2.2" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.2.tgz#324377a83e5049cbecadc5554d6a63a9a4866b36" + integrity sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + pbkdf2@^3.0.17: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" @@ -4678,6 +5082,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +prettier@^2.3.1: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + prettier@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.3.tgz#432a51f7ba422d1469096c0fdc28e235db8f9643" @@ -5022,6 +5431,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + request-promise-core@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" @@ -5256,6 +5670,13 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + serve-static@1.15.0: version "1.15.0" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" @@ -5357,6 +5778,18 @@ simple-update-notifier@^2.0.0: dependencies: semver "^7.5.3" +sinon@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-18.0.0.tgz#69ca293dbc3e82590a8b0d46c97f63ebc1e5fc01" + integrity sha512-+dXDXzD1sBO6HlmZDd7mXZCR/y5ECiEiGCBSGuFD/kZ0bDTofPYc6JaeGmPSF+1j1MejGUWkORbYOLDyvqCWpA== + dependencies: + "@sinonjs/commons" "^3.0.1" + "@sinonjs/fake-timers" "^11.2.2" + "@sinonjs/samsam" "^8.0.0" + diff "^5.2.0" + nise "^6.0.0" + supports-color "^7" + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -5492,6 +5925,11 @@ strict-uri-encode@^2.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" integrity sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ== +string-format@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -5565,6 +6003,11 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + strnum@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/strnum/-/strnum-1.0.5.tgz#5c4e829fe15ad4ff0d20c3db5ac97b73c9b072db" @@ -5580,20 +6023,27 @@ superstruct@^1.0.3: resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-1.0.3.tgz#de626a5b49c6641ff4d37da3c7598e7a87697046" integrity sha512-8iTn3oSS8nRGn+C2pgXSKPI3jmpm6FExNazNpjvqS6ZUJQCej3PUXEKM8NjHBOs54ExM+LPW/FBRhymrdcCiSg== -supports-color@^5.5.0: +supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: +supports-color@^7, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== dependencies: has-flag "^4.0.0" +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -5616,6 +6066,16 @@ swarm-js@^0.1.40: tar "^4.0.2" xhr-request "^1.0.1" +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + tar@^4.0.2: version "4.4.19" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" @@ -5743,6 +6203,21 @@ triple-beam@^1.3.0: resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== +ts-command-line-args@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz#e64456b580d1d4f6d948824c274cf6fa5f45f7f0" + integrity sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.0" + string-format "^2.0.0" + +ts-essentials@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== + ts-mixer@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/ts-mixer/-/ts-mixer-6.0.3.tgz#69bd50f406ff39daa369885b16c77a6194c7cae6" @@ -5801,6 +6276,11 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -5819,6 +6299,22 @@ type@^2.7.2: resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +typechain@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.3.2.tgz#1090dd8d9c57b6ef2aed3640a516bdbf01b00d73" + integrity sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q== + dependencies: + "@types/prettier" "^2.1.1" + debug "^4.3.1" + fs-extra "^7.0.0" + glob "7.1.7" + js-sha3 "^0.8.0" + lodash "^4.17.15" + mkdirp "^1.0.4" + prettier "^2.3.1" + ts-command-line-args "^2.2.0" + ts-essentials "^7.0.1" + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -5831,6 +6327,16 @@ typescript@^5.2.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" @@ -6317,6 +6823,19 @@ winston@^3.2.1: triple-beam "^1.3.0" winston-transport "^4.5.0" +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + +workerpool@^6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" + integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -6415,7 +6934,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@^20.2.2: +yargs-parser@^20.2.2, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== @@ -6425,6 +6944,16 @@ yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"