From 5f3a5d5d160aecb1e9c60e00de02f7fc8a509cf4 Mon Sep 17 00:00:00 2001 From: signature18632 Date: Fri, 22 Aug 2025 15:43:13 +0700 Subject: [PATCH 01/12] bridge monitor --- packages/bridge-monitor/README.md | 17 ++++++++++++ packages/bridge-monitor/package.json | 20 ++++++++++++++ packages/bridge-monitor/src/index.ts | 27 +++++++++++++++++++ .../bridge-monitor/src/service/job.service.ts | 3 +++ packages/bridge-monitor/tsconfig.json | 25 +++++++++++++++++ 5 files changed, 92 insertions(+) create mode 100644 packages/bridge-monitor/README.md create mode 100644 packages/bridge-monitor/package.json create mode 100644 packages/bridge-monitor/src/index.ts create mode 100644 packages/bridge-monitor/src/service/job.service.ts create mode 100644 packages/bridge-monitor/tsconfig.json diff --git a/packages/bridge-monitor/README.md b/packages/bridge-monitor/README.md new file mode 100644 index 0000000..e49306d --- /dev/null +++ b/packages/bridge-monitor/README.md @@ -0,0 +1,17 @@ +# bridge-monitor + +The bridge-monitor is a tool designed to monitor and process bridge transactions on blockchain networks. + +## Usage + +To set up the development environment: + +```bash +# install +yarn + +# dev +yarn workspace bridge-monitor dev + +# build +yarn build diff --git a/packages/bridge-monitor/package.json b/packages/bridge-monitor/package.json new file mode 100644 index 0000000..53a3c40 --- /dev/null +++ b/packages/bridge-monitor/package.json @@ -0,0 +1,20 @@ +{ + "name": "bridge-monitor", + "version": "1.0.0", + "dependencies": { + "@intmax2-function/shared": "workspace:*", + "viem": "^2.33.3" + }, + "scripts": { + "start": "node dist/index.js", + "dev": "tsx watch --env-file=./../../.env src/index.ts", + "build": "tsc", + "typecheck": "tsc --noEmit", + "test": "vitest" + }, + "devDependencies": { + "tsx": "^4.20.4", + "typescript": "^5.9.2", + "vitest": "^3.2.4" + } +} diff --git a/packages/bridge-monitor/src/index.ts b/packages/bridge-monitor/src/index.ts new file mode 100644 index 0000000..7b9994b --- /dev/null +++ b/packages/bridge-monitor/src/index.ts @@ -0,0 +1,27 @@ +import { logger, timeOperation } from "@intmax2-function/shared"; +import { name } from "../package.json"; +import { performJob } from "./service/job.service"; + +async function main() { + try { + logger.info(`Starting ${name} job`); + const { durationInSeconds } = await timeOperation(performJob); + logger.info(`Completed ${name} job executed successfully in ${durationInSeconds}s`); + process.exit(0); + } catch (error) { + logger.error(error); + process.exit(1); + } +} + +process.on("unhandledRejection", (reason, promise) => { + logger.error(`Unhandled Rejection at: ${promise} reason: ${reason}`); + process.exit(1); +}); + +if (require.main === module) { + main().catch((error) => { + logger.error(error); + process.exit(1); + }); +} diff --git a/packages/bridge-monitor/src/service/job.service.ts b/packages/bridge-monitor/src/service/job.service.ts new file mode 100644 index 0000000..594944e --- /dev/null +++ b/packages/bridge-monitor/src/service/job.service.ts @@ -0,0 +1,3 @@ +export const performJob = async () => { + console.log("Perform job"); +}; diff --git a/packages/bridge-monitor/tsconfig.json b/packages/bridge-monitor/tsconfig.json new file mode 100644 index 0000000..a09ade0 --- /dev/null +++ b/packages/bridge-monitor/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "declaration": true, + "sourceMap": true, + "isolatedModules": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "allowUnreachableCode": false, + "incremental": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "**/*.spec.ts", "dist"] +} From a89a8f16d6e35f7fc4d11945d11864f03239829d Mon Sep 17 00:00:00 2001 From: signature18632 Date: Fri, 22 Aug 2025 20:03:06 +0700 Subject: [PATCH 02/12] added BaseBridgeOApp.json --- packages/shared/src/abi/BaseBridgeOApp.json | 928 ++++++++++++++++++++ packages/shared/src/abi/index.ts | 1 + packages/shared/src/blockchain/events.ts | 4 + 3 files changed, 933 insertions(+) create mode 100644 packages/shared/src/abi/BaseBridgeOApp.json diff --git a/packages/shared/src/abi/BaseBridgeOApp.json b/packages/shared/src/abi/BaseBridgeOApp.json new file mode 100644 index 0000000..23184d0 --- /dev/null +++ b/packages/shared/src/abi/BaseBridgeOApp.json @@ -0,0 +1,928 @@ +{ + "abi": [ + { + "type": "constructor", + "inputs": [ + { "name": "_endpoint", "type": "address", "internalType": "address" }, + { "name": "_delegate", "type": "address", "internalType": "address" }, + { "name": "_owner", "type": "address", "internalType": "address" }, + { "name": "_token", "type": "address", "internalType": "address" }, + { "name": "_dstEid", "type": "uint32", "internalType": "uint32" } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "bridgeStorage", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "contract IBridgeStorage" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "bridgeTo", + "inputs": [{ "name": "recipient", "type": "address", "internalType": "address" }], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "bridgedAmount", + "inputs": [{ "name": "user", "type": "address", "internalType": "address" }], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "endpoint", + "inputs": [], + "outputs": [ + { "name": "", "type": "address", "internalType": "contract ILayerZeroEndpointV2" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "gasLimit", + "inputs": [], + "outputs": [{ "name": "", "type": "uint128", "internalType": "uint128" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "oAppVersion", + "inputs": [], + "outputs": [ + { "name": "senderVersion", "type": "uint64", "internalType": "uint64" }, + { "name": "receiverVersion", "type": "uint64", "internalType": "uint64" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "peers", + "inputs": [{ "name": "eid", "type": "uint32", "internalType": "uint32" }], + "outputs": [{ "name": "peer", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "quoteBridge", + "inputs": [], + "outputs": [ + { + "name": "fee", + "type": "tuple", + "internalType": "struct MessagingFee", + "components": [ + { "name": "nativeFee", "type": "uint256", "internalType": "uint256" }, + { "name": "lzTokenFee", "type": "uint256", "internalType": "uint256" } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setBridgeStorage", + "inputs": [{ "name": "_bridgeStorage", "type": "address", "internalType": "address" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setDelegate", + "inputs": [{ "name": "_delegate", "type": "address", "internalType": "address" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setGasLimit", + "inputs": [{ "name": "_gasLimit", "type": "uint128", "internalType": "uint128" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setPeer", + "inputs": [ + { "name": "_eid", "type": "uint32", "internalType": "uint32" }, + { "name": "_peer", "type": "bytes32", "internalType": "bytes32" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [{ "name": "newOwner", "type": "address", "internalType": "address" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferStorageOwnership", + "inputs": [{ "name": "newOwner", "type": "address", "internalType": "address" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "BridgeRequested", + "inputs": [ + { "name": "recipient", "type": "address", "indexed": true, "internalType": "address" }, + { "name": "amount", "type": "uint256", "indexed": false, "internalType": "uint256" }, + { "name": "user", "type": "address", "indexed": true, "internalType": "address" }, + { + "name": "receipt", + "type": "tuple", + "indexed": false, + "internalType": "struct MessagingReceipt", + "components": [ + { "name": "guid", "type": "bytes32", "internalType": "bytes32" }, + { "name": "nonce", "type": "uint64", "internalType": "uint64" }, + { + "name": "fee", + "type": "tuple", + "internalType": "struct MessagingFee", + "components": [ + { "name": "nativeFee", "type": "uint256", "internalType": "uint256" }, + { "name": "lzTokenFee", "type": "uint256", "internalType": "uint256" } + ] + } + ] + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "BridgeStorageUpdated", + "inputs": [ + { "name": "oldStorage", "type": "address", "indexed": true, "internalType": "address" }, + { "name": "newStorage", "type": "address", "indexed": true, "internalType": "address" } + ], + "anonymous": false + }, + { + "type": "event", + "name": "GasLimitUpdated", + "inputs": [ + { "name": "oldLimit", "type": "uint128", "indexed": false, "internalType": "uint128" }, + { "name": "newLimit", "type": "uint128", "indexed": false, "internalType": "uint128" } + ], + "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 + }, + { + "type": "event", + "name": "PeerSet", + "inputs": [ + { "name": "eid", "type": "uint32", "indexed": false, "internalType": "uint32" }, + { "name": "peer", "type": "bytes32", "indexed": false, "internalType": "bytes32" } + ], + "anonymous": false + }, + { "type": "error", "name": "BalanceLessThanBridged", "inputs": [] }, + { "type": "error", "name": "InsufficientNativeFee", "inputs": [] }, + { "type": "error", "name": "InvalidBridgeStorage", "inputs": [] }, + { "type": "error", "name": "InvalidDelegate", "inputs": [] }, + { "type": "error", "name": "InvalidEndpointCall", "inputs": [] }, + { "type": "error", "name": "InvalidGasLimit", "inputs": [] }, + { + "type": "error", + "name": "InvalidOptionType", + "inputs": [{ "name": "optionType", "type": "uint16", "internalType": "uint16" }] + }, + { "type": "error", "name": "LzTokenUnavailable", "inputs": [] }, + { "type": "error", "name": "NoDelta", "inputs": [] }, + { + "type": "error", + "name": "NoPeer", + "inputs": [{ "name": "eid", "type": "uint32", "internalType": "uint32" }] + }, + { + "type": "error", + "name": "NotEnoughNative", + "inputs": [{ "name": "msgValue", "type": "uint256", "internalType": "uint256" }] + }, + { + "type": "error", + "name": "OnlyPeer", + "inputs": [ + { "name": "eid", "type": "uint32", "internalType": "uint32" }, + { "name": "sender", "type": "bytes32", "internalType": "bytes32" } + ] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [{ "name": "owner", "type": "address", "internalType": "address" }] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [{ "name": "account", "type": "address", "internalType": "address" }] + }, + { "type": "error", "name": "RecipientZero", "inputs": [] }, + { "type": "error", "name": "ReentrancyGuardReentrantCall", "inputs": [] }, + { + "type": "error", + "name": "SafeCastOverflowedUintDowncast", + "inputs": [ + { "name": "bits", "type": "uint8", "internalType": "uint8" }, + { "name": "value", "type": "uint256", "internalType": "uint256" } + ] + }, + { + "type": "error", + "name": "SafeERC20FailedOperation", + "inputs": [{ "name": "token", "type": "address", "internalType": "address" }] + } + ], + "bytecode": { + "object": "0x60e060405262030d4060045f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555034801561004a575f5ffd5b50604051612905380380612905833981810160405281019061006c91906103a4565b8484845f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100df575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100d6919061042a565b60405180910390fd5b6100ee8161024c60201b60201c565b508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610188576040517fb586360400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60805173ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b81526004016101c3919061042a565b5f604051808303815f87803b1580156101da575f5ffd5b505af11580156101ec573d5f5f3e3d5ffd5b50505050505060016002819055508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508063ffffffff1660c08163ffffffff16815250505050505050610443565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61033a82610311565b9050919050565b61034a81610330565b8114610354575f5ffd5b50565b5f8151905061036581610341565b92915050565b5f63ffffffff82169050919050565b6103838161036b565b811461038d575f5ffd5b50565b5f8151905061039e8161037a565b92915050565b5f5f5f5f5f60a086880312156103bd576103bc61030d565b5b5f6103ca88828901610357565b95505060206103db88828901610357565b94505060406103ec88828901610357565b93505060606103fd88828901610357565b925050608061040e88828901610390565b9150509295509295909350565b61042481610330565b82525050565b5f60208201905061043d5f83018461041b565b92915050565b60805160a05160c05161246761049e5f395f81816104a40152818161061d015261068901525f610c9c01525f818161073b015281816109cf01528181610eaa01528181610ff801528181611327015261141f01526124675ff3fe6080604052600436106100f2575f3560e01c80639a9f2e0611610089578063d3d8257811610058578063d3d82578146102e9578063ee0b544514610313578063f2fde38b1461033b578063f68016b714610363576100f2565b80639a9f2e0614610235578063a1da9dae1461025d578063bb0b6a5314610285578063ca5eb5e1146102c1576100f2565b80635c6d3da4116100c55780635c6d3da4146101af5780635e280f11146101cb578063715018a6146101f55780638da5cb5b1461020b576100f2565b806317442b70146100f65780633400288b14610121578063348f020914610149578063472fa44314610185575b5f5ffd5b348015610101575f5ffd5b5061010a61038d565b6040516101189291906117d0565b60405180910390f35b34801561012c575f5ffd5b5061014760048036038101906101429190611870565b61039a565b005b348015610154575f5ffd5b5061016f600480360381019061016a9190611908565b6103b0565b60405161017c919061194b565b60405180910390f35b348015610190575f5ffd5b50610199610451565b6040516101a691906119a0565b60405180910390f35b6101c960048036038101906101c49190611908565b6104d3565b005b3480156101d6575f5ffd5b506101df610739565b6040516101ec9190611a14565b60405180910390f35b348015610200575f5ffd5b5061020961075d565b005b348015610216575f5ffd5b5061021f610770565b60405161022c9190611a3c565b60405180910390f35b348015610240575f5ffd5b5061025b60048036038101906102569190611908565b610797565b005b348015610268575f5ffd5b50610283600480360381019061027e9190611a9a565b6108c7565b005b348015610290575f5ffd5b506102ab60048036038101906102a69190611ac5565b6109b0565b6040516102b89190611aff565b60405180910390f35b3480156102cc575f5ffd5b506102e760048036038101906102e29190611908565b6109c5565b005b3480156102f4575f5ffd5b506102fd610a56565b60405161030a9190611b38565b60405180910390f35b34801561031e575f5ffd5b5061033960048036038101906103349190611908565b610a7b565b005b348015610346575f5ffd5b50610361600480360381019061035c9190611908565b610b0d565b005b34801561036e575f5ffd5b50610377610b91565b6040516103849190611b60565b60405180910390f35b5f5f60015f915091509091565b6103a2610bb2565b6103ac8282610c39565b5050565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b7b8ceb3836040518263ffffffff1660e01b815260040161040b9190611a3c565b602060405180830381865afa158015610426573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044a9190611ba3565b9050919050565b610459611767565b5f610462610c98565b9150505f600182610471610e63565b60405160200161048393929190611bce565b60405160208183030381529060405290505f61049d610e6a565b90506104cb7f000000000000000000000000000000000000000000000000000000000000000083835f610ea0565b935050505090565b6104db610f81565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610540576040517f3d9eb1db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f61054a610c98565b9150915060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0f444b8610593610e63565b846040518363ffffffff1660e01b81526004016105b1929190611c03565b5f604051808303815f87803b1580156105c8575f5ffd5b505af11580156105da573d5f5f3e3d5ffd5b505050505f83826105e9610e63565b6040516020016105fb93929190611bce565b60405160208183030381529060405290505f610615610e6a565b90505f6106447f000000000000000000000000000000000000000000000000000000000000000084845f610ea0565b9050805f0151341015610683576040517f9c92bdfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6106b87f00000000000000000000000000000000000000000000000000000000000000008585856106b3610e63565b610fc5565b90506106c2610e63565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fb7a8fd64ccf9bc14113db8da652400c70061bba546c0732c14823138cffc62ed8784604051610720929190611cb5565b60405180910390a35050505050506107366110db565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b610765610bb2565b61076e5f6110e5565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61079f610bb2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610804576040517f8848062300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f939d27c079a71a72f299a5c806b3bb461e220e2b010c26ed2769771ff64dd08d60405160405180910390a35050565b6108cf610bb2565b5f816fffffffffffffffffffffffffffffffff161161091a576040517f98bdb2e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60045f9054906101000a90046fffffffffffffffffffffffffffffffff1690508160045f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f89200afd487aab0afaac512be478a60dc59fa2ac8c0a50d3ccd0cd252ed7ee5781836040516109a4929190611cdc565b60405180910390a15050565b6001602052805f5260405f205f915090505481565b6109cd610bb2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b8152600401610a269190611a3c565b5f604051808303815f87803b158015610a3d575f5ffd5b505af1158015610a4f573d5f5f3e3d5ffd5b5050505050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a83610bb2565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ee0b5445826040518263ffffffff1660e01b8152600401610add9190611a3c565b5f604051808303815f87803b158015610af4575f5ffd5b505af1158015610b06573d5f5f3e3d5ffd5b5050505050565b610b15610bb2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b85575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610b7c9190611a3c565b60405180910390fd5b610b8e816110e5565b50565b60045f9054906101000a90046fffffffffffffffffffffffffffffffff1681565b610bba610e63565b73ffffffffffffffffffffffffffffffffffffffff16610bd8610770565b73ffffffffffffffffffffffffffffffffffffffff1614610c3757610bfb610e63565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610c2e9190611a3c565b60405180910390fd5b565b8060015f8463ffffffff1663ffffffff1681526020019081526020015f20819055507f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b8282604051610c8c929190611d12565b60405180910390a15050565b5f5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231610cde610e63565b6040518263ffffffff1660e01b8152600401610cfa9190611a3c565b602060405180830381865afa158015610d15573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d399190611ba3565b91505f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b7b8ceb3610d81610e63565b6040518263ffffffff1660e01b8152600401610d9d9190611a3c565b602060405180830381865afa158015610db8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611ba3565b9050808311610e17576040517f506c1ba700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8083610e239190611d66565b91505f8211610e5e576040517f02f4cd1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b509091565b5f33905090565b6060610e9b610e776111a6565b60045f9054906101000a90046fffffffffffffffffffffffffffffffff165f6111ce565b905090565b610ea8611767565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ddc28c586040518060a001604052808863ffffffff168152602001610f0489611266565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b8152600401610f39929190611eac565b6040805180830381865afa158015610f53573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f779190611fa3565b9050949350505050565b6002805403610fbc576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028081905550565b610fcd61177f565b5f610fda845f01516112d7565b90505f84602001511115610ff657610ff58460200151611324565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632637a450826040518060a001604052808b63ffffffff1681526020016110538c611266565b81526020018a81526020018981526020015f8960200151111515815250866040518463ffffffff1660e01b815260040161108e929190611eac565b60806040518083038185885af11580156110aa573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906110cf919061206d565b91505095945050505050565b6001600281905550565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606060036040516020016111ba91906120d9565b604051602081830303815290604052905090565b606083600361ffff166111ea5f8361146a90919063ffffffff16565b61ffff1614611242576112065f8261146a90919063ffffffff16565b6040517f3a51740d0000000000000000000000000000000000000000000000000000000081526004016112399190612102565b60405180910390fd5b5f61124d85856114cf565b905061125b8660018361153a565b925050509392505050565b5f5f60015f8463ffffffff1663ffffffff1681526020019081526020015f205490505f5f1b81036112ce57826040517ff6ff4fb70000000000000000000000000000000000000000000000000000000081526004016112c5919061211b565b60405180910390fd5b80915050919050565b5f81341461131c57346040517f9f704120000000000000000000000000000000000000000000000000000000008152600401611313919061194b565b60405180910390fd5b819050919050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa15801561138e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b29190612148565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611419576040517f5373352a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611466337f0000000000000000000000000000000000000000000000000000000000000000848473ffffffffffffffffffffffffffffffffffffffff166115f5909392919063ffffffff16565b5050565b5f6002826114789190612173565b835110156114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290612200565b60405180910390fd5b5f8260028501015190508091505092915050565b60605f826fffffffffffffffffffffffffffffffff16146115115782826040516020016114fd929190612252565b604051602081830303815290604052611532565b82604051602001611522919061227d565b6040516020818303038152906040525b905092915050565b606083600361ffff166115565f8361146a90919063ffffffff16565b61ffff16146115ae576115725f8261146a90919063ffffffff16565b6040517f3a51740d0000000000000000000000000000000000000000000000000000000081526004016115a59190612102565b60405180910390fd5b846001806115bc8651611677565b6115c69190612297565b86866040516020016115dc959493929190612346565b6040516020818303038152906040529150509392505050565b611671848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161162a9392919061239c565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506116cc565b50505050565b5f61ffff80168211156116c4576010826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016116bb92919061240a565b60405180910390fd5b819050919050565b5f5f60205f8451602086015f885af1806116eb576040513d5f823e3d81fd5b3d92505f519150505f821461170457600181141561171f565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561176157836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016117589190611a3c565b60405180910390fd5b50505050565b60405180604001604052805f81526020015f81525090565b60405180606001604052805f81526020015f67ffffffffffffffff1681526020016117a8611767565b81525090565b5f67ffffffffffffffff82169050919050565b6117ca816117ae565b82525050565b5f6040820190506117e35f8301856117c1565b6117f060208301846117c1565b9392505050565b5f604051905090565b5f5ffd5b5f63ffffffff82169050919050565b61181c81611804565b8114611826575f5ffd5b50565b5f8135905061183781611813565b92915050565b5f819050919050565b61184f8161183d565b8114611859575f5ffd5b50565b5f8135905061186a81611846565b92915050565b5f5f6040838503121561188657611885611800565b5b5f61189385828601611829565b92505060206118a48582860161185c565b9150509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6118d7826118ae565b9050919050565b6118e7816118cd565b81146118f1575f5ffd5b50565b5f81359050611902816118de565b92915050565b5f6020828403121561191d5761191c611800565b5b5f61192a848285016118f4565b91505092915050565b5f819050919050565b61194581611933565b82525050565b5f60208201905061195e5f83018461193c565b92915050565b61196d81611933565b82525050565b604082015f8201516119875f850182611964565b50602082015161199a6020850182611964565b50505050565b5f6040820190506119b35f830184611973565b92915050565b5f819050919050565b5f6119dc6119d76119d2846118ae565b6119b9565b6118ae565b9050919050565b5f6119ed826119c2565b9050919050565b5f6119fe826119e3565b9050919050565b611a0e816119f4565b82525050565b5f602082019050611a275f830184611a05565b92915050565b611a36816118cd565b82525050565b5f602082019050611a4f5f830184611a2d565b92915050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b611a7981611a55565b8114611a83575f5ffd5b50565b5f81359050611a9481611a70565b92915050565b5f60208284031215611aaf57611aae611800565b5b5f611abc84828501611a86565b91505092915050565b5f60208284031215611ada57611ad9611800565b5b5f611ae784828501611829565b91505092915050565b611af98161183d565b82525050565b5f602082019050611b125f830184611af0565b92915050565b5f611b22826119e3565b9050919050565b611b3281611b18565b82525050565b5f602082019050611b4b5f830184611b29565b92915050565b611b5a81611a55565b82525050565b5f602082019050611b735f830184611b51565b92915050565b611b8281611933565b8114611b8c575f5ffd5b50565b5f81519050611b9d81611b79565b92915050565b5f60208284031215611bb857611bb7611800565b5b5f611bc584828501611b8f565b91505092915050565b5f606082019050611be15f830186611a2d565b611bee602083018561193c565b611bfb6040830184611a2d565b949350505050565b5f604082019050611c165f830185611a2d565b611c23602083018461193c565b9392505050565b611c338161183d565b82525050565b611c42816117ae565b82525050565b604082015f820151611c5c5f850182611964565b506020820151611c6f6020850182611964565b50505050565b608082015f820151611c895f850182611c2a565b506020820151611c9c6020850182611c39565b506040820151611caf6040850182611c48565b50505050565b5f60a082019050611cc85f83018561193c565b611cd56020830184611c75565b9392505050565b5f604082019050611cef5f830185611b51565b611cfc6020830184611b51565b9392505050565b611d0c81611804565b82525050565b5f604082019050611d255f830185611d03565b611d326020830184611af0565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611d7082611933565b9150611d7b83611933565b9250828203905081811115611d9357611d92611d39565b5b92915050565b611da281611804565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611dea82611da8565b611df48185611db2565b9350611e04818560208601611dc2565b611e0d81611dd0565b840191505092915050565b5f8115159050919050565b611e2c81611e18565b82525050565b5f60a083015f830151611e475f860182611d99565b506020830151611e5a6020860182611c2a565b5060408301518482036040860152611e728282611de0565b91505060608301518482036060860152611e8c8282611de0565b9150506080830151611ea16080860182611e23565b508091505092915050565b5f6040820190508181035f830152611ec48185611e32565b9050611ed36020830184611a2d565b9392505050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611f1482611dd0565b810181811067ffffffffffffffff82111715611f3357611f32611ede565b5b80604052505050565b5f611f456117f7565b9050611f518282611f0b565b919050565b5f60408284031215611f6b57611f6a611eda565b5b611f756040611f3c565b90505f611f8484828501611b8f565b5f830152506020611f9784828501611b8f565b60208301525092915050565b5f60408284031215611fb857611fb7611800565b5b5f611fc584828501611f56565b91505092915050565b5f81519050611fdc81611846565b92915050565b611feb816117ae565b8114611ff5575f5ffd5b50565b5f8151905061200681611fe2565b92915050565b5f6080828403121561202157612020611eda565b5b61202b6060611f3c565b90505f61203a84828501611fce565b5f83015250602061204d84828501611ff8565b602083015250604061206184828501611f56565b60408301525092915050565b5f6080828403121561208257612081611800565b5b5f61208f8482850161200c565b91505092915050565b5f61ffff82169050919050565b5f8160f01b9050919050565b5f6120bb826120a5565b9050919050565b6120d36120ce82612098565b6120b1565b82525050565b5f6120e482846120c2565b60028201915081905092915050565b6120fc81612098565b82525050565b5f6020820190506121155f8301846120f3565b92915050565b5f60208201905061212e5f830184611d03565b92915050565b5f81519050612142816118de565b92915050565b5f6020828403121561215d5761215c611800565b5b5f61216a84828501612134565b91505092915050565b5f61217d82611933565b915061218883611933565b92508282019050808211156121a05761219f611d39565b5b92915050565b5f82825260208201905092915050565b7f746f55696e7431365f6f75744f66426f756e64730000000000000000000000005f82015250565b5f6121ea6014836121a6565b91506121f5826121b6565b602082019050919050565b5f6020820190508181035f830152612217816121de565b9050919050565b5f8160801b9050919050565b5f6122348261221e565b9050919050565b61224c61224782611a55565b61222a565b82525050565b5f61225d828561223b565b60108201915061226d828461223b565b6010820191508190509392505050565b5f612288828461223b565b60108201915081905092915050565b5f6122a182612098565b91506122ac83612098565b9250828201905061ffff8111156122c6576122c5611d39565b5b92915050565b5f81905092915050565b5f6122e082611da8565b6122ea81856122cc565b93506122fa818560208601611dc2565b80840191505092915050565b5f60ff82169050919050565b5f8160f81b9050919050565b5f61232882612312565b9050919050565b61234061233b82612306565b61231e565b82525050565b5f61235182886122d6565b915061235d828761232f565b60018201915061236d82866120c2565b60028201915061237d828561232f565b60018201915061238d82846122d6565b91508190509695505050505050565b5f6060820190506123af5f830186611a2d565b6123bc6020830185611a2d565b6123c9604083018461193c565b949350505050565b5f819050919050565b5f6123f46123ef6123ea846123d1565b6119b9565b612306565b9050919050565b612404816123da565b82525050565b5f60408201905061241d5f8301856123fb565b61242a602083018461193c565b939250505056fea2646970667358221220c199f933b43749b8c30c8c9f8fed618e992ae8a5e2b6f7e46f59abaa98fd9ed564736f6c634300081e0033", + "sourceMap": "764:3779:50:-:0;;;1016:6;990:32;;;;;;;;;;;;;;;;;;;;1029:306;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1144:9;1155;1182:6;1297:1:37;1273:26;;:12;:26;;;1269:95;;1350:1;1322:31;;;;;;;;;;;:::i;:::-;;;;;;;;1269:95;1373:32;1392:12;1373:18;;;:32;;:::i;:::-;1225:187;1079:9:2;1047:42;;;;;;;;;;1125:1;1104:23;;:9;:23;;;1100:53;;1136:17;;;;;;;;;;;;;;1100:53;1163:8;;:20;;;1184:9;1163:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;987:214;;1857:1:44;2061:7;:21;;;;1219:6:50::2;1204:22;;;;;;;;::::0;::::2;1321:7;1311:17;;;;;;;;::::0;::::2;1029:306:::0;;;;;764:3779;;2912:187:37;2985:16;3004:6;;;;;;;;;;;2985:25;;3029:8;3020:6;;:17;;;;;;;;;;;;;;;;;;3083:8;3052:40;;3073:8;3052:40;;;;;;;;;;;;2975:124;2912:187;:::o;88:117:59:-;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:143::-;753:5;784:6;778:13;769:22;;800:33;827:5;800:33;:::i;:::-;696:143;;;;:::o;845:93::-;881:7;921:10;914:5;910:22;899:33;;845:93;;;:::o;944:120::-;1016:23;1033:5;1016:23;:::i;:::-;1009:5;1006:34;996:62;;1054:1;1051;1044:12;996:62;944:120;:::o;1070:141::-;1126:5;1157:6;1151:13;1142:22;;1173:32;1199:5;1173:32;:::i;:::-;1070:141;;;;:::o;1217:975::-;1322:6;1330;1338;1346;1354;1403:3;1391:9;1382:7;1378:23;1374:33;1371:120;;;1410:79;;:::i;:::-;1371:120;1530:1;1555:64;1611:7;1602:6;1591:9;1587:22;1555:64;:::i;:::-;1545:74;;1501:128;1668:2;1694:64;1750:7;1741:6;1730:9;1726:22;1694:64;:::i;:::-;1684:74;;1639:129;1807:2;1833:64;1889:7;1880:6;1869:9;1865:22;1833:64;:::i;:::-;1823:74;;1778:129;1946:2;1972:64;2028:7;2019:6;2008:9;2004:22;1972:64;:::i;:::-;1962:74;;1917:129;2085:3;2112:63;2167:7;2158:6;2147:9;2143:22;2112:63;:::i;:::-;2102:73;;2056:129;1217:975;;;;;;;;:::o;2198:118::-;2285:24;2303:5;2285:24;:::i;:::-;2280:3;2273:37;2198:118;;:::o;2322:222::-;2415:4;2453:2;2442:9;2438:18;2430:26;;2466:71;2534:1;2523:9;2519:17;2510:6;2466:71;:::i;:::-;2322:222;;;;:::o;764:3779:50:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", + "linkReferences": {} + }, + "deployedBytecode": { + "object": "0x6080604052600436106100f2575f3560e01c80639a9f2e0611610089578063d3d8257811610058578063d3d82578146102e9578063ee0b544514610313578063f2fde38b1461033b578063f68016b714610363576100f2565b80639a9f2e0614610235578063a1da9dae1461025d578063bb0b6a5314610285578063ca5eb5e1146102c1576100f2565b80635c6d3da4116100c55780635c6d3da4146101af5780635e280f11146101cb578063715018a6146101f55780638da5cb5b1461020b576100f2565b806317442b70146100f65780633400288b14610121578063348f020914610149578063472fa44314610185575b5f5ffd5b348015610101575f5ffd5b5061010a61038d565b6040516101189291906117d0565b60405180910390f35b34801561012c575f5ffd5b5061014760048036038101906101429190611870565b61039a565b005b348015610154575f5ffd5b5061016f600480360381019061016a9190611908565b6103b0565b60405161017c919061194b565b60405180910390f35b348015610190575f5ffd5b50610199610451565b6040516101a691906119a0565b60405180910390f35b6101c960048036038101906101c49190611908565b6104d3565b005b3480156101d6575f5ffd5b506101df610739565b6040516101ec9190611a14565b60405180910390f35b348015610200575f5ffd5b5061020961075d565b005b348015610216575f5ffd5b5061021f610770565b60405161022c9190611a3c565b60405180910390f35b348015610240575f5ffd5b5061025b60048036038101906102569190611908565b610797565b005b348015610268575f5ffd5b50610283600480360381019061027e9190611a9a565b6108c7565b005b348015610290575f5ffd5b506102ab60048036038101906102a69190611ac5565b6109b0565b6040516102b89190611aff565b60405180910390f35b3480156102cc575f5ffd5b506102e760048036038101906102e29190611908565b6109c5565b005b3480156102f4575f5ffd5b506102fd610a56565b60405161030a9190611b38565b60405180910390f35b34801561031e575f5ffd5b5061033960048036038101906103349190611908565b610a7b565b005b348015610346575f5ffd5b50610361600480360381019061035c9190611908565b610b0d565b005b34801561036e575f5ffd5b50610377610b91565b6040516103849190611b60565b60405180910390f35b5f5f60015f915091509091565b6103a2610bb2565b6103ac8282610c39565b5050565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b7b8ceb3836040518263ffffffff1660e01b815260040161040b9190611a3c565b602060405180830381865afa158015610426573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044a9190611ba3565b9050919050565b610459611767565b5f610462610c98565b9150505f600182610471610e63565b60405160200161048393929190611bce565b60405160208183030381529060405290505f61049d610e6a565b90506104cb7f000000000000000000000000000000000000000000000000000000000000000083835f610ea0565b935050505090565b6104db610f81565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610540576040517f3d9eb1db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f61054a610c98565b9150915060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0f444b8610593610e63565b846040518363ffffffff1660e01b81526004016105b1929190611c03565b5f604051808303815f87803b1580156105c8575f5ffd5b505af11580156105da573d5f5f3e3d5ffd5b505050505f83826105e9610e63565b6040516020016105fb93929190611bce565b60405160208183030381529060405290505f610615610e6a565b90505f6106447f000000000000000000000000000000000000000000000000000000000000000084845f610ea0565b9050805f0151341015610683576040517f9c92bdfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6106b87f00000000000000000000000000000000000000000000000000000000000000008585856106b3610e63565b610fc5565b90506106c2610e63565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fb7a8fd64ccf9bc14113db8da652400c70061bba546c0732c14823138cffc62ed8784604051610720929190611cb5565b60405180910390a35050505050506107366110db565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b610765610bb2565b61076e5f6110e5565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61079f610bb2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610804576040517f8848062300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f939d27c079a71a72f299a5c806b3bb461e220e2b010c26ed2769771ff64dd08d60405160405180910390a35050565b6108cf610bb2565b5f816fffffffffffffffffffffffffffffffff161161091a576040517f98bdb2e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60045f9054906101000a90046fffffffffffffffffffffffffffffffff1690508160045f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f89200afd487aab0afaac512be478a60dc59fa2ac8c0a50d3ccd0cd252ed7ee5781836040516109a4929190611cdc565b60405180910390a15050565b6001602052805f5260405f205f915090505481565b6109cd610bb2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b8152600401610a269190611a3c565b5f604051808303815f87803b158015610a3d575f5ffd5b505af1158015610a4f573d5f5f3e3d5ffd5b5050505050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a83610bb2565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ee0b5445826040518263ffffffff1660e01b8152600401610add9190611a3c565b5f604051808303815f87803b158015610af4575f5ffd5b505af1158015610b06573d5f5f3e3d5ffd5b5050505050565b610b15610bb2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b85575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610b7c9190611a3c565b60405180910390fd5b610b8e816110e5565b50565b60045f9054906101000a90046fffffffffffffffffffffffffffffffff1681565b610bba610e63565b73ffffffffffffffffffffffffffffffffffffffff16610bd8610770565b73ffffffffffffffffffffffffffffffffffffffff1614610c3757610bfb610e63565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610c2e9190611a3c565b60405180910390fd5b565b8060015f8463ffffffff1663ffffffff1681526020019081526020015f20819055507f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b8282604051610c8c929190611d12565b60405180910390a15050565b5f5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231610cde610e63565b6040518263ffffffff1660e01b8152600401610cfa9190611a3c565b602060405180830381865afa158015610d15573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d399190611ba3565b91505f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b7b8ceb3610d81610e63565b6040518263ffffffff1660e01b8152600401610d9d9190611a3c565b602060405180830381865afa158015610db8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611ba3565b9050808311610e17576040517f506c1ba700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8083610e239190611d66565b91505f8211610e5e576040517f02f4cd1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b509091565b5f33905090565b6060610e9b610e776111a6565b60045f9054906101000a90046fffffffffffffffffffffffffffffffff165f6111ce565b905090565b610ea8611767565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ddc28c586040518060a001604052808863ffffffff168152602001610f0489611266565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b8152600401610f39929190611eac565b6040805180830381865afa158015610f53573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f779190611fa3565b9050949350505050565b6002805403610fbc576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028081905550565b610fcd61177f565b5f610fda845f01516112d7565b90505f84602001511115610ff657610ff58460200151611324565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632637a450826040518060a001604052808b63ffffffff1681526020016110538c611266565b81526020018a81526020018981526020015f8960200151111515815250866040518463ffffffff1660e01b815260040161108e929190611eac565b60806040518083038185885af11580156110aa573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906110cf919061206d565b91505095945050505050565b6001600281905550565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606060036040516020016111ba91906120d9565b604051602081830303815290604052905090565b606083600361ffff166111ea5f8361146a90919063ffffffff16565b61ffff1614611242576112065f8261146a90919063ffffffff16565b6040517f3a51740d0000000000000000000000000000000000000000000000000000000081526004016112399190612102565b60405180910390fd5b5f61124d85856114cf565b905061125b8660018361153a565b925050509392505050565b5f5f60015f8463ffffffff1663ffffffff1681526020019081526020015f205490505f5f1b81036112ce57826040517ff6ff4fb70000000000000000000000000000000000000000000000000000000081526004016112c5919061211b565b60405180910390fd5b80915050919050565b5f81341461131c57346040517f9f704120000000000000000000000000000000000000000000000000000000008152600401611313919061194b565b60405180910390fd5b819050919050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa15801561138e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b29190612148565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611419576040517f5373352a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611466337f0000000000000000000000000000000000000000000000000000000000000000848473ffffffffffffffffffffffffffffffffffffffff166115f5909392919063ffffffff16565b5050565b5f6002826114789190612173565b835110156114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290612200565b60405180910390fd5b5f8260028501015190508091505092915050565b60605f826fffffffffffffffffffffffffffffffff16146115115782826040516020016114fd929190612252565b604051602081830303815290604052611532565b82604051602001611522919061227d565b6040516020818303038152906040525b905092915050565b606083600361ffff166115565f8361146a90919063ffffffff16565b61ffff16146115ae576115725f8261146a90919063ffffffff16565b6040517f3a51740d0000000000000000000000000000000000000000000000000000000081526004016115a59190612102565b60405180910390fd5b846001806115bc8651611677565b6115c69190612297565b86866040516020016115dc959493929190612346565b6040516020818303038152906040529150509392505050565b611671848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161162a9392919061239c565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506116cc565b50505050565b5f61ffff80168211156116c4576010826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016116bb92919061240a565b60405180910390fd5b819050919050565b5f5f60205f8451602086015f885af1806116eb576040513d5f823e3d81fd5b3d92505f519150505f821461170457600181141561171f565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561176157836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016117589190611a3c565b60405180910390fd5b50505050565b60405180604001604052805f81526020015f81525090565b60405180606001604052805f81526020015f67ffffffffffffffff1681526020016117a8611767565b81525090565b5f67ffffffffffffffff82169050919050565b6117ca816117ae565b82525050565b5f6040820190506117e35f8301856117c1565b6117f060208301846117c1565b9392505050565b5f604051905090565b5f5ffd5b5f63ffffffff82169050919050565b61181c81611804565b8114611826575f5ffd5b50565b5f8135905061183781611813565b92915050565b5f819050919050565b61184f8161183d565b8114611859575f5ffd5b50565b5f8135905061186a81611846565b92915050565b5f5f6040838503121561188657611885611800565b5b5f61189385828601611829565b92505060206118a48582860161185c565b9150509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6118d7826118ae565b9050919050565b6118e7816118cd565b81146118f1575f5ffd5b50565b5f81359050611902816118de565b92915050565b5f6020828403121561191d5761191c611800565b5b5f61192a848285016118f4565b91505092915050565b5f819050919050565b61194581611933565b82525050565b5f60208201905061195e5f83018461193c565b92915050565b61196d81611933565b82525050565b604082015f8201516119875f850182611964565b50602082015161199a6020850182611964565b50505050565b5f6040820190506119b35f830184611973565b92915050565b5f819050919050565b5f6119dc6119d76119d2846118ae565b6119b9565b6118ae565b9050919050565b5f6119ed826119c2565b9050919050565b5f6119fe826119e3565b9050919050565b611a0e816119f4565b82525050565b5f602082019050611a275f830184611a05565b92915050565b611a36816118cd565b82525050565b5f602082019050611a4f5f830184611a2d565b92915050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b611a7981611a55565b8114611a83575f5ffd5b50565b5f81359050611a9481611a70565b92915050565b5f60208284031215611aaf57611aae611800565b5b5f611abc84828501611a86565b91505092915050565b5f60208284031215611ada57611ad9611800565b5b5f611ae784828501611829565b91505092915050565b611af98161183d565b82525050565b5f602082019050611b125f830184611af0565b92915050565b5f611b22826119e3565b9050919050565b611b3281611b18565b82525050565b5f602082019050611b4b5f830184611b29565b92915050565b611b5a81611a55565b82525050565b5f602082019050611b735f830184611b51565b92915050565b611b8281611933565b8114611b8c575f5ffd5b50565b5f81519050611b9d81611b79565b92915050565b5f60208284031215611bb857611bb7611800565b5b5f611bc584828501611b8f565b91505092915050565b5f606082019050611be15f830186611a2d565b611bee602083018561193c565b611bfb6040830184611a2d565b949350505050565b5f604082019050611c165f830185611a2d565b611c23602083018461193c565b9392505050565b611c338161183d565b82525050565b611c42816117ae565b82525050565b604082015f820151611c5c5f850182611964565b506020820151611c6f6020850182611964565b50505050565b608082015f820151611c895f850182611c2a565b506020820151611c9c6020850182611c39565b506040820151611caf6040850182611c48565b50505050565b5f60a082019050611cc85f83018561193c565b611cd56020830184611c75565b9392505050565b5f604082019050611cef5f830185611b51565b611cfc6020830184611b51565b9392505050565b611d0c81611804565b82525050565b5f604082019050611d255f830185611d03565b611d326020830184611af0565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611d7082611933565b9150611d7b83611933565b9250828203905081811115611d9357611d92611d39565b5b92915050565b611da281611804565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611dea82611da8565b611df48185611db2565b9350611e04818560208601611dc2565b611e0d81611dd0565b840191505092915050565b5f8115159050919050565b611e2c81611e18565b82525050565b5f60a083015f830151611e475f860182611d99565b506020830151611e5a6020860182611c2a565b5060408301518482036040860152611e728282611de0565b91505060608301518482036060860152611e8c8282611de0565b9150506080830151611ea16080860182611e23565b508091505092915050565b5f6040820190508181035f830152611ec48185611e32565b9050611ed36020830184611a2d565b9392505050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611f1482611dd0565b810181811067ffffffffffffffff82111715611f3357611f32611ede565b5b80604052505050565b5f611f456117f7565b9050611f518282611f0b565b919050565b5f60408284031215611f6b57611f6a611eda565b5b611f756040611f3c565b90505f611f8484828501611b8f565b5f830152506020611f9784828501611b8f565b60208301525092915050565b5f60408284031215611fb857611fb7611800565b5b5f611fc584828501611f56565b91505092915050565b5f81519050611fdc81611846565b92915050565b611feb816117ae565b8114611ff5575f5ffd5b50565b5f8151905061200681611fe2565b92915050565b5f6080828403121561202157612020611eda565b5b61202b6060611f3c565b90505f61203a84828501611fce565b5f83015250602061204d84828501611ff8565b602083015250604061206184828501611f56565b60408301525092915050565b5f6080828403121561208257612081611800565b5b5f61208f8482850161200c565b91505092915050565b5f61ffff82169050919050565b5f8160f01b9050919050565b5f6120bb826120a5565b9050919050565b6120d36120ce82612098565b6120b1565b82525050565b5f6120e482846120c2565b60028201915081905092915050565b6120fc81612098565b82525050565b5f6020820190506121155f8301846120f3565b92915050565b5f60208201905061212e5f830184611d03565b92915050565b5f81519050612142816118de565b92915050565b5f6020828403121561215d5761215c611800565b5b5f61216a84828501612134565b91505092915050565b5f61217d82611933565b915061218883611933565b92508282019050808211156121a05761219f611d39565b5b92915050565b5f82825260208201905092915050565b7f746f55696e7431365f6f75744f66426f756e64730000000000000000000000005f82015250565b5f6121ea6014836121a6565b91506121f5826121b6565b602082019050919050565b5f6020820190508181035f830152612217816121de565b9050919050565b5f8160801b9050919050565b5f6122348261221e565b9050919050565b61224c61224782611a55565b61222a565b82525050565b5f61225d828561223b565b60108201915061226d828461223b565b6010820191508190509392505050565b5f612288828461223b565b60108201915081905092915050565b5f6122a182612098565b91506122ac83612098565b9250828201905061ffff8111156122c6576122c5611d39565b5b92915050565b5f81905092915050565b5f6122e082611da8565b6122ea81856122cc565b93506122fa818560208601611dc2565b80840191505092915050565b5f60ff82169050919050565b5f8160f81b9050919050565b5f61232882612312565b9050919050565b61234061233b82612306565b61231e565b82525050565b5f61235182886122d6565b915061235d828761232f565b60018201915061236d82866120c2565b60028201915061237d828561232f565b60018201915061238d82846122d6565b91508190509695505050505050565b5f6060820190506123af5f830186611a2d565b6123bc6020830185611a2d565b6123c9604083018461193c565b949350505050565b5f819050919050565b5f6123f46123ef6123ea846123d1565b6119b9565b612306565b9050919050565b612404816123da565b82525050565b5f60408201905061241d5f8301856123fb565b61242a602083018461193c565b939250505056fea2646970667358221220c199f933b43749b8c30c8c9f8fed618e992ae8a5e2b6f7e46f59abaa98fd9ed564736f6c634300081e0033", + "sourceMap": "764:3779:50:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1358:141:4;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1724:108:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1845:129:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2093:317;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2883:953;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;446:46:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2293:101:37;;;;;;;;;;;;;:::i;:::-;;1638:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2416:319:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1604:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;569:48:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3252:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;949:35:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2741:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2543:215:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;990:32:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1358:141:4;1410:20;1432:22;843:1;1490;1466:26;;;;1358:141;;:::o;1724:108:2:-;1531:13:37;:11;:13::i;:::-;1804:21:2::1;1813:4;1819:5;1804:8;:21::i;:::-;1724:108:::0;;:::o;1845:129:50:-;1905:7;1931:13;;;;;;;;;;;:30;;;1962:4;1931:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1924:43;;1845:129;;;:::o;2093:317::-;2139:23;;:::i;:::-;2177:13;2194:21;:19;:21::i;:::-;2174:41;;;2226:20;2268:1;2272:5;2279:12;:10;:12::i;:::-;2249:43;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2226:66;;2302:20;2325;:18;:20::i;:::-;2302:43;;2363:40;2370:7;2379;2388;2397:5;2363:6;:40::i;:::-;2356:47;;;;;2093:317;:::o;2883:953::-;2500:21:44;:19;:21::i;:::-;2989:1:50::1;2968:23;;:9;:23;;::::0;2960:49:::1;;;;;;;;;;;;;;;;;3021:15;3038:13;3055:21;:19;:21::i;:::-;3020:56;;;;3086:13;;;;;;;;;;;:30;;;3117:12;:10;:12::i;:::-;3131:7;3086:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3150:20;3184:9;3195:5;3202:12;:10;:12::i;:::-;3173:42;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3150:65;;3306:20;3329;:18;:20::i;:::-;3306:43;;3359:23;3385:61;3392:7;3401;3410;3419:5;3385:6;:61::i;:::-;3359:87;;3477:3;:13;;;3464:9;:26;;3456:60;;;;;;;;;;;;;;;;;3526:31;3560:198;3581:7;3602;3623;3644:3;3669:12;:10;:12::i;:::-;3560:7;:198::i;:::-;3526:232;;3807:12;:10;:12::i;:::-;3773:56;;3789:9;3773:56;;;3800:5;3821:7;3773:56;;;;;;;:::i;:::-;;;;;;;;2950:886;;;;;;2542:20:44::0;:18;:20::i;:::-;2883:953:50;:::o;446:46:2:-;;;:::o;2293:101:37:-;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;:::-;2293:101::o:0;1638:85::-;1684:7;1710:6;;;;;;;;;;;1703:13;;1638:85;:::o;2416:319:50:-;1531:13:37;:11;:13::i;:::-;2529:1:50::1;2503:28;;:14;:28;;::::0;2495:61:::1;;;;;;;;;;;;;;;;;2566:18;2595:13;;;;;;;;;;;2566:43;;2650:14;2619:13;;:46;;;;;;;;;;;;;;;;;;2713:14;2680:48;;2701:10;2680:48;;;;;;;;;;;;2485:250;2416:319:::0;:::o;1604:235::-;1531:13:37;:11;:13::i;:::-;1693:1:50::1;1681:9;:13;;;1673:41;;;;;;;;;;;;;;;;;1724:16;1743:8;;;;;;;;;;;1724:27;;1772:9;1761:8;;:20;;;;;;;;;;;;;;;;;;1796:36;1812:8;1822:9;1796:36;;;;;;;:::i;:::-;;;;;;;;1663:176;1604:235:::0;:::o;569:48:2:-;;;;;;;;;;;;;;;;;:::o;3252:105::-;1531:13:37;:11;:13::i;:::-;3319:8:2::1;:20;;;3340:9;3319:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3252:105:::0;:::o;949:35:50:-;;;;;;;;;;;;;:::o;2741:136::-;1531:13:37;:11;:13::i;:::-;2822::50::1;;;;;;;;;;;:38;;;2861:8;2822:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2741:136:::0;:::o;2543:215:37:-;1531:13;:11;:13::i;:::-;2647:1:::1;2627:22;;:8;:22;;::::0;2623:91:::1;;2700:1;2672:31;;;;;;;;;;;:::i;:::-;;;;;;;;2623:91;2723:28;2742:8;2723:18;:28::i;:::-;2543:215:::0;:::o;990:32:50:-;;;;;;;;;;;;;:::o;1796:162:37:-;1866:12;:10;:12::i;:::-;1855:23;;:7;:5;:7::i;:::-;:23;;;1851:101;;1928:12;:10;:12::i;:::-;1901:40;;;;;;;;;;;:::i;:::-;;;;;;;;1851:101;1796:162::o;2286:134:2:-;2373:5;2359;:11;2365:4;2359:11;;;;;;;;;;;;;;;:19;;;;2393:20;2401:4;2407:5;2393:20;;;;;;;:::i;:::-;;;;;;;;2286:134;;:::o;3842:340:50:-;3895:15;3912:13;3947:5;:15;;;3963:12;:10;:12::i;:::-;3947:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3937:39;;3986:12;4001:13;;;;;;;;;;;:30;;;4032:12;:10;:12::i;:::-;4001:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3986:59;;4073:4;4063:7;:14;4055:49;;;;;;;;;;;;;;;;;4132:4;4122:7;:14;;;;:::i;:::-;4114:22;;4162:1;4154:5;:9;4146:29;;;;;;;;;;;;;;;;;3927:255;3842:340;;:::o;656:96:43:-;709:7;735:10;728:17;;656:96;:::o;4368:173:50:-;4420:12;4451:83;4493:27;:25;:27::i;:::-;4522:8;;;;;;;;;;;4532:1;4451:41;:83::i;:::-;4444:90;;4368:173;:::o;2038:391:4:-;2205:23;;:::i;:::-;2259:8;:14;;;2291:86;;;;;;;;2307:7;2291:86;;;;;;2316:25;2333:7;2316:16;:25::i;:::-;2291:86;;;;2343:8;2291:86;;;;2353:8;2291:86;;;;2363:13;2291:86;;;;;2403:4;2259:163;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2240:182;;2038:391;;;;;;:::o;2575:307:44:-;1899:1;2702:7;;:18;2698:86;;2743:30;;;;;;;;;;;;;;2698:86;1899:1;2858:7;:17;;;;2575:307::o;3188:766:4:-;3389:31;;:::i;:::-;3554:20;3577:26;3588:4;:14;;;3577:10;:26::i;:::-;3554:49;;3635:1;3617:4;:15;;;:19;3613:53;;;3638:28;3650:4;:15;;;3638:11;:28::i;:::-;3613:53;3755:8;:13;;;3777:12;3809:92;;;;;;;;3825:7;3809:92;;;;;;3834:25;3851:7;3834:16;:25::i;:::-;3809:92;;;;3861:8;3809:92;;;;3871:8;3809:92;;;;3899:1;3881:4;:15;;;:19;3809:92;;;;;3919:14;3755:192;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3677:270;;;3188:766;;;;;;;:::o;2888:208:44:-;1857:1;3068:7;:21;;;;2888:208::o;2912:187:37:-;2985:16;3004:6;;;;;;;;;;;2985:25;;3029:8;3020:6;;:17;;;;;;;;;;;;;;;;;;3083:8;3052:40;;3073:8;3052:40;;;;;;;;;;;;2975:124;2912:187;:::o;1303:107:7:-;1348:12;817:1;1379:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;1372:31;;1303:107;:::o;2101:357::-;2263:12;2244:8;817:1;1068:30;;:20;1086:1;1068:8;:17;;:20;;;;:::i;:::-;:30;;;1064:82;;1125:20;1143:1;1125:8;:17;;:20;;;;:::i;:::-;1107:39;;;;;;;;;;;:::i;:::-;;;;;;;;1064:82;2287:19:::1;2309:51;2347:4;2353:6;2309:37;:51::i;:::-;2287:73;;2377:74;2395:8;294:1:16;2444:6:7;2377:17;:74::i;:::-;2370:81;;;2101:357:::0;;;;;;:::o;2718:196:2:-;2788:7;2807:12;2822:5;:11;2828:4;2822:11;;;;;;;;;;;;;;;;2807:26;;2863:1;2855:10;;2847:4;:18;2843:43;;2881:4;2874:12;;;;;;;;;;;:::i;:::-;;;;;;;;2843:43;2903:4;2896:11;;;2718:196;;;:::o;4650:191:4:-;4716:17;4762:10;4749:9;:23;4745:62;;4797:9;4781:26;;;;;;;;;;;:::i;:::-;;;;;;;;4745:62;4824:10;4817:17;;4650:191;;;:::o;5218:410::-;5371:15;5389:8;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5371:36;;5440:1;5421:21;;:7;:21;;;5417:54;;5451:20;;;;;;;;;;;;;;5417:54;5545:76;5578:10;5598:8;5609:11;5552:7;5545:32;;;;:76;;;;;;:::i;:::-;5277:351;5218:410;:::o;13100:305:47:-;13178:6;13230:1;13221:6;:10;;;;:::i;:::-;13204:6;:13;:27;;13196:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;13266:15;13355:6;13349:3;13341:6;13337:16;13333:29;13327:36;13315:48;;13390:8;13383:15;;;13100:305;;;;:::o;2968:191:16:-;3052:12;3093:1;3083:6;:11;;;:69;;3139:4;3145:6;3122:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3083:69;;;3114:4;3097:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;3083:69;3076:76;;2968:191;;;;:::o;5725:435:7:-;5889:12;5870:8;817:1;1068:30;;:20;1086:1;1068:8;:17;;:20;;;;:::i;:::-;:30;;;1064:82;;1125:20;1143:1;1125:8;:17;;:20;;;;:::i;:::-;1107:39;;;;;;;;;;;:::i;:::-;;;;;;;;1064:82;5966:8:::1;238:1:16;6063::7::0;6035:25:::1;:7;:14;:23;:25::i;:::-;:29;;;;:::i;:::-;6103:11;6132:7;5932:221;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5913:240;;5725:435:::0;;;;;;:::o;1618:188:42:-;1718:81;1738:5;1760;:18;;;1781:4;1787:2;1791:5;1745:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1718:19;:81::i;:::-;1618:188;;;;:::o;16296:213:46:-;16352:6;16382:16;16374:24;;:5;:24;16370:103;;;16452:2;16456:5;16421:41;;;;;;;;;;;;:::i;:::-;;;;;;;;16370:103;16496:5;16482:20;;16296:213;;;:::o;8370:720:42:-;8450:18;8478:19;8616:4;8613:1;8606:4;8600:11;8593:4;8587;8583:15;8580:1;8573:5;8566;8561:60;8673:7;8663:176;;8717:4;8711:11;8762:16;8759:1;8754:3;8739:40;8808:16;8803:3;8796:29;8663:176;8866:16;8852:30;;8916:1;8910:8;8895:23;;8532:396;8956:1;8942:10;:15;:68;;9009:1;8994:11;:16;;8942:68;;;8990:1;8968:5;8960:26;;;:31;8942:68;8938:146;;;9066:5;9033:40;;;;;;;;;;;:::i;:::-;;;;;;;;8938:146;8440:650;;8370:720;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;7:101:59:-;43:7;83:18;76:5;72:30;61:41;;7:101;;;:::o;114:115::-;199:23;216:5;199:23;:::i;:::-;194:3;187:36;114:115;;:::o;235:324::-;352:4;390:2;379:9;375:18;367:26;;403:69;469:1;458:9;454:17;445:6;403:69;:::i;:::-;482:70;548:2;537:9;533:18;524:6;482:70;:::i;:::-;235:324;;;;;:::o;565:75::-;598:6;631:2;625:9;615:19;;565:75;:::o;646:117::-;755:1;752;745:12;892:93;928:7;968:10;961:5;957:22;946:33;;892:93;;;:::o;991:120::-;1063:23;1080:5;1063:23;:::i;:::-;1056:5;1053:34;1043:62;;1101:1;1098;1091:12;1043:62;991:120;:::o;1117:137::-;1162:5;1200:6;1187:20;1178:29;;1216:32;1242:5;1216:32;:::i;:::-;1117:137;;;;:::o;1260:77::-;1297:7;1326:5;1315:16;;1260:77;;;:::o;1343:122::-;1416:24;1434:5;1416:24;:::i;:::-;1409:5;1406:35;1396:63;;1455:1;1452;1445:12;1396:63;1343:122;:::o;1471:139::-;1517:5;1555:6;1542:20;1533:29;;1571:33;1598:5;1571:33;:::i;:::-;1471:139;;;;:::o;1616:472::-;1683:6;1691;1740:2;1728:9;1719:7;1715:23;1711:32;1708:119;;;1746:79;;:::i;:::-;1708:119;1866:1;1891:52;1935:7;1926:6;1915:9;1911:22;1891:52;:::i;:::-;1881:62;;1837:116;1992:2;2018:53;2063:7;2054:6;2043:9;2039:22;2018:53;:::i;:::-;2008:63;;1963:118;1616:472;;;;;:::o;2094:126::-;2131:7;2171:42;2164:5;2160:54;2149:65;;2094:126;;;:::o;2226:96::-;2263:7;2292:24;2310:5;2292:24;:::i;:::-;2281:35;;2226:96;;;:::o;2328:122::-;2401:24;2419:5;2401:24;:::i;:::-;2394:5;2391:35;2381:63;;2440:1;2437;2430:12;2381:63;2328:122;:::o;2456:139::-;2502:5;2540:6;2527:20;2518:29;;2556:33;2583:5;2556:33;:::i;:::-;2456:139;;;;:::o;2601:329::-;2660:6;2709:2;2697:9;2688:7;2684:23;2680:32;2677:119;;;2715:79;;:::i;:::-;2677:119;2835:1;2860:53;2905:7;2896:6;2885:9;2881:22;2860:53;:::i;:::-;2850:63;;2806:117;2601:329;;;;:::o;2936:77::-;2973:7;3002:5;2991:16;;2936:77;;;:::o;3019:118::-;3106:24;3124:5;3106:24;:::i;:::-;3101:3;3094:37;3019:118;;:::o;3143:222::-;3236:4;3274:2;3263:9;3259:18;3251:26;;3287:71;3355:1;3344:9;3340:17;3331:6;3287:71;:::i;:::-;3143:222;;;;:::o;3371:108::-;3448:24;3466:5;3448:24;:::i;:::-;3443:3;3436:37;3371:108;;:::o;3535:528::-;3692:4;3687:3;3683:14;3784:4;3777:5;3773:16;3767:23;3803:63;3860:4;3855:3;3851:14;3837:12;3803:63;:::i;:::-;3707:169;3964:4;3957:5;3953:16;3947:23;3983:63;4040:4;4035:3;4031:14;4017:12;3983:63;:::i;:::-;3886:170;3661:402;3535:528;;:::o;4069:342::-;4222:4;4260:2;4249:9;4245:18;4237:26;;4273:131;4401:1;4390:9;4386:17;4377:6;4273:131;:::i;:::-;4069:342;;;;:::o;4417:60::-;4445:3;4466:5;4459:12;;4417:60;;;:::o;4483:142::-;4533:9;4566:53;4584:34;4593:24;4611:5;4593:24;:::i;:::-;4584:34;:::i;:::-;4566:53;:::i;:::-;4553:66;;4483:142;;;:::o;4631:126::-;4681:9;4714:37;4745:5;4714:37;:::i;:::-;4701:50;;4631:126;;;:::o;4763:155::-;4842:9;4875:37;4906:5;4875:37;:::i;:::-;4862:50;;4763:155;;;:::o;4924:189::-;5040:66;5100:5;5040:66;:::i;:::-;5035:3;5028:79;4924:189;;:::o;5119:280::-;5241:4;5279:2;5268:9;5264:18;5256:26;;5292:100;5389:1;5378:9;5374:17;5365:6;5292:100;:::i;:::-;5119:280;;;;:::o;5405:118::-;5492:24;5510:5;5492:24;:::i;:::-;5487:3;5480:37;5405:118;;:::o;5529:222::-;5622:4;5660:2;5649:9;5645:18;5637:26;;5673:71;5741:1;5730:9;5726:17;5717:6;5673:71;:::i;:::-;5529:222;;;;:::o;5757:118::-;5794:7;5834:34;5827:5;5823:46;5812:57;;5757:118;;;:::o;5881:122::-;5954:24;5972:5;5954:24;:::i;:::-;5947:5;5944:35;5934:63;;5993:1;5990;5983:12;5934:63;5881:122;:::o;6009:139::-;6055:5;6093:6;6080:20;6071:29;;6109:33;6136:5;6109:33;:::i;:::-;6009:139;;;;:::o;6154:329::-;6213:6;6262:2;6250:9;6241:7;6237:23;6233:32;6230:119;;;6268:79;;:::i;:::-;6230:119;6388:1;6413:53;6458:7;6449:6;6438:9;6434:22;6413:53;:::i;:::-;6403:63;;6359:117;6154:329;;;;:::o;6489:327::-;6547:6;6596:2;6584:9;6575:7;6571:23;6567:32;6564:119;;;6602:79;;:::i;:::-;6564:119;6722:1;6747:52;6791:7;6782:6;6771:9;6767:22;6747:52;:::i;:::-;6737:62;;6693:116;6489:327;;;;:::o;6822:118::-;6909:24;6927:5;6909:24;:::i;:::-;6904:3;6897:37;6822:118;;:::o;6946:222::-;7039:4;7077:2;7066:9;7062:18;7054:26;;7090:71;7158:1;7147:9;7143:17;7134:6;7090:71;:::i;:::-;6946:222;;;;:::o;7174:150::-;7248:9;7281:37;7312:5;7281:37;:::i;:::-;7268:50;;7174:150;;;:::o;7330:179::-;7441:61;7496:5;7441:61;:::i;:::-;7436:3;7429:74;7330:179;;:::o;7515:270::-;7632:4;7670:2;7659:9;7655:18;7647:26;;7683:95;7775:1;7764:9;7760:17;7751:6;7683:95;:::i;:::-;7515:270;;;;:::o;7791:118::-;7878:24;7896:5;7878:24;:::i;:::-;7873:3;7866:37;7791:118;;:::o;7915:222::-;8008:4;8046:2;8035:9;8031:18;8023:26;;8059:71;8127:1;8116:9;8112:17;8103:6;8059:71;:::i;:::-;7915:222;;;;:::o;8143:122::-;8216:24;8234:5;8216:24;:::i;:::-;8209:5;8206:35;8196:63;;8255:1;8252;8245:12;8196:63;8143:122;:::o;8271:143::-;8328:5;8359:6;8353:13;8344:22;;8375:33;8402:5;8375:33;:::i;:::-;8271:143;;;;:::o;8420:351::-;8490:6;8539:2;8527:9;8518:7;8514:23;8510:32;8507:119;;;8545:79;;:::i;:::-;8507:119;8665:1;8690:64;8746:7;8737:6;8726:9;8722:22;8690:64;:::i;:::-;8680:74;;8636:128;8420:351;;;;:::o;8777:442::-;8926:4;8964:2;8953:9;8949:18;8941:26;;8977:71;9045:1;9034:9;9030:17;9021:6;8977:71;:::i;:::-;9058:72;9126:2;9115:9;9111:18;9102:6;9058:72;:::i;:::-;9140;9208:2;9197:9;9193:18;9184:6;9140:72;:::i;:::-;8777:442;;;;;;:::o;9225:332::-;9346:4;9384:2;9373:9;9369:18;9361:26;;9397:71;9465:1;9454:9;9450:17;9441:6;9397:71;:::i;:::-;9478:72;9546:2;9535:9;9531:18;9522:6;9478:72;:::i;:::-;9225:332;;;;;:::o;9563:108::-;9640:24;9658:5;9640:24;:::i;:::-;9635:3;9628:37;9563:108;;:::o;9677:105::-;9752:23;9769:5;9752:23;:::i;:::-;9747:3;9740:36;9677:105;;:::o;9838:518::-;9985:4;9980:3;9976:14;10077:4;10070:5;10066:16;10060:23;10096:63;10153:4;10148:3;10144:14;10130:12;10096:63;:::i;:::-;10000:169;10257:4;10250:5;10246:16;10240:23;10276:63;10333:4;10328:3;10324:14;10310:12;10276:63;:::i;:::-;10179:170;9954:402;9838:518;;:::o;10420:757::-;10585:4;10580:3;10576:14;10672:4;10665:5;10661:16;10655:23;10691:63;10748:4;10743:3;10739:14;10725:12;10691:63;:::i;:::-;10600:164;10847:4;10840:5;10836:16;10830:23;10866:61;10921:4;10916:3;10912:14;10898:12;10866:61;:::i;:::-;10774:163;11018:4;11011:5;11007:16;11001:23;11037:123;11154:4;11149:3;11145:14;11131:12;11037:123;:::i;:::-;10947:223;10554:623;10420:757;;:::o;11183:469::-;11372:4;11410:3;11399:9;11395:19;11387:27;;11424:71;11492:1;11481:9;11477:17;11468:6;11424:71;:::i;:::-;11505:140;11641:2;11630:9;11626:18;11617:6;11505:140;:::i;:::-;11183:469;;;;;:::o;11658:332::-;11779:4;11817:2;11806:9;11802:18;11794:26;;11830:71;11898:1;11887:9;11883:17;11874:6;11830:71;:::i;:::-;11911:72;11979:2;11968:9;11964:18;11955:6;11911:72;:::i;:::-;11658:332;;;;;:::o;11996:115::-;12081:23;12098:5;12081:23;:::i;:::-;12076:3;12069:36;11996:115;;:::o;12117:328::-;12236:4;12274:2;12263:9;12259:18;12251:26;;12287:69;12353:1;12342:9;12338:17;12329:6;12287:69;:::i;:::-;12366:72;12434:2;12423:9;12419:18;12410:6;12366:72;:::i;:::-;12117:328;;;;;:::o;12451:180::-;12499:77;12496:1;12489:88;12596:4;12593:1;12586:15;12620:4;12617:1;12610:15;12637:194;12677:4;12697:20;12715:1;12697:20;:::i;:::-;12692:25;;12731:20;12749:1;12731:20;:::i;:::-;12726:25;;12775:1;12772;12768:9;12760:17;;12799:1;12793:4;12790:11;12787:37;;;12804:18;;:::i;:::-;12787:37;12637:194;;;;:::o;12837:105::-;12912:23;12929:5;12912:23;:::i;:::-;12907:3;12900:36;12837:105;;:::o;12948:98::-;12999:6;13033:5;13027:12;13017:22;;12948:98;;;:::o;13052:158::-;13125:11;13159:6;13154:3;13147:19;13199:4;13194:3;13190:14;13175:29;;13052:158;;;;:::o;13216:139::-;13305:6;13300:3;13295;13289:23;13346:1;13337:6;13332:3;13328:16;13321:27;13216:139;;;:::o;13361:102::-;13402:6;13453:2;13449:7;13444:2;13437:5;13433:14;13429:28;13419:38;;13361:102;;;:::o;13469:353::-;13545:3;13573:38;13605:5;13573:38;:::i;:::-;13627:60;13680:6;13675:3;13627:60;:::i;:::-;13620:67;;13696:65;13754:6;13749:3;13742:4;13735:5;13731:16;13696:65;:::i;:::-;13786:29;13808:6;13786:29;:::i;:::-;13781:3;13777:39;13770:46;;13549:273;13469:353;;;;:::o;13828:90::-;13862:7;13905:5;13898:13;13891:21;13880:32;;13828:90;;;:::o;13924:99::-;13995:21;14010:5;13995:21;:::i;:::-;13990:3;13983:34;13924:99;;:::o;14085:1223::-;14220:3;14256:4;14251:3;14247:14;14345:4;14338:5;14334:16;14328:23;14364:61;14419:4;14414:3;14410:14;14396:12;14364:61;:::i;:::-;14271:164;14521:4;14514:5;14510:16;14504:23;14540:63;14597:4;14592:3;14588:14;14574:12;14540:63;:::i;:::-;14445:168;14698:4;14691:5;14687:16;14681:23;14751:3;14745:4;14741:14;14734:4;14729:3;14725:14;14718:38;14777:71;14843:4;14829:12;14777:71;:::i;:::-;14769:79;;14623:236;14944:4;14937:5;14933:16;14927:23;14997:3;14991:4;14987:14;14980:4;14975:3;14971:14;14964:38;15023:71;15089:4;15075:12;15023:71;:::i;:::-;15015:79;;14869:236;15195:4;15188:5;15184:16;15178:23;15214:57;15265:4;15260:3;15256:14;15242:12;15214:57;:::i;:::-;15115:166;15298:4;15291:11;;14225:1083;14085:1223;;;;:::o;15314:515::-;15501:4;15539:2;15528:9;15524:18;15516:26;;15588:9;15582:4;15578:20;15574:1;15563:9;15559:17;15552:47;15616:124;15735:4;15726:6;15616:124;:::i;:::-;15608:132;;15750:72;15818:2;15807:9;15803:18;15794:6;15750:72;:::i;:::-;15314:515;;;;;:::o;15835:117::-;15944:1;15941;15934:12;15958:180;16006:77;16003:1;15996:88;16103:4;16100:1;16093:15;16127:4;16124:1;16117:15;16144:281;16227:27;16249:4;16227:27;:::i;:::-;16219:6;16215:40;16357:6;16345:10;16342:22;16321:18;16309:10;16306:34;16303:62;16300:88;;;16368:18;;:::i;:::-;16300:88;16408:10;16404:2;16397:22;16187:238;16144:281;;:::o;16431:129::-;16465:6;16492:20;;:::i;:::-;16482:30;;16521:33;16549:4;16541:6;16521:33;:::i;:::-;16431:129;;;:::o;16716:623::-;16806:5;16850:4;16838:9;16833:3;16829:19;16825:30;16822:117;;;16858:79;;:::i;:::-;16822:117;16957:21;16973:4;16957:21;:::i;:::-;16948:30;;17042:1;17082:60;17138:3;17129:6;17118:9;17114:22;17082:60;:::i;:::-;17075:4;17068:5;17064:16;17057:86;16988:166;17219:2;17260:60;17316:3;17307:6;17296:9;17292:22;17260:60;:::i;:::-;17253:4;17246:5;17242:16;17235:86;17164:168;16716:623;;;;:::o;17345:411::-;17445:6;17494:2;17482:9;17473:7;17469:23;17465:32;17462:119;;;17500:79;;:::i;:::-;17462:119;17620:1;17645:94;17731:7;17722:6;17711:9;17707:22;17645:94;:::i;:::-;17635:104;;17591:158;17345:411;;;;:::o;17762:143::-;17819:5;17850:6;17844:13;17835:22;;17866:33;17893:5;17866:33;:::i;:::-;17762:143;;;;:::o;17911:120::-;17983:23;18000:5;17983:23;:::i;:::-;17976:5;17973:34;17963:62;;18021:1;18018;18011:12;17963:62;17911:120;:::o;18037:141::-;18093:5;18124:6;18118:13;18109:22;;18140:32;18166:5;18140:32;:::i;:::-;18037:141;;;;:::o;18215:817::-;18309:5;18353:4;18341:9;18336:3;18332:19;18328:30;18325:117;;;18361:79;;:::i;:::-;18325:117;18460:21;18476:4;18460:21;:::i;:::-;18451:30;;18540:1;18580:60;18636:3;18627:6;18616:9;18612:22;18580:60;:::i;:::-;18573:4;18566:5;18562:16;18555:86;18491:161;18712:2;18753:59;18808:3;18799:6;18788:9;18784:22;18753:59;:::i;:::-;18746:4;18739:5;18735:16;18728:85;18662:162;18882:2;18923:90;19009:3;19000:6;18989:9;18985:22;18923:90;:::i;:::-;18916:4;18909:5;18905:16;18898:116;18834:191;18215:817;;;;:::o;19038:420::-;19142:6;19191:3;19179:9;19170:7;19166:23;19162:33;19159:120;;;19198:79;;:::i;:::-;19159:120;19318:1;19343:98;19433:7;19424:6;19413:9;19409:22;19343:98;:::i;:::-;19333:108;;19289:162;19038:420;;;;:::o;19464:89::-;19500:7;19540:6;19533:5;19529:18;19518:29;;19464:89;;;:::o;19559:96::-;19593:8;19642:5;19637:3;19633:15;19612:36;;19559:96;;;:::o;19661:94::-;19699:7;19728:21;19743:5;19728:21;:::i;:::-;19717:32;;19661:94;;;:::o;19761:153::-;19864:43;19883:23;19900:5;19883:23;:::i;:::-;19864:43;:::i;:::-;19859:3;19852:56;19761:153;;:::o;19920:251::-;20030:3;20045:73;20114:3;20105:6;20045:73;:::i;:::-;20143:1;20138:3;20134:11;20127:18;;20162:3;20155:10;;19920:251;;;;:::o;20177:115::-;20262:23;20279:5;20262:23;:::i;:::-;20257:3;20250:36;20177:115;;:::o;20298:218::-;20389:4;20427:2;20416:9;20412:18;20404:26;;20440:69;20506:1;20495:9;20491:17;20482:6;20440:69;:::i;:::-;20298:218;;;;:::o;20522:::-;20613:4;20651:2;20640:9;20636:18;20628:26;;20664:69;20730:1;20719:9;20715:17;20706:6;20664:69;:::i;:::-;20522:218;;;;:::o;20746:143::-;20803:5;20834:6;20828:13;20819:22;;20850:33;20877:5;20850:33;:::i;:::-;20746:143;;;;:::o;20895:351::-;20965:6;21014:2;21002:9;20993:7;20989:23;20985:32;20982:119;;;21020:79;;:::i;:::-;20982:119;21140:1;21165:64;21221:7;21212:6;21201:9;21197:22;21165:64;:::i;:::-;21155:74;;21111:128;20895:351;;;;:::o;21252:191::-;21292:3;21311:20;21329:1;21311:20;:::i;:::-;21306:25;;21345:20;21363:1;21345:20;:::i;:::-;21340:25;;21388:1;21385;21381:9;21374:16;;21409:3;21406:1;21403:10;21400:36;;;21416:18;;:::i;:::-;21400:36;21252:191;;;;:::o;21449:169::-;21533:11;21567:6;21562:3;21555:19;21607:4;21602:3;21598:14;21583:29;;21449:169;;;;:::o;21624:170::-;21764:22;21760:1;21752:6;21748:14;21741:46;21624:170;:::o;21800:366::-;21942:3;21963:67;22027:2;22022:3;21963:67;:::i;:::-;21956:74;;22039:93;22128:3;22039:93;:::i;:::-;22157:2;22152:3;22148:12;22141:19;;21800:366;;;:::o;22172:419::-;22338:4;22376:2;22365:9;22361:18;22353:26;;22425:9;22419:4;22415:20;22411:1;22400:9;22396:17;22389:47;22453:131;22579:4;22453:131;:::i;:::-;22445:139;;22172:419;;;:::o;22597:96::-;22631:8;22680:5;22675:3;22671:15;22650:36;;22597:96;;;:::o;22699:95::-;22738:7;22767:21;22782:5;22767:21;:::i;:::-;22756:32;;22699:95;;;:::o;22800:157::-;22905:45;22925:24;22943:5;22925:24;:::i;:::-;22905:45;:::i;:::-;22900:3;22893:58;22800:157;;:::o;22963:397::-;23103:3;23118:75;23189:3;23180:6;23118:75;:::i;:::-;23218:2;23213:3;23209:12;23202:19;;23231:75;23302:3;23293:6;23231:75;:::i;:::-;23331:2;23326:3;23322:12;23315:19;;23351:3;23344:10;;22963:397;;;;;:::o;23366:256::-;23478:3;23493:75;23564:3;23555:6;23493:75;:::i;:::-;23593:2;23588:3;23584:12;23577:19;;23613:3;23606:10;;23366:256;;;;:::o;23628:193::-;23667:3;23686:19;23703:1;23686:19;:::i;:::-;23681:24;;23719:19;23736:1;23719:19;:::i;:::-;23714:24;;23761:1;23758;23754:9;23747:16;;23784:6;23779:3;23776:15;23773:41;;;23794:18;;:::i;:::-;23773:41;23628:193;;;;:::o;23827:147::-;23928:11;23965:3;23950:18;;23827:147;;;;:::o;23980:386::-;24084:3;24112:38;24144:5;24112:38;:::i;:::-;24166:88;24247:6;24242:3;24166:88;:::i;:::-;24159:95;;24263:65;24321:6;24316:3;24309:4;24302:5;24298:16;24263:65;:::i;:::-;24353:6;24348:3;24344:16;24337:23;;24088:278;23980:386;;;;:::o;24372:86::-;24407:7;24447:4;24440:5;24436:16;24425:27;;24372:86;;;:::o;24464:96::-;24498:8;24547:5;24542:3;24538:15;24517:36;;24464:96;;;:::o;24566:93::-;24603:7;24632:21;24647:5;24632:21;:::i;:::-;24621:32;;24566:93;;;:::o;24665:149::-;24766:41;24784:22;24800:5;24784:22;:::i;:::-;24766:41;:::i;:::-;24761:3;24754:54;24665:149;;:::o;24820:827::-;25070:3;25092:93;25181:3;25172:6;25092:93;:::i;:::-;25085:100;;25195:71;25262:3;25253:6;25195:71;:::i;:::-;25291:1;25286:3;25282:11;25275:18;;25303:73;25372:3;25363:6;25303:73;:::i;:::-;25401:1;25396:3;25392:11;25385:18;;25413:71;25480:3;25471:6;25413:71;:::i;:::-;25509:1;25504:3;25500:11;25493:18;;25528:93;25617:3;25608:6;25528:93;:::i;:::-;25521:100;;25638:3;25631:10;;24820:827;;;;;;;;:::o;25653:442::-;25802:4;25840:2;25829:9;25825:18;25817:26;;25853:71;25921:1;25910:9;25906:17;25897:6;25853:71;:::i;:::-;25934:72;26002:2;25991:9;25987:18;25978:6;25934:72;:::i;:::-;26016;26084:2;26073:9;26069:18;26060:6;26016:72;:::i;:::-;25653:442;;;;;;:::o;26101:86::-;26147:7;26176:5;26165:16;;26101:86;;;:::o;26193:156::-;26250:9;26283:60;26299:43;26308:33;26335:5;26308:33;:::i;:::-;26299:43;:::i;:::-;26283:60;:::i;:::-;26270:73;;26193:156;;;:::o;26355:145::-;26449:44;26487:5;26449:44;:::i;:::-;26444:3;26437:57;26355:145;;:::o;26506:346::-;26634:4;26672:2;26661:9;26657:18;26649:26;;26685:78;26760:1;26749:9;26745:17;26736:6;26685:78;:::i;:::-;26773:72;26841:2;26830:9;26826:18;26817:6;26773:72;:::i;:::-;26506:346;;;;;:::o", + "linkReferences": {}, + "immutableReferences": { + "45956": [{ "start": 3228, "length": 32 }], + "45958": [ + { "start": 1188, "length": 32 }, + { "start": 1565, "length": 32 }, + { "start": 1673, "length": 32 } + ], + "535": [ + { "start": 1851, "length": 32 }, + { "start": 2511, "length": 32 }, + { "start": 3754, "length": 32 }, + { "start": 4088, "length": 32 }, + { "start": 4903, "length": 32 }, + { "start": 5151, "length": 32 } + ] + } + }, + "methodIdentifiers": { + "bridgeStorage()": "d3d82578", + "bridgeTo(address)": "5c6d3da4", + "bridgedAmount(address)": "348f0209", + "endpoint()": "5e280f11", + "gasLimit()": "f68016b7", + "oAppVersion()": "17442b70", + "owner()": "8da5cb5b", + "peers(uint32)": "bb0b6a53", + "quoteBridge()": "472fa443", + "renounceOwnership()": "715018a6", + "setBridgeStorage(address)": "9a9f2e06", + "setDelegate(address)": "ca5eb5e1", + "setGasLimit(uint128)": "a1da9dae", + "setPeer(uint32,bytes32)": "3400288b", + "transferOwnership(address)": "f2fde38b", + "transferStorageOwnership(address)": "ee0b5445" + }, + "rawMetadata": "{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_endpoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_delegate\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_dstEid\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BalanceLessThanBridged\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientNativeFee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidBridgeStorage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDelegate\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidEndpointCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidGasLimit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"optionType\",\"type\":\"uint16\"}],\"name\":\"InvalidOptionType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LzTokenUnavailable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoDelta\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"}],\"name\":\"NoPeer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"msgValue\",\"type\":\"uint256\"}],\"name\":\"NotEnoughNative\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"}],\"name\":\"OnlyPeer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"bits\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeCastOverflowedUintDowncast\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"guid\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nativeFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lzTokenFee\",\"type\":\"uint256\"}],\"internalType\":\"struct MessagingFee\",\"name\":\"fee\",\"type\":\"tuple\"}],\"indexed\":false,\"internalType\":\"struct MessagingReceipt\",\"name\":\"receipt\",\"type\":\"tuple\"}],\"name\":\"BridgeRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldStorage\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newStorage\",\"type\":\"address\"}],\"name\":\"BridgeStorageUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"oldLimit\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"newLimit\",\"type\":\"uint128\"}],\"name\":\"GasLimitUpdated\",\"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\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"peer\",\"type\":\"bytes32\"}],\"name\":\"PeerSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"bridgeStorage\",\"outputs\":[{\"internalType\":\"contract IBridgeStorage\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"bridgeTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"bridgedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"endpoint\",\"outputs\":[{\"internalType\":\"contract ILayerZeroEndpointV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasLimit\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oAppVersion\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"senderVersion\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"receiverVersion\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"}],\"name\":\"peers\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"peer\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quoteBridge\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nativeFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lzTokenFee\",\"type\":\"uint256\"}],\"internalType\":\"struct MessagingFee\",\"name\":\"fee\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bridgeStorage\",\"type\":\"address\"}],\"name\":\"setBridgeStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegate\",\"type\":\"address\"}],\"name\":\"setDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint128\",\"name\":\"_gasLimit\",\"type\":\"uint128\"}],\"name\":\"setGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_eid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"_peer\",\"type\":\"bytes32\"}],\"name\":\"setPeer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferStorageOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"BalanceLessThanBridged()\":[{\"details\":\"Thrown when current balance is less than previously bridged amount\"}],\"InsufficientNativeFee()\":[{\"details\":\"Thrown when insufficient native fee is provided for bridging\"}],\"InvalidBridgeStorage()\":[{\"details\":\"Thrown when an invalid bridge storage address is provided (e.g., zero address)\"}],\"InvalidGasLimit()\":[{\"details\":\"Thrown when an invalid gas limit is provided (e.g., zero or negative value)\"}],\"NoDelta()\":[{\"details\":\"Thrown when there's no delta between current and previous balance\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}],\"RecipientZero()\":[{\"details\":\"Thrown when recipient address is zero\"}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"SafeCastOverflowedUintDowncast(uint8,uint256)\":[{\"details\":\"Value doesn't fit in an uint of `bits` size.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"BridgeRequested(address,uint256,address,(bytes32,uint64,(uint256,uint256)))\":{\"details\":\"Emitted when a bridge request is initiated\",\"params\":{\"amount\":\"The amount of tokens being bridged\",\"receipt\":\"The LayerZero messaging receipt containing guid and nonce\",\"recipient\":\"The recipient address on destination chain\",\"user\":\"The user initiating the bridge\"}},\"BridgeStorageUpdated(address,address)\":{\"details\":\"Emitted when the bridge storage contract is updated\",\"params\":{\"newStorage\":\"The new bridge storage contract address\",\"oldStorage\":\"The previous bridge storage contract address\"}},\"GasLimitUpdated(uint128,uint128)\":{\"details\":\"Emitted when the gas limit for LayerZero execution is updated\",\"params\":{\"newLimit\":\"The new gas limit value\",\"oldLimit\":\"The previous gas limit value\"}}},\"kind\":\"dev\",\"methods\":{\"bridgeTo(address)\":{\"details\":\"Requires sufficient native fee to be sent with the transactionOnly bridges the delta between current balance and previously bridged amount\",\"params\":{\"recipient\":\"The recipient address on destination chain\"}},\"bridgedAmount(address)\":{\"params\":{\"user\":\"The user address to query\"},\"returns\":{\"_0\":\"The total amount of tokens bridged by the user\"}},\"oAppVersion()\":{\"details\":\"Providing 0 as the default for OAppReceiver version. Indicates that the OAppReceiver is not implemented. ie. this is a SEND only OApp.If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions\",\"returns\":{\"receiverVersion\":\"The version of the OAppReceiver.sol contract.\",\"senderVersion\":\"The version of the OAppSender.sol contract.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"quoteBridge()\":{\"returns\":{\"fee\":\"The estimated messaging fee\"}},\"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.\"},\"setDelegate(address)\":{\"details\":\"Only the owner/admin of the OApp can call this function.Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract.\",\"params\":{\"_delegate\":\"The address of the delegate to be set.\"}},\"setGasLimit(uint128)\":{\"details\":\"Only callable by contract ownerEmits GasLimitUpdated event\",\"params\":{\"_gasLimit\":\"The new gas limit value (must be greater than 0)\"}},\"setPeer(uint32,bytes32)\":{\"details\":\"Only the owner/admin of the OApp can call this function.Indicates that the peer is trusted to send LayerZero messages to this OApp.Set this to bytes32(0) to remove the peer address.Peer is a bytes32 to accommodate non-evm chains.\",\"params\":{\"_eid\":\"The endpoint ID.\",\"_peer\":\"The address of the peer to be associated with the corresponding endpoint.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"transferStorageOwnership(address)\":{\"details\":\"Only callable by contract ownerReverts if newOwner is the zero address\",\"params\":{\"newOwner\":\"The address of the new owner for BridgeStorage\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"bridgeTo(address)\":{\"notice\":\"Bridge tokens to a recipient on the destination chain\"},\"bridgedAmount(address)\":{\"notice\":\"Get the total amount of tokens bridged by a user\"},\"endpoint()\":{\"notice\":\"Retrieves the LayerZero endpoint associated with the OApp.\"},\"oAppVersion()\":{\"notice\":\"Retrieves the OApp version information.\"},\"peers(uint32)\":{\"notice\":\"Retrieves the peer (OApp) associated with a corresponding endpoint.\"},\"quoteBridge()\":{\"notice\":\"Get the estimated fee for bridging\"},\"setDelegate(address)\":{\"notice\":\"Sets the delegate address for the OApp.\"},\"setGasLimit(uint128)\":{\"notice\":\"Set the gas limit for LayerZero message execution on the destination chain\"},\"setPeer(uint32,bytes32)\":{\"notice\":\"Sets the peer address (OApp instance) for a corresponding endpoint.\"},\"transferStorageOwnership(address)\":{\"notice\":\"Transfer ownership of the BridgeStorage contract\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/BaseBridgeOApp.sol\":\"BaseBridgeOApp\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@layerzerolabs/lz-evm-messagelib-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/messagelib/\",\":@layerzerolabs/lz-evm-protocol-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/\",\":@layerzerolabs/oapp/=lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/\",\":@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":LayerZero-v2/=lib/LayerZero-v2/\",\":ds-test/=lib/solidity-bytes-utils/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":solidity-bytes-utils/=lib/solidity-bytes-utils/\"]},\"sources\":{\"lib/LayerZero-v2/packages/layerzero-v2/evm/messagelib/contracts/uln/libs/DVNOptions.sol\":{\"keccak256\":\"0x2beee03cdf59a9bc72e94d08b69cb2e908725f4ceabb48651494938100e21e35\",\"license\":\"LZBL-1.2\",\"urls\":[\"bzz-raw://d88e121a39e74309f3575417df2318e2d2ee8bc8314e68dbf78544a9c393b141\",\"dweb:/ipfs/QmRojBRAyENK21HnjevAWeoZZxtWkYZubB9Y78vCJPYeU6\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OApp.sol\":{\"keccak256\":\"0xac362c4c291fad2f1511a968424b2e78a5ad502d1c867bd31da04be742aca8c5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e1f8cf9f20a2b683a53c3883972aa0676af97a24c678f461fae08e1fb056df28\",\"dweb:/ipfs/QmPpKNqda3rgxDwnq3XiRTtT3NfWeqrCJT6LwmhYd2AoT2\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppCore.sol\":{\"keccak256\":\"0x13a9c2d1d2c1f086b8624f2e84c4a4702212daae36f701d92bb915b535cbe4cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://606515dd9193551bd2c94ac8c304f3776fafcc70e544ebf441f334658b2fd5f0\",\"dweb:/ipfs/QmZ88ey7DdZqV5taAoebabvszX5kdPMSrQCAmTteVdDtcH\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppReceiver.sol\":{\"keccak256\":\"0x0174e9f1ec4cefe4b5adc26c392269c699b9ff75965364e5b7264426a462c70b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cd12bb4fe5802c53911b9a0081a2ea10639b1f99925d1e5c1b1421d1bdc17075\",\"dweb:/ipfs/QmZonarwbKiEwQ8qoASKur2bbMjusdy9pqK9RCR4P1YPtc\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppSender.sol\":{\"keccak256\":\"0x518cf4adca601923ed4baa6619846a253ea32b8d8775f8bc1faa3dfac7f67c20\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d42b471418efadcc3577ef3fa9f8f504e8bed7db90c3b0c862038d8b29529eb2\",\"dweb:/ipfs/QmZETDQiJN4U92fmLKo8T9ZbdDf7BNBUUvo9H7M7GqAyFU\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppCore.sol\":{\"keccak256\":\"0x40e49f2de74506e1da5dcaed53a39853f691647f4ceb0fccc8f49a68d3f47c58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a1deb2a6a3eb1fb83936c9578469142bff470295f403d7d07d955a76be3adbd\",\"dweb:/ipfs/QmS9bjSfBaE4YhQ1PCQ1TknbEPbNfRXzBK9E7SaPGyiZEv\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppReceiver.sol\":{\"keccak256\":\"0xd26135185e19b3732746d4a9e2923e896f28dec8664bab161faea2ee26fcdc3d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c236dfe386b508be33c3a1a74ae1d4fd64b8c77ae207767e9dbed0f2429518a2\",\"dweb:/ipfs/QmXVbZJjfryTRti98uN3BMh5qh4K7NuEs1RSCoBjRoYd4q\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/libs/OptionsBuilder.sol\":{\"keccak256\":\"0x9ba881395fe0906e40d9222c318b8c74d45cc4035369db4a4c6c7d5de2c42378\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bae80a870a797838741f3fcffc57ae6216487ea0640a0f9707efd13a7830372f\",\"dweb:/ipfs/QmVHqnqVP9De8X2ZiDRAn6LXnoUD3Xm7PHWGYrRD1EuBEG\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroEndpointV2.sol\":{\"keccak256\":\"0xf7f941bee89ea6369950fe54e8ac476ae6478b958b20fc0e8a83e8ff1364eac3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bacc29fd3866af71e59cb0bdc1cf82c882a4a7f4e2652fd413c9f12649762083\",\"dweb:/ipfs/QmZh2toLnrQDWaNYhS5K4NoW7Vxd2GdZx9KA77vKEDLAqs\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroReceiver.sol\":{\"keccak256\":\"0x9641abba8d53b08bb517d1b74801dd15ea7b84d77a6719085bd96c8ea94e3ca0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77415ae0820859e0faf3fabdce683cce9fa03ea026ae0f6fe081ef1c9205f933\",\"dweb:/ipfs/QmXd7APqoCunQ2jYy73AHvi5gsZofLpm3SzM6FPo7zRPfL\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessageLibManager.sol\":{\"keccak256\":\"0xd710f9efe703982e8eabe15d19d6114af753ef42f2796551da782a0fb6633e4b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b5c9c874871469c871004d49a1cb5304e63ea3faaf366bfed9d718abbb9cc20a\",\"dweb:/ipfs/QmarXxE4dezAa5gBe82KCrcvWcMwa3BYqkfXbDQ3rRjfEB\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingChannel.sol\":{\"keccak256\":\"0x0878f64dffebf58c4165569416372f40860fab546b88cd926eba0d5cb6d8d972\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7e1b245d58221d16d8b5e0f01ef3e289a24a7df1ace3b94239e4d5b954ad5927\",\"dweb:/ipfs/Qmappsgp7PCY9rSSNE9Cdn4BTRX591WfCSEgq2HxhA3z6S\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingComposer.sol\":{\"keccak256\":\"0x85bc7090134529ec474866dc4bb1c48692d518c756eb0a961c82574829c51901\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b18b23a1643fc6636c4ad9d9023e2e6ca2d3c2a4a046482d4655bff09950598d\",\"dweb:/ipfs/Qma6G5SqiovwrMPfgqTrRngK1HWW373Wkf9c6YP2NhXpPk\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingContext.sol\":{\"keccak256\":\"0xff0c546c2813dae3e440882f46b377375f7461b0714efd80bd3f0c6e5cb8da4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5173fc9143bea314b159ca5a9adb5626659ef763bc598e27de5fa46efe3291a6\",\"dweb:/ipfs/QmSLFeMFPmVeGxT4sxRPW28ictjAS22M8rLeYRu9TXkA6D\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/libs/CalldataBytesLib.sol\":{\"keccak256\":\"0x5c0db161cef6603c3b256d4220f489419e7478ef775e52a80056654129c61875\",\"license\":\"LZBL-1.2\",\"urls\":[\"bzz-raw://a33245d0fdd3992bb56b31d1840108d36bb46c8d617b659ef1af8dd7ed86302d\",\"dweb:/ipfs/QmWyBqT7Tdrfn5zz9xYM3V1PBtfAZAVwwCrrKwwfi3wMQK\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/messagelib/libs/BitMaps.sol\":{\"keccak256\":\"0xaad3c72ef43480d2253fd48b394e8fb7286d009991d2bc4e61be58ce48ac5ee9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b8c02b14f954416ba2148b389c87da8378ac8dd16ba3d458cbbfba8b0fd8639f\",\"dweb:/ipfs/Qmd2EEQhYL2VmgJi1V4uiHM2WcYxF9iBtxSgcFkbS21rQD\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/messagelib/libs/ExecutorOptions.sol\":{\"keccak256\":\"0x621c6090fc432f94a99f677a95d72b75f56db89ddc5fc870669777a313587c28\",\"license\":\"LZBL-1.2\",\"urls\":[\"bzz-raw://69086166f16d29e30c5eb9ca2f97afb27569afe619807d79736833a809a512d2\",\"dweb:/ipfs/QmcZqXjFuVdTrfbteKBF3GuEpjVFZ2YNZTa3J87dyLsqav\"]},\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6\",\"dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol\":{\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100\",\"dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037\",\"dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d\",\"dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303\",\"dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508\",\"dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol\":{\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3cf0c69ab827e3251db9ee6a50647d62c90ba580a4d7bbff21f2bea39e7b2f4a\",\"dweb:/ipfs/QmZiKwtKU1SBX4RGfQtY7PZfiapbbu6SZ9vizGQD9UHjRA\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"lib/solidity-bytes-utils/contracts/BytesLib.sol\":{\"keccak256\":\"0xf4b07e5d8f69407bb43c6db224adfcf6c73b512dd64e85008ac3c222910c3555\",\"license\":\"Unlicense\",\"urls\":[\"bzz-raw://db020721e59008f7159b65962cc24038c92ac1c2ee8b7cfaa28a1771ced663f5\",\"dweb:/ipfs/QmQ8rznRTYc3AoVCJno8tY6vQVKCbhDJ3husfytUUvMrSN\"]},\"src/BaseBridgeOApp.sol\":{\"keccak256\":\"0x713913dd10c60dac673e9b49faa5db799d53d4dd1c877712a03f07bf2c178742\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2ea6e6cd292e35033b0492e24de089e5ae65a5dd118e8d5ec8d94d478a760d27\",\"dweb:/ipfs/QmQXVPrnuEBLGPNMFk5mTnjhFMQf8EyetskYhvEkFCErLH\"]},\"src/interfaces/IBaseBridgeOApp.sol\":{\"keccak256\":\"0x67e12bf13988c6d4c86e4f1927a65363466136b6cba0d630e59cbb9a39a63558\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://03852609cae00931df9d52c0770e314b4f5639d134701e643da86ce7ab29928d\",\"dweb:/ipfs/Qmf1bMnd51NoQhCwEbQH8TzRFZpyXN5a4KgDinKKMBpH9Y\"]},\"src/interfaces/IBridgeStorage.sol\":{\"keccak256\":\"0xeb540ee0f9c934d62f349628184a199bf539267e38254200c3acc2bb18b513ca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8922e33cbf24115faa4efd03b83a7af866981bc580f2c48a148de455a00036d5\",\"dweb:/ipfs/QmU8PqXhzXFVKThZmThVXasg2vzWidsZXap53nUmyKtygo\"]}},\"version\":1}", + "metadata": { + "compiler": { "version": "0.8.30+commit.73712a01" }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { "internalType": "address", "name": "_endpoint", "type": "address" }, + { "internalType": "address", "name": "_delegate", "type": "address" }, + { "internalType": "address", "name": "_owner", "type": "address" }, + { "internalType": "address", "name": "_token", "type": "address" }, + { "internalType": "uint32", "name": "_dstEid", "type": "uint32" } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { "inputs": [], "type": "error", "name": "BalanceLessThanBridged" }, + { "inputs": [], "type": "error", "name": "InsufficientNativeFee" }, + { "inputs": [], "type": "error", "name": "InvalidBridgeStorage" }, + { "inputs": [], "type": "error", "name": "InvalidDelegate" }, + { "inputs": [], "type": "error", "name": "InvalidEndpointCall" }, + { "inputs": [], "type": "error", "name": "InvalidGasLimit" }, + { + "inputs": [{ "internalType": "uint16", "name": "optionType", "type": "uint16" }], + "type": "error", + "name": "InvalidOptionType" + }, + { "inputs": [], "type": "error", "name": "LzTokenUnavailable" }, + { "inputs": [], "type": "error", "name": "NoDelta" }, + { + "inputs": [{ "internalType": "uint32", "name": "eid", "type": "uint32" }], + "type": "error", + "name": "NoPeer" + }, + { + "inputs": [{ "internalType": "uint256", "name": "msgValue", "type": "uint256" }], + "type": "error", + "name": "NotEnoughNative" + }, + { + "inputs": [ + { "internalType": "uint32", "name": "eid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" } + ], + "type": "error", + "name": "OnlyPeer" + }, + { + "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], + "type": "error", + "name": "OwnableInvalidOwner" + }, + { + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "type": "error", + "name": "OwnableUnauthorizedAccount" + }, + { "inputs": [], "type": "error", "name": "RecipientZero" }, + { "inputs": [], "type": "error", "name": "ReentrancyGuardReentrantCall" }, + { + "inputs": [ + { "internalType": "uint8", "name": "bits", "type": "uint8" }, + { "internalType": "uint256", "name": "value", "type": "uint256" } + ], + "type": "error", + "name": "SafeCastOverflowedUintDowncast" + }, + { + "inputs": [{ "internalType": "address", "name": "token", "type": "address" }], + "type": "error", + "name": "SafeERC20FailedOperation" + }, + { + "inputs": [ + { "internalType": "address", "name": "recipient", "type": "address", "indexed": true }, + { "internalType": "uint256", "name": "amount", "type": "uint256", "indexed": false }, + { "internalType": "address", "name": "user", "type": "address", "indexed": true }, + { + "internalType": "struct MessagingReceipt", + "name": "receipt", + "type": "tuple", + "components": [ + { "internalType": "bytes32", "name": "guid", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" }, + { + "internalType": "struct MessagingFee", + "name": "fee", + "type": "tuple", + "components": [ + { "internalType": "uint256", "name": "nativeFee", "type": "uint256" }, + { "internalType": "uint256", "name": "lzTokenFee", "type": "uint256" } + ] + } + ], + "indexed": false + } + ], + "type": "event", + "name": "BridgeRequested", + "anonymous": false + }, + { + "inputs": [ + { "internalType": "address", "name": "oldStorage", "type": "address", "indexed": true }, + { "internalType": "address", "name": "newStorage", "type": "address", "indexed": true } + ], + "type": "event", + "name": "BridgeStorageUpdated", + "anonymous": false + }, + { + "inputs": [ + { "internalType": "uint128", "name": "oldLimit", "type": "uint128", "indexed": false }, + { "internalType": "uint128", "name": "newLimit", "type": "uint128", "indexed": false } + ], + "type": "event", + "name": "GasLimitUpdated", + "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": [ + { "internalType": "uint32", "name": "eid", "type": "uint32", "indexed": false }, + { "internalType": "bytes32", "name": "peer", "type": "bytes32", "indexed": false } + ], + "type": "event", + "name": "PeerSet", + "anonymous": false + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "bridgeStorage", + "outputs": [{ "internalType": "contract IBridgeStorage", "name": "", "type": "address" }] + }, + { + "inputs": [{ "internalType": "address", "name": "recipient", "type": "address" }], + "stateMutability": "payable", + "type": "function", + "name": "bridgeTo" + }, + { + "inputs": [{ "internalType": "address", "name": "user", "type": "address" }], + "stateMutability": "view", + "type": "function", + "name": "bridgedAmount", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "endpoint", + "outputs": [ + { "internalType": "contract ILayerZeroEndpointV2", "name": "", "type": "address" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "gasLimit", + "outputs": [{ "internalType": "uint128", "name": "", "type": "uint128" }] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "oAppVersion", + "outputs": [ + { "internalType": "uint64", "name": "senderVersion", "type": "uint64" }, + { "internalType": "uint64", "name": "receiverVersion", "type": "uint64" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }] + }, + { + "inputs": [{ "internalType": "uint32", "name": "eid", "type": "uint32" }], + "stateMutability": "view", + "type": "function", + "name": "peers", + "outputs": [{ "internalType": "bytes32", "name": "peer", "type": "bytes32" }] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "quoteBridge", + "outputs": [ + { + "internalType": "struct MessagingFee", + "name": "fee", + "type": "tuple", + "components": [ + { "internalType": "uint256", "name": "nativeFee", "type": "uint256" }, + { "internalType": "uint256", "name": "lzTokenFee", "type": "uint256" } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "renounceOwnership" + }, + { + "inputs": [{ "internalType": "address", "name": "_bridgeStorage", "type": "address" }], + "stateMutability": "nonpayable", + "type": "function", + "name": "setBridgeStorage" + }, + { + "inputs": [{ "internalType": "address", "name": "_delegate", "type": "address" }], + "stateMutability": "nonpayable", + "type": "function", + "name": "setDelegate" + }, + { + "inputs": [{ "internalType": "uint128", "name": "_gasLimit", "type": "uint128" }], + "stateMutability": "nonpayable", + "type": "function", + "name": "setGasLimit" + }, + { + "inputs": [ + { "internalType": "uint32", "name": "_eid", "type": "uint32" }, + { "internalType": "bytes32", "name": "_peer", "type": "bytes32" } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setPeer" + }, + { + "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], + "stateMutability": "nonpayable", + "type": "function", + "name": "transferOwnership" + }, + { + "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], + "stateMutability": "nonpayable", + "type": "function", + "name": "transferStorageOwnership" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "bridgeTo(address)": { + "details": "Requires sufficient native fee to be sent with the transactionOnly bridges the delta between current balance and previously bridged amount", + "params": { "recipient": "The recipient address on destination chain" } + }, + "bridgedAmount(address)": { + "params": { "user": "The user address to query" }, + "returns": { "_0": "The total amount of tokens bridged by the user" } + }, + "oAppVersion()": { + "details": "Providing 0 as the default for OAppReceiver version. Indicates that the OAppReceiver is not implemented. ie. this is a SEND only OApp.If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions", + "returns": { + "receiverVersion": "The version of the OAppReceiver.sol contract.", + "senderVersion": "The version of the OAppSender.sol contract." + } + }, + "owner()": { "details": "Returns the address of the current owner." }, + "quoteBridge()": { "returns": { "fee": "The estimated messaging fee" } }, + "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." + }, + "setDelegate(address)": { + "details": "Only the owner/admin of the OApp can call this function.Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract.", + "params": { "_delegate": "The address of the delegate to be set." } + }, + "setGasLimit(uint128)": { + "details": "Only callable by contract ownerEmits GasLimitUpdated event", + "params": { "_gasLimit": "The new gas limit value (must be greater than 0)" } + }, + "setPeer(uint32,bytes32)": { + "details": "Only the owner/admin of the OApp can call this function.Indicates that the peer is trusted to send LayerZero messages to this OApp.Set this to bytes32(0) to remove the peer address.Peer is a bytes32 to accommodate non-evm chains.", + "params": { + "_eid": "The endpoint ID.", + "_peer": "The address of the peer to be associated with the corresponding endpoint." + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "transferStorageOwnership(address)": { + "details": "Only callable by contract ownerReverts if newOwner is the zero address", + "params": { "newOwner": "The address of the new owner for BridgeStorage" } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "bridgeTo(address)": { + "notice": "Bridge tokens to a recipient on the destination chain" + }, + "bridgedAmount(address)": { + "notice": "Get the total amount of tokens bridged by a user" + }, + "endpoint()": { "notice": "Retrieves the LayerZero endpoint associated with the OApp." }, + "oAppVersion()": { "notice": "Retrieves the OApp version information." }, + "peers(uint32)": { + "notice": "Retrieves the peer (OApp) associated with a corresponding endpoint." + }, + "quoteBridge()": { "notice": "Get the estimated fee for bridging" }, + "setDelegate(address)": { "notice": "Sets the delegate address for the OApp." }, + "setGasLimit(uint128)": { + "notice": "Set the gas limit for LayerZero message execution on the destination chain" + }, + "setPeer(uint32,bytes32)": { + "notice": "Sets the peer address (OApp instance) for a corresponding endpoint." + }, + "transferStorageOwnership(address)": { + "notice": "Transfer ownership of the BridgeStorage contract" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@layerzerolabs/lz-evm-messagelib-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/messagelib/", + "@layerzerolabs/lz-evm-protocol-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/", + "@layerzerolabs/oapp/=lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/", + "@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/", + "@openzeppelin/=lib/openzeppelin-contracts/", + "LayerZero-v2/=lib/LayerZero-v2/", + "ds-test/=lib/solidity-bytes-utils/lib/forge-std/lib/ds-test/src/", + "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", + "forge-std/=lib/forge-std/src/", + "halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/", + "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", + "openzeppelin-contracts/=lib/openzeppelin-contracts/", + "solidity-bytes-utils/=lib/solidity-bytes-utils/" + ], + "optimizer": { "enabled": false, "runs": 200 }, + "metadata": { "bytecodeHash": "ipfs" }, + "compilationTarget": { "src/BaseBridgeOApp.sol": "BaseBridgeOApp" }, + "evmVersion": "cancun", + "libraries": {} + }, + "sources": { + "lib/LayerZero-v2/packages/layerzero-v2/evm/messagelib/contracts/uln/libs/DVNOptions.sol": { + "keccak256": "0x2beee03cdf59a9bc72e94d08b69cb2e908725f4ceabb48651494938100e21e35", + "urls": [ + "bzz-raw://d88e121a39e74309f3575417df2318e2d2ee8bc8314e68dbf78544a9c393b141", + "dweb:/ipfs/QmRojBRAyENK21HnjevAWeoZZxtWkYZubB9Y78vCJPYeU6" + ], + "license": "LZBL-1.2" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OApp.sol": { + "keccak256": "0xac362c4c291fad2f1511a968424b2e78a5ad502d1c867bd31da04be742aca8c5", + "urls": [ + "bzz-raw://e1f8cf9f20a2b683a53c3883972aa0676af97a24c678f461fae08e1fb056df28", + "dweb:/ipfs/QmPpKNqda3rgxDwnq3XiRTtT3NfWeqrCJT6LwmhYd2AoT2" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppCore.sol": { + "keccak256": "0x13a9c2d1d2c1f086b8624f2e84c4a4702212daae36f701d92bb915b535cbe4cc", + "urls": [ + "bzz-raw://606515dd9193551bd2c94ac8c304f3776fafcc70e544ebf441f334658b2fd5f0", + "dweb:/ipfs/QmZ88ey7DdZqV5taAoebabvszX5kdPMSrQCAmTteVdDtcH" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppReceiver.sol": { + "keccak256": "0x0174e9f1ec4cefe4b5adc26c392269c699b9ff75965364e5b7264426a462c70b", + "urls": [ + "bzz-raw://cd12bb4fe5802c53911b9a0081a2ea10639b1f99925d1e5c1b1421d1bdc17075", + "dweb:/ipfs/QmZonarwbKiEwQ8qoASKur2bbMjusdy9pqK9RCR4P1YPtc" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppSender.sol": { + "keccak256": "0x518cf4adca601923ed4baa6619846a253ea32b8d8775f8bc1faa3dfac7f67c20", + "urls": [ + "bzz-raw://d42b471418efadcc3577ef3fa9f8f504e8bed7db90c3b0c862038d8b29529eb2", + "dweb:/ipfs/QmZETDQiJN4U92fmLKo8T9ZbdDf7BNBUUvo9H7M7GqAyFU" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppCore.sol": { + "keccak256": "0x40e49f2de74506e1da5dcaed53a39853f691647f4ceb0fccc8f49a68d3f47c58", + "urls": [ + "bzz-raw://4a1deb2a6a3eb1fb83936c9578469142bff470295f403d7d07d955a76be3adbd", + "dweb:/ipfs/QmS9bjSfBaE4YhQ1PCQ1TknbEPbNfRXzBK9E7SaPGyiZEv" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppReceiver.sol": { + "keccak256": "0xd26135185e19b3732746d4a9e2923e896f28dec8664bab161faea2ee26fcdc3d", + "urls": [ + "bzz-raw://c236dfe386b508be33c3a1a74ae1d4fd64b8c77ae207767e9dbed0f2429518a2", + "dweb:/ipfs/QmXVbZJjfryTRti98uN3BMh5qh4K7NuEs1RSCoBjRoYd4q" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/libs/OptionsBuilder.sol": { + "keccak256": "0x9ba881395fe0906e40d9222c318b8c74d45cc4035369db4a4c6c7d5de2c42378", + "urls": [ + "bzz-raw://bae80a870a797838741f3fcffc57ae6216487ea0640a0f9707efd13a7830372f", + "dweb:/ipfs/QmVHqnqVP9De8X2ZiDRAn6LXnoUD3Xm7PHWGYrRD1EuBEG" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroEndpointV2.sol": { + "keccak256": "0xf7f941bee89ea6369950fe54e8ac476ae6478b958b20fc0e8a83e8ff1364eac3", + "urls": [ + "bzz-raw://bacc29fd3866af71e59cb0bdc1cf82c882a4a7f4e2652fd413c9f12649762083", + "dweb:/ipfs/QmZh2toLnrQDWaNYhS5K4NoW7Vxd2GdZx9KA77vKEDLAqs" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroReceiver.sol": { + "keccak256": "0x9641abba8d53b08bb517d1b74801dd15ea7b84d77a6719085bd96c8ea94e3ca0", + "urls": [ + "bzz-raw://77415ae0820859e0faf3fabdce683cce9fa03ea026ae0f6fe081ef1c9205f933", + "dweb:/ipfs/QmXd7APqoCunQ2jYy73AHvi5gsZofLpm3SzM6FPo7zRPfL" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessageLibManager.sol": { + "keccak256": "0xd710f9efe703982e8eabe15d19d6114af753ef42f2796551da782a0fb6633e4b", + "urls": [ + "bzz-raw://b5c9c874871469c871004d49a1cb5304e63ea3faaf366bfed9d718abbb9cc20a", + "dweb:/ipfs/QmarXxE4dezAa5gBe82KCrcvWcMwa3BYqkfXbDQ3rRjfEB" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingChannel.sol": { + "keccak256": "0x0878f64dffebf58c4165569416372f40860fab546b88cd926eba0d5cb6d8d972", + "urls": [ + "bzz-raw://7e1b245d58221d16d8b5e0f01ef3e289a24a7df1ace3b94239e4d5b954ad5927", + "dweb:/ipfs/Qmappsgp7PCY9rSSNE9Cdn4BTRX591WfCSEgq2HxhA3z6S" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingComposer.sol": { + "keccak256": "0x85bc7090134529ec474866dc4bb1c48692d518c756eb0a961c82574829c51901", + "urls": [ + "bzz-raw://b18b23a1643fc6636c4ad9d9023e2e6ca2d3c2a4a046482d4655bff09950598d", + "dweb:/ipfs/Qma6G5SqiovwrMPfgqTrRngK1HWW373Wkf9c6YP2NhXpPk" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingContext.sol": { + "keccak256": "0xff0c546c2813dae3e440882f46b377375f7461b0714efd80bd3f0c6e5cb8da4e", + "urls": [ + "bzz-raw://5173fc9143bea314b159ca5a9adb5626659ef763bc598e27de5fa46efe3291a6", + "dweb:/ipfs/QmSLFeMFPmVeGxT4sxRPW28ictjAS22M8rLeYRu9TXkA6D" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/libs/CalldataBytesLib.sol": { + "keccak256": "0x5c0db161cef6603c3b256d4220f489419e7478ef775e52a80056654129c61875", + "urls": [ + "bzz-raw://a33245d0fdd3992bb56b31d1840108d36bb46c8d617b659ef1af8dd7ed86302d", + "dweb:/ipfs/QmWyBqT7Tdrfn5zz9xYM3V1PBtfAZAVwwCrrKwwfi3wMQK" + ], + "license": "LZBL-1.2" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/messagelib/libs/BitMaps.sol": { + "keccak256": "0xaad3c72ef43480d2253fd48b394e8fb7286d009991d2bc4e61be58ce48ac5ee9", + "urls": [ + "bzz-raw://b8c02b14f954416ba2148b389c87da8378ac8dd16ba3d458cbbfba8b0fd8639f", + "dweb:/ipfs/Qmd2EEQhYL2VmgJi1V4uiHM2WcYxF9iBtxSgcFkbS21rQD" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/messagelib/libs/ExecutorOptions.sol": { + "keccak256": "0x621c6090fc432f94a99f677a95d72b75f56db89ddc5fc870669777a313587c28", + "urls": [ + "bzz-raw://69086166f16d29e30c5eb9ca2f97afb27569afe619807d79736833a809a512d2", + "dweb:/ipfs/QmcZqXjFuVdTrfbteKBF3GuEpjVFZ2YNZTa3J87dyLsqav" + ], + "license": "LZBL-1.2" + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "keccak256": "0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb", + "urls": [ + "bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6", + "dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol": { + "keccak256": "0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d", + "urls": [ + "bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100", + "dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol": { + "keccak256": "0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc", + "urls": [ + "bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037", + "dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol": { + "keccak256": "0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44", + "urls": [ + "bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d", + "dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2", + "urls": [ + "bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303", + "dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol": { + "keccak256": "0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5", + "urls": [ + "bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508", + "dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "keccak256": "0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2", + "urls": [ + "bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12", + "dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol": { + "keccak256": "0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3", + "urls": [ + "bzz-raw://3cf0c69ab827e3251db9ee6a50647d62c90ba580a4d7bbff21f2bea39e7b2f4a", + "dweb:/ipfs/QmZiKwtKU1SBX4RGfQtY7PZfiapbbu6SZ9vizGQD9UHjRA" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c", + "urls": [ + "bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617", + "dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol": { + "keccak256": "0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54", + "urls": [ + "bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8", + "dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy" + ], + "license": "MIT" + }, + "lib/solidity-bytes-utils/contracts/BytesLib.sol": { + "keccak256": "0xf4b07e5d8f69407bb43c6db224adfcf6c73b512dd64e85008ac3c222910c3555", + "urls": [ + "bzz-raw://db020721e59008f7159b65962cc24038c92ac1c2ee8b7cfaa28a1771ced663f5", + "dweb:/ipfs/QmQ8rznRTYc3AoVCJno8tY6vQVKCbhDJ3husfytUUvMrSN" + ], + "license": "Unlicense" + }, + "src/BaseBridgeOApp.sol": { + "keccak256": "0x713913dd10c60dac673e9b49faa5db799d53d4dd1c877712a03f07bf2c178742", + "urls": [ + "bzz-raw://2ea6e6cd292e35033b0492e24de089e5ae65a5dd118e8d5ec8d94d478a760d27", + "dweb:/ipfs/QmQXVPrnuEBLGPNMFk5mTnjhFMQf8EyetskYhvEkFCErLH" + ], + "license": "MIT" + }, + "src/interfaces/IBaseBridgeOApp.sol": { + "keccak256": "0x67e12bf13988c6d4c86e4f1927a65363466136b6cba0d630e59cbb9a39a63558", + "urls": [ + "bzz-raw://03852609cae00931df9d52c0770e314b4f5639d134701e643da86ce7ab29928d", + "dweb:/ipfs/Qmf1bMnd51NoQhCwEbQH8TzRFZpyXN5a4KgDinKKMBpH9Y" + ], + "license": "MIT" + }, + "src/interfaces/IBridgeStorage.sol": { + "keccak256": "0xeb540ee0f9c934d62f349628184a199bf539267e38254200c3acc2bb18b513ca", + "urls": [ + "bzz-raw://8922e33cbf24115faa4efd03b83a7af866981bc580f2c48a148de455a00036d5", + "dweb:/ipfs/QmU8PqXhzXFVKThZmThVXasg2vzWidsZXap53nUmyKtygo" + ], + "license": "MIT" + } + }, + "version": 1 + }, + "id": 50 +} diff --git a/packages/shared/src/abi/index.ts b/packages/shared/src/abi/index.ts index c222c1d..9b23e7c 100644 --- a/packages/shared/src/abi/index.ts +++ b/packages/shared/src/abi/index.ts @@ -5,3 +5,4 @@ export { abi as LiquidityAbi } from "./Liquidity.json"; export { abi as MinterAbi } from "./Minter.json"; export { abi as MockL1ScrollMessengerAbi } from "./MockL1ScrollMessenger.json"; export { abi as RollupAbi } from "./Rollup.json"; +export { abi as BaseBridgeOAppAbi } from "./BaseBridgeOApp.json"; diff --git a/packages/shared/src/blockchain/events.ts b/packages/shared/src/blockchain/events.ts index 94ac201..c8287af 100644 --- a/packages/shared/src/blockchain/events.ts +++ b/packages/shared/src/blockchain/events.ts @@ -31,6 +31,10 @@ export const transferredToLiquidityEvent = parseAbiItem( "event TransferredToLiquidity(uint256 amount)", ); +export const bridgeRequestedEvent = parseAbiItem( + "event BridgeRequested(address indexed recipient, uint256 amount, address indexed user, tuple(bytes32 guid, uint64 nonce, tuple(uint256 nativeFee, uint256 lzTokenFee) fee) receipt)", +); + export const getEventLogs = async ( client: PublicClient, address: `0x${string}`, From daa0f2badf3fc54bc495c31cdacee715dd0ce623 Mon Sep 17 00:00:00 2001 From: signature18632 Date: Fri, 22 Aug 2025 23:50:25 +0700 Subject: [PATCH 03/12] format --- packages/shared/src/abi/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shared/src/abi/index.ts b/packages/shared/src/abi/index.ts index 9b23e7c..c5ddf3b 100644 --- a/packages/shared/src/abi/index.ts +++ b/packages/shared/src/abi/index.ts @@ -1,3 +1,4 @@ +export { abi as BaseBridgeOAppAbi } from "./BaseBridgeOApp.json"; export { abi as BlockBuilderRegistryAbi } from "./BlockBuilderRegistry.json"; export { abi as L1ScrollMessengerAbi } from "./L1ScrollMessenger.json"; export { abi as L2ScrollMessengerAbi } from "./L2ScrollMessenger.json"; @@ -5,4 +6,3 @@ export { abi as LiquidityAbi } from "./Liquidity.json"; export { abi as MinterAbi } from "./Minter.json"; export { abi as MockL1ScrollMessengerAbi } from "./MockL1ScrollMessenger.json"; export { abi as RollupAbi } from "./Rollup.json"; -export { abi as BaseBridgeOAppAbi } from "./BaseBridgeOApp.json"; From fdab23786b08e78eec5425ab4616343ea6bae37d Mon Sep 17 00:00:00 2001 From: signature18632 Date: Fri, 22 Aug 2025 23:51:36 +0700 Subject: [PATCH 04/12] update yarn lock --- yarn.lock | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/yarn.lock b/yarn.lock index 6d73355..bc7610b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1981,6 +1981,18 @@ __metadata: languageName: node linkType: hard +"bridge-monitor@workspace:packages/bridge-monitor": + version: 0.0.0-use.local + resolution: "bridge-monitor@workspace:packages/bridge-monitor" + dependencies: + "@intmax2-function/shared": "workspace:*" + tsx: "npm:^4.20.4" + typescript: "npm:^5.9.2" + viem: "npm:^2.33.3" + vitest: "npm:^3.2.4" + languageName: unknown + linkType: soft + "brorand@npm:^1.1.0": version: 1.1.0 resolution: "brorand@npm:1.1.0" From 07890e661ad85476b75caa1e9a51fca2a614efd3 Mon Sep 17 00:00:00 2001 From: signature18632 Date: Sat, 23 Aug 2025 00:07:34 +0700 Subject: [PATCH 05/12] bridge monitor --- .env.example | 2 + README.md | 1 - packages/bridge-monitor/src/constants.ts | 14 +++++ .../bridge-monitor/src/service/job.service.ts | 54 ++++++++++++++++++- packages/shared/src/blockchain/events.ts | 2 +- packages/shared/src/config/index.ts | 2 + packages/shared/src/constants/constants.ts | 6 +++ 7 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 packages/bridge-monitor/src/constants.ts diff --git a/.env.example b/.env.example index 80c7efe..7e13266 100644 --- a/.env.example +++ b/.env.example @@ -57,6 +57,8 @@ CLAIM_CONTRACT_ADDRESS=0x ROLLUP_CONTRACT_ADDRESS=0x MINTER_CONTRACT_ADDRESS=0x MINTER_CONTRACT_DEPLOYED_BLOCK=0 +BASE_BRIDGE_O_APP_CONTRACT_ADDRESS=0x +BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK=0 # messenger contract L1_SCROLL_MESSENGER_CONTRACT_ADDRESS=0x diff --git a/README.md b/README.md index 847c4e6..9e78597 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,6 @@ gcloud emulators firestore start # Set the FIRESTORE_EMULATOR_HOST variable in the same terminal where you will run your application. export FIRESTORE_EMULATOR_HOST="HOST:PORT" -export FIRESTORE_EMULATOR_HOST="HOST:PORT" # We will use what is displayed in the console. ``` ## Docker diff --git a/packages/bridge-monitor/src/constants.ts b/packages/bridge-monitor/src/constants.ts new file mode 100644 index 0000000..d015adb --- /dev/null +++ b/packages/bridge-monitor/src/constants.ts @@ -0,0 +1,14 @@ +export enum MessageStatus { + INFLIGHT = "INFLIGHT", + CONFIRMING = "CONFIRMING", + VERIFIED = "VERIFIED", + DELIVERED = "DELIVERED", + FAILED = "FAILED", + PAYLOAD_STORED = "PAYLOAD_STORED", + BLOCKED = "BLOCKED", +} + +export const LAYER_ZERO_SCAN_API = { + ["l1"]: "https://scan.layerzero-api.com/v1", + ["l2"]: "https://scan-testnet.layerzero-api.com/v1", +} as const; diff --git a/packages/bridge-monitor/src/service/job.service.ts b/packages/bridge-monitor/src/service/job.service.ts index 594944e..ad4d772 100644 --- a/packages/bridge-monitor/src/service/job.service.ts +++ b/packages/bridge-monitor/src/service/job.service.ts @@ -1,3 +1,55 @@ +import { + BASE_BRIDGE_O_APP_CONTRACT_ADDRESS, + BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK, + BLOCK_RANGE_MINIMUM, + bridgeRequestedEvent, + createNetworkClient, + type DepositEvent, + Event, + type EventData, + FIRESTORE_DOCUMENT_EVENTS, + fetchEvents, + getStartBlockNumber, + logger, + validateBlockRange, + BLOCK_RANGE_TINY, +} from "@intmax2-function/shared"; + export const performJob = async () => { - console.log("Perform job"); + const l2Client = createNetworkClient("l2"); + const event = new Event(FIRESTORE_DOCUMENT_EVENTS.BRIDGE_REQUESTED); + + const [currentBlockNumber, lastProcessedEvent] = await Promise.all([ + await l2Client.getBlockNumber(), + await event.getEvent(), + ]); + + await processBridgeMonitor(l2Client, currentBlockNumber, event, lastProcessedEvent); +}; + +const processBridgeMonitor = async ( + l2Client: ReturnType, + currentBlockNumber: bigint, + event: Event, + lastProcessedEvent: EventData | null, +) => { + const startBlockNumber = getStartBlockNumber( + lastProcessedEvent, + BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK, + ); + const isValid = validateBlockRange("BridgeRequested", startBlockNumber, currentBlockNumber); + if (!isValid) { + logger.info("Skipping process BridgeRequested due to invalid block range."); + return; + } + + const bridgeRequestedEvents = await fetchEvents(l2Client, { + startBlockNumber, + endBlockNumber: currentBlockNumber, + blockRange: BLOCK_RANGE_TINY, + contractAddress: BASE_BRIDGE_O_APP_CONTRACT_ADDRESS, + eventInterface: bridgeRequestedEvent, + }); + + console.log("bridgeRequestedEvents:", bridgeRequestedEvents); }; diff --git a/packages/shared/src/blockchain/events.ts b/packages/shared/src/blockchain/events.ts index c8287af..96afab4 100644 --- a/packages/shared/src/blockchain/events.ts +++ b/packages/shared/src/blockchain/events.ts @@ -32,7 +32,7 @@ export const transferredToLiquidityEvent = parseAbiItem( ); export const bridgeRequestedEvent = parseAbiItem( - "event BridgeRequested(address indexed recipient, uint256 amount, address indexed user, tuple(bytes32 guid, uint64 nonce, tuple(uint256 nativeFee, uint256 lzTokenFee) fee) receipt)", + "event BridgeRequested(address indexed recipient, uint256 amount, address indexed user, (bytes32 guid, uint64 nonce, (uint256 nativeFee, uint256 lzTokenFee) fee) receipt)", ); export const getEventLogs = async ( diff --git a/packages/shared/src/config/index.ts b/packages/shared/src/config/index.ts index 2f7000c..0816539 100644 --- a/packages/shared/src/config/index.ts +++ b/packages/shared/src/config/index.ts @@ -77,6 +77,8 @@ export const config = cleanEnv(process.env, { ROLLUP_CONTRACT_ADDRESS: str({ devDefault: "0x" }), MINTER_CONTRACT_ADDRESS: str({ devDefault: "0x" }), MINTER_CONTRACT_DEPLOYED_BLOCK: num({ devDefault: 0 }), + BASE_BRIDGE_O_APP_CONTRACT_ADDRESS: str({ devDefault: "0x" }), + BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK: num({ devDefault: 0 }), // messenger contract L1_SCROLL_MESSENGER_CONTRACT_ADDRESS: str({ devDefault: "0x" }), MOCK_L1_SCROLL_MESSENGER_CONTRACT_ADDRESS: str({ default: "0x" }), diff --git a/packages/shared/src/constants/constants.ts b/packages/shared/src/constants/constants.ts index 2403633..de2087e 100644 --- a/packages/shared/src/constants/constants.ts +++ b/packages/shared/src/constants/constants.ts @@ -34,6 +34,7 @@ export const FIRESTORE_DOCUMENT_EVENTS = { MOCK_L2_SENT_MESSAGE: "mockL2SentMessage", BLOCK_BUILDER_HEART_BEAT: "blockBuilderHeartBeat", MINTER: "minter", + BRIDGE_REQUESTED: "bridgeRequested", } as const; export const FIRESTORE_MAX_BATCH_SIZE = 500; @@ -67,6 +68,10 @@ export const L1_SCROLL_MESSENGER_CONTRACT_ADDRESS = config.L1_SCROLL_MESSENGER_CONTRACT_ADDRESS as `0x${string}`; export const MINTER_CONTRACT_ADDRESS = config.MINTER_CONTRACT_ADDRESS as `0x${string}`; export const MINTER_CONTRACT_DEPLOYED_BLOCK = config.MINTER_CONTRACT_DEPLOYED_BLOCK; +export const BASE_BRIDGE_O_APP_CONTRACT_ADDRESS = + config.BASE_BRIDGE_O_APP_CONTRACT_ADDRESS as `0x${string}`; +export const BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK = + config.BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK; // mock export const MOCK_L1_SCROLL_MESSENGER_CONTRACT_ADDRESS = @@ -90,6 +95,7 @@ export const TRANSACTION_WAIT_TRANSACTION_TIMEOUT = config.TRANSACTION_WAIT_TRAN export const TRANSACTION_INCREMENT_RATE = config.TRANSACTION_INCREMENT_RATE; // block event +export const BLOCK_RANGE_TINY = 499n; export const BLOCK_RANGE_MINIMUM = 10000n; export const BLOCK_RANGE_NORMAL = 30000n; export const BLOCK_RANGE_MAX = 100000n; From 3364f0a5fe6e426dc07bbd943821b8dbc16040e1 Mon Sep 17 00:00:00 2001 From: signature18632 Date: Sat, 23 Aug 2025 00:20:15 +0700 Subject: [PATCH 06/12] added MainnetBridgeOApp.json --- .env.example | 2 + .../bridge-monitor/src/service/job.service.ts | 2 +- .../shared/src/abi/MainnetBridgeOApp.json | 937 ++++++++++++++++++ packages/shared/src/abi/index.ts | 1 + packages/shared/src/config/index.ts | 2 + 5 files changed, 943 insertions(+), 1 deletion(-) create mode 100644 packages/shared/src/abi/MainnetBridgeOApp.json diff --git a/.env.example b/.env.example index 7e13266..389b82d 100644 --- a/.env.example +++ b/.env.example @@ -57,6 +57,8 @@ CLAIM_CONTRACT_ADDRESS=0x ROLLUP_CONTRACT_ADDRESS=0x MINTER_CONTRACT_ADDRESS=0x MINTER_CONTRACT_DEPLOYED_BLOCK=0 +MAINNET_BRIDGE_O_APP_CONTRACT_ADDRESS=0x +MAINNET_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK=0 BASE_BRIDGE_O_APP_CONTRACT_ADDRESS=0x BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK=0 diff --git a/packages/bridge-monitor/src/service/job.service.ts b/packages/bridge-monitor/src/service/job.service.ts index ad4d772..92c1937 100644 --- a/packages/bridge-monitor/src/service/job.service.ts +++ b/packages/bridge-monitor/src/service/job.service.ts @@ -2,6 +2,7 @@ import { BASE_BRIDGE_O_APP_CONTRACT_ADDRESS, BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK, BLOCK_RANGE_MINIMUM, + BLOCK_RANGE_TINY, bridgeRequestedEvent, createNetworkClient, type DepositEvent, @@ -12,7 +13,6 @@ import { getStartBlockNumber, logger, validateBlockRange, - BLOCK_RANGE_TINY, } from "@intmax2-function/shared"; export const performJob = async () => { diff --git a/packages/shared/src/abi/MainnetBridgeOApp.json b/packages/shared/src/abi/MainnetBridgeOApp.json new file mode 100644 index 0000000..530bfdf --- /dev/null +++ b/packages/shared/src/abi/MainnetBridgeOApp.json @@ -0,0 +1,937 @@ +{ + "abi": [ + { + "type": "constructor", + "inputs": [ + { "name": "_endpoint", "type": "address", "internalType": "address" }, + { "name": "_delegate", "type": "address", "internalType": "address" }, + { "name": "_owner", "type": "address", "internalType": "address" }, + { "name": "_token", "type": "address", "internalType": "address" }, + { "name": "_srcEid", "type": "uint32", "internalType": "uint32" }, + { "name": "_srcSender", "type": "bytes32", "internalType": "bytes32" } + ], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "allowInitializePath", + "inputs": [ + { + "name": "origin", + "type": "tuple", + "internalType": "struct Origin", + "components": [ + { "name": "srcEid", "type": "uint32", "internalType": "uint32" }, + { "name": "sender", "type": "bytes32", "internalType": "bytes32" }, + { "name": "nonce", "type": "uint64", "internalType": "uint64" } + ] + } + ], + "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "clearMessage", + "inputs": [ + { + "name": "_origin", + "type": "tuple", + "internalType": "struct Origin", + "components": [ + { "name": "srcEid", "type": "uint32", "internalType": "uint32" }, + { "name": "sender", "type": "bytes32", "internalType": "bytes32" }, + { "name": "nonce", "type": "uint64", "internalType": "uint64" } + ] + }, + { "name": "_guid", "type": "bytes32", "internalType": "bytes32" }, + { "name": "_message", "type": "bytes", "internalType": "bytes" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "endpoint", + "inputs": [], + "outputs": [ + { "name": "", "type": "address", "internalType": "contract ILayerZeroEndpointV2" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "hasStoredPayload", + "inputs": [ + { "name": "srcEid", "type": "uint32", "internalType": "uint32" }, + { "name": "sender", "type": "bytes32", "internalType": "bytes32" }, + { "name": "nonce", "type": "uint64", "internalType": "uint64" }, + { "name": "guid", "type": "bytes32", "internalType": "bytes32" }, + { "name": "message", "type": "bytes", "internalType": "bytes" } + ], + "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "isComposeMsgSender", + "inputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct Origin", + "components": [ + { "name": "srcEid", "type": "uint32", "internalType": "uint32" }, + { "name": "sender", "type": "bytes32", "internalType": "bytes32" }, + { "name": "nonce", "type": "uint64", "internalType": "uint64" } + ] + }, + { "name": "", "type": "bytes", "internalType": "bytes" }, + { "name": "_sender", "type": "address", "internalType": "address" } + ], + "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "lzReceive", + "inputs": [ + { + "name": "_origin", + "type": "tuple", + "internalType": "struct Origin", + "components": [ + { "name": "srcEid", "type": "uint32", "internalType": "uint32" }, + { "name": "sender", "type": "bytes32", "internalType": "bytes32" }, + { "name": "nonce", "type": "uint64", "internalType": "uint64" } + ] + }, + { "name": "_guid", "type": "bytes32", "internalType": "bytes32" }, + { "name": "_message", "type": "bytes", "internalType": "bytes" }, + { "name": "_executor", "type": "address", "internalType": "address" }, + { "name": "_extraData", "type": "bytes", "internalType": "bytes" } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "manualRetry", + "inputs": [ + { + "name": "_origin", + "type": "tuple", + "internalType": "struct Origin", + "components": [ + { "name": "srcEid", "type": "uint32", "internalType": "uint32" }, + { "name": "sender", "type": "bytes32", "internalType": "bytes32" }, + { "name": "nonce", "type": "uint64", "internalType": "uint64" } + ] + }, + { "name": "_guid", "type": "bytes32", "internalType": "bytes32" }, + { "name": "_message", "type": "bytes", "internalType": "bytes" }, + { "name": "_extraData", "type": "bytes", "internalType": "bytes" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "nextNonce", + "inputs": [ + { "name": "", "type": "uint32", "internalType": "uint32" }, + { "name": "", "type": "bytes32", "internalType": "bytes32" } + ], + "outputs": [{ "name": "nonce", "type": "uint64", "internalType": "uint64" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "oAppVersion", + "inputs": [], + "outputs": [ + { "name": "senderVersion", "type": "uint64", "internalType": "uint64" }, + { "name": "receiverVersion", "type": "uint64", "internalType": "uint64" } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "peers", + "inputs": [{ "name": "eid", "type": "uint32", "internalType": "uint32" }], + "outputs": [{ "name": "peer", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "renounceOwnership", + "inputs": [], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setDelegate", + "inputs": [{ "name": "_delegate", "type": "address", "internalType": "address" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setPeer", + "inputs": [ + { "name": "_eid", "type": "uint32", "internalType": "uint32" }, + { "name": "_peer", "type": "bytes32", "internalType": "bytes32" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [{ "name": "newOwner", "type": "address", "internalType": "address" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "withdrawTokens", + "inputs": [ + { "name": "to", "type": "address", "internalType": "address" }, + { "name": "amount", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "event", + "name": "BridgeFulfilled", + "inputs": [ + { "name": "srcUser", "type": "address", "indexed": true, "internalType": "address" }, + { "name": "recipient", "type": "address", "indexed": true, "internalType": "address" }, + { "name": "amount", "type": "uint256", "indexed": false, "internalType": "uint256" } + ], + "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 + }, + { + "type": "event", + "name": "PeerSet", + "inputs": [ + { "name": "eid", "type": "uint32", "indexed": false, "internalType": "uint32" }, + { "name": "peer", "type": "bytes32", "indexed": false, "internalType": "bytes32" } + ], + "anonymous": false + }, + { + "type": "event", + "name": "TokensWithdrawn", + "inputs": [ + { "name": "to", "type": "address", "indexed": true, "internalType": "address" }, + { "name": "amount", "type": "uint256", "indexed": false, "internalType": "uint256" } + ], + "anonymous": false + }, + { "type": "error", "name": "BadSender", "inputs": [] }, + { "type": "error", "name": "BadSrcEid", "inputs": [] }, + { "type": "error", "name": "InvalidAddress", "inputs": [] }, + { "type": "error", "name": "InvalidAmount", "inputs": [] }, + { "type": "error", "name": "InvalidDelegate", "inputs": [] }, + { "type": "error", "name": "InvalidEndpointCall", "inputs": [] }, + { + "type": "error", + "name": "NoPeer", + "inputs": [{ "name": "eid", "type": "uint32", "internalType": "uint32" }] + }, + { + "type": "error", + "name": "OnlyEndpoint", + "inputs": [{ "name": "addr", "type": "address", "internalType": "address" }] + }, + { + "type": "error", + "name": "OnlyPeer", + "inputs": [ + { "name": "eid", "type": "uint32", "internalType": "uint32" }, + { "name": "sender", "type": "bytes32", "internalType": "bytes32" } + ] + }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [{ "name": "owner", "type": "address", "internalType": "address" }] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [{ "name": "account", "type": "address", "internalType": "address" }] + }, + { "type": "error", "name": "RecipientZero", "inputs": [] }, + { + "type": "error", + "name": "SafeERC20FailedOperation", + "inputs": [{ "name": "token", "type": "address", "internalType": "address" }] + } + ], + "bytecode": { + "object": "0x610100604052348015610010575f5ffd5b50604051611e7f380380611e7f8339818101604052810190610032919061039e565b8585855f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100a5575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161009c9190610436565b60405180910390fd5b6100b48161021360201b60201c565b508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361014e576040517fb586360400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60805173ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b81526004016101899190610436565b5f604051808303815f87803b1580156101a0575f5ffd5b505af11580156101b2573d5f5f3e3d5ffd5b5050505050508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508163ffffffff1660c08163ffffffff16815250508060e0818152505050505050505061044f565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610301826102d8565b9050919050565b610311816102f7565b811461031b575f5ffd5b50565b5f8151905061032c81610308565b92915050565b5f63ffffffff82169050919050565b61034a81610332565b8114610354575f5ffd5b50565b5f8151905061036581610341565b92915050565b5f819050919050565b61037d8161036b565b8114610387575f5ffd5b50565b5f8151905061039881610374565b92915050565b5f5f5f5f5f5f60c087890312156103b8576103b76102d4565b5b5f6103c589828a0161031e565b96505060206103d689828a0161031e565b95505060406103e789828a0161031e565b94505060606103f889828a0161031e565b935050608061040989828a01610357565b92505060a061041a89828a0161038a565b9150509295509295509295565b610430816102f7565b82525050565b5f6020820190506104495f830184610427565b92915050565b60805160a05160c05160e0516119d96104a65f395f50505f50505f81816104700152610c6401525f818161053c015281816105f10152818161069c015281816107c80152818161086a015261092101526119d95ff3fe6080604052600436106100f2575f3560e01c80637d25a05e11610089578063bb0b6a5311610058578063bb0b6a53146102fb578063ca5eb5e114610337578063f2fde38b1461035f578063ff7bd03d14610387576100f2565b80637d25a05e1461023157806382413eac1461026d5780638da5cb5b146102a9578063b9a9c0d6146102d3576100f2565b806317442b70116100c557806317442b701461019e5780633400288b146101c95780635e280f11146101f1578063715018a61461021b576100f2565b806306b091f9146100f65780630787bddb1461011e5780630a96997d1461015a57806313137d6514610182575b5f5ffd5b348015610101575f5ffd5b5061011c60048036038101906101179190610f70565b6103c3565b005b348015610129575f5ffd5b50610144600480360381019061013f91906110b8565b610506565b6040516101519190611168565b60405180910390f35b348015610165575f5ffd5b50610180600480360381019061017b91906111a3565b6105e7565b005b61019c60048036038101906101979190611214565b610683565b005b3480156101a9575f5ffd5b506101b26107a3565b6040516101c09291906112da565b60405180910390f35b3480156101d4575f5ffd5b506101ef60048036038101906101ea9190611301565b6107b0565b005b3480156101fc575f5ffd5b506102056107c6565b604051610212919061139a565b60405180910390f35b348015610226575f5ffd5b5061022f6107ea565b005b34801561023c575f5ffd5b5061025760048036038101906102529190611301565b6107fd565b60405161026491906113b3565b60405180910390f35b348015610278575f5ffd5b50610293600480360381019061028e91906113cc565b610807565b6040516102a09190611168565b60405180910390f35b3480156102b4575f5ffd5b506102bd610841565b6040516102ca919061144c565b60405180910390f35b3480156102de575f5ffd5b506102f960048036038101906102f49190611465565b610868565b005b348015610306575f5ffd5b50610321600480360381019061031c9190611508565b610902565b60405161032e9190611542565b60405180910390f35b348015610342575f5ffd5b5061035d6004803603810190610358919061155b565b610917565b005b34801561036a575f5ffd5b506103856004803603810190610380919061155b565b6109a8565b005b348015610392575f5ffd5b506103ad60048036038101906103a89190611586565b610a2c565b6040516103ba9190611168565b60405180910390f35b6103cb610a69565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610430576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610469576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104b482827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610af09092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b826040516104fa91906115c0565b60405180910390a25050565b5f5f84848460405160200161051d93929190611635565b60405160208183030381529060405290505f81805190602001209050807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9fc7bcd308c8c8c6040518563ffffffff1660e01b8152600401610599949392919061166d565b602060405180830381865afa1580156105b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d891906116c4565b14925050509695505050505050565b6105ef610a69565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632a56c1b030868686866040518663ffffffff1660e01b8152600401610650959493929190611802565b5f604051808303815f87803b158015610667575f5ffd5b505af1158015610679573d5f5f3e3d5ffd5b5050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461071357336040517f91ac5e4f00000000000000000000000000000000000000000000000000000000815260040161070a919061144c565b60405180910390fd5b8660200135610732885f01602081019061072d9190611508565b610b6f565b1461078b57865f0160208101906107499190611508565b87602001356040517fc26bebcc00000000000000000000000000000000000000000000000000000000815260040161078292919061184e565b60405180910390fd5b61079a87878787878787610be0565b50505050505050565b5f5f5f6002915091509091565b6107b8610a69565b6107c28282610d19565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6107f2610a69565b6107fb5f610d78565b565b5f5f905092915050565b5f3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050949350505050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630c0c389e873088888888886040518863ffffffff1660e01b81526004016108cd9796959493929190611875565b5f604051808303815f87803b1580156108e4575f5ffd5b505af11580156108f6573d5f5f3e3d5ffd5b50505050505050505050565b6001602052805f5260405f205f915090505481565b61091f610a69565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b8152600401610978919061144c565b5f604051808303815f87803b15801561098f575f5ffd5b505af11580156109a1573d5f5f3e3d5ffd5b5050505050565b6109b0610a69565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a20575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610a17919061144c565b60405180910390fd5b610a2981610d78565b50565b5f816020013560015f845f016020810190610a479190611508565b63ffffffff1663ffffffff1681526020019081526020015f2054149050919050565b610a71610e39565b73ffffffffffffffffffffffffffffffffffffffff16610a8f610841565b73ffffffffffffffffffffffffffffffffffffffff1614610aee57610ab2610e39565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610ae5919061144c565b60405180910390fd5b565b610b6a838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401610b239291906118d8565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610e40565b505050565b5f5f60015f8463ffffffff1663ffffffff1681526020019081526020015f205490505f5f1b8103610bd757826040517ff6ff4fb7000000000000000000000000000000000000000000000000000000008152600401610bce91906118ff565b60405180910390fd5b80915050919050565b5f5f5f8787810190610bf29190611953565b9250925092505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c5d576040517f3d9eb1db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ca883837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610af09092919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fdd9f27a2298663148e8518b15d063f9febfad5269089f80b35cd6f59074190c684604051610d0591906115c0565b60405180910390a350505050505050505050565b8060015f8463ffffffff1663ffffffff1681526020019081526020015f20819055507f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b8282604051610d6c92919061184e565b60405180910390a15050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f5f60205f8451602086015f885af180610e5f576040513d5f823e3d81fd5b3d92505f519150505f8214610e78576001811415610e93565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b15610ed557836040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401610ecc919061144c565b60405180910390fd5b50505050565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610f0c82610ee3565b9050919050565b610f1c81610f02565b8114610f26575f5ffd5b50565b5f81359050610f3781610f13565b92915050565b5f819050919050565b610f4f81610f3d565b8114610f59575f5ffd5b50565b5f81359050610f6a81610f46565b92915050565b5f5f60408385031215610f8657610f85610edb565b5b5f610f9385828601610f29565b9250506020610fa485828601610f5c565b9150509250929050565b5f63ffffffff82169050919050565b610fc681610fae565b8114610fd0575f5ffd5b50565b5f81359050610fe181610fbd565b92915050565b5f819050919050565b610ff981610fe7565b8114611003575f5ffd5b50565b5f8135905061101481610ff0565b92915050565b5f67ffffffffffffffff82169050919050565b6110368161101a565b8114611040575f5ffd5b50565b5f813590506110518161102d565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261107857611077611057565b5b8235905067ffffffffffffffff8111156110955761109461105b565b5b6020830191508360018202830111156110b1576110b061105f565b5b9250929050565b5f5f5f5f5f5f60a087890312156110d2576110d1610edb565b5b5f6110df89828a01610fd3565b96505060206110f089828a01611006565b955050604061110189828a01611043565b945050606061111289828a01611006565b935050608087013567ffffffffffffffff81111561113357611132610edf565b5b61113f89828a01611063565b92509250509295509295509295565b5f8115159050919050565b6111628161114e565b82525050565b5f60208201905061117b5f830184611159565b92915050565b5f5ffd5b5f6060828403121561119a57611199611181565b5b81905092915050565b5f5f5f5f60a085870312156111bb576111ba610edb565b5b5f6111c887828801611185565b94505060606111d987828801611006565b935050608085013567ffffffffffffffff8111156111fa576111f9610edf565b5b61120687828801611063565b925092505092959194509250565b5f5f5f5f5f5f5f60e0888a03121561122f5761122e610edb565b5b5f61123c8a828b01611185565b975050606061124d8a828b01611006565b965050608088013567ffffffffffffffff81111561126e5761126d610edf565b5b61127a8a828b01611063565b955095505060a061128d8a828b01610f29565b93505060c088013567ffffffffffffffff8111156112ae576112ad610edf565b5b6112ba8a828b01611063565b925092505092959891949750929550565b6112d48161101a565b82525050565b5f6040820190506112ed5f8301856112cb565b6112fa60208301846112cb565b9392505050565b5f5f6040838503121561131757611316610edb565b5b5f61132485828601610fd3565b925050602061133585828601611006565b9150509250929050565b5f819050919050565b5f61136261135d61135884610ee3565b61133f565b610ee3565b9050919050565b5f61137382611348565b9050919050565b5f61138482611369565b9050919050565b6113948161137a565b82525050565b5f6020820190506113ad5f83018461138b565b92915050565b5f6020820190506113c65f8301846112cb565b92915050565b5f5f5f5f60a085870312156113e4576113e3610edb565b5b5f6113f187828801611185565b945050606085013567ffffffffffffffff81111561141257611411610edf565b5b61141e87828801611063565b9350935050608061143187828801610f29565b91505092959194509250565b61144681610f02565b82525050565b5f60208201905061145f5f83018461143d565b92915050565b5f5f5f5f5f5f60c0878903121561147f5761147e610edb565b5b5f61148c89828a01611185565b965050606061149d89828a01611006565b955050608087013567ffffffffffffffff8111156114be576114bd610edf565b5b6114ca89828a01611063565b945094505060a087013567ffffffffffffffff8111156114ed576114ec610edf565b5b6114f989828a01611063565b92509250509295509295509295565b5f6020828403121561151d5761151c610edb565b5b5f61152a84828501610fd3565b91505092915050565b61153c81610fe7565b82525050565b5f6020820190506115555f830184611533565b92915050565b5f602082840312156115705761156f610edb565b5b5f61157d84828501610f29565b91505092915050565b5f6060828403121561159b5761159a610edb565b5b5f6115a884828501611185565b91505092915050565b6115ba81610f3d565b82525050565b5f6020820190506115d35f8301846115b1565b92915050565b5f819050919050565b6115f36115ee82610fe7565b6115d9565b82525050565b5f81905092915050565b828183375f83830152505050565b5f61161c83856115f9565b9350611629838584611603565b82840190509392505050565b5f61164082866115e2565b602082019150611651828486611611565b9150819050949350505050565b61166781610fae565b82525050565b5f6080820190506116805f83018761143d565b61168d602083018661165e565b61169a6040830185611533565b6116a760608301846112cb565b95945050505050565b5f815190506116be81610ff0565b92915050565b5f602082840312156116d9576116d8610edb565b5b5f6116e6848285016116b0565b91505092915050565b5f6116fd6020840184610fd3565b905092915050565b61170e81610fae565b82525050565b5f6117226020840184611006565b905092915050565b61173381610fe7565b82525050565b5f6117476020840184611043565b905092915050565b6117588161101a565b82525050565b6060820161176e5f8301836116ef565b61177a5f850182611705565b506117886020830183611714565b611795602085018261172a565b506117a36040830183611739565b6117b0604085018261174f565b50505050565b5f82825260208201905092915050565b5f601f19601f8301169050919050565b5f6117e183856117b6565b93506117ee838584611603565b6117f7836117c6565b840190509392505050565b5f60c0820190506118155f83018861143d565b611822602083018761175e565b61182f6080830186611533565b81810360a08301526118428184866117d6565b90509695505050505050565b5f6040820190506118615f83018561165e565b61186e6020830184611533565b9392505050565b5f60e0820190506118885f83018a61175e565b611895606083018961143d565b6118a26080830188611533565b81810360a08301526118b58186886117d6565b905081810360c08301526118ca8184866117d6565b905098975050505050505050565b5f6040820190506118eb5f83018561143d565b6118f860208301846115b1565b9392505050565b5f6020820190506119125f83018461165e565b92915050565b5f61192282610ee3565b9050919050565b61193281611918565b811461193c575f5ffd5b50565b5f8135905061194d81611929565b92915050565b5f5f5f6060848603121561196a57611969610edb565b5b5f6119778682870161193f565b935050602061198886828701610f5c565b92505060406119998682870161193f565b915050925092509256fea26469706673582212207202fd70410df61eca847a9ccc44a55e49e9ecf277f8e0c05a6f0c0dbacc0b6564736f6c634300081e0033", + "sourceMap": "586:2357:52:-:0;;;808:321;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;989:9;1000;1019:6;1297:1:37;1273:26;;:12;:26;;;1269:95;;1350:1;1322:31;;;;;;;;;;;:::i;:::-;;;;;;;;1269:95;1373:32;1392:12;1373:18;;;:32;;:::i;:::-;1225:187;1079:9:2;1047:42;;;;;;;;;;1125:1;1104:23;;:9;:23;;;1100:53;;1136:17;;;;;;;;;;;;;;1100:53;1163:8;;:20;;;1184:9;1163:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;987:214;;1053:6:52::2;1037:23;;;;;;;;::::0;::::2;1081:7;1070:18;;;;;;;;::::0;::::2;1112:10;1098:24;;;;::::0;::::2;808:321:::0;;;;;;586:2357;;2912:187:37;2985:16;3004:6;;;;;;;;;;;2985:25;;3029:8;3020:6;;:17;;;;;;;;;;;;;;;;;;3083:8;3052:40;;3073:8;3052:40;;;;;;;;;;;;2975:124;2912:187;:::o;88:117:59:-;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:143::-;753:5;784:6;778:13;769:22;;800:33;827:5;800:33;:::i;:::-;696:143;;;;:::o;845:93::-;881:7;921:10;914:5;910:22;899:33;;845:93;;;:::o;944:120::-;1016:23;1033:5;1016:23;:::i;:::-;1009:5;1006:34;996:62;;1054:1;1051;1044:12;996:62;944:120;:::o;1070:141::-;1126:5;1157:6;1151:13;1142:22;;1173:32;1199:5;1173:32;:::i;:::-;1070:141;;;;:::o;1217:77::-;1254:7;1283:5;1272:16;;1217:77;;;:::o;1300:122::-;1373:24;1391:5;1373:24;:::i;:::-;1366:5;1363:35;1353:63;;1412:1;1409;1402:12;1353:63;1300:122;:::o;1428:143::-;1485:5;1516:6;1510:13;1501:22;;1532:33;1559:5;1532:33;:::i;:::-;1428:143;;;;:::o;1577:1132::-;1691:6;1699;1707;1715;1723;1731;1780:3;1768:9;1759:7;1755:23;1751:33;1748:120;;;1787:79;;:::i;:::-;1748:120;1907:1;1932:64;1988:7;1979:6;1968:9;1964:22;1932:64;:::i;:::-;1922:74;;1878:128;2045:2;2071:64;2127:7;2118:6;2107:9;2103:22;2071:64;:::i;:::-;2061:74;;2016:129;2184:2;2210:64;2266:7;2257:6;2246:9;2242:22;2210:64;:::i;:::-;2200:74;;2155:129;2323:2;2349:64;2405:7;2396:6;2385:9;2381:22;2349:64;:::i;:::-;2339:74;;2294:129;2462:3;2489:63;2544:7;2535:6;2524:9;2520:22;2489:63;:::i;:::-;2479:73;;2433:129;2601:3;2628:64;2684:7;2675:6;2664:9;2660:22;2628:64;:::i;:::-;2618:74;;2572:130;1577:1132;;;;;;;;:::o;2715:118::-;2802:24;2820:5;2802:24;:::i;:::-;2797:3;2790:37;2715:118;;:::o;2839:222::-;2932:4;2970:2;2959:9;2955:18;2947:26;;2983:71;3051:1;3040:9;3036:17;3027:6;2983:71;:::i;:::-;2839:222;;;;:::o;586:2357:52:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", + "linkReferences": {} + }, + "deployedBytecode": { + "object": "0x6080604052600436106100f2575f3560e01c80637d25a05e11610089578063bb0b6a5311610058578063bb0b6a53146102fb578063ca5eb5e114610337578063f2fde38b1461035f578063ff7bd03d14610387576100f2565b80637d25a05e1461023157806382413eac1461026d5780638da5cb5b146102a9578063b9a9c0d6146102d3576100f2565b806317442b70116100c557806317442b701461019e5780633400288b146101c95780635e280f11146101f1578063715018a61461021b576100f2565b806306b091f9146100f65780630787bddb1461011e5780630a96997d1461015a57806313137d6514610182575b5f5ffd5b348015610101575f5ffd5b5061011c60048036038101906101179190610f70565b6103c3565b005b348015610129575f5ffd5b50610144600480360381019061013f91906110b8565b610506565b6040516101519190611168565b60405180910390f35b348015610165575f5ffd5b50610180600480360381019061017b91906111a3565b6105e7565b005b61019c60048036038101906101979190611214565b610683565b005b3480156101a9575f5ffd5b506101b26107a3565b6040516101c09291906112da565b60405180910390f35b3480156101d4575f5ffd5b506101ef60048036038101906101ea9190611301565b6107b0565b005b3480156101fc575f5ffd5b506102056107c6565b604051610212919061139a565b60405180910390f35b348015610226575f5ffd5b5061022f6107ea565b005b34801561023c575f5ffd5b5061025760048036038101906102529190611301565b6107fd565b60405161026491906113b3565b60405180910390f35b348015610278575f5ffd5b50610293600480360381019061028e91906113cc565b610807565b6040516102a09190611168565b60405180910390f35b3480156102b4575f5ffd5b506102bd610841565b6040516102ca919061144c565b60405180910390f35b3480156102de575f5ffd5b506102f960048036038101906102f49190611465565b610868565b005b348015610306575f5ffd5b50610321600480360381019061031c9190611508565b610902565b60405161032e9190611542565b60405180910390f35b348015610342575f5ffd5b5061035d6004803603810190610358919061155b565b610917565b005b34801561036a575f5ffd5b506103856004803603810190610380919061155b565b6109a8565b005b348015610392575f5ffd5b506103ad60048036038101906103a89190611586565b610a2c565b6040516103ba9190611168565b60405180910390f35b6103cb610a69565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610430576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610469576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104b482827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610af09092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b826040516104fa91906115c0565b60405180910390a25050565b5f5f84848460405160200161051d93929190611635565b60405160208183030381529060405290505f81805190602001209050807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9fc7bcd308c8c8c6040518563ffffffff1660e01b8152600401610599949392919061166d565b602060405180830381865afa1580156105b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d891906116c4565b14925050509695505050505050565b6105ef610a69565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632a56c1b030868686866040518663ffffffff1660e01b8152600401610650959493929190611802565b5f604051808303815f87803b158015610667575f5ffd5b505af1158015610679573d5f5f3e3d5ffd5b5050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461071357336040517f91ac5e4f00000000000000000000000000000000000000000000000000000000815260040161070a919061144c565b60405180910390fd5b8660200135610732885f01602081019061072d9190611508565b610b6f565b1461078b57865f0160208101906107499190611508565b87602001356040517fc26bebcc00000000000000000000000000000000000000000000000000000000815260040161078292919061184e565b60405180910390fd5b61079a87878787878787610be0565b50505050505050565b5f5f5f6002915091509091565b6107b8610a69565b6107c28282610d19565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6107f2610a69565b6107fb5f610d78565b565b5f5f905092915050565b5f3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050949350505050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630c0c389e873088888888886040518863ffffffff1660e01b81526004016108cd9796959493929190611875565b5f604051808303815f87803b1580156108e4575f5ffd5b505af11580156108f6573d5f5f3e3d5ffd5b50505050505050505050565b6001602052805f5260405f205f915090505481565b61091f610a69565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b8152600401610978919061144c565b5f604051808303815f87803b15801561098f575f5ffd5b505af11580156109a1573d5f5f3e3d5ffd5b5050505050565b6109b0610a69565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a20575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610a17919061144c565b60405180910390fd5b610a2981610d78565b50565b5f816020013560015f845f016020810190610a479190611508565b63ffffffff1663ffffffff1681526020019081526020015f2054149050919050565b610a71610e39565b73ffffffffffffffffffffffffffffffffffffffff16610a8f610841565b73ffffffffffffffffffffffffffffffffffffffff1614610aee57610ab2610e39565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610ae5919061144c565b60405180910390fd5b565b610b6a838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401610b239291906118d8565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610e40565b505050565b5f5f60015f8463ffffffff1663ffffffff1681526020019081526020015f205490505f5f1b8103610bd757826040517ff6ff4fb7000000000000000000000000000000000000000000000000000000008152600401610bce91906118ff565b60405180910390fd5b80915050919050565b5f5f5f8787810190610bf29190611953565b9250925092505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c5d576040517f3d9eb1db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ca883837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610af09092919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fdd9f27a2298663148e8518b15d063f9febfad5269089f80b35cd6f59074190c684604051610d0591906115c0565b60405180910390a350505050505050505050565b8060015f8463ffffffff1663ffffffff1681526020019081526020015f20819055507f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b8282604051610d6c92919061184e565b60405180910390a15050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f5f60205f8451602086015f885af180610e5f576040513d5f823e3d81fd5b3d92505f519150505f8214610e78576001811415610e93565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b15610ed557836040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401610ecc919061144c565b60405180910390fd5b50505050565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610f0c82610ee3565b9050919050565b610f1c81610f02565b8114610f26575f5ffd5b50565b5f81359050610f3781610f13565b92915050565b5f819050919050565b610f4f81610f3d565b8114610f59575f5ffd5b50565b5f81359050610f6a81610f46565b92915050565b5f5f60408385031215610f8657610f85610edb565b5b5f610f9385828601610f29565b9250506020610fa485828601610f5c565b9150509250929050565b5f63ffffffff82169050919050565b610fc681610fae565b8114610fd0575f5ffd5b50565b5f81359050610fe181610fbd565b92915050565b5f819050919050565b610ff981610fe7565b8114611003575f5ffd5b50565b5f8135905061101481610ff0565b92915050565b5f67ffffffffffffffff82169050919050565b6110368161101a565b8114611040575f5ffd5b50565b5f813590506110518161102d565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261107857611077611057565b5b8235905067ffffffffffffffff8111156110955761109461105b565b5b6020830191508360018202830111156110b1576110b061105f565b5b9250929050565b5f5f5f5f5f5f60a087890312156110d2576110d1610edb565b5b5f6110df89828a01610fd3565b96505060206110f089828a01611006565b955050604061110189828a01611043565b945050606061111289828a01611006565b935050608087013567ffffffffffffffff81111561113357611132610edf565b5b61113f89828a01611063565b92509250509295509295509295565b5f8115159050919050565b6111628161114e565b82525050565b5f60208201905061117b5f830184611159565b92915050565b5f5ffd5b5f6060828403121561119a57611199611181565b5b81905092915050565b5f5f5f5f60a085870312156111bb576111ba610edb565b5b5f6111c887828801611185565b94505060606111d987828801611006565b935050608085013567ffffffffffffffff8111156111fa576111f9610edf565b5b61120687828801611063565b925092505092959194509250565b5f5f5f5f5f5f5f60e0888a03121561122f5761122e610edb565b5b5f61123c8a828b01611185565b975050606061124d8a828b01611006565b965050608088013567ffffffffffffffff81111561126e5761126d610edf565b5b61127a8a828b01611063565b955095505060a061128d8a828b01610f29565b93505060c088013567ffffffffffffffff8111156112ae576112ad610edf565b5b6112ba8a828b01611063565b925092505092959891949750929550565b6112d48161101a565b82525050565b5f6040820190506112ed5f8301856112cb565b6112fa60208301846112cb565b9392505050565b5f5f6040838503121561131757611316610edb565b5b5f61132485828601610fd3565b925050602061133585828601611006565b9150509250929050565b5f819050919050565b5f61136261135d61135884610ee3565b61133f565b610ee3565b9050919050565b5f61137382611348565b9050919050565b5f61138482611369565b9050919050565b6113948161137a565b82525050565b5f6020820190506113ad5f83018461138b565b92915050565b5f6020820190506113c65f8301846112cb565b92915050565b5f5f5f5f60a085870312156113e4576113e3610edb565b5b5f6113f187828801611185565b945050606085013567ffffffffffffffff81111561141257611411610edf565b5b61141e87828801611063565b9350935050608061143187828801610f29565b91505092959194509250565b61144681610f02565b82525050565b5f60208201905061145f5f83018461143d565b92915050565b5f5f5f5f5f5f60c0878903121561147f5761147e610edb565b5b5f61148c89828a01611185565b965050606061149d89828a01611006565b955050608087013567ffffffffffffffff8111156114be576114bd610edf565b5b6114ca89828a01611063565b945094505060a087013567ffffffffffffffff8111156114ed576114ec610edf565b5b6114f989828a01611063565b92509250509295509295509295565b5f6020828403121561151d5761151c610edb565b5b5f61152a84828501610fd3565b91505092915050565b61153c81610fe7565b82525050565b5f6020820190506115555f830184611533565b92915050565b5f602082840312156115705761156f610edb565b5b5f61157d84828501610f29565b91505092915050565b5f6060828403121561159b5761159a610edb565b5b5f6115a884828501611185565b91505092915050565b6115ba81610f3d565b82525050565b5f6020820190506115d35f8301846115b1565b92915050565b5f819050919050565b6115f36115ee82610fe7565b6115d9565b82525050565b5f81905092915050565b828183375f83830152505050565b5f61161c83856115f9565b9350611629838584611603565b82840190509392505050565b5f61164082866115e2565b602082019150611651828486611611565b9150819050949350505050565b61166781610fae565b82525050565b5f6080820190506116805f83018761143d565b61168d602083018661165e565b61169a6040830185611533565b6116a760608301846112cb565b95945050505050565b5f815190506116be81610ff0565b92915050565b5f602082840312156116d9576116d8610edb565b5b5f6116e6848285016116b0565b91505092915050565b5f6116fd6020840184610fd3565b905092915050565b61170e81610fae565b82525050565b5f6117226020840184611006565b905092915050565b61173381610fe7565b82525050565b5f6117476020840184611043565b905092915050565b6117588161101a565b82525050565b6060820161176e5f8301836116ef565b61177a5f850182611705565b506117886020830183611714565b611795602085018261172a565b506117a36040830183611739565b6117b0604085018261174f565b50505050565b5f82825260208201905092915050565b5f601f19601f8301169050919050565b5f6117e183856117b6565b93506117ee838584611603565b6117f7836117c6565b840190509392505050565b5f60c0820190506118155f83018861143d565b611822602083018761175e565b61182f6080830186611533565b81810360a08301526118428184866117d6565b90509695505050505050565b5f6040820190506118615f83018561165e565b61186e6020830184611533565b9392505050565b5f60e0820190506118885f83018a61175e565b611895606083018961143d565b6118a26080830188611533565b81810360a08301526118b58186886117d6565b905081810360c08301526118ca8184866117d6565b905098975050505050505050565b5f6040820190506118eb5f83018561143d565b6118f860208301846115b1565b9392505050565b5f6020820190506119125f83018461165e565b92915050565b5f61192282610ee3565b9050919050565b61193281611918565b811461193c575f5ffd5b50565b5f8135905061194d81611929565b92915050565b5f5f5f6060848603121561196a57611969610edb565b5b5f6119778682870161193f565b935050602061198886828701610f5c565b92505060406119998682870161193f565b915050925092509256fea26469706673582212207202fd70410df61eca847a9ccc44a55e49e9ecf277f8e0c05a6f0c0dbacc0b6564736f6c634300081e0033", + "sourceMap": "586:2357:52:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2291:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2557:384;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2107:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4368:708:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1193:143;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1724:108:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;446:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2293:101:37;;;;;;;;;;;;;:::i;:::-;;3507:128:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2013:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1638:85:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1879:222:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;569:48:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3252:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2543:215:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2771:149:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2291:260:52;1531:13:37;:11;:13::i;:::-;2394:1:52::1;2380:16;;:2;:16;;::::0;2372:43:::1;;;;;;;;;;;;;;;;;2442:1;2433:6;:10;2425:36;;;;;;;;;;;;;;;;;2471:31;2491:2;2495:6;2471;:19;;;;:31;;;;;:::i;:::-;2533:2;2517:27;;;2537:6;2517:27;;;;;;:::i;:::-;;;;;;;;2291:260:::0;;:::o;2557:384::-;2713:4;2733:20;2773:4;2779:7;;2756:31;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2733:54;;2797:19;2829:7;2819:18;;;;;;2797:40;;2923:11;2854:8;:27;;;2890:4;2897:6;2905;2913:5;2854:65;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:80;2847:87;;;;2557:384;;;;;;;;:::o;2107:178::-;1531:13:37;:11;:13::i;:::-;2223:8:52::1;:14;;;2246:4;2253:7;2262:5;2269:8;;2223:55;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2107:178:::0;;;;:::o;4368:708:3:-;4694:10;4673:31;;4681:8;4673:31;;;4669:68;;4726:10;4713:24;;;;;;;;;;;:::i;:::-;;;;;;;;4669:68;4873:7;:14;;;4837:32;4854:7;:14;;;;;;;;;;:::i;:::-;4837:16;:32::i;:::-;:50;4833:103;;4905:7;:14;;;;;;;;;;:::i;:::-;4921:7;:14;;;4896:40;;;;;;;;;;;;:::i;:::-;;;;;;;;4833:103;5010:59;5021:7;5030:5;5037:8;;5047:9;5058:10;;5010;:59::i;:::-;4368:708;;;;;;;:::o;1193:143::-;1245:20;1267:22;1309:1;678;1301:28;;;;1193:143;;:::o;1724:108:2:-;1531:13:37;:11;:13::i;:::-;1804:21:2::1;1813:4;1819:5;1804:8;:21::i;:::-;1724:108:::0;;:::o;446:46::-;;;:::o;2293:101:37:-;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;:::-;2293:101::o:0;3507:128:3:-;3596:12;3627:1;3620:8;;3507:128;;;;:::o;2013:216::-;2175:4;2217;2198:24;;:7;:24;;;2191:31;;2013:216;;;;;;:::o;1638:85:37:-;1684:7;1710:6;;;;;;;;;;;1703:13;;1638:85;:::o;1879:222:52:-;2023:8;:18;;;2042:7;2059:4;2066:5;2073:8;;2083:10;;2023:71;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1879:222;;;;;;:::o;569:48:2:-;;;;;;;;;;;;;;;;;:::o;3252:105::-;1531:13:37;:11;:13::i;:::-;3319:8:2::1;:20;;;3340:9;3319:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3252:105:::0;:::o;2543:215:37:-;1531:13;:11;:13::i;:::-;2647:1:::1;2627:22;;:8;:22;;::::0;2623:91:::1;;2700:1;2672:31;;;;;;;;;;;:::i;:::-;;;;;;;;2623:91;2723:28;2742:8;2723:18;:28::i;:::-;2543:215:::0;:::o;2771:149:3:-;2853:4;2900:6;:13;;;2876:5;:20;2882:6;:13;;;;;;;;;;:::i;:::-;2876:20;;;;;;;;;;;;;;;;:37;2869:44;;2771:149;;;:::o;1796:162:37:-;1866:12;:10;:12::i;:::-;1855:23;;:7;:5;:7::i;:::-;:23;;;1851:101;;1928:12;:10;:12::i;:::-;1901:40;;;;;;;;;;;:::i;:::-;;;;;;;;1851:101;1796:162::o;1219:160:42:-;1301:71;1321:5;1343;:14;;;1360:2;1364:5;1328:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1301:19;:71::i;:::-;1219:160;;;:::o;2718:196:2:-;2788:7;2807:12;2822:5;:11;2828:4;2822:11;;;;;;;;;;;;;;;;2807:26;;2863:1;2855:10;;2847:4;:18;2843:43;;2881:4;2874:12;;;;;;;;;;;:::i;:::-;;;;;;;;2843:43;2903:4;2896:11;;;2718:196;;;:::o;1221:581:52:-;1525:17;1544:14;1560:15;1590:8;;1579:49;;;;;;;:::i;:::-;1524:104;;;;;;1668:1;1647:23;;:9;:23;;;1639:49;;;;;;;;;;;;;;;;;1699:38;1719:9;1730:6;1699;:19;;;;:38;;;;;:::i;:::-;1777:9;1752:43;;1768:7;1752:43;;;1788:6;1752:43;;;;;;:::i;:::-;;;;;;;;1440:362;;;1221:581;;;;;;;:::o;2286:134:2:-;2373:5;2359;:11;2365:4;2359:11;;;;;;;;;;;;;;;:19;;;;2393:20;2401:4;2407:5;2393:20;;;;;;;:::i;:::-;;;;;;;;2286:134;;:::o;2912:187:37:-;2985:16;3004:6;;;;;;;;;;;2985:25;;3029:8;3020:6;;:17;;;;;;;;;;;;;;;;;;3083:8;3052:40;;3073:8;3052:40;;;;;;;;;;;;2975:124;2912:187;:::o;656:96:43:-;709:7;735:10;728:17;;656:96;:::o;8370:720:42:-;8450:18;8478:19;8616:4;8613:1;8606:4;8600:11;8593:4;8587;8583:15;8580:1;8573:5;8566;8561:60;8673:7;8663:176;;8717:4;8711:11;8762:16;8759:1;8754:3;8739:40;8808:16;8803:3;8796:29;8663:176;8866:16;8852:30;;8916:1;8910:8;8895:23;;8532:396;8956:1;8942:10;:15;:68;;9009:1;8994:11;:16;;8942:68;;;8990:1;8968:5;8960:26;;;:31;8942:68;8938:146;;;9066:5;9033:40;;;;;;;;;;;:::i;:::-;;;;;;;;8938:146;8440:650;;8370:720;;:::o;88:117:59:-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:93::-;1713:7;1753:10;1746:5;1742:22;1731:33;;1677:93;;;:::o;1776:120::-;1848:23;1865:5;1848:23;:::i;:::-;1841:5;1838:34;1828:62;;1886:1;1883;1876:12;1828:62;1776:120;:::o;1902:137::-;1947:5;1985:6;1972:20;1963:29;;2001:32;2027:5;2001:32;:::i;:::-;1902:137;;;;:::o;2045:77::-;2082:7;2111:5;2100:16;;2045:77;;;:::o;2128:122::-;2201:24;2219:5;2201:24;:::i;:::-;2194:5;2191:35;2181:63;;2240:1;2237;2230:12;2181:63;2128:122;:::o;2256:139::-;2302:5;2340:6;2327:20;2318:29;;2356:33;2383:5;2356:33;:::i;:::-;2256:139;;;;:::o;2401:101::-;2437:7;2477:18;2470:5;2466:30;2455:41;;2401:101;;;:::o;2508:120::-;2580:23;2597:5;2580:23;:::i;:::-;2573:5;2570:34;2560:62;;2618:1;2615;2608:12;2560:62;2508:120;:::o;2634:137::-;2679:5;2717:6;2704:20;2695:29;;2733:32;2759:5;2733:32;:::i;:::-;2634:137;;;;:::o;2777:117::-;2886:1;2883;2876:12;2900:117;3009:1;3006;2999:12;3023:117;3132:1;3129;3122:12;3159:552;3216:8;3226:6;3276:3;3269:4;3261:6;3257:17;3253:27;3243:122;;3284:79;;:::i;:::-;3243:122;3397:6;3384:20;3374:30;;3427:18;3419:6;3416:30;3413:117;;;3449:79;;:::i;:::-;3413:117;3563:4;3555:6;3551:17;3539:29;;3617:3;3609:4;3601:6;3597:17;3587:8;3583:32;3580:41;3577:128;;;3624:79;;:::i;:::-;3577:128;3159:552;;;;;:::o;3717:1105::-;3821:6;3829;3837;3845;3853;3861;3910:3;3898:9;3889:7;3885:23;3881:33;3878:120;;;3917:79;;:::i;:::-;3878:120;4037:1;4062:52;4106:7;4097:6;4086:9;4082:22;4062:52;:::i;:::-;4052:62;;4008:116;4163:2;4189:53;4234:7;4225:6;4214:9;4210:22;4189:53;:::i;:::-;4179:63;;4134:118;4291:2;4317:52;4361:7;4352:6;4341:9;4337:22;4317:52;:::i;:::-;4307:62;;4262:117;4418:2;4444:53;4489:7;4480:6;4469:9;4465:22;4444:53;:::i;:::-;4434:63;;4389:118;4574:3;4563:9;4559:19;4546:33;4606:18;4598:6;4595:30;4592:117;;;4628:79;;:::i;:::-;4592:117;4741:64;4797:7;4788:6;4777:9;4773:22;4741:64;:::i;:::-;4723:82;;;;4517:298;3717:1105;;;;;;;;:::o;4828:90::-;4862:7;4905:5;4898:13;4891:21;4880:32;;4828:90;;;:::o;4924:109::-;5005:21;5020:5;5005:21;:::i;:::-;5000:3;4993:34;4924:109;;:::o;5039:210::-;5126:4;5164:2;5153:9;5149:18;5141:26;;5177:65;5239:1;5228:9;5224:17;5215:6;5177:65;:::i;:::-;5039:210;;;;:::o;5255:117::-;5364:1;5361;5354:12;5399:230;5471:5;5512:2;5503:6;5498:3;5494:16;5490:25;5487:112;;;5518:79;;:::i;:::-;5487:112;5617:6;5608:15;;5399:230;;;;:::o;5635:871::-;5749:6;5757;5765;5773;5822:3;5810:9;5801:7;5797:23;5793:33;5790:120;;;5829:79;;:::i;:::-;5790:120;5949:1;5974:79;6045:7;6036:6;6025:9;6021:22;5974:79;:::i;:::-;5964:89;;5920:143;6102:2;6128:53;6173:7;6164:6;6153:9;6149:22;6128:53;:::i;:::-;6118:63;;6073:118;6258:3;6247:9;6243:19;6230:33;6290:18;6282:6;6279:30;6276:117;;;6312:79;;:::i;:::-;6276:117;6425:64;6481:7;6472:6;6461:9;6457:22;6425:64;:::i;:::-;6407:82;;;;6201:298;5635:871;;;;;;;:::o;6512:1361::-;6655:6;6663;6671;6679;6687;6695;6703;6752:3;6740:9;6731:7;6727:23;6723:33;6720:120;;;6759:79;;:::i;:::-;6720:120;6879:1;6904:79;6975:7;6966:6;6955:9;6951:22;6904:79;:::i;:::-;6894:89;;6850:143;7032:2;7058:53;7103:7;7094:6;7083:9;7079:22;7058:53;:::i;:::-;7048:63;;7003:118;7188:3;7177:9;7173:19;7160:33;7220:18;7212:6;7209:30;7206:117;;;7242:79;;:::i;:::-;7206:117;7355:64;7411:7;7402:6;7391:9;7387:22;7355:64;:::i;:::-;7337:82;;;;7131:298;7468:3;7495:53;7540:7;7531:6;7520:9;7516:22;7495:53;:::i;:::-;7485:63;;7439:119;7625:3;7614:9;7610:19;7597:33;7657:18;7649:6;7646:30;7643:117;;;7679:79;;:::i;:::-;7643:117;7792:64;7848:7;7839:6;7828:9;7824:22;7792:64;:::i;:::-;7774:82;;;;7568:298;6512:1361;;;;;;;;;;:::o;7879:115::-;7964:23;7981:5;7964:23;:::i;:::-;7959:3;7952:36;7879:115;;:::o;8000:324::-;8117:4;8155:2;8144:9;8140:18;8132:26;;8168:69;8234:1;8223:9;8219:17;8210:6;8168:69;:::i;:::-;8247:70;8313:2;8302:9;8298:18;8289:6;8247:70;:::i;:::-;8000:324;;;;;:::o;8330:472::-;8397:6;8405;8454:2;8442:9;8433:7;8429:23;8425:32;8422:119;;;8460:79;;:::i;:::-;8422:119;8580:1;8605:52;8649:7;8640:6;8629:9;8625:22;8605:52;:::i;:::-;8595:62;;8551:116;8706:2;8732:53;8777:7;8768:6;8757:9;8753:22;8732:53;:::i;:::-;8722:63;;8677:118;8330:472;;;;;:::o;8808:60::-;8836:3;8857:5;8850:12;;8808:60;;;:::o;8874:142::-;8924:9;8957:53;8975:34;8984:24;9002:5;8984:24;:::i;:::-;8975:34;:::i;:::-;8957:53;:::i;:::-;8944:66;;8874:142;;;:::o;9022:126::-;9072:9;9105:37;9136:5;9105:37;:::i;:::-;9092:50;;9022:126;;;:::o;9154:155::-;9233:9;9266:37;9297:5;9266:37;:::i;:::-;9253:50;;9154:155;;;:::o;9315:189::-;9431:66;9491:5;9431:66;:::i;:::-;9426:3;9419:79;9315:189;;:::o;9510:280::-;9632:4;9670:2;9659:9;9655:18;9647:26;;9683:100;9780:1;9769:9;9765:17;9756:6;9683:100;:::i;:::-;9510:280;;;;:::o;9796:218::-;9887:4;9925:2;9914:9;9910:18;9902:26;;9938:69;10004:1;9993:9;9989:17;9980:6;9938:69;:::i;:::-;9796:218;;;;:::o;10020:871::-;10134:6;10142;10150;10158;10207:3;10195:9;10186:7;10182:23;10178:33;10175:120;;;10214:79;;:::i;:::-;10175:120;10334:1;10359:79;10430:7;10421:6;10410:9;10406:22;10359:79;:::i;:::-;10349:89;;10305:143;10515:2;10504:9;10500:18;10487:32;10546:18;10538:6;10535:30;10532:117;;;10568:79;;:::i;:::-;10532:117;10681:64;10737:7;10728:6;10717:9;10713:22;10681:64;:::i;:::-;10663:82;;;;10458:297;10794:3;10821:53;10866:7;10857:6;10846:9;10842:22;10821:53;:::i;:::-;10811:63;;10765:119;10020:871;;;;;;;:::o;10897:118::-;10984:24;11002:5;10984:24;:::i;:::-;10979:3;10972:37;10897:118;;:::o;11021:222::-;11114:4;11152:2;11141:9;11137:18;11129:26;;11165:71;11233:1;11222:9;11218:17;11209:6;11165:71;:::i;:::-;11021:222;;;;:::o;11249:1215::-;11383:6;11391;11399;11407;11415;11423;11472:3;11460:9;11451:7;11447:23;11443:33;11440:120;;;11479:79;;:::i;:::-;11440:120;11599:1;11624:79;11695:7;11686:6;11675:9;11671:22;11624:79;:::i;:::-;11614:89;;11570:143;11752:2;11778:53;11823:7;11814:6;11803:9;11799:22;11778:53;:::i;:::-;11768:63;;11723:118;11908:3;11897:9;11893:19;11880:33;11940:18;11932:6;11929:30;11926:117;;;11962:79;;:::i;:::-;11926:117;12075:64;12131:7;12122:6;12111:9;12107:22;12075:64;:::i;:::-;12057:82;;;;11851:298;12216:3;12205:9;12201:19;12188:33;12248:18;12240:6;12237:30;12234:117;;;12270:79;;:::i;:::-;12234:117;12383:64;12439:7;12430:6;12419:9;12415:22;12383:64;:::i;:::-;12365:82;;;;12159:298;11249:1215;;;;;;;;:::o;12470:327::-;12528:6;12577:2;12565:9;12556:7;12552:23;12548:32;12545:119;;;12583:79;;:::i;:::-;12545:119;12703:1;12728:52;12772:7;12763:6;12752:9;12748:22;12728:52;:::i;:::-;12718:62;;12674:116;12470:327;;;;:::o;12803:118::-;12890:24;12908:5;12890:24;:::i;:::-;12885:3;12878:37;12803:118;;:::o;12927:222::-;13020:4;13058:2;13047:9;13043:18;13035:26;;13071:71;13139:1;13128:9;13124:17;13115:6;13071:71;:::i;:::-;12927:222;;;;:::o;13155:329::-;13214:6;13263:2;13251:9;13242:7;13238:23;13234:32;13231:119;;;13269:79;;:::i;:::-;13231:119;13389:1;13414:53;13459:7;13450:6;13439:9;13435:22;13414:53;:::i;:::-;13404:63;;13360:117;13155:329;;;;:::o;13490:381::-;13575:6;13624:2;13612:9;13603:7;13599:23;13595:32;13592:119;;;13630:79;;:::i;:::-;13592:119;13750:1;13775:79;13846:7;13837:6;13826:9;13822:22;13775:79;:::i;:::-;13765:89;;13721:143;13490:381;;;;:::o;13877:118::-;13964:24;13982:5;13964:24;:::i;:::-;13959:3;13952:37;13877:118;;:::o;14001:222::-;14094:4;14132:2;14121:9;14117:18;14109:26;;14145:71;14213:1;14202:9;14198:17;14189:6;14145:71;:::i;:::-;14001:222;;;;:::o;14229:79::-;14268:7;14297:5;14286:16;;14229:79;;;:::o;14314:157::-;14419:45;14439:24;14457:5;14439:24;:::i;:::-;14419:45;:::i;:::-;14414:3;14407:58;14314:157;;:::o;14477:147::-;14578:11;14615:3;14600:18;;14477:147;;;;:::o;14630:148::-;14728:6;14723:3;14718;14705:30;14769:1;14760:6;14755:3;14751:16;14744:27;14630:148;;;:::o;14806:327::-;14920:3;14941:88;15022:6;15017:3;14941:88;:::i;:::-;14934:95;;15039:56;15088:6;15083:3;15076:5;15039:56;:::i;:::-;15120:6;15115:3;15111:16;15104:23;;14806:327;;;;;:::o;15139:432::-;15307:3;15322:75;15393:3;15384:6;15322:75;:::i;:::-;15422:2;15417:3;15413:12;15406:19;;15442:103;15541:3;15532:6;15524;15442:103;:::i;:::-;15435:110;;15562:3;15555:10;;15139:432;;;;;;:::o;15577:115::-;15662:23;15679:5;15662:23;:::i;:::-;15657:3;15650:36;15577:115;;:::o;15698:545::-;15871:4;15909:3;15898:9;15894:19;15886:27;;15923:71;15991:1;15980:9;15976:17;15967:6;15923:71;:::i;:::-;16004:70;16070:2;16059:9;16055:18;16046:6;16004:70;:::i;:::-;16084:72;16152:2;16141:9;16137:18;16128:6;16084:72;:::i;:::-;16166:70;16232:2;16221:9;16217:18;16208:6;16166:70;:::i;:::-;15698:545;;;;;;;:::o;16249:143::-;16306:5;16337:6;16331:13;16322:22;;16353:33;16380:5;16353:33;:::i;:::-;16249:143;;;;:::o;16398:351::-;16468:6;16517:2;16505:9;16496:7;16492:23;16488:32;16485:119;;;16523:79;;:::i;:::-;16485:119;16643:1;16668:64;16724:7;16715:6;16704:9;16700:22;16668:64;:::i;:::-;16658:74;;16614:128;16398:351;;;;:::o;16755:120::-;16806:5;16831:38;16865:2;16860:3;16856:12;16851:3;16831:38;:::i;:::-;16822:47;;16755:120;;;;:::o;16881:105::-;16956:23;16973:5;16956:23;:::i;:::-;16951:3;16944:36;16881:105;;:::o;16992:122::-;17044:5;17069:39;17104:2;17099:3;17095:12;17090:3;17069:39;:::i;:::-;17060:48;;16992:122;;;;:::o;17120:108::-;17197:24;17215:5;17197:24;:::i;:::-;17192:3;17185:37;17120:108;;:::o;17234:120::-;17285:5;17310:38;17344:2;17339:3;17335:12;17330:3;17310:38;:::i;:::-;17301:47;;17234:120;;;;:::o;17360:105::-;17435:23;17452:5;17435:23;:::i;:::-;17430:3;17423:36;17360:105;;:::o;17509:761::-;17656:4;17651:3;17647:14;17728:49;17771:4;17764:5;17760:16;17753:5;17728:49;:::i;:::-;17790:61;17845:4;17840:3;17836:14;17822:12;17790:61;:::i;:::-;17671:190;17928:50;17972:4;17965:5;17961:16;17954:5;17928:50;:::i;:::-;17991:63;18048:4;18043:3;18039:14;18025:12;17991:63;:::i;:::-;17871:193;18130:49;18173:4;18166:5;18162:16;18155:5;18130:49;:::i;:::-;18192:61;18247:4;18242:3;18238:14;18224:12;18192:61;:::i;:::-;18074:189;17625:645;17509:761;;:::o;18276:168::-;18359:11;18393:6;18388:3;18381:19;18433:4;18428:3;18424:14;18409:29;;18276:168;;;;:::o;18450:102::-;18491:6;18542:2;18538:7;18533:2;18526:5;18522:14;18518:28;18508:38;;18450:102;;;:::o;18580:314::-;18676:3;18697:70;18760:6;18755:3;18697:70;:::i;:::-;18690:77;;18777:56;18826:6;18821:3;18814:5;18777:56;:::i;:::-;18858:29;18880:6;18858:29;:::i;:::-;18853:3;18849:39;18842:46;;18580:314;;;;;:::o;18900:762::-;19155:4;19193:3;19182:9;19178:19;19170:27;;19207:71;19275:1;19264:9;19260:17;19251:6;19207:71;:::i;:::-;19288:122;19406:2;19395:9;19391:18;19382:6;19288:122;:::i;:::-;19420:73;19488:3;19477:9;19473:19;19464:6;19420:73;:::i;:::-;19541:9;19535:4;19531:20;19525:3;19514:9;19510:19;19503:49;19569:86;19650:4;19641:6;19633;19569:86;:::i;:::-;19561:94;;18900:762;;;;;;;;:::o;19668:328::-;19787:4;19825:2;19814:9;19810:18;19802:26;;19838:69;19904:1;19893:9;19889:17;19880:6;19838:69;:::i;:::-;19917:72;19985:2;19974:9;19970:18;19961:6;19917:72;:::i;:::-;19668:328;;;;;:::o;20002:980::-;20313:4;20351:3;20340:9;20336:19;20328:27;;20365:121;20483:1;20472:9;20468:17;20459:6;20365:121;:::i;:::-;20496:72;20564:2;20553:9;20549:18;20540:6;20496:72;:::i;:::-;20578:73;20646:3;20635:9;20631:19;20622:6;20578:73;:::i;:::-;20699:9;20693:4;20689:20;20683:3;20672:9;20668:19;20661:49;20727:86;20808:4;20799:6;20791;20727:86;:::i;:::-;20719:94;;20861:9;20855:4;20851:20;20845:3;20834:9;20830:19;20823:49;20889:86;20970:4;20961:6;20953;20889:86;:::i;:::-;20881:94;;20002:980;;;;;;;;;;:::o;20988:332::-;21109:4;21147:2;21136:9;21132:18;21124:26;;21160:71;21228:1;21217:9;21213:17;21204:6;21160:71;:::i;:::-;21241:72;21309:2;21298:9;21294:18;21285:6;21241:72;:::i;:::-;20988:332;;;;;:::o;21326:218::-;21417:4;21455:2;21444:9;21440:18;21432:26;;21468:69;21534:1;21523:9;21519:17;21510:6;21468:69;:::i;:::-;21326:218;;;;:::o;21550:104::-;21595:7;21624:24;21642:5;21624:24;:::i;:::-;21613:35;;21550:104;;;:::o;21660:138::-;21741:32;21767:5;21741:32;:::i;:::-;21734:5;21731:43;21721:71;;21788:1;21785;21778:12;21721:71;21660:138;:::o;21804:155::-;21858:5;21896:6;21883:20;21874:29;;21912:41;21947:5;21912:41;:::i;:::-;21804:155;;;;:::o;21965:651::-;22058:6;22066;22074;22123:2;22111:9;22102:7;22098:23;22094:32;22091:119;;;22129:79;;:::i;:::-;22091:119;22249:1;22274:61;22327:7;22318:6;22307:9;22303:22;22274:61;:::i;:::-;22264:71;;22220:125;22384:2;22410:53;22455:7;22446:6;22435:9;22431:22;22410:53;:::i;:::-;22400:63;;22355:118;22512:2;22538:61;22591:7;22582:6;22571:9;22567:22;22538:61;:::i;:::-;22528:71;;22483:126;21965:651;;;;;:::o", + "linkReferences": {}, + "immutableReferences": { + "46390": [{ "start": 1136, "length": 32 }, { "start": 3172, "length": 32 }], + "535": [ + { "start": 1340, "length": 32 }, + { "start": 1521, "length": 32 }, + { "start": 1692, "length": 32 }, + { "start": 1992, "length": 32 }, + { "start": 2154, "length": 32 }, + { "start": 2337, "length": 32 } + ] + } + }, + "methodIdentifiers": { + "allowInitializePath((uint32,bytes32,uint64))": "ff7bd03d", + "clearMessage((uint32,bytes32,uint64),bytes32,bytes)": "0a96997d", + "endpoint()": "5e280f11", + "hasStoredPayload(uint32,bytes32,uint64,bytes32,bytes)": "0787bddb", + "isComposeMsgSender((uint32,bytes32,uint64),bytes,address)": "82413eac", + "lzReceive((uint32,bytes32,uint64),bytes32,bytes,address,bytes)": "13137d65", + "manualRetry((uint32,bytes32,uint64),bytes32,bytes,bytes)": "b9a9c0d6", + "nextNonce(uint32,bytes32)": "7d25a05e", + "oAppVersion()": "17442b70", + "owner()": "8da5cb5b", + "peers(uint32)": "bb0b6a53", + "renounceOwnership()": "715018a6", + "setDelegate(address)": "ca5eb5e1", + "setPeer(uint32,bytes32)": "3400288b", + "transferOwnership(address)": "f2fde38b", + "withdrawTokens(address,uint256)": "06b091f9" + }, + "rawMetadata": "{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_endpoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_delegate\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"_srcSender\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BadSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadSrcEid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDelegate\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidEndpointCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"}],\"name\":\"NoPeer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"OnlyEndpoint\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"}],\"name\":\"OnlyPeer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"srcUser\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BridgeFulfilled\",\"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\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"peer\",\"type\":\"bytes32\"}],\"name\":\"PeerSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawn\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"struct Origin\",\"name\":\"origin\",\"type\":\"tuple\"}],\"name\":\"allowInitializePath\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"struct Origin\",\"name\":\"_origin\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_guid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"name\":\"clearMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"endpoint\",\"outputs\":[{\"internalType\":\"contract ILayerZeroEndpointV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"guid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"hasStoredPayload\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"struct Origin\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"}],\"name\":\"isComposeMsgSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"struct Origin\",\"name\":\"_origin\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_guid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_executor\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"lzReceive\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"struct Origin\",\"name\":\"_origin\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_guid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"manualRetry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"nextNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oAppVersion\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"senderVersion\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"receiverVersion\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"}],\"name\":\"peers\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"peer\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegate\",\"type\":\"address\"}],\"name\":\"setDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_eid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"_peer\",\"type\":\"bytes32\"}],\"name\":\"setPeer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"BadSender()\":[{\"details\":\"Thrown when the sender address is invalid\"}],\"BadSrcEid()\":[{\"details\":\"Thrown when the source endpoint ID is invalid\"}],\"InvalidAddress()\":[{\"details\":\"Thrown when an invalid address is provided\"}],\"InvalidAmount()\":[{\"details\":\"Thrown when an invalid amount is provided\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}],\"RecipientZero()\":[{\"details\":\"Thrown when recipient address is zero\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"BridgeFulfilled(address,address,uint256)\":{\"details\":\"Emitted when a bridge request is fulfilled on the destination chain\",\"params\":{\"amount\":\"The amount of tokens transferred\",\"recipient\":\"The recipient who received the tokens\",\"srcUser\":\"The original user who initiated the bridge on source chain\"}},\"TokensWithdrawn(address,uint256)\":{\"details\":\"Emitted when tokens are withdrawn by owner\",\"params\":{\"amount\":\"The amount of tokens withdrawn\",\"to\":\"The address that received the withdrawn tokens\"}}},\"kind\":\"dev\",\"methods\":{\"allowInitializePath((uint32,bytes32,uint64))\":{\"details\":\"This indicates to the endpoint that the OApp has enabled msgs for this particular path to be received.This defaults to assuming if a peer has been set, its initialized. Can be overridden by the OApp if there is other logic to determine this.\",\"params\":{\"origin\":\"The origin information containing the source endpoint and sender address.\"},\"returns\":{\"_0\":\"Whether the path has been initialized.\"}},\"clearMessage((uint32,bytes32,uint64),bytes32,bytes)\":{\"details\":\"Only callable by contract ownerUsed to clear messages that cannot be retried and need to be skipped\",\"params\":{\"_guid\":\"The globally unique identifier of the message\",\"_message\":\"The message payload to clear\",\"_origin\":\"The origin information of the message\"}},\"hasStoredPayload(uint32,bytes32,uint64,bytes32,bytes)\":{\"details\":\"Used to verify if a message failed execution and is stored for retry\",\"params\":{\"guid\":\"The globally unique identifier of the message\",\"message\":\"The message payload\",\"nonce\":\"The message nonce\",\"sender\":\"The sender address on source chain\",\"srcEid\":\"The source endpoint ID\"},\"returns\":{\"_0\":\"True if the payload is stored, false otherwise\"}},\"isComposeMsgSender((uint32,bytes32,uint64),bytes,address)\":{\"details\":\"_origin The origin information containing the source endpoint and sender address. - srcEid: The source chain endpoint ID. - sender: The sender address on the src chain. - nonce: The nonce of the message._message The lzReceive payload.Applications can optionally choose to implement separate composeMsg senders that are NOT the bridging layer.The default sender IS the OAppReceiver implementer.\",\"params\":{\"_sender\":\"The sender address.\"},\"returns\":{\"_0\":\"isSender Is a valid sender.\"}},\"lzReceive((uint32,bytes32,uint64),bytes32,bytes,address,bytes)\":{\"details\":\"Entry point for receiving messages or packets from the endpoint.Entry point for receiving msg/packet from the LayerZero endpoint.\",\"params\":{\"_executor\":\"The address of the executor for the received message.\",\"_extraData\":\"Additional arbitrary data provided by the corresponding executor.\",\"_guid\":\"The unique identifier for the received LayerZero message.\",\"_message\":\"The payload of the received message.\",\"_origin\":\"The origin information containing the source endpoint and sender address. - srcEid: The source chain endpoint ID. - sender: The sender address on the src chain. - nonce: The nonce of the message.\"}},\"manualRetry((uint32,bytes32,uint64),bytes32,bytes,bytes)\":{\"details\":\"Used when a message fails to execute and needs manual intervention\",\"params\":{\"_extraData\":\"Additional data for the retry\",\"_guid\":\"The globally unique identifier of the message\",\"_message\":\"The message payload\",\"_origin\":\"The origin information of the message\"}},\"nextNonce(uint32,bytes32)\":{\"details\":\"_srcEid The source endpoint ID._sender The sender address.The path nonce starts from 1. If 0 is returned it means that there is NO nonce ordered enforcement.Is required by the off-chain executor to determine the OApp expects msg execution is ordered.This is also enforced by the OApp.By default this is NOT enabled. ie. nextNonce is hardcoded to return 0.\",\"returns\":{\"nonce\":\"The next nonce.\"}},\"oAppVersion()\":{\"details\":\"Providing 0 as the default for OAppSender version. Indicates that the OAppSender is not implemented. ie. this is a RECEIVE only OApp.If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions.\",\"returns\":{\"receiverVersion\":\"The version of the OAppReceiver.sol contract.\",\"senderVersion\":\"The version of the OAppSender.sol 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.\"},\"setDelegate(address)\":{\"details\":\"Only the owner/admin of the OApp can call this function.Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract.\",\"params\":{\"_delegate\":\"The address of the delegate to be set.\"}},\"setPeer(uint32,bytes32)\":{\"details\":\"Only the owner/admin of the OApp can call this function.Indicates that the peer is trusted to send LayerZero messages to this OApp.Set this to bytes32(0) to remove the peer address.Peer is a bytes32 to accommodate non-evm chains.\",\"params\":{\"_eid\":\"The endpoint ID.\",\"_peer\":\"The address of the peer to be associated with the corresponding endpoint.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawTokens(address,uint256)\":{\"details\":\"Only callable by contract ownerValidates that 'to' is not zero address and amount is greater than 0\",\"params\":{\"amount\":\"The amount of tokens to withdraw\",\"to\":\"The address to send tokens to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowInitializePath((uint32,bytes32,uint64))\":{\"notice\":\"Checks if the path initialization is allowed based on the provided origin.\"},\"clearMessage((uint32,bytes32,uint64),bytes32,bytes)\":{\"notice\":\"Clear a stuck LayerZero message (owner only)\"},\"endpoint()\":{\"notice\":\"Retrieves the LayerZero endpoint associated with the OApp.\"},\"hasStoredPayload(uint32,bytes32,uint64,bytes32,bytes)\":{\"notice\":\"Check if a payload is stored on the LayerZero endpoint\"},\"isComposeMsgSender((uint32,bytes32,uint64),bytes,address)\":{\"notice\":\"Indicates whether an address is an approved composeMsg sender to the Endpoint.\"},\"manualRetry((uint32,bytes32,uint64),bytes32,bytes,bytes)\":{\"notice\":\"Manually retry a failed LayerZero message\"},\"nextNonce(uint32,bytes32)\":{\"notice\":\"Retrieves the next nonce for a given source endpoint and sender address.\"},\"oAppVersion()\":{\"notice\":\"Retrieves the OApp version information.\"},\"peers(uint32)\":{\"notice\":\"Retrieves the peer (OApp) associated with a corresponding endpoint.\"},\"setDelegate(address)\":{\"notice\":\"Sets the delegate address for the OApp.\"},\"setPeer(uint32,bytes32)\":{\"notice\":\"Sets the peer address (OApp instance) for a corresponding endpoint.\"},\"withdrawTokens(address,uint256)\":{\"notice\":\"Withdraw tokens from the contract (owner only)\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/MainnetBridgeOApp.sol\":\"MainnetBridgeOApp\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@layerzerolabs/lz-evm-messagelib-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/messagelib/\",\":@layerzerolabs/lz-evm-protocol-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/\",\":@layerzerolabs/oapp/=lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/\",\":@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":LayerZero-v2/=lib/LayerZero-v2/\",\":ds-test/=lib/solidity-bytes-utils/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":solidity-bytes-utils/=lib/solidity-bytes-utils/\"]},\"sources\":{\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppCore.sol\":{\"keccak256\":\"0x13a9c2d1d2c1f086b8624f2e84c4a4702212daae36f701d92bb915b535cbe4cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://606515dd9193551bd2c94ac8c304f3776fafcc70e544ebf441f334658b2fd5f0\",\"dweb:/ipfs/QmZ88ey7DdZqV5taAoebabvszX5kdPMSrQCAmTteVdDtcH\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppReceiver.sol\":{\"keccak256\":\"0x0174e9f1ec4cefe4b5adc26c392269c699b9ff75965364e5b7264426a462c70b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cd12bb4fe5802c53911b9a0081a2ea10639b1f99925d1e5c1b1421d1bdc17075\",\"dweb:/ipfs/QmZonarwbKiEwQ8qoASKur2bbMjusdy9pqK9RCR4P1YPtc\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppCore.sol\":{\"keccak256\":\"0x40e49f2de74506e1da5dcaed53a39853f691647f4ceb0fccc8f49a68d3f47c58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a1deb2a6a3eb1fb83936c9578469142bff470295f403d7d07d955a76be3adbd\",\"dweb:/ipfs/QmS9bjSfBaE4YhQ1PCQ1TknbEPbNfRXzBK9E7SaPGyiZEv\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppReceiver.sol\":{\"keccak256\":\"0xd26135185e19b3732746d4a9e2923e896f28dec8664bab161faea2ee26fcdc3d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c236dfe386b508be33c3a1a74ae1d4fd64b8c77ae207767e9dbed0f2429518a2\",\"dweb:/ipfs/QmXVbZJjfryTRti98uN3BMh5qh4K7NuEs1RSCoBjRoYd4q\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroEndpointV2.sol\":{\"keccak256\":\"0xf7f941bee89ea6369950fe54e8ac476ae6478b958b20fc0e8a83e8ff1364eac3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bacc29fd3866af71e59cb0bdc1cf82c882a4a7f4e2652fd413c9f12649762083\",\"dweb:/ipfs/QmZh2toLnrQDWaNYhS5K4NoW7Vxd2GdZx9KA77vKEDLAqs\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroReceiver.sol\":{\"keccak256\":\"0x9641abba8d53b08bb517d1b74801dd15ea7b84d77a6719085bd96c8ea94e3ca0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77415ae0820859e0faf3fabdce683cce9fa03ea026ae0f6fe081ef1c9205f933\",\"dweb:/ipfs/QmXd7APqoCunQ2jYy73AHvi5gsZofLpm3SzM6FPo7zRPfL\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessageLibManager.sol\":{\"keccak256\":\"0xd710f9efe703982e8eabe15d19d6114af753ef42f2796551da782a0fb6633e4b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b5c9c874871469c871004d49a1cb5304e63ea3faaf366bfed9d718abbb9cc20a\",\"dweb:/ipfs/QmarXxE4dezAa5gBe82KCrcvWcMwa3BYqkfXbDQ3rRjfEB\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingChannel.sol\":{\"keccak256\":\"0x0878f64dffebf58c4165569416372f40860fab546b88cd926eba0d5cb6d8d972\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7e1b245d58221d16d8b5e0f01ef3e289a24a7df1ace3b94239e4d5b954ad5927\",\"dweb:/ipfs/Qmappsgp7PCY9rSSNE9Cdn4BTRX591WfCSEgq2HxhA3z6S\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingComposer.sol\":{\"keccak256\":\"0x85bc7090134529ec474866dc4bb1c48692d518c756eb0a961c82574829c51901\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b18b23a1643fc6636c4ad9d9023e2e6ca2d3c2a4a046482d4655bff09950598d\",\"dweb:/ipfs/Qma6G5SqiovwrMPfgqTrRngK1HWW373Wkf9c6YP2NhXpPk\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingContext.sol\":{\"keccak256\":\"0xff0c546c2813dae3e440882f46b377375f7461b0714efd80bd3f0c6e5cb8da4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5173fc9143bea314b159ca5a9adb5626659ef763bc598e27de5fa46efe3291a6\",\"dweb:/ipfs/QmSLFeMFPmVeGxT4sxRPW28ictjAS22M8rLeYRu9TXkA6D\"]},\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6\",\"dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol\":{\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100\",\"dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037\",\"dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d\",\"dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303\",\"dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508\",\"dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"src/MainnetBridgeOApp.sol\":{\"keccak256\":\"0xe7ec0a4c4e145e689f150f058d68a2b1517dd4fff736645e773126d551c43880\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://44394bd5000239b731ceb1d7b517efa26d4fa312a518f12f07f694c0994eea7f\",\"dweb:/ipfs/QmVTGcaVSgzmsNMXs7QBiWDh3iQiNgrUAHbh2utJAhEkjg\"]},\"src/interfaces/IMainnetBridgeOApp.sol\":{\"keccak256\":\"0xcb5a5dfffb3d72ccdb2080d1c0eba322b2f14d89755989ef5712ad7592976344\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e36433c7a852f73feca736a1d0bc215280d6a3c74f82aae227f35d8f46b61ec5\",\"dweb:/ipfs/QmbwPJJ5GyVs5y9Ycya5zWdhXgn3JfG41TMM5N6kKfaT3y\"]}},\"version\":1}", + "metadata": { + "compiler": { "version": "0.8.30+commit.73712a01" }, + "language": "Solidity", + "output": { + "abi": [ + { + "inputs": [ + { "internalType": "address", "name": "_endpoint", "type": "address" }, + { "internalType": "address", "name": "_delegate", "type": "address" }, + { "internalType": "address", "name": "_owner", "type": "address" }, + { "internalType": "address", "name": "_token", "type": "address" }, + { "internalType": "uint32", "name": "_srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "_srcSender", "type": "bytes32" } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { "inputs": [], "type": "error", "name": "BadSender" }, + { "inputs": [], "type": "error", "name": "BadSrcEid" }, + { "inputs": [], "type": "error", "name": "InvalidAddress" }, + { "inputs": [], "type": "error", "name": "InvalidAmount" }, + { "inputs": [], "type": "error", "name": "InvalidDelegate" }, + { "inputs": [], "type": "error", "name": "InvalidEndpointCall" }, + { + "inputs": [{ "internalType": "uint32", "name": "eid", "type": "uint32" }], + "type": "error", + "name": "NoPeer" + }, + { + "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }], + "type": "error", + "name": "OnlyEndpoint" + }, + { + "inputs": [ + { "internalType": "uint32", "name": "eid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" } + ], + "type": "error", + "name": "OnlyPeer" + }, + { + "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], + "type": "error", + "name": "OwnableInvalidOwner" + }, + { + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "type": "error", + "name": "OwnableUnauthorizedAccount" + }, + { "inputs": [], "type": "error", "name": "RecipientZero" }, + { + "inputs": [{ "internalType": "address", "name": "token", "type": "address" }], + "type": "error", + "name": "SafeERC20FailedOperation" + }, + { + "inputs": [ + { "internalType": "address", "name": "srcUser", "type": "address", "indexed": true }, + { "internalType": "address", "name": "recipient", "type": "address", "indexed": true }, + { "internalType": "uint256", "name": "amount", "type": "uint256", "indexed": false } + ], + "type": "event", + "name": "BridgeFulfilled", + "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": [ + { "internalType": "uint32", "name": "eid", "type": "uint32", "indexed": false }, + { "internalType": "bytes32", "name": "peer", "type": "bytes32", "indexed": false } + ], + "type": "event", + "name": "PeerSet", + "anonymous": false + }, + { + "inputs": [ + { "internalType": "address", "name": "to", "type": "address", "indexed": true }, + { "internalType": "uint256", "name": "amount", "type": "uint256", "indexed": false } + ], + "type": "event", + "name": "TokensWithdrawn", + "anonymous": false + }, + { + "inputs": [ + { + "internalType": "struct Origin", + "name": "origin", + "type": "tuple", + "components": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ] + } + ], + "stateMutability": "view", + "type": "function", + "name": "allowInitializePath", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] + }, + { + "inputs": [ + { + "internalType": "struct Origin", + "name": "_origin", + "type": "tuple", + "components": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ] + }, + { "internalType": "bytes32", "name": "_guid", "type": "bytes32" }, + { "internalType": "bytes", "name": "_message", "type": "bytes" } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "clearMessage" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "endpoint", + "outputs": [ + { "internalType": "contract ILayerZeroEndpointV2", "name": "", "type": "address" } + ] + }, + { + "inputs": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" }, + { "internalType": "bytes32", "name": "guid", "type": "bytes32" }, + { "internalType": "bytes", "name": "message", "type": "bytes" } + ], + "stateMutability": "view", + "type": "function", + "name": "hasStoredPayload", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] + }, + { + "inputs": [ + { + "internalType": "struct Origin", + "name": "", + "type": "tuple", + "components": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ] + }, + { "internalType": "bytes", "name": "", "type": "bytes" }, + { "internalType": "address", "name": "_sender", "type": "address" } + ], + "stateMutability": "view", + "type": "function", + "name": "isComposeMsgSender", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] + }, + { + "inputs": [ + { + "internalType": "struct Origin", + "name": "_origin", + "type": "tuple", + "components": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ] + }, + { "internalType": "bytes32", "name": "_guid", "type": "bytes32" }, + { "internalType": "bytes", "name": "_message", "type": "bytes" }, + { "internalType": "address", "name": "_executor", "type": "address" }, + { "internalType": "bytes", "name": "_extraData", "type": "bytes" } + ], + "stateMutability": "payable", + "type": "function", + "name": "lzReceive" + }, + { + "inputs": [ + { + "internalType": "struct Origin", + "name": "_origin", + "type": "tuple", + "components": [ + { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, + { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, + { "internalType": "uint64", "name": "nonce", "type": "uint64" } + ] + }, + { "internalType": "bytes32", "name": "_guid", "type": "bytes32" }, + { "internalType": "bytes", "name": "_message", "type": "bytes" }, + { "internalType": "bytes", "name": "_extraData", "type": "bytes" } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "manualRetry" + }, + { + "inputs": [ + { "internalType": "uint32", "name": "", "type": "uint32" }, + { "internalType": "bytes32", "name": "", "type": "bytes32" } + ], + "stateMutability": "view", + "type": "function", + "name": "nextNonce", + "outputs": [{ "internalType": "uint64", "name": "nonce", "type": "uint64" }] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "oAppVersion", + "outputs": [ + { "internalType": "uint64", "name": "senderVersion", "type": "uint64" }, + { "internalType": "uint64", "name": "receiverVersion", "type": "uint64" } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }] + }, + { + "inputs": [{ "internalType": "uint32", "name": "eid", "type": "uint32" }], + "stateMutability": "view", + "type": "function", + "name": "peers", + "outputs": [{ "internalType": "bytes32", "name": "peer", "type": "bytes32" }] + }, + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "function", + "name": "renounceOwnership" + }, + { + "inputs": [{ "internalType": "address", "name": "_delegate", "type": "address" }], + "stateMutability": "nonpayable", + "type": "function", + "name": "setDelegate" + }, + { + "inputs": [ + { "internalType": "uint32", "name": "_eid", "type": "uint32" }, + { "internalType": "bytes32", "name": "_peer", "type": "bytes32" } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "setPeer" + }, + { + "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], + "stateMutability": "nonpayable", + "type": "function", + "name": "transferOwnership" + }, + { + "inputs": [ + { "internalType": "address", "name": "to", "type": "address" }, + { "internalType": "uint256", "name": "amount", "type": "uint256" } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "withdrawTokens" + } + ], + "devdoc": { + "kind": "dev", + "methods": { + "allowInitializePath((uint32,bytes32,uint64))": { + "details": "This indicates to the endpoint that the OApp has enabled msgs for this particular path to be received.This defaults to assuming if a peer has been set, its initialized. Can be overridden by the OApp if there is other logic to determine this.", + "params": { + "origin": "The origin information containing the source endpoint and sender address." + }, + "returns": { "_0": "Whether the path has been initialized." } + }, + "clearMessage((uint32,bytes32,uint64),bytes32,bytes)": { + "details": "Only callable by contract ownerUsed to clear messages that cannot be retried and need to be skipped", + "params": { + "_guid": "The globally unique identifier of the message", + "_message": "The message payload to clear", + "_origin": "The origin information of the message" + } + }, + "hasStoredPayload(uint32,bytes32,uint64,bytes32,bytes)": { + "details": "Used to verify if a message failed execution and is stored for retry", + "params": { + "guid": "The globally unique identifier of the message", + "message": "The message payload", + "nonce": "The message nonce", + "sender": "The sender address on source chain", + "srcEid": "The source endpoint ID" + }, + "returns": { "_0": "True if the payload is stored, false otherwise" } + }, + "isComposeMsgSender((uint32,bytes32,uint64),bytes,address)": { + "details": "_origin The origin information containing the source endpoint and sender address. - srcEid: The source chain endpoint ID. - sender: The sender address on the src chain. - nonce: The nonce of the message._message The lzReceive payload.Applications can optionally choose to implement separate composeMsg senders that are NOT the bridging layer.The default sender IS the OAppReceiver implementer.", + "params": { "_sender": "The sender address." }, + "returns": { "_0": "isSender Is a valid sender." } + }, + "lzReceive((uint32,bytes32,uint64),bytes32,bytes,address,bytes)": { + "details": "Entry point for receiving messages or packets from the endpoint.Entry point for receiving msg/packet from the LayerZero endpoint.", + "params": { + "_executor": "The address of the executor for the received message.", + "_extraData": "Additional arbitrary data provided by the corresponding executor.", + "_guid": "The unique identifier for the received LayerZero message.", + "_message": "The payload of the received message.", + "_origin": "The origin information containing the source endpoint and sender address. - srcEid: The source chain endpoint ID. - sender: The sender address on the src chain. - nonce: The nonce of the message." + } + }, + "manualRetry((uint32,bytes32,uint64),bytes32,bytes,bytes)": { + "details": "Used when a message fails to execute and needs manual intervention", + "params": { + "_extraData": "Additional data for the retry", + "_guid": "The globally unique identifier of the message", + "_message": "The message payload", + "_origin": "The origin information of the message" + } + }, + "nextNonce(uint32,bytes32)": { + "details": "_srcEid The source endpoint ID._sender The sender address.The path nonce starts from 1. If 0 is returned it means that there is NO nonce ordered enforcement.Is required by the off-chain executor to determine the OApp expects msg execution is ordered.This is also enforced by the OApp.By default this is NOT enabled. ie. nextNonce is hardcoded to return 0.", + "returns": { "nonce": "The next nonce." } + }, + "oAppVersion()": { + "details": "Providing 0 as the default for OAppSender version. Indicates that the OAppSender is not implemented. ie. this is a RECEIVE only OApp.If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions.", + "returns": { + "receiverVersion": "The version of the OAppReceiver.sol contract.", + "senderVersion": "The version of the OAppSender.sol 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." + }, + "setDelegate(address)": { + "details": "Only the owner/admin of the OApp can call this function.Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract.", + "params": { "_delegate": "The address of the delegate to be set." } + }, + "setPeer(uint32,bytes32)": { + "details": "Only the owner/admin of the OApp can call this function.Indicates that the peer is trusted to send LayerZero messages to this OApp.Set this to bytes32(0) to remove the peer address.Peer is a bytes32 to accommodate non-evm chains.", + "params": { + "_eid": "The endpoint ID.", + "_peer": "The address of the peer to be associated with the corresponding endpoint." + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "withdrawTokens(address,uint256)": { + "details": "Only callable by contract ownerValidates that 'to' is not zero address and amount is greater than 0", + "params": { + "amount": "The amount of tokens to withdraw", + "to": "The address to send tokens to" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "allowInitializePath((uint32,bytes32,uint64))": { + "notice": "Checks if the path initialization is allowed based on the provided origin." + }, + "clearMessage((uint32,bytes32,uint64),bytes32,bytes)": { + "notice": "Clear a stuck LayerZero message (owner only)" + }, + "endpoint()": { "notice": "Retrieves the LayerZero endpoint associated with the OApp." }, + "hasStoredPayload(uint32,bytes32,uint64,bytes32,bytes)": { + "notice": "Check if a payload is stored on the LayerZero endpoint" + }, + "isComposeMsgSender((uint32,bytes32,uint64),bytes,address)": { + "notice": "Indicates whether an address is an approved composeMsg sender to the Endpoint." + }, + "manualRetry((uint32,bytes32,uint64),bytes32,bytes,bytes)": { + "notice": "Manually retry a failed LayerZero message" + }, + "nextNonce(uint32,bytes32)": { + "notice": "Retrieves the next nonce for a given source endpoint and sender address." + }, + "oAppVersion()": { "notice": "Retrieves the OApp version information." }, + "peers(uint32)": { + "notice": "Retrieves the peer (OApp) associated with a corresponding endpoint." + }, + "setDelegate(address)": { "notice": "Sets the delegate address for the OApp." }, + "setPeer(uint32,bytes32)": { + "notice": "Sets the peer address (OApp instance) for a corresponding endpoint." + }, + "withdrawTokens(address,uint256)": { + "notice": "Withdraw tokens from the contract (owner only)" + } + }, + "version": 1 + } + }, + "settings": { + "remappings": [ + "@layerzerolabs/lz-evm-messagelib-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/messagelib/", + "@layerzerolabs/lz-evm-protocol-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/", + "@layerzerolabs/oapp/=lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/", + "@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/", + "@openzeppelin/=lib/openzeppelin-contracts/", + "LayerZero-v2/=lib/LayerZero-v2/", + "ds-test/=lib/solidity-bytes-utils/lib/forge-std/lib/ds-test/src/", + "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", + "forge-std/=lib/forge-std/src/", + "halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/", + "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", + "openzeppelin-contracts/=lib/openzeppelin-contracts/", + "solidity-bytes-utils/=lib/solidity-bytes-utils/" + ], + "optimizer": { "enabled": false, "runs": 200 }, + "metadata": { "bytecodeHash": "ipfs" }, + "compilationTarget": { "src/MainnetBridgeOApp.sol": "MainnetBridgeOApp" }, + "evmVersion": "cancun", + "libraries": {} + }, + "sources": { + "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppCore.sol": { + "keccak256": "0x13a9c2d1d2c1f086b8624f2e84c4a4702212daae36f701d92bb915b535cbe4cc", + "urls": [ + "bzz-raw://606515dd9193551bd2c94ac8c304f3776fafcc70e544ebf441f334658b2fd5f0", + "dweb:/ipfs/QmZ88ey7DdZqV5taAoebabvszX5kdPMSrQCAmTteVdDtcH" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppReceiver.sol": { + "keccak256": "0x0174e9f1ec4cefe4b5adc26c392269c699b9ff75965364e5b7264426a462c70b", + "urls": [ + "bzz-raw://cd12bb4fe5802c53911b9a0081a2ea10639b1f99925d1e5c1b1421d1bdc17075", + "dweb:/ipfs/QmZonarwbKiEwQ8qoASKur2bbMjusdy9pqK9RCR4P1YPtc" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppCore.sol": { + "keccak256": "0x40e49f2de74506e1da5dcaed53a39853f691647f4ceb0fccc8f49a68d3f47c58", + "urls": [ + "bzz-raw://4a1deb2a6a3eb1fb83936c9578469142bff470295f403d7d07d955a76be3adbd", + "dweb:/ipfs/QmS9bjSfBaE4YhQ1PCQ1TknbEPbNfRXzBK9E7SaPGyiZEv" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppReceiver.sol": { + "keccak256": "0xd26135185e19b3732746d4a9e2923e896f28dec8664bab161faea2ee26fcdc3d", + "urls": [ + "bzz-raw://c236dfe386b508be33c3a1a74ae1d4fd64b8c77ae207767e9dbed0f2429518a2", + "dweb:/ipfs/QmXVbZJjfryTRti98uN3BMh5qh4K7NuEs1RSCoBjRoYd4q" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroEndpointV2.sol": { + "keccak256": "0xf7f941bee89ea6369950fe54e8ac476ae6478b958b20fc0e8a83e8ff1364eac3", + "urls": [ + "bzz-raw://bacc29fd3866af71e59cb0bdc1cf82c882a4a7f4e2652fd413c9f12649762083", + "dweb:/ipfs/QmZh2toLnrQDWaNYhS5K4NoW7Vxd2GdZx9KA77vKEDLAqs" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroReceiver.sol": { + "keccak256": "0x9641abba8d53b08bb517d1b74801dd15ea7b84d77a6719085bd96c8ea94e3ca0", + "urls": [ + "bzz-raw://77415ae0820859e0faf3fabdce683cce9fa03ea026ae0f6fe081ef1c9205f933", + "dweb:/ipfs/QmXd7APqoCunQ2jYy73AHvi5gsZofLpm3SzM6FPo7zRPfL" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessageLibManager.sol": { + "keccak256": "0xd710f9efe703982e8eabe15d19d6114af753ef42f2796551da782a0fb6633e4b", + "urls": [ + "bzz-raw://b5c9c874871469c871004d49a1cb5304e63ea3faaf366bfed9d718abbb9cc20a", + "dweb:/ipfs/QmarXxE4dezAa5gBe82KCrcvWcMwa3BYqkfXbDQ3rRjfEB" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingChannel.sol": { + "keccak256": "0x0878f64dffebf58c4165569416372f40860fab546b88cd926eba0d5cb6d8d972", + "urls": [ + "bzz-raw://7e1b245d58221d16d8b5e0f01ef3e289a24a7df1ace3b94239e4d5b954ad5927", + "dweb:/ipfs/Qmappsgp7PCY9rSSNE9Cdn4BTRX591WfCSEgq2HxhA3z6S" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingComposer.sol": { + "keccak256": "0x85bc7090134529ec474866dc4bb1c48692d518c756eb0a961c82574829c51901", + "urls": [ + "bzz-raw://b18b23a1643fc6636c4ad9d9023e2e6ca2d3c2a4a046482d4655bff09950598d", + "dweb:/ipfs/Qma6G5SqiovwrMPfgqTrRngK1HWW373Wkf9c6YP2NhXpPk" + ], + "license": "MIT" + }, + "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingContext.sol": { + "keccak256": "0xff0c546c2813dae3e440882f46b377375f7461b0714efd80bd3f0c6e5cb8da4e", + "urls": [ + "bzz-raw://5173fc9143bea314b159ca5a9adb5626659ef763bc598e27de5fa46efe3291a6", + "dweb:/ipfs/QmSLFeMFPmVeGxT4sxRPW28ictjAS22M8rLeYRu9TXkA6D" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { + "keccak256": "0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb", + "urls": [ + "bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6", + "dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol": { + "keccak256": "0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d", + "urls": [ + "bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100", + "dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol": { + "keccak256": "0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc", + "urls": [ + "bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037", + "dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol": { + "keccak256": "0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44", + "urls": [ + "bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d", + "dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { + "keccak256": "0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2", + "urls": [ + "bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303", + "dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol": { + "keccak256": "0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5", + "urls": [ + "bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508", + "dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/Context.sol": { + "keccak256": "0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2", + "urls": [ + "bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12", + "dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { + "keccak256": "0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c", + "urls": [ + "bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617", + "dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u" + ], + "license": "MIT" + }, + "src/MainnetBridgeOApp.sol": { + "keccak256": "0xe7ec0a4c4e145e689f150f058d68a2b1517dd4fff736645e773126d551c43880", + "urls": [ + "bzz-raw://44394bd5000239b731ceb1d7b517efa26d4fa312a518f12f07f694c0994eea7f", + "dweb:/ipfs/QmVTGcaVSgzmsNMXs7QBiWDh3iQiNgrUAHbh2utJAhEkjg" + ], + "license": "MIT" + }, + "src/interfaces/IMainnetBridgeOApp.sol": { + "keccak256": "0xcb5a5dfffb3d72ccdb2080d1c0eba322b2f14d89755989ef5712ad7592976344", + "urls": [ + "bzz-raw://e36433c7a852f73feca736a1d0bc215280d6a3c74f82aae227f35d8f46b61ec5", + "dweb:/ipfs/QmbwPJJ5GyVs5y9Ycya5zWdhXgn3JfG41TMM5N6kKfaT3y" + ], + "license": "MIT" + } + }, + "version": 1 + }, + "id": 52 +} diff --git a/packages/shared/src/abi/index.ts b/packages/shared/src/abi/index.ts index c5ddf3b..e84507d 100644 --- a/packages/shared/src/abi/index.ts +++ b/packages/shared/src/abi/index.ts @@ -3,6 +3,7 @@ export { abi as BlockBuilderRegistryAbi } from "./BlockBuilderRegistry.json"; export { abi as L1ScrollMessengerAbi } from "./L1ScrollMessenger.json"; export { abi as L2ScrollMessengerAbi } from "./L2ScrollMessenger.json"; export { abi as LiquidityAbi } from "./Liquidity.json"; +export { abi as MainnetBridgeOAppAbi } from "./MainnetBridgeOApp.json"; export { abi as MinterAbi } from "./Minter.json"; export { abi as MockL1ScrollMessengerAbi } from "./MockL1ScrollMessenger.json"; export { abi as RollupAbi } from "./Rollup.json"; diff --git a/packages/shared/src/config/index.ts b/packages/shared/src/config/index.ts index 0816539..6808f45 100644 --- a/packages/shared/src/config/index.ts +++ b/packages/shared/src/config/index.ts @@ -77,6 +77,8 @@ export const config = cleanEnv(process.env, { ROLLUP_CONTRACT_ADDRESS: str({ devDefault: "0x" }), MINTER_CONTRACT_ADDRESS: str({ devDefault: "0x" }), MINTER_CONTRACT_DEPLOYED_BLOCK: num({ devDefault: 0 }), + MAINNET_BRIDGE_O_APP_CONTRACT_ADDRESS: str({ devDefault: "0x" }), + MAINNET_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK: num({ devDefault: 0 }), BASE_BRIDGE_O_APP_CONTRACT_ADDRESS: str({ devDefault: "0x" }), BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK: num({ devDefault: 0 }), // messenger contract From 9480306c50ea9d9742730c13577b1f0cf4f3671c Mon Sep 17 00:00:00 2001 From: signature18632 Date: Sat, 23 Aug 2025 00:24:16 +0700 Subject: [PATCH 07/12] added bridge-event-watcher --- packages/bridge-event-watcher/README.md | 17 +++++ packages/bridge-event-watcher/package.json | 19 ++++++ .../bridge-event-watcher/src/constants.ts | 14 +++++ packages/bridge-event-watcher/src/index.ts | 27 ++++++++ .../src/service/job.service.ts | 63 +++++++++++++++++++ packages/bridge-event-watcher/tsconfig.json | 25 ++++++++ yarn.lock | 12 ++++ 7 files changed, 177 insertions(+) create mode 100644 packages/bridge-event-watcher/README.md create mode 100644 packages/bridge-event-watcher/package.json create mode 100644 packages/bridge-event-watcher/src/constants.ts create mode 100644 packages/bridge-event-watcher/src/index.ts create mode 100644 packages/bridge-event-watcher/src/service/job.service.ts create mode 100644 packages/bridge-event-watcher/tsconfig.json diff --git a/packages/bridge-event-watcher/README.md b/packages/bridge-event-watcher/README.md new file mode 100644 index 0000000..e4abab1 --- /dev/null +++ b/packages/bridge-event-watcher/README.md @@ -0,0 +1,17 @@ +# bridge-event-watcher + +bridge-event-watcher is a tool designed to monitor and process bridge transactions on blockchain networks. + +## Usage + +To set up the development environment: + +```bash +# install +yarn + +# dev +yarn workspace bridge-event-watcher dev + +# build +yarn build diff --git a/packages/bridge-event-watcher/package.json b/packages/bridge-event-watcher/package.json new file mode 100644 index 0000000..76a4004 --- /dev/null +++ b/packages/bridge-event-watcher/package.json @@ -0,0 +1,19 @@ +{ + "name": "bridge-event-watcher", + "version": "1.0.0", + "dependencies": { + "@intmax2-function/shared": "workspace:*" + }, + "scripts": { + "start": "node dist/index.js", + "dev": "tsx watch --env-file=./../../.env src/index.ts", + "build": "tsc", + "typecheck": "tsc --noEmit", + "test": "vitest" + }, + "devDependencies": { + "tsx": "^4.20.4", + "typescript": "^5.9.2", + "vitest": "^3.2.4" + } +} diff --git a/packages/bridge-event-watcher/src/constants.ts b/packages/bridge-event-watcher/src/constants.ts new file mode 100644 index 0000000..d015adb --- /dev/null +++ b/packages/bridge-event-watcher/src/constants.ts @@ -0,0 +1,14 @@ +export enum MessageStatus { + INFLIGHT = "INFLIGHT", + CONFIRMING = "CONFIRMING", + VERIFIED = "VERIFIED", + DELIVERED = "DELIVERED", + FAILED = "FAILED", + PAYLOAD_STORED = "PAYLOAD_STORED", + BLOCKED = "BLOCKED", +} + +export const LAYER_ZERO_SCAN_API = { + ["l1"]: "https://scan.layerzero-api.com/v1", + ["l2"]: "https://scan-testnet.layerzero-api.com/v1", +} as const; diff --git a/packages/bridge-event-watcher/src/index.ts b/packages/bridge-event-watcher/src/index.ts new file mode 100644 index 0000000..7b9994b --- /dev/null +++ b/packages/bridge-event-watcher/src/index.ts @@ -0,0 +1,27 @@ +import { logger, timeOperation } from "@intmax2-function/shared"; +import { name } from "../package.json"; +import { performJob } from "./service/job.service"; + +async function main() { + try { + logger.info(`Starting ${name} job`); + const { durationInSeconds } = await timeOperation(performJob); + logger.info(`Completed ${name} job executed successfully in ${durationInSeconds}s`); + process.exit(0); + } catch (error) { + logger.error(error); + process.exit(1); + } +} + +process.on("unhandledRejection", (reason, promise) => { + logger.error(`Unhandled Rejection at: ${promise} reason: ${reason}`); + process.exit(1); +}); + +if (require.main === module) { + main().catch((error) => { + logger.error(error); + process.exit(1); + }); +} diff --git a/packages/bridge-event-watcher/src/service/job.service.ts b/packages/bridge-event-watcher/src/service/job.service.ts new file mode 100644 index 0000000..551d263 --- /dev/null +++ b/packages/bridge-event-watcher/src/service/job.service.ts @@ -0,0 +1,63 @@ +import { + BASE_BRIDGE_O_APP_CONTRACT_ADDRESS, + BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK, + BLOCK_RANGE_TINY, + bridgeRequestedEvent, + createNetworkClient, + type DepositEvent, + Event, + type EventData, + FIRESTORE_DOCUMENT_EVENTS, + fetchEvents, + getStartBlockNumber, + logger, + validateBlockRange, +} from "@intmax2-function/shared"; + +export const performJob = async () => { + const l2Client = createNetworkClient("l2"); + const event = new Event(FIRESTORE_DOCUMENT_EVENTS.BRIDGE_REQUESTED); + + const [currentBlockNumber, lastProcessedEvent] = await Promise.all([ + await l2Client.getBlockNumber(), + await event.getEvent(), + ]); + + await processBridgeMonitor(l2Client, currentBlockNumber, event, lastProcessedEvent); +}; + +const processBridgeMonitor = async ( + l2Client: ReturnType, + currentBlockNumber: bigint, + event: Event, + lastProcessedEvent: EventData | null, +) => { + const startBlockNumber = getStartBlockNumber( + lastProcessedEvent, + BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK, + ); + const isValid = validateBlockRange("BridgeRequested", startBlockNumber, currentBlockNumber); + if (!isValid) { + logger.info("Skipping process BridgeRequested due to invalid block range."); + return; + } + + const bridgeRequestedEvents = await fetchEvents(l2Client, { + startBlockNumber, + endBlockNumber: currentBlockNumber, + blockRange: BLOCK_RANGE_TINY, + contractAddress: BASE_BRIDGE_O_APP_CONTRACT_ADDRESS, + eventInterface: bridgeRequestedEvent, + }); + + console.log("bridgeRequestedEvents:", bridgeRequestedEvents); + + await updateEventState(event, currentBlockNumber); +}; + +const updateEventState = async (event: Event, currentBlockNumber: bigint) => { + const eventData = { + lastBlockNumber: Number(currentBlockNumber), + }; + await event.addOrUpdateEvent(eventData); +}; diff --git a/packages/bridge-event-watcher/tsconfig.json b/packages/bridge-event-watcher/tsconfig.json new file mode 100644 index 0000000..a09ade0 --- /dev/null +++ b/packages/bridge-event-watcher/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "outDir": "./dist", + "rootDir": "./src", + "strict": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "declaration": true, + "sourceMap": true, + "isolatedModules": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "allowUnreachableCode": false, + "incremental": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "**/*.spec.ts", "dist"] +} diff --git a/yarn.lock b/yarn.lock index bc7610b..5ef4415 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1981,6 +1981,18 @@ __metadata: languageName: node linkType: hard +"bridge-event-watcher@workspace:packages/bridge-event-watcher": + version: 0.0.0-use.local + resolution: "bridge-event-watcher@workspace:packages/bridge-event-watcher" + dependencies: + "@intmax2-function/shared": "workspace:*" + tsx: "npm:^4.20.4" + typescript: "npm:^5.9.2" + viem: "npm:^2.33.3" + vitest: "npm:^3.2.4" + languageName: unknown + linkType: soft + "bridge-monitor@workspace:packages/bridge-monitor": version: 0.0.0-use.local resolution: "bridge-monitor@workspace:packages/bridge-monitor" From a729e71e75f0b6649a52f8ac6bab75ed52a75a0b Mon Sep 17 00:00:00 2001 From: signature18632 Date: Sat, 23 Aug 2025 00:30:22 +0700 Subject: [PATCH 08/12] bridge transaction --- packages/shared/src/db/bridgeTransaction.ts | 122 ++++++++++++++++++++ packages/shared/src/db/index.ts | 1 + 2 files changed, 123 insertions(+) create mode 100644 packages/shared/src/db/bridgeTransaction.ts diff --git a/packages/shared/src/db/bridgeTransaction.ts b/packages/shared/src/db/bridgeTransaction.ts new file mode 100644 index 0000000..fc77d67 --- /dev/null +++ b/packages/shared/src/db/bridgeTransaction.ts @@ -0,0 +1,122 @@ +import type { CollectionReference, Query } from "@google-cloud/firestore"; +import { FIRESTORE_COLLECTIONS, FIRESTORE_MAX_BATCH_SIZE } from "../constants"; +import { AppError, ErrorCode, logger } from "../lib"; +import type { TokenMapData, TokenMapFilter, TokenMapInput } from "../types"; +import { db } from "./firestore"; + +export class BridgeTransaction { + private static instance: BridgeTransaction | null = null; + private readonly db = db; + private readonly collection: CollectionReference; + protected readonly defaultOrderField = "__name__"; + protected readonly defaultOrderDirection = "asc"; + + constructor() { + this.collection = db.collection(FIRESTORE_COLLECTIONS.TOKEN_MAPS); + } + + public static getInstance() { + if (!BridgeTransaction.instance) { + BridgeTransaction.instance = new BridgeTransaction(); + } + return BridgeTransaction.instance; + } + + async saveTokenMapsBatch(inputs: TokenMapInput[]) { + const batches = []; + const now = new Date(); + + try { + for (let i = 0; i < inputs.length; i += FIRESTORE_MAX_BATCH_SIZE) { + const batch = this.db.batch(); + const batchInputs = inputs.slice(i, i + FIRESTORE_MAX_BATCH_SIZE); + + for (const input of batchInputs) { + const ref = this.collection.doc(input.tokenIndex.toString()); + + batch.set( + ref, + { + ...input, + createdAt: now, + }, + { merge: false }, + ); + } + + batches.push(batch.commit()); + } + + await Promise.all(batches); + + return { + count: inputs.length, + }; + } catch (error) { + logger.error(error); + throw new AppError( + 500, + ErrorCode.INTERNAL_SERVER_ERROR, + `Failed to save tokenMaps: ${(error as Error).message}`, + ); + } + } + + private async list(buildQuery?: (query: Query) => Query) { + try { + let query = this.collection.orderBy( + this.defaultOrderField as string, + this.defaultOrderDirection, + ); + + if (buildQuery) { + query = buildQuery(query); + } + + const allItems = []; + let lastDoc: FirebaseFirestore.DocumentSnapshot | null = null; + + do { + let batchQuery = query.limit(FIRESTORE_MAX_BATCH_SIZE); + if (lastDoc) { + batchQuery = batchQuery.startAfter(lastDoc); + } + + const snapshot = await batchQuery.get(); + const batchItems = snapshot.docs.map((doc) => { + return { ...doc.data() } as TokenMapData; + }); + + allItems.push(...batchItems); + if (snapshot.size < FIRESTORE_MAX_BATCH_SIZE) { + lastDoc = null; + } else { + lastDoc = snapshot.docs[snapshot.docs.length - 1]; + } + } while (lastDoc); + + return allItems; + } catch (error) { + logger.error(error); + throw new AppError( + 500, + ErrorCode.INTERNAL_SERVER_ERROR, + `Failed to list ${(error as Error).message}`, + ); + } + } + + async fetchTokenMaps(filter?: TokenMapFilter) { + return this.list((query) => { + let modified = query; + if (filter?.tokenIndexes) { + modified = modified.where("__name__", "in", filter.tokenIndexes); + } + return modified; + }); + } + + async fetchAllTokenMaps() { + return this.list(); + } +} diff --git a/packages/shared/src/db/index.ts b/packages/shared/src/db/index.ts index 87aec9b..95fa9d6 100644 --- a/packages/shared/src/db/index.ts +++ b/packages/shared/src/db/index.ts @@ -4,3 +4,4 @@ export * from "./indexer"; export * from "./mintEvent"; export * from "./tokenMap"; export * from "./txMap"; +export * from "./bridgeTransaction"; From 2e8bc6a26ca97ade63f99c1d8f51d102c5dee350 Mon Sep 17 00:00:00 2001 From: signature18632 Date: Sat, 23 Aug 2025 00:52:36 +0700 Subject: [PATCH 09/12] update bridge transaction --- .../src/service/job.service.ts | 12 +++- packages/bridge-monitor/src/constants.ts | 10 ---- .../bridge-monitor/src/service/job.service.ts | 55 ++++--------------- packages/shared/src/constants/constants.ts | 1 + packages/shared/src/db/bridgeTransaction.ts | 20 ++++--- packages/shared/src/db/index.ts | 2 +- packages/shared/src/types/blockchain.ts | 18 ++++++ .../shared/src/types/bridgeTransaction.ts | 25 +++++++++ packages/shared/src/types/index.ts | 1 + yarn.lock | 1 - 10 files changed, 80 insertions(+), 65 deletions(-) create mode 100644 packages/shared/src/types/bridgeTransaction.ts diff --git a/packages/bridge-event-watcher/src/service/job.service.ts b/packages/bridge-event-watcher/src/service/job.service.ts index 551d263..d5b7eff 100644 --- a/packages/bridge-event-watcher/src/service/job.service.ts +++ b/packages/bridge-event-watcher/src/service/job.service.ts @@ -2,9 +2,10 @@ import { BASE_BRIDGE_O_APP_CONTRACT_ADDRESS, BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK, BLOCK_RANGE_TINY, + type BridgeRequestedEvent, + BridgeTransaction, bridgeRequestedEvent, createNetworkClient, - type DepositEvent, Event, type EventData, FIRESTORE_DOCUMENT_EVENTS, @@ -42,7 +43,7 @@ const processBridgeMonitor = async ( return; } - const bridgeRequestedEvents = await fetchEvents(l2Client, { + const bridgeRequestedEvents = await fetchEvents(l2Client, { startBlockNumber, endBlockNumber: currentBlockNumber, blockRange: BLOCK_RANGE_TINY, @@ -50,7 +51,12 @@ const processBridgeMonitor = async ( eventInterface: bridgeRequestedEvent, }); - console.log("bridgeRequestedEvents:", bridgeRequestedEvents); + const bridgeRequestedInputs = bridgeRequestedEvents.map((event) => ({ + guid: event.args.receipt.guid, + nonce: Number(event.args.receipt.nonce), + })); + + await BridgeTransaction.getInstance().saveBridgeTransactionsBatch(bridgeRequestedInputs); await updateEventState(event, currentBlockNumber); }; diff --git a/packages/bridge-monitor/src/constants.ts b/packages/bridge-monitor/src/constants.ts index d015adb..d6d1485 100644 --- a/packages/bridge-monitor/src/constants.ts +++ b/packages/bridge-monitor/src/constants.ts @@ -1,13 +1,3 @@ -export enum MessageStatus { - INFLIGHT = "INFLIGHT", - CONFIRMING = "CONFIRMING", - VERIFIED = "VERIFIED", - DELIVERED = "DELIVERED", - FAILED = "FAILED", - PAYLOAD_STORED = "PAYLOAD_STORED", - BLOCKED = "BLOCKED", -} - export const LAYER_ZERO_SCAN_API = { ["l1"]: "https://scan.layerzero-api.com/v1", ["l2"]: "https://scan-testnet.layerzero-api.com/v1", diff --git a/packages/bridge-monitor/src/service/job.service.ts b/packages/bridge-monitor/src/service/job.service.ts index 92c1937..598b408 100644 --- a/packages/bridge-monitor/src/service/job.service.ts +++ b/packages/bridge-monitor/src/service/job.service.ts @@ -1,55 +1,24 @@ import { - BASE_BRIDGE_O_APP_CONTRACT_ADDRESS, - BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK, - BLOCK_RANGE_MINIMUM, - BLOCK_RANGE_TINY, - bridgeRequestedEvent, - createNetworkClient, - type DepositEvent, - Event, - type EventData, - FIRESTORE_DOCUMENT_EVENTS, - fetchEvents, - getStartBlockNumber, - logger, - validateBlockRange, + BridgeTransaction, + BridgeTransactionData, + BridgeTransactionStatus, } from "@intmax2-function/shared"; export const performJob = async () => { - const l2Client = createNetworkClient("l2"); - const event = new Event(FIRESTORE_DOCUMENT_EVENTS.BRIDGE_REQUESTED); + const bridgeTransactions = await BridgeTransaction.getInstance().fetchAllBridgeTransactions(); - const [currentBlockNumber, lastProcessedEvent] = await Promise.all([ - await l2Client.getBlockNumber(), - await event.getEvent(), - ]); + const sortedTransactions = bridgeTransactions.sort((a, b) => a.nonce - b.nonce); - await processBridgeMonitor(l2Client, currentBlockNumber, event, lastProcessedEvent); + for (const bridgeTransaction of sortedTransactions) { + await processBridgeTransaction(bridgeTransaction, sortedTransactions); + } }; -const processBridgeMonitor = async ( - l2Client: ReturnType, - currentBlockNumber: bigint, - event: Event, - lastProcessedEvent: EventData | null, +const processBridgeTransaction = async ( + bridgeTransaction: BridgeTransactionData, + allTransactions: BridgeTransactionData[], ) => { - const startBlockNumber = getStartBlockNumber( - lastProcessedEvent, - BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK, - ); - const isValid = validateBlockRange("BridgeRequested", startBlockNumber, currentBlockNumber); - if (!isValid) { - logger.info("Skipping process BridgeRequested due to invalid block range."); + if (bridgeTransaction.status === BridgeTransactionStatus.DELIVERED) { return; } - - const bridgeRequestedEvents = await fetchEvents(l2Client, { - startBlockNumber, - endBlockNumber: currentBlockNumber, - blockRange: BLOCK_RANGE_TINY, - contractAddress: BASE_BRIDGE_O_APP_CONTRACT_ADDRESS, - eventInterface: bridgeRequestedEvent, - }); - - console.log("bridgeRequestedEvents:", bridgeRequestedEvents); }; diff --git a/packages/shared/src/constants/constants.ts b/packages/shared/src/constants/constants.ts index de2087e..f923106 100644 --- a/packages/shared/src/constants/constants.ts +++ b/packages/shared/src/constants/constants.ts @@ -18,6 +18,7 @@ export const FIRESTORE_COLLECTIONS = { TX_MAPS: "txMaps", TOKEN_MAPS: "tokenMaps", MINTER_EVENTS: "minterEvents", + BRIDGE_TRANSACTIONS: "bridgeTransactions", } as const; export const FIRESTORE_DOCUMENTS = { diff --git a/packages/shared/src/db/bridgeTransaction.ts b/packages/shared/src/db/bridgeTransaction.ts index fc77d67..748173d 100644 --- a/packages/shared/src/db/bridgeTransaction.ts +++ b/packages/shared/src/db/bridgeTransaction.ts @@ -1,7 +1,12 @@ import type { CollectionReference, Query } from "@google-cloud/firestore"; import { FIRESTORE_COLLECTIONS, FIRESTORE_MAX_BATCH_SIZE } from "../constants"; import { AppError, ErrorCode, logger } from "../lib"; -import type { TokenMapData, TokenMapFilter, TokenMapInput } from "../types"; +import { + type BridgeTransactionData, + type BridgeTransactionFilter, + type BridgeTransactionInput, + BridgeTransactionStatus, +} from "../types"; import { db } from "./firestore"; export class BridgeTransaction { @@ -12,7 +17,7 @@ export class BridgeTransaction { protected readonly defaultOrderDirection = "asc"; constructor() { - this.collection = db.collection(FIRESTORE_COLLECTIONS.TOKEN_MAPS); + this.collection = db.collection(FIRESTORE_COLLECTIONS.BRIDGE_TRANSACTIONS); } public static getInstance() { @@ -22,7 +27,7 @@ export class BridgeTransaction { return BridgeTransaction.instance; } - async saveTokenMapsBatch(inputs: TokenMapInput[]) { + async saveBridgeTransactionsBatch(inputs: BridgeTransactionInput[]) { const batches = []; const now = new Date(); @@ -32,12 +37,13 @@ export class BridgeTransaction { const batchInputs = inputs.slice(i, i + FIRESTORE_MAX_BATCH_SIZE); for (const input of batchInputs) { - const ref = this.collection.doc(input.tokenIndex.toString()); + const ref = this.collection.doc(); batch.set( ref, { ...input, + status: BridgeTransactionStatus.QUEUED, createdAt: now, }, { merge: false }, @@ -84,7 +90,7 @@ export class BridgeTransaction { const snapshot = await batchQuery.get(); const batchItems = snapshot.docs.map((doc) => { - return { ...doc.data() } as TokenMapData; + return { ...doc.data() } as BridgeTransactionData; }); allItems.push(...batchItems); @@ -106,7 +112,7 @@ export class BridgeTransaction { } } - async fetchTokenMaps(filter?: TokenMapFilter) { + async fetchBridgeTransactions(filter?: BridgeTransactionFilter) { return this.list((query) => { let modified = query; if (filter?.tokenIndexes) { @@ -116,7 +122,7 @@ export class BridgeTransaction { }); } - async fetchAllTokenMaps() { + async fetchAllBridgeTransactions() { return this.list(); } } diff --git a/packages/shared/src/db/index.ts b/packages/shared/src/db/index.ts index 95fa9d6..905aed2 100644 --- a/packages/shared/src/db/index.ts +++ b/packages/shared/src/db/index.ts @@ -1,7 +1,7 @@ export * from "./baseIndexer"; +export * from "./bridgeTransaction"; export * from "./event"; export * from "./indexer"; export * from "./mintEvent"; export * from "./tokenMap"; export * from "./txMap"; -export * from "./bridgeTransaction"; diff --git a/packages/shared/src/types/blockchain.ts b/packages/shared/src/types/blockchain.ts index 31a98f3..34d6661 100644 --- a/packages/shared/src/types/blockchain.ts +++ b/packages/shared/src/types/blockchain.ts @@ -87,4 +87,22 @@ export interface TransferredToLiquidityEventLog { amount: bigint; } +export interface BridgeRequestedEvent { + args: BridgeRequestedEventLog; +} + +export interface BridgeRequestedEventLog { + recipient: string; + amount: bigint; + user: string; + receipt: { + guid: string; + nonce: bigint; + fee: { + nativeFee: bigint; + lzTokenFee: bigint; + }; + }; +} + export type NetworkLayer = "l1" | "l2"; diff --git a/packages/shared/src/types/bridgeTransaction.ts b/packages/shared/src/types/bridgeTransaction.ts new file mode 100644 index 0000000..623003a --- /dev/null +++ b/packages/shared/src/types/bridgeTransaction.ts @@ -0,0 +1,25 @@ +export interface BridgeTransactionData { + guid: string; + status: BridgeTransactionStatus; + nonce: number; + createdAt: FirebaseFirestore.Timestamp; +} + +export interface BridgeTransactionInput { + guid: string; +} + +export interface BridgeTransactionFilter { + tokenIndexes?: string[]; +} + +export enum BridgeTransactionStatus { + QUEUED = "QUEUED", + INFLIGHT = "INFLIGHT", + CONFIRMING = "CONFIRMING", + VERIFIED = "VERIFIED", + DELIVERED = "DELIVERED", + FAILED = "FAILED", + PAYLOAD_STORED = "PAYLOAD_STORED", + BLOCKED = "BLOCKED", +} diff --git a/packages/shared/src/types/index.ts b/packages/shared/src/types/index.ts index b43cfe1..1edcb61 100644 --- a/packages/shared/src/types/index.ts +++ b/packages/shared/src/types/index.ts @@ -1,4 +1,5 @@ export * from "./blockchain"; +export * from "./bridgeTransaction"; export * from "./event"; export * from "./indexer"; export * from "./mintEvent"; diff --git a/yarn.lock b/yarn.lock index 5ef4415..57e8664 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1988,7 +1988,6 @@ __metadata: "@intmax2-function/shared": "workspace:*" tsx: "npm:^4.20.4" typescript: "npm:^5.9.2" - viem: "npm:^2.33.3" vitest: "npm:^3.2.4" languageName: unknown linkType: soft From 94c226b83362ab6cdc862cb533ee6badfb646414 Mon Sep 17 00:00:00 2001 From: signature18632 Date: Sat, 23 Aug 2025 07:56:50 +0700 Subject: [PATCH 10/12] layzer zero transaction --- packages/bridge-monitor/package.json | 3 +- packages/bridge-monitor/src/constants.ts | 4 +- .../bridge-monitor/src/service/job.service.ts | 46 +- .../src/service/process.service.ts | 117 +++ .../src/service/submit.service.ts | 3 + packages/bridge-monitor/src/types.ts | 146 ++++ packages/shared/src/abi/BaseBridgeOApp.json | 664 +----------------- .../shared/src/abi/MainnetBridgeOApp.json | 648 +---------------- packages/shared/src/config/index.ts | 3 +- packages/shared/src/config/validator.ts | 7 + packages/shared/src/constants/constants.ts | 4 + packages/shared/src/db/bridgeTransaction.ts | 5 +- .../shared/src/types/bridgeTransaction.ts | 4 +- yarn.lock | 69 +- 14 files changed, 401 insertions(+), 1322 deletions(-) create mode 100644 packages/bridge-monitor/src/service/process.service.ts create mode 100644 packages/bridge-monitor/src/service/submit.service.ts create mode 100644 packages/bridge-monitor/src/types.ts diff --git a/packages/bridge-monitor/package.json b/packages/bridge-monitor/package.json index 53a3c40..ac86e7a 100644 --- a/packages/bridge-monitor/package.json +++ b/packages/bridge-monitor/package.json @@ -3,7 +3,8 @@ "version": "1.0.0", "dependencies": { "@intmax2-function/shared": "workspace:*", - "viem": "^2.33.3" + "axios": "^1.11.0", + "viem": "^2.34.0" }, "scripts": { "start": "node dist/index.js", diff --git a/packages/bridge-monitor/src/constants.ts b/packages/bridge-monitor/src/constants.ts index d6d1485..6d050f5 100644 --- a/packages/bridge-monitor/src/constants.ts +++ b/packages/bridge-monitor/src/constants.ts @@ -1,4 +1,4 @@ export const LAYER_ZERO_SCAN_API = { - ["l1"]: "https://scan.layerzero-api.com/v1", - ["l2"]: "https://scan-testnet.layerzero-api.com/v1", + ["mainnet"]: "https://scan.layerzero-api.com/v1", + ["testnet"]: "https://scan-testnet.layerzero-api.com/v1", } as const; diff --git a/packages/bridge-monitor/src/service/job.service.ts b/packages/bridge-monitor/src/service/job.service.ts index 598b408..b97a78d 100644 --- a/packages/bridge-monitor/src/service/job.service.ts +++ b/packages/bridge-monitor/src/service/job.service.ts @@ -1,11 +1,26 @@ import { BridgeTransaction, - BridgeTransactionData, + type BridgeTransactionData, BridgeTransactionStatus, } from "@intmax2-function/shared"; +import { + fetchBridgeGuidTransaction, + handleFailedStatus, + handleInflightOrConfirming, + handlePayloadStored, + handleVerifiedStatus, +} from "./process.service"; export const performJob = async () => { - const bridgeTransactions = await BridgeTransaction.getInstance().fetchAllBridgeTransactions(); + const bridgeTransactions = await BridgeTransaction.getInstance().fetchBridgeTransactions({ + statuses: [ + BridgeTransactionStatus.QUEUED, + BridgeTransactionStatus.INFLIGHT, + BridgeTransactionStatus.CONFIRMING, + BridgeTransactionStatus.VERIFIED, + BridgeTransactionStatus.BLOCKED, + ], + }); const sortedTransactions = bridgeTransactions.sort((a, b) => a.nonce - b.nonce); @@ -18,7 +33,30 @@ const processBridgeTransaction = async ( bridgeTransaction: BridgeTransactionData, allTransactions: BridgeTransactionData[], ) => { - if (bridgeTransaction.status === BridgeTransactionStatus.DELIVERED) { - return; + const bridgeGuidTransaction = await fetchBridgeGuidTransaction(bridgeTransaction.guid); + const statusName = bridgeGuidTransaction.status.name; + + switch (statusName) { + case BridgeTransactionStatus.FAILED: + await handleFailedStatus(bridgeGuidTransaction); + break; + + case BridgeTransactionStatus.INFLIGHT: + case BridgeTransactionStatus.CONFIRMING: + await handleInflightOrConfirming(bridgeTransaction); + break; + + case BridgeTransactionStatus.VERIFIED: + await handleVerifiedStatus(bridgeTransaction); + break; + + case BridgeTransactionStatus.PAYLOAD_STORED: + await handlePayloadStored(bridgeGuidTransaction); + break; } + + // updateStatus + + // if (statusName === BridgeTransactionStatus.DELIVERED) { + // } }; diff --git a/packages/bridge-monitor/src/service/process.service.ts b/packages/bridge-monitor/src/service/process.service.ts new file mode 100644 index 0000000..059982f --- /dev/null +++ b/packages/bridge-monitor/src/service/process.service.ts @@ -0,0 +1,117 @@ +import { + API_TIMEOUT, + BridgeTransactionData, + config, + createNetworkClient, + Discord, + logger, + MainnetBridgeOAppAbi, + MAINNET_BRIDGE_O_APP_CONTRACT_ADDRESS, +} from "@intmax2-function/shared"; +import axios, { AxiosError } from "axios"; +import { LAYER_ZERO_SCAN_API } from "../constants"; +import type { BridgeGuidTransaction, BridgeGuidTransactionResponse } from "../types"; +import { submitTransaction } from "./submit.service"; +import type { Abi } from "viem"; + +export const fetchBridgeGuidTransaction = async (guid: string) => { + const layerZeroMessagesUrl = `${LAYER_ZERO_SCAN_API[config.LAYER_ZERO_NETWORK]}/messages/${guid}`; + try { + const response = await axios.get(layerZeroMessagesUrl, { + timeout: API_TIMEOUT, + headers: { + Accept: "application/json", + }, + }); + if (response.data?.data === undefined) { + throw new Error("Data is missing in the response"); + } + const transactions = response.data.data as BridgeGuidTransaction[]; + + if (transactions.length === 0) { + throw new Error("No transactions found"); + } + + return transactions[0]; + } catch (error) { + logger.error( + `Failed to fetch bridge transaction status url: ${layerZeroMessagesUrl} ${error instanceof Error ? error.message : error}`, + ); + + if (error instanceof AxiosError) { + throw new Error(`Failed to fetch status: ${error.response?.status}`); + } + + throw new Error( + `Unexpected error while fetching bridge transaction status: ${ + error instanceof Error ? error.message : error + }`, + ); + } +}; + +export const handleFailedStatus = async (bridgeGuidTransaction: BridgeGuidTransaction) => { + await submitTransaction("clear"); +}; + +export const handleInflightOrConfirming = async (bridgeTransaction: BridgeTransactionData) => { + const twentyFourHoursAgo = new Date(Date.now() - 24 * 60 * 60 * 1000); + + // TODO + if (bridgeTransaction.updatedAt.toDate() < twentyFourHoursAgo) { + await Discord.getInstance().sendMessageWitForReady( + "FATAL", + `INFLIGHT/CONFIRMING status persists over 24 hours: ${bridgeTransaction.guid}`, + ); + } +}; + +export const handleVerifiedStatus = async (bridgeTransaction: BridgeTransactionData) => { + const twentyFourHoursAgo = new Date(Date.now() - 24 * 60 * 60 * 1000); + const verifiedTimestamp = bridgeTransaction.verifiedAt + ? bridgeTransaction.verifiedAt.toDate() + : bridgeTransaction.createdAt.toDate(); + + // TODO: + if (verifiedTimestamp < twentyFourHoursAgo) { + await submitTransaction("manualRetry"); + } +}; + +export const handlePayloadStored = async (bridgeGuidTransaction: BridgeGuidTransaction) => { + const hasStored = await hasStoredPayload(); + + if (hasStored) { + await submitTransaction("manualRetry"); + } else { + await Discord.getInstance().sendMessageWitForReady( + "FATAL", + `PAYLOAD_STORED but hasStoredPayload is false: ${bridgeGuidTransaction.guid}`, + ); + } +}; + +const hasStoredPayload = async () => { + const l1Client = createNetworkClient("l1"); + const currentBlockNumber = await l1Client.getBlockNumber(); + + const args = [ + { + srcEid: "srcEid", + sender: "sender", + nonce: "nonce", + guid: "guid", + message: "message", + }, + ]; + + const isStored = await l1Client.readContract({ + address: MAINNET_BRIDGE_O_APP_CONTRACT_ADDRESS, + abi: MainnetBridgeOAppAbi as Abi, + functionName: "hasStoredPayload", + args, + blockNumber: currentBlockNumber, + }); + + return isStored as boolean; +}; diff --git a/packages/bridge-monitor/src/service/submit.service.ts b/packages/bridge-monitor/src/service/submit.service.ts new file mode 100644 index 0000000..f77e69a --- /dev/null +++ b/packages/bridge-monitor/src/service/submit.service.ts @@ -0,0 +1,3 @@ +export const submitTransaction = async (operation: string) { + console.log(`Submitting transaction for operation: ${operation}`) +} \ No newline at end of file diff --git a/packages/bridge-monitor/src/types.ts b/packages/bridge-monitor/src/types.ts new file mode 100644 index 0000000..eccb88b --- /dev/null +++ b/packages/bridge-monitor/src/types.ts @@ -0,0 +1,146 @@ +export interface BridgeGuidTransactionResponse { + data: BridgeGuidTransaction[]; +} + +export interface BridgeGuidTransaction { + pathway: Pathway; + source: Source; + destination: Destination; + verification: Verification; + guid: string; + config: Config; + status: Status; + created: string; + updated: string; +} + +interface Pathway { + srcEid: number; + dstEid: number; + sender: PathwayEndpoint; + receiver: PathwayEndpoint; + id: string; + nonce: number; +} + +interface PathwayEndpoint { + address: string; + id: string; + name: string; + chain: string; +} + +interface Source { + status: string; + tx: SourceTransaction; + failedTx: string[]; +} + +interface SourceTransaction { + txHash: string; + blockHash: string; + blockNumber: string; + blockTimestamp: number; + from: string; + blockConfirmations: number; + payload: string; + value: string; + readinessTimestamp: number; + resolvedPayload: string; + adapterParams: AdapterParams; + options: TransactionOptions; +} + +interface AdapterParams { + version: string; + dstGasLimit: string; + dstNativeGasTransferAmount: string; + dstNativeGasTransferAddress: string; +} + +interface TransactionOptions { + lzReceive: GasValue; + nativeDrop: NativeDrop[]; + compose: Compose[]; + ordered: boolean; +} + +interface GasValue { + gas: string; + value: string; +} + +interface NativeDrop { + amount: string; + receiver: string; +} + +interface Compose { + index: number; + gas: string; + value: string; +} + +interface Destination { + status: string; + tx: DestinationTransaction; + payloadStoredTx: string; + failedTx: string[]; +} + +interface DestinationTransaction { + txHash: string; + blockHash: string; + blockNumber: number; + blockTimestamp: number; +} + +interface Verification { + dvn: DVNVerification; + sealer: SealerVerification; +} + +interface DVNVerification { + dvns: Record; + status: string; +} + +interface SealerVerification { + tx: DestinationTransaction; + failedTx: FailedTransaction[]; + status: string; +} + +interface FailedTransaction { + txHash: string; + txError: string; +} + +interface Config { + error: boolean; + errorMessage: string; + dvnConfigError: boolean; + receiveLibrary: string; + sendLibrary: string; + inboundConfig: ChainConfig; + outboundConfig: ChainConfig; + ulnSendVersion: string; + ulnReceiveVersion: string; +} + +interface ChainConfig { + confirmations: number; + requiredDVNCount: number; + optionalDVNCount: number; + optionalDVNThreshold: number; + requiredDVNs: string[]; + requiredDVNNames: string[]; + optionalDVNs: string[]; + optionalDVNNames: string[]; + executor: string; +} + +export interface Status { + name: string; + message: string; +} diff --git a/packages/shared/src/abi/BaseBridgeOApp.json b/packages/shared/src/abi/BaseBridgeOApp.json index 23184d0..ce0255c 100644 --- a/packages/shared/src/abi/BaseBridgeOApp.json +++ b/packages/shared/src/abi/BaseBridgeOApp.json @@ -262,667 +262,5 @@ "name": "SafeERC20FailedOperation", "inputs": [{ "name": "token", "type": "address", "internalType": "address" }] } - ], - "bytecode": { - "object": "0x60e060405262030d4060045f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555034801561004a575f5ffd5b50604051612905380380612905833981810160405281019061006c91906103a4565b8484845f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100df575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100d6919061042a565b60405180910390fd5b6100ee8161024c60201b60201c565b508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610188576040517fb586360400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60805173ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b81526004016101c3919061042a565b5f604051808303815f87803b1580156101da575f5ffd5b505af11580156101ec573d5f5f3e3d5ffd5b50505050505060016002819055508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508063ffffffff1660c08163ffffffff16815250505050505050610443565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61033a82610311565b9050919050565b61034a81610330565b8114610354575f5ffd5b50565b5f8151905061036581610341565b92915050565b5f63ffffffff82169050919050565b6103838161036b565b811461038d575f5ffd5b50565b5f8151905061039e8161037a565b92915050565b5f5f5f5f5f60a086880312156103bd576103bc61030d565b5b5f6103ca88828901610357565b95505060206103db88828901610357565b94505060406103ec88828901610357565b93505060606103fd88828901610357565b925050608061040e88828901610390565b9150509295509295909350565b61042481610330565b82525050565b5f60208201905061043d5f83018461041b565b92915050565b60805160a05160c05161246761049e5f395f81816104a40152818161061d015261068901525f610c9c01525f818161073b015281816109cf01528181610eaa01528181610ff801528181611327015261141f01526124675ff3fe6080604052600436106100f2575f3560e01c80639a9f2e0611610089578063d3d8257811610058578063d3d82578146102e9578063ee0b544514610313578063f2fde38b1461033b578063f68016b714610363576100f2565b80639a9f2e0614610235578063a1da9dae1461025d578063bb0b6a5314610285578063ca5eb5e1146102c1576100f2565b80635c6d3da4116100c55780635c6d3da4146101af5780635e280f11146101cb578063715018a6146101f55780638da5cb5b1461020b576100f2565b806317442b70146100f65780633400288b14610121578063348f020914610149578063472fa44314610185575b5f5ffd5b348015610101575f5ffd5b5061010a61038d565b6040516101189291906117d0565b60405180910390f35b34801561012c575f5ffd5b5061014760048036038101906101429190611870565b61039a565b005b348015610154575f5ffd5b5061016f600480360381019061016a9190611908565b6103b0565b60405161017c919061194b565b60405180910390f35b348015610190575f5ffd5b50610199610451565b6040516101a691906119a0565b60405180910390f35b6101c960048036038101906101c49190611908565b6104d3565b005b3480156101d6575f5ffd5b506101df610739565b6040516101ec9190611a14565b60405180910390f35b348015610200575f5ffd5b5061020961075d565b005b348015610216575f5ffd5b5061021f610770565b60405161022c9190611a3c565b60405180910390f35b348015610240575f5ffd5b5061025b60048036038101906102569190611908565b610797565b005b348015610268575f5ffd5b50610283600480360381019061027e9190611a9a565b6108c7565b005b348015610290575f5ffd5b506102ab60048036038101906102a69190611ac5565b6109b0565b6040516102b89190611aff565b60405180910390f35b3480156102cc575f5ffd5b506102e760048036038101906102e29190611908565b6109c5565b005b3480156102f4575f5ffd5b506102fd610a56565b60405161030a9190611b38565b60405180910390f35b34801561031e575f5ffd5b5061033960048036038101906103349190611908565b610a7b565b005b348015610346575f5ffd5b50610361600480360381019061035c9190611908565b610b0d565b005b34801561036e575f5ffd5b50610377610b91565b6040516103849190611b60565b60405180910390f35b5f5f60015f915091509091565b6103a2610bb2565b6103ac8282610c39565b5050565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b7b8ceb3836040518263ffffffff1660e01b815260040161040b9190611a3c565b602060405180830381865afa158015610426573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044a9190611ba3565b9050919050565b610459611767565b5f610462610c98565b9150505f600182610471610e63565b60405160200161048393929190611bce565b60405160208183030381529060405290505f61049d610e6a565b90506104cb7f000000000000000000000000000000000000000000000000000000000000000083835f610ea0565b935050505090565b6104db610f81565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610540576040517f3d9eb1db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f61054a610c98565b9150915060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0f444b8610593610e63565b846040518363ffffffff1660e01b81526004016105b1929190611c03565b5f604051808303815f87803b1580156105c8575f5ffd5b505af11580156105da573d5f5f3e3d5ffd5b505050505f83826105e9610e63565b6040516020016105fb93929190611bce565b60405160208183030381529060405290505f610615610e6a565b90505f6106447f000000000000000000000000000000000000000000000000000000000000000084845f610ea0565b9050805f0151341015610683576040517f9c92bdfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6106b87f00000000000000000000000000000000000000000000000000000000000000008585856106b3610e63565b610fc5565b90506106c2610e63565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fb7a8fd64ccf9bc14113db8da652400c70061bba546c0732c14823138cffc62ed8784604051610720929190611cb5565b60405180910390a35050505050506107366110db565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b610765610bb2565b61076e5f6110e5565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61079f610bb2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610804576040517f8848062300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f939d27c079a71a72f299a5c806b3bb461e220e2b010c26ed2769771ff64dd08d60405160405180910390a35050565b6108cf610bb2565b5f816fffffffffffffffffffffffffffffffff161161091a576040517f98bdb2e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60045f9054906101000a90046fffffffffffffffffffffffffffffffff1690508160045f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f89200afd487aab0afaac512be478a60dc59fa2ac8c0a50d3ccd0cd252ed7ee5781836040516109a4929190611cdc565b60405180910390a15050565b6001602052805f5260405f205f915090505481565b6109cd610bb2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b8152600401610a269190611a3c565b5f604051808303815f87803b158015610a3d575f5ffd5b505af1158015610a4f573d5f5f3e3d5ffd5b5050505050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a83610bb2565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ee0b5445826040518263ffffffff1660e01b8152600401610add9190611a3c565b5f604051808303815f87803b158015610af4575f5ffd5b505af1158015610b06573d5f5f3e3d5ffd5b5050505050565b610b15610bb2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b85575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610b7c9190611a3c565b60405180910390fd5b610b8e816110e5565b50565b60045f9054906101000a90046fffffffffffffffffffffffffffffffff1681565b610bba610e63565b73ffffffffffffffffffffffffffffffffffffffff16610bd8610770565b73ffffffffffffffffffffffffffffffffffffffff1614610c3757610bfb610e63565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610c2e9190611a3c565b60405180910390fd5b565b8060015f8463ffffffff1663ffffffff1681526020019081526020015f20819055507f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b8282604051610c8c929190611d12565b60405180910390a15050565b5f5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231610cde610e63565b6040518263ffffffff1660e01b8152600401610cfa9190611a3c565b602060405180830381865afa158015610d15573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d399190611ba3565b91505f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b7b8ceb3610d81610e63565b6040518263ffffffff1660e01b8152600401610d9d9190611a3c565b602060405180830381865afa158015610db8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611ba3565b9050808311610e17576040517f506c1ba700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8083610e239190611d66565b91505f8211610e5e576040517f02f4cd1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b509091565b5f33905090565b6060610e9b610e776111a6565b60045f9054906101000a90046fffffffffffffffffffffffffffffffff165f6111ce565b905090565b610ea8611767565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ddc28c586040518060a001604052808863ffffffff168152602001610f0489611266565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b8152600401610f39929190611eac565b6040805180830381865afa158015610f53573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f779190611fa3565b9050949350505050565b6002805403610fbc576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028081905550565b610fcd61177f565b5f610fda845f01516112d7565b90505f84602001511115610ff657610ff58460200151611324565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632637a450826040518060a001604052808b63ffffffff1681526020016110538c611266565b81526020018a81526020018981526020015f8960200151111515815250866040518463ffffffff1660e01b815260040161108e929190611eac565b60806040518083038185885af11580156110aa573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906110cf919061206d565b91505095945050505050565b6001600281905550565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606060036040516020016111ba91906120d9565b604051602081830303815290604052905090565b606083600361ffff166111ea5f8361146a90919063ffffffff16565b61ffff1614611242576112065f8261146a90919063ffffffff16565b6040517f3a51740d0000000000000000000000000000000000000000000000000000000081526004016112399190612102565b60405180910390fd5b5f61124d85856114cf565b905061125b8660018361153a565b925050509392505050565b5f5f60015f8463ffffffff1663ffffffff1681526020019081526020015f205490505f5f1b81036112ce57826040517ff6ff4fb70000000000000000000000000000000000000000000000000000000081526004016112c5919061211b565b60405180910390fd5b80915050919050565b5f81341461131c57346040517f9f704120000000000000000000000000000000000000000000000000000000008152600401611313919061194b565b60405180910390fd5b819050919050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa15801561138e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b29190612148565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611419576040517f5373352a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611466337f0000000000000000000000000000000000000000000000000000000000000000848473ffffffffffffffffffffffffffffffffffffffff166115f5909392919063ffffffff16565b5050565b5f6002826114789190612173565b835110156114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290612200565b60405180910390fd5b5f8260028501015190508091505092915050565b60605f826fffffffffffffffffffffffffffffffff16146115115782826040516020016114fd929190612252565b604051602081830303815290604052611532565b82604051602001611522919061227d565b6040516020818303038152906040525b905092915050565b606083600361ffff166115565f8361146a90919063ffffffff16565b61ffff16146115ae576115725f8261146a90919063ffffffff16565b6040517f3a51740d0000000000000000000000000000000000000000000000000000000081526004016115a59190612102565b60405180910390fd5b846001806115bc8651611677565b6115c69190612297565b86866040516020016115dc959493929190612346565b6040516020818303038152906040529150509392505050565b611671848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161162a9392919061239c565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506116cc565b50505050565b5f61ffff80168211156116c4576010826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016116bb92919061240a565b60405180910390fd5b819050919050565b5f5f60205f8451602086015f885af1806116eb576040513d5f823e3d81fd5b3d92505f519150505f821461170457600181141561171f565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561176157836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016117589190611a3c565b60405180910390fd5b50505050565b60405180604001604052805f81526020015f81525090565b60405180606001604052805f81526020015f67ffffffffffffffff1681526020016117a8611767565b81525090565b5f67ffffffffffffffff82169050919050565b6117ca816117ae565b82525050565b5f6040820190506117e35f8301856117c1565b6117f060208301846117c1565b9392505050565b5f604051905090565b5f5ffd5b5f63ffffffff82169050919050565b61181c81611804565b8114611826575f5ffd5b50565b5f8135905061183781611813565b92915050565b5f819050919050565b61184f8161183d565b8114611859575f5ffd5b50565b5f8135905061186a81611846565b92915050565b5f5f6040838503121561188657611885611800565b5b5f61189385828601611829565b92505060206118a48582860161185c565b9150509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6118d7826118ae565b9050919050565b6118e7816118cd565b81146118f1575f5ffd5b50565b5f81359050611902816118de565b92915050565b5f6020828403121561191d5761191c611800565b5b5f61192a848285016118f4565b91505092915050565b5f819050919050565b61194581611933565b82525050565b5f60208201905061195e5f83018461193c565b92915050565b61196d81611933565b82525050565b604082015f8201516119875f850182611964565b50602082015161199a6020850182611964565b50505050565b5f6040820190506119b35f830184611973565b92915050565b5f819050919050565b5f6119dc6119d76119d2846118ae565b6119b9565b6118ae565b9050919050565b5f6119ed826119c2565b9050919050565b5f6119fe826119e3565b9050919050565b611a0e816119f4565b82525050565b5f602082019050611a275f830184611a05565b92915050565b611a36816118cd565b82525050565b5f602082019050611a4f5f830184611a2d565b92915050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b611a7981611a55565b8114611a83575f5ffd5b50565b5f81359050611a9481611a70565b92915050565b5f60208284031215611aaf57611aae611800565b5b5f611abc84828501611a86565b91505092915050565b5f60208284031215611ada57611ad9611800565b5b5f611ae784828501611829565b91505092915050565b611af98161183d565b82525050565b5f602082019050611b125f830184611af0565b92915050565b5f611b22826119e3565b9050919050565b611b3281611b18565b82525050565b5f602082019050611b4b5f830184611b29565b92915050565b611b5a81611a55565b82525050565b5f602082019050611b735f830184611b51565b92915050565b611b8281611933565b8114611b8c575f5ffd5b50565b5f81519050611b9d81611b79565b92915050565b5f60208284031215611bb857611bb7611800565b5b5f611bc584828501611b8f565b91505092915050565b5f606082019050611be15f830186611a2d565b611bee602083018561193c565b611bfb6040830184611a2d565b949350505050565b5f604082019050611c165f830185611a2d565b611c23602083018461193c565b9392505050565b611c338161183d565b82525050565b611c42816117ae565b82525050565b604082015f820151611c5c5f850182611964565b506020820151611c6f6020850182611964565b50505050565b608082015f820151611c895f850182611c2a565b506020820151611c9c6020850182611c39565b506040820151611caf6040850182611c48565b50505050565b5f60a082019050611cc85f83018561193c565b611cd56020830184611c75565b9392505050565b5f604082019050611cef5f830185611b51565b611cfc6020830184611b51565b9392505050565b611d0c81611804565b82525050565b5f604082019050611d255f830185611d03565b611d326020830184611af0565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611d7082611933565b9150611d7b83611933565b9250828203905081811115611d9357611d92611d39565b5b92915050565b611da281611804565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611dea82611da8565b611df48185611db2565b9350611e04818560208601611dc2565b611e0d81611dd0565b840191505092915050565b5f8115159050919050565b611e2c81611e18565b82525050565b5f60a083015f830151611e475f860182611d99565b506020830151611e5a6020860182611c2a565b5060408301518482036040860152611e728282611de0565b91505060608301518482036060860152611e8c8282611de0565b9150506080830151611ea16080860182611e23565b508091505092915050565b5f6040820190508181035f830152611ec48185611e32565b9050611ed36020830184611a2d565b9392505050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611f1482611dd0565b810181811067ffffffffffffffff82111715611f3357611f32611ede565b5b80604052505050565b5f611f456117f7565b9050611f518282611f0b565b919050565b5f60408284031215611f6b57611f6a611eda565b5b611f756040611f3c565b90505f611f8484828501611b8f565b5f830152506020611f9784828501611b8f565b60208301525092915050565b5f60408284031215611fb857611fb7611800565b5b5f611fc584828501611f56565b91505092915050565b5f81519050611fdc81611846565b92915050565b611feb816117ae565b8114611ff5575f5ffd5b50565b5f8151905061200681611fe2565b92915050565b5f6080828403121561202157612020611eda565b5b61202b6060611f3c565b90505f61203a84828501611fce565b5f83015250602061204d84828501611ff8565b602083015250604061206184828501611f56565b60408301525092915050565b5f6080828403121561208257612081611800565b5b5f61208f8482850161200c565b91505092915050565b5f61ffff82169050919050565b5f8160f01b9050919050565b5f6120bb826120a5565b9050919050565b6120d36120ce82612098565b6120b1565b82525050565b5f6120e482846120c2565b60028201915081905092915050565b6120fc81612098565b82525050565b5f6020820190506121155f8301846120f3565b92915050565b5f60208201905061212e5f830184611d03565b92915050565b5f81519050612142816118de565b92915050565b5f6020828403121561215d5761215c611800565b5b5f61216a84828501612134565b91505092915050565b5f61217d82611933565b915061218883611933565b92508282019050808211156121a05761219f611d39565b5b92915050565b5f82825260208201905092915050565b7f746f55696e7431365f6f75744f66426f756e64730000000000000000000000005f82015250565b5f6121ea6014836121a6565b91506121f5826121b6565b602082019050919050565b5f6020820190508181035f830152612217816121de565b9050919050565b5f8160801b9050919050565b5f6122348261221e565b9050919050565b61224c61224782611a55565b61222a565b82525050565b5f61225d828561223b565b60108201915061226d828461223b565b6010820191508190509392505050565b5f612288828461223b565b60108201915081905092915050565b5f6122a182612098565b91506122ac83612098565b9250828201905061ffff8111156122c6576122c5611d39565b5b92915050565b5f81905092915050565b5f6122e082611da8565b6122ea81856122cc565b93506122fa818560208601611dc2565b80840191505092915050565b5f60ff82169050919050565b5f8160f81b9050919050565b5f61232882612312565b9050919050565b61234061233b82612306565b61231e565b82525050565b5f61235182886122d6565b915061235d828761232f565b60018201915061236d82866120c2565b60028201915061237d828561232f565b60018201915061238d82846122d6565b91508190509695505050505050565b5f6060820190506123af5f830186611a2d565b6123bc6020830185611a2d565b6123c9604083018461193c565b949350505050565b5f819050919050565b5f6123f46123ef6123ea846123d1565b6119b9565b612306565b9050919050565b612404816123da565b82525050565b5f60408201905061241d5f8301856123fb565b61242a602083018461193c565b939250505056fea2646970667358221220c199f933b43749b8c30c8c9f8fed618e992ae8a5e2b6f7e46f59abaa98fd9ed564736f6c634300081e0033", - "sourceMap": "764:3779:50:-:0;;;1016:6;990:32;;;;;;;;;;;;;;;;;;;;1029:306;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1144:9;1155;1182:6;1297:1:37;1273:26;;:12;:26;;;1269:95;;1350:1;1322:31;;;;;;;;;;;:::i;:::-;;;;;;;;1269:95;1373:32;1392:12;1373:18;;;:32;;:::i;:::-;1225:187;1079:9:2;1047:42;;;;;;;;;;1125:1;1104:23;;:9;:23;;;1100:53;;1136:17;;;;;;;;;;;;;;1100:53;1163:8;;:20;;;1184:9;1163:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;987:214;;1857:1:44;2061:7;:21;;;;1219:6:50::2;1204:22;;;;;;;;::::0;::::2;1321:7;1311:17;;;;;;;;::::0;::::2;1029:306:::0;;;;;764:3779;;2912:187:37;2985:16;3004:6;;;;;;;;;;;2985:25;;3029:8;3020:6;;:17;;;;;;;;;;;;;;;;;;3083:8;3052:40;;3073:8;3052:40;;;;;;;;;;;;2975:124;2912:187;:::o;88:117:59:-;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:143::-;753:5;784:6;778:13;769:22;;800:33;827:5;800:33;:::i;:::-;696:143;;;;:::o;845:93::-;881:7;921:10;914:5;910:22;899:33;;845:93;;;:::o;944:120::-;1016:23;1033:5;1016:23;:::i;:::-;1009:5;1006:34;996:62;;1054:1;1051;1044:12;996:62;944:120;:::o;1070:141::-;1126:5;1157:6;1151:13;1142:22;;1173:32;1199:5;1173:32;:::i;:::-;1070:141;;;;:::o;1217:975::-;1322:6;1330;1338;1346;1354;1403:3;1391:9;1382:7;1378:23;1374:33;1371:120;;;1410:79;;:::i;:::-;1371:120;1530:1;1555:64;1611:7;1602:6;1591:9;1587:22;1555:64;:::i;:::-;1545:74;;1501:128;1668:2;1694:64;1750:7;1741:6;1730:9;1726:22;1694:64;:::i;:::-;1684:74;;1639:129;1807:2;1833:64;1889:7;1880:6;1869:9;1865:22;1833:64;:::i;:::-;1823:74;;1778:129;1946:2;1972:64;2028:7;2019:6;2008:9;2004:22;1972:64;:::i;:::-;1962:74;;1917:129;2085:3;2112:63;2167:7;2158:6;2147:9;2143:22;2112:63;:::i;:::-;2102:73;;2056:129;1217:975;;;;;;;;:::o;2198:118::-;2285:24;2303:5;2285:24;:::i;:::-;2280:3;2273:37;2198:118;;:::o;2322:222::-;2415:4;2453:2;2442:9;2438:18;2430:26;;2466:71;2534:1;2523:9;2519:17;2510:6;2466:71;:::i;:::-;2322:222;;;;:::o;764:3779:50:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", - "linkReferences": {} - }, - "deployedBytecode": { - "object": "0x6080604052600436106100f2575f3560e01c80639a9f2e0611610089578063d3d8257811610058578063d3d82578146102e9578063ee0b544514610313578063f2fde38b1461033b578063f68016b714610363576100f2565b80639a9f2e0614610235578063a1da9dae1461025d578063bb0b6a5314610285578063ca5eb5e1146102c1576100f2565b80635c6d3da4116100c55780635c6d3da4146101af5780635e280f11146101cb578063715018a6146101f55780638da5cb5b1461020b576100f2565b806317442b70146100f65780633400288b14610121578063348f020914610149578063472fa44314610185575b5f5ffd5b348015610101575f5ffd5b5061010a61038d565b6040516101189291906117d0565b60405180910390f35b34801561012c575f5ffd5b5061014760048036038101906101429190611870565b61039a565b005b348015610154575f5ffd5b5061016f600480360381019061016a9190611908565b6103b0565b60405161017c919061194b565b60405180910390f35b348015610190575f5ffd5b50610199610451565b6040516101a691906119a0565b60405180910390f35b6101c960048036038101906101c49190611908565b6104d3565b005b3480156101d6575f5ffd5b506101df610739565b6040516101ec9190611a14565b60405180910390f35b348015610200575f5ffd5b5061020961075d565b005b348015610216575f5ffd5b5061021f610770565b60405161022c9190611a3c565b60405180910390f35b348015610240575f5ffd5b5061025b60048036038101906102569190611908565b610797565b005b348015610268575f5ffd5b50610283600480360381019061027e9190611a9a565b6108c7565b005b348015610290575f5ffd5b506102ab60048036038101906102a69190611ac5565b6109b0565b6040516102b89190611aff565b60405180910390f35b3480156102cc575f5ffd5b506102e760048036038101906102e29190611908565b6109c5565b005b3480156102f4575f5ffd5b506102fd610a56565b60405161030a9190611b38565b60405180910390f35b34801561031e575f5ffd5b5061033960048036038101906103349190611908565b610a7b565b005b348015610346575f5ffd5b50610361600480360381019061035c9190611908565b610b0d565b005b34801561036e575f5ffd5b50610377610b91565b6040516103849190611b60565b60405180910390f35b5f5f60015f915091509091565b6103a2610bb2565b6103ac8282610c39565b5050565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b7b8ceb3836040518263ffffffff1660e01b815260040161040b9190611a3c565b602060405180830381865afa158015610426573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044a9190611ba3565b9050919050565b610459611767565b5f610462610c98565b9150505f600182610471610e63565b60405160200161048393929190611bce565b60405160208183030381529060405290505f61049d610e6a565b90506104cb7f000000000000000000000000000000000000000000000000000000000000000083835f610ea0565b935050505090565b6104db610f81565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610540576040517f3d9eb1db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f61054a610c98565b9150915060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0f444b8610593610e63565b846040518363ffffffff1660e01b81526004016105b1929190611c03565b5f604051808303815f87803b1580156105c8575f5ffd5b505af11580156105da573d5f5f3e3d5ffd5b505050505f83826105e9610e63565b6040516020016105fb93929190611bce565b60405160208183030381529060405290505f610615610e6a565b90505f6106447f000000000000000000000000000000000000000000000000000000000000000084845f610ea0565b9050805f0151341015610683576040517f9c92bdfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6106b87f00000000000000000000000000000000000000000000000000000000000000008585856106b3610e63565b610fc5565b90506106c2610e63565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fb7a8fd64ccf9bc14113db8da652400c70061bba546c0732c14823138cffc62ed8784604051610720929190611cb5565b60405180910390a35050505050506107366110db565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b610765610bb2565b61076e5f6110e5565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61079f610bb2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610804576040517f8848062300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f939d27c079a71a72f299a5c806b3bb461e220e2b010c26ed2769771ff64dd08d60405160405180910390a35050565b6108cf610bb2565b5f816fffffffffffffffffffffffffffffffff161161091a576040517f98bdb2e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60045f9054906101000a90046fffffffffffffffffffffffffffffffff1690508160045f6101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055507f89200afd487aab0afaac512be478a60dc59fa2ac8c0a50d3ccd0cd252ed7ee5781836040516109a4929190611cdc565b60405180910390a15050565b6001602052805f5260405f205f915090505481565b6109cd610bb2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b8152600401610a269190611a3c565b5f604051808303815f87803b158015610a3d575f5ffd5b505af1158015610a4f573d5f5f3e3d5ffd5b5050505050565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610a83610bb2565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ee0b5445826040518263ffffffff1660e01b8152600401610add9190611a3c565b5f604051808303815f87803b158015610af4575f5ffd5b505af1158015610b06573d5f5f3e3d5ffd5b5050505050565b610b15610bb2565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b85575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610b7c9190611a3c565b60405180910390fd5b610b8e816110e5565b50565b60045f9054906101000a90046fffffffffffffffffffffffffffffffff1681565b610bba610e63565b73ffffffffffffffffffffffffffffffffffffffff16610bd8610770565b73ffffffffffffffffffffffffffffffffffffffff1614610c3757610bfb610e63565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610c2e9190611a3c565b60405180910390fd5b565b8060015f8463ffffffff1663ffffffff1681526020019081526020015f20819055507f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b8282604051610c8c929190611d12565b60405180910390a15050565b5f5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231610cde610e63565b6040518263ffffffff1660e01b8152600401610cfa9190611a3c565b602060405180830381865afa158015610d15573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d399190611ba3565b91505f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b7b8ceb3610d81610e63565b6040518263ffffffff1660e01b8152600401610d9d9190611a3c565b602060405180830381865afa158015610db8573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ddc9190611ba3565b9050808311610e17576040517f506c1ba700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8083610e239190611d66565b91505f8211610e5e576040517f02f4cd1f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b509091565b5f33905090565b6060610e9b610e776111a6565b60045f9054906101000a90046fffffffffffffffffffffffffffffffff165f6111ce565b905090565b610ea8611767565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ddc28c586040518060a001604052808863ffffffff168152602001610f0489611266565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b8152600401610f39929190611eac565b6040805180830381865afa158015610f53573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f779190611fa3565b9050949350505050565b6002805403610fbc576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028081905550565b610fcd61177f565b5f610fda845f01516112d7565b90505f84602001511115610ff657610ff58460200151611324565b5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632637a450826040518060a001604052808b63ffffffff1681526020016110538c611266565b81526020018a81526020018981526020015f8960200151111515815250866040518463ffffffff1660e01b815260040161108e929190611eac565b60806040518083038185885af11580156110aa573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906110cf919061206d565b91505095945050505050565b6001600281905550565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606060036040516020016111ba91906120d9565b604051602081830303815290604052905090565b606083600361ffff166111ea5f8361146a90919063ffffffff16565b61ffff1614611242576112065f8261146a90919063ffffffff16565b6040517f3a51740d0000000000000000000000000000000000000000000000000000000081526004016112399190612102565b60405180910390fd5b5f61124d85856114cf565b905061125b8660018361153a565b925050509392505050565b5f5f60015f8463ffffffff1663ffffffff1681526020019081526020015f205490505f5f1b81036112ce57826040517ff6ff4fb70000000000000000000000000000000000000000000000000000000081526004016112c5919061211b565b60405180910390fd5b80915050919050565b5f81341461131c57346040517f9f704120000000000000000000000000000000000000000000000000000000008152600401611313919061194b565b60405180910390fd5b819050919050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa15801561138e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113b29190612148565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611419576040517f5373352a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611466337f0000000000000000000000000000000000000000000000000000000000000000848473ffffffffffffffffffffffffffffffffffffffff166115f5909392919063ffffffff16565b5050565b5f6002826114789190612173565b835110156114bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b290612200565b60405180910390fd5b5f8260028501015190508091505092915050565b60605f826fffffffffffffffffffffffffffffffff16146115115782826040516020016114fd929190612252565b604051602081830303815290604052611532565b82604051602001611522919061227d565b6040516020818303038152906040525b905092915050565b606083600361ffff166115565f8361146a90919063ffffffff16565b61ffff16146115ae576115725f8261146a90919063ffffffff16565b6040517f3a51740d0000000000000000000000000000000000000000000000000000000081526004016115a59190612102565b60405180910390fd5b846001806115bc8651611677565b6115c69190612297565b86866040516020016115dc959493929190612346565b6040516020818303038152906040529150509392505050565b611671848573ffffffffffffffffffffffffffffffffffffffff166323b872dd86868660405160240161162a9392919061239c565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506116cc565b50505050565b5f61ffff80168211156116c4576010826040517f6dfcc6500000000000000000000000000000000000000000000000000000000081526004016116bb92919061240a565b60405180910390fd5b819050919050565b5f5f60205f8451602086015f885af1806116eb576040513d5f823e3d81fd5b3d92505f519150505f821461170457600181141561171f565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b1561176157836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016117589190611a3c565b60405180910390fd5b50505050565b60405180604001604052805f81526020015f81525090565b60405180606001604052805f81526020015f67ffffffffffffffff1681526020016117a8611767565b81525090565b5f67ffffffffffffffff82169050919050565b6117ca816117ae565b82525050565b5f6040820190506117e35f8301856117c1565b6117f060208301846117c1565b9392505050565b5f604051905090565b5f5ffd5b5f63ffffffff82169050919050565b61181c81611804565b8114611826575f5ffd5b50565b5f8135905061183781611813565b92915050565b5f819050919050565b61184f8161183d565b8114611859575f5ffd5b50565b5f8135905061186a81611846565b92915050565b5f5f6040838503121561188657611885611800565b5b5f61189385828601611829565b92505060206118a48582860161185c565b9150509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6118d7826118ae565b9050919050565b6118e7816118cd565b81146118f1575f5ffd5b50565b5f81359050611902816118de565b92915050565b5f6020828403121561191d5761191c611800565b5b5f61192a848285016118f4565b91505092915050565b5f819050919050565b61194581611933565b82525050565b5f60208201905061195e5f83018461193c565b92915050565b61196d81611933565b82525050565b604082015f8201516119875f850182611964565b50602082015161199a6020850182611964565b50505050565b5f6040820190506119b35f830184611973565b92915050565b5f819050919050565b5f6119dc6119d76119d2846118ae565b6119b9565b6118ae565b9050919050565b5f6119ed826119c2565b9050919050565b5f6119fe826119e3565b9050919050565b611a0e816119f4565b82525050565b5f602082019050611a275f830184611a05565b92915050565b611a36816118cd565b82525050565b5f602082019050611a4f5f830184611a2d565b92915050565b5f6fffffffffffffffffffffffffffffffff82169050919050565b611a7981611a55565b8114611a83575f5ffd5b50565b5f81359050611a9481611a70565b92915050565b5f60208284031215611aaf57611aae611800565b5b5f611abc84828501611a86565b91505092915050565b5f60208284031215611ada57611ad9611800565b5b5f611ae784828501611829565b91505092915050565b611af98161183d565b82525050565b5f602082019050611b125f830184611af0565b92915050565b5f611b22826119e3565b9050919050565b611b3281611b18565b82525050565b5f602082019050611b4b5f830184611b29565b92915050565b611b5a81611a55565b82525050565b5f602082019050611b735f830184611b51565b92915050565b611b8281611933565b8114611b8c575f5ffd5b50565b5f81519050611b9d81611b79565b92915050565b5f60208284031215611bb857611bb7611800565b5b5f611bc584828501611b8f565b91505092915050565b5f606082019050611be15f830186611a2d565b611bee602083018561193c565b611bfb6040830184611a2d565b949350505050565b5f604082019050611c165f830185611a2d565b611c23602083018461193c565b9392505050565b611c338161183d565b82525050565b611c42816117ae565b82525050565b604082015f820151611c5c5f850182611964565b506020820151611c6f6020850182611964565b50505050565b608082015f820151611c895f850182611c2a565b506020820151611c9c6020850182611c39565b506040820151611caf6040850182611c48565b50505050565b5f60a082019050611cc85f83018561193c565b611cd56020830184611c75565b9392505050565b5f604082019050611cef5f830185611b51565b611cfc6020830184611b51565b9392505050565b611d0c81611804565b82525050565b5f604082019050611d255f830185611d03565b611d326020830184611af0565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611d7082611933565b9150611d7b83611933565b9250828203905081811115611d9357611d92611d39565b5b92915050565b611da281611804565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611dea82611da8565b611df48185611db2565b9350611e04818560208601611dc2565b611e0d81611dd0565b840191505092915050565b5f8115159050919050565b611e2c81611e18565b82525050565b5f60a083015f830151611e475f860182611d99565b506020830151611e5a6020860182611c2a565b5060408301518482036040860152611e728282611de0565b91505060608301518482036060860152611e8c8282611de0565b9150506080830151611ea16080860182611e23565b508091505092915050565b5f6040820190508181035f830152611ec48185611e32565b9050611ed36020830184611a2d565b9392505050565b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611f1482611dd0565b810181811067ffffffffffffffff82111715611f3357611f32611ede565b5b80604052505050565b5f611f456117f7565b9050611f518282611f0b565b919050565b5f60408284031215611f6b57611f6a611eda565b5b611f756040611f3c565b90505f611f8484828501611b8f565b5f830152506020611f9784828501611b8f565b60208301525092915050565b5f60408284031215611fb857611fb7611800565b5b5f611fc584828501611f56565b91505092915050565b5f81519050611fdc81611846565b92915050565b611feb816117ae565b8114611ff5575f5ffd5b50565b5f8151905061200681611fe2565b92915050565b5f6080828403121561202157612020611eda565b5b61202b6060611f3c565b90505f61203a84828501611fce565b5f83015250602061204d84828501611ff8565b602083015250604061206184828501611f56565b60408301525092915050565b5f6080828403121561208257612081611800565b5b5f61208f8482850161200c565b91505092915050565b5f61ffff82169050919050565b5f8160f01b9050919050565b5f6120bb826120a5565b9050919050565b6120d36120ce82612098565b6120b1565b82525050565b5f6120e482846120c2565b60028201915081905092915050565b6120fc81612098565b82525050565b5f6020820190506121155f8301846120f3565b92915050565b5f60208201905061212e5f830184611d03565b92915050565b5f81519050612142816118de565b92915050565b5f6020828403121561215d5761215c611800565b5b5f61216a84828501612134565b91505092915050565b5f61217d82611933565b915061218883611933565b92508282019050808211156121a05761219f611d39565b5b92915050565b5f82825260208201905092915050565b7f746f55696e7431365f6f75744f66426f756e64730000000000000000000000005f82015250565b5f6121ea6014836121a6565b91506121f5826121b6565b602082019050919050565b5f6020820190508181035f830152612217816121de565b9050919050565b5f8160801b9050919050565b5f6122348261221e565b9050919050565b61224c61224782611a55565b61222a565b82525050565b5f61225d828561223b565b60108201915061226d828461223b565b6010820191508190509392505050565b5f612288828461223b565b60108201915081905092915050565b5f6122a182612098565b91506122ac83612098565b9250828201905061ffff8111156122c6576122c5611d39565b5b92915050565b5f81905092915050565b5f6122e082611da8565b6122ea81856122cc565b93506122fa818560208601611dc2565b80840191505092915050565b5f60ff82169050919050565b5f8160f81b9050919050565b5f61232882612312565b9050919050565b61234061233b82612306565b61231e565b82525050565b5f61235182886122d6565b915061235d828761232f565b60018201915061236d82866120c2565b60028201915061237d828561232f565b60018201915061238d82846122d6565b91508190509695505050505050565b5f6060820190506123af5f830186611a2d565b6123bc6020830185611a2d565b6123c9604083018461193c565b949350505050565b5f819050919050565b5f6123f46123ef6123ea846123d1565b6119b9565b612306565b9050919050565b612404816123da565b82525050565b5f60408201905061241d5f8301856123fb565b61242a602083018461193c565b939250505056fea2646970667358221220c199f933b43749b8c30c8c9f8fed618e992ae8a5e2b6f7e46f59abaa98fd9ed564736f6c634300081e0033", - "sourceMap": "764:3779:50:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1358:141:4;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1724:108:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1845:129:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2093:317;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2883:953;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;446:46:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2293:101:37;;;;;;;;;;;;;:::i;:::-;;1638:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2416:319:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1604:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;569:48:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3252:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;949:35:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2741:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2543:215:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;990:32:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1358:141:4;1410:20;1432:22;843:1;1490;1466:26;;;;1358:141;;:::o;1724:108:2:-;1531:13:37;:11;:13::i;:::-;1804:21:2::1;1813:4;1819:5;1804:8;:21::i;:::-;1724:108:::0;;:::o;1845:129:50:-;1905:7;1931:13;;;;;;;;;;;:30;;;1962:4;1931:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1924:43;;1845:129;;;:::o;2093:317::-;2139:23;;:::i;:::-;2177:13;2194:21;:19;:21::i;:::-;2174:41;;;2226:20;2268:1;2272:5;2279:12;:10;:12::i;:::-;2249:43;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2226:66;;2302:20;2325;:18;:20::i;:::-;2302:43;;2363:40;2370:7;2379;2388;2397:5;2363:6;:40::i;:::-;2356:47;;;;;2093:317;:::o;2883:953::-;2500:21:44;:19;:21::i;:::-;2989:1:50::1;2968:23;;:9;:23;;::::0;2960:49:::1;;;;;;;;;;;;;;;;;3021:15;3038:13;3055:21;:19;:21::i;:::-;3020:56;;;;3086:13;;;;;;;;;;;:30;;;3117:12;:10;:12::i;:::-;3131:7;3086:53;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3150:20;3184:9;3195:5;3202:12;:10;:12::i;:::-;3173:42;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3150:65;;3306:20;3329;:18;:20::i;:::-;3306:43;;3359:23;3385:61;3392:7;3401;3410;3419:5;3385:6;:61::i;:::-;3359:87;;3477:3;:13;;;3464:9;:26;;3456:60;;;;;;;;;;;;;;;;;3526:31;3560:198;3581:7;3602;3623;3644:3;3669:12;:10;:12::i;:::-;3560:7;:198::i;:::-;3526:232;;3807:12;:10;:12::i;:::-;3773:56;;3789:9;3773:56;;;3800:5;3821:7;3773:56;;;;;;;:::i;:::-;;;;;;;;2950:886;;;;;;2542:20:44::0;:18;:20::i;:::-;2883:953:50;:::o;446:46:2:-;;;:::o;2293:101:37:-;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;:::-;2293:101::o:0;1638:85::-;1684:7;1710:6;;;;;;;;;;;1703:13;;1638:85;:::o;2416:319:50:-;1531:13:37;:11;:13::i;:::-;2529:1:50::1;2503:28;;:14;:28;;::::0;2495:61:::1;;;;;;;;;;;;;;;;;2566:18;2595:13;;;;;;;;;;;2566:43;;2650:14;2619:13;;:46;;;;;;;;;;;;;;;;;;2713:14;2680:48;;2701:10;2680:48;;;;;;;;;;;;2485:250;2416:319:::0;:::o;1604:235::-;1531:13:37;:11;:13::i;:::-;1693:1:50::1;1681:9;:13;;;1673:41;;;;;;;;;;;;;;;;;1724:16;1743:8;;;;;;;;;;;1724:27;;1772:9;1761:8;;:20;;;;;;;;;;;;;;;;;;1796:36;1812:8;1822:9;1796:36;;;;;;;:::i;:::-;;;;;;;;1663:176;1604:235:::0;:::o;569:48:2:-;;;;;;;;;;;;;;;;;:::o;3252:105::-;1531:13:37;:11;:13::i;:::-;3319:8:2::1;:20;;;3340:9;3319:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3252:105:::0;:::o;949:35:50:-;;;;;;;;;;;;;:::o;2741:136::-;1531:13:37;:11;:13::i;:::-;2822::50::1;;;;;;;;;;;:38;;;2861:8;2822:48;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2741:136:::0;:::o;2543:215:37:-;1531:13;:11;:13::i;:::-;2647:1:::1;2627:22;;:8;:22;;::::0;2623:91:::1;;2700:1;2672:31;;;;;;;;;;;:::i;:::-;;;;;;;;2623:91;2723:28;2742:8;2723:18;:28::i;:::-;2543:215:::0;:::o;990:32:50:-;;;;;;;;;;;;;:::o;1796:162:37:-;1866:12;:10;:12::i;:::-;1855:23;;:7;:5;:7::i;:::-;:23;;;1851:101;;1928:12;:10;:12::i;:::-;1901:40;;;;;;;;;;;:::i;:::-;;;;;;;;1851:101;1796:162::o;2286:134:2:-;2373:5;2359;:11;2365:4;2359:11;;;;;;;;;;;;;;;:19;;;;2393:20;2401:4;2407:5;2393:20;;;;;;;:::i;:::-;;;;;;;;2286:134;;:::o;3842:340:50:-;3895:15;3912:13;3947:5;:15;;;3963:12;:10;:12::i;:::-;3947:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3937:39;;3986:12;4001:13;;;;;;;;;;;:30;;;4032:12;:10;:12::i;:::-;4001:44;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3986:59;;4073:4;4063:7;:14;4055:49;;;;;;;;;;;;;;;;;4132:4;4122:7;:14;;;;:::i;:::-;4114:22;;4162:1;4154:5;:9;4146:29;;;;;;;;;;;;;;;;;3927:255;3842:340;;:::o;656:96:43:-;709:7;735:10;728:17;;656:96;:::o;4368:173:50:-;4420:12;4451:83;4493:27;:25;:27::i;:::-;4522:8;;;;;;;;;;;4532:1;4451:41;:83::i;:::-;4444:90;;4368:173;:::o;2038:391:4:-;2205:23;;:::i;:::-;2259:8;:14;;;2291:86;;;;;;;;2307:7;2291:86;;;;;;2316:25;2333:7;2316:16;:25::i;:::-;2291:86;;;;2343:8;2291:86;;;;2353:8;2291:86;;;;2363:13;2291:86;;;;;2403:4;2259:163;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2240:182;;2038:391;;;;;;:::o;2575:307:44:-;1899:1;2702:7;;:18;2698:86;;2743:30;;;;;;;;;;;;;;2698:86;1899:1;2858:7;:17;;;;2575:307::o;3188:766:4:-;3389:31;;:::i;:::-;3554:20;3577:26;3588:4;:14;;;3577:10;:26::i;:::-;3554:49;;3635:1;3617:4;:15;;;:19;3613:53;;;3638:28;3650:4;:15;;;3638:11;:28::i;:::-;3613:53;3755:8;:13;;;3777:12;3809:92;;;;;;;;3825:7;3809:92;;;;;;3834:25;3851:7;3834:16;:25::i;:::-;3809:92;;;;3861:8;3809:92;;;;3871:8;3809:92;;;;3899:1;3881:4;:15;;;:19;3809:92;;;;;3919:14;3755:192;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3677:270;;;3188:766;;;;;;;:::o;2888:208:44:-;1857:1;3068:7;:21;;;;2888:208::o;2912:187:37:-;2985:16;3004:6;;;;;;;;;;;2985:25;;3029:8;3020:6;;:17;;;;;;;;;;;;;;;;;;3083:8;3052:40;;3073:8;3052:40;;;;;;;;;;;;2975:124;2912:187;:::o;1303:107:7:-;1348:12;817:1;1379:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;1372:31;;1303:107;:::o;2101:357::-;2263:12;2244:8;817:1;1068:30;;:20;1086:1;1068:8;:17;;:20;;;;:::i;:::-;:30;;;1064:82;;1125:20;1143:1;1125:8;:17;;:20;;;;:::i;:::-;1107:39;;;;;;;;;;;:::i;:::-;;;;;;;;1064:82;2287:19:::1;2309:51;2347:4;2353:6;2309:37;:51::i;:::-;2287:73;;2377:74;2395:8;294:1:16;2444:6:7;2377:17;:74::i;:::-;2370:81;;;2101:357:::0;;;;;;:::o;2718:196:2:-;2788:7;2807:12;2822:5;:11;2828:4;2822:11;;;;;;;;;;;;;;;;2807:26;;2863:1;2855:10;;2847:4;:18;2843:43;;2881:4;2874:12;;;;;;;;;;;:::i;:::-;;;;;;;;2843:43;2903:4;2896:11;;;2718:196;;;:::o;4650:191:4:-;4716:17;4762:10;4749:9;:23;4745:62;;4797:9;4781:26;;;;;;;;;;;:::i;:::-;;;;;;;;4745:62;4824:10;4817:17;;4650:191;;;:::o;5218:410::-;5371:15;5389:8;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5371:36;;5440:1;5421:21;;:7;:21;;;5417:54;;5451:20;;;;;;;;;;;;;;5417:54;5545:76;5578:10;5598:8;5609:11;5552:7;5545:32;;;;:76;;;;;;:::i;:::-;5277:351;5218:410;:::o;13100:305:47:-;13178:6;13230:1;13221:6;:10;;;;:::i;:::-;13204:6;:13;:27;;13196:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;13266:15;13355:6;13349:3;13341:6;13337:16;13333:29;13327:36;13315:48;;13390:8;13383:15;;;13100:305;;;;:::o;2968:191:16:-;3052:12;3093:1;3083:6;:11;;;:69;;3139:4;3145:6;3122:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3083:69;;;3114:4;3097:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;3083:69;3076:76;;2968:191;;;;:::o;5725:435:7:-;5889:12;5870:8;817:1;1068:30;;:20;1086:1;1068:8;:17;;:20;;;;:::i;:::-;:30;;;1064:82;;1125:20;1143:1;1125:8;:17;;:20;;;;:::i;:::-;1107:39;;;;;;;;;;;:::i;:::-;;;;;;;;1064:82;5966:8:::1;238:1:16;6063::7::0;6035:25:::1;:7;:14;:23;:25::i;:::-;:29;;;;:::i;:::-;6103:11;6132:7;5932:221;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5913:240;;5725:435:::0;;;;;;:::o;1618:188:42:-;1718:81;1738:5;1760;:18;;;1781:4;1787:2;1791:5;1745:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1718:19;:81::i;:::-;1618:188;;;;:::o;16296:213:46:-;16352:6;16382:16;16374:24;;:5;:24;16370:103;;;16452:2;16456:5;16421:41;;;;;;;;;;;;:::i;:::-;;;;;;;;16370:103;16496:5;16482:20;;16296:213;;;:::o;8370:720:42:-;8450:18;8478:19;8616:4;8613:1;8606:4;8600:11;8593:4;8587;8583:15;8580:1;8573:5;8566;8561:60;8673:7;8663:176;;8717:4;8711:11;8762:16;8759:1;8754:3;8739:40;8808:16;8803:3;8796:29;8663:176;8866:16;8852:30;;8916:1;8910:8;8895:23;;8532:396;8956:1;8942:10;:15;:68;;9009:1;8994:11;:16;;8942:68;;;8990:1;8968:5;8960:26;;;:31;8942:68;8938:146;;;9066:5;9033:40;;;;;;;;;;;:::i;:::-;;;;;;;;8938:146;8440:650;;8370:720;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;7:101:59:-;43:7;83:18;76:5;72:30;61:41;;7:101;;;:::o;114:115::-;199:23;216:5;199:23;:::i;:::-;194:3;187:36;114:115;;:::o;235:324::-;352:4;390:2;379:9;375:18;367:26;;403:69;469:1;458:9;454:17;445:6;403:69;:::i;:::-;482:70;548:2;537:9;533:18;524:6;482:70;:::i;:::-;235:324;;;;;:::o;565:75::-;598:6;631:2;625:9;615:19;;565:75;:::o;646:117::-;755:1;752;745:12;892:93;928:7;968:10;961:5;957:22;946:33;;892:93;;;:::o;991:120::-;1063:23;1080:5;1063:23;:::i;:::-;1056:5;1053:34;1043:62;;1101:1;1098;1091:12;1043:62;991:120;:::o;1117:137::-;1162:5;1200:6;1187:20;1178:29;;1216:32;1242:5;1216:32;:::i;:::-;1117:137;;;;:::o;1260:77::-;1297:7;1326:5;1315:16;;1260:77;;;:::o;1343:122::-;1416:24;1434:5;1416:24;:::i;:::-;1409:5;1406:35;1396:63;;1455:1;1452;1445:12;1396:63;1343:122;:::o;1471:139::-;1517:5;1555:6;1542:20;1533:29;;1571:33;1598:5;1571:33;:::i;:::-;1471:139;;;;:::o;1616:472::-;1683:6;1691;1740:2;1728:9;1719:7;1715:23;1711:32;1708:119;;;1746:79;;:::i;:::-;1708:119;1866:1;1891:52;1935:7;1926:6;1915:9;1911:22;1891:52;:::i;:::-;1881:62;;1837:116;1992:2;2018:53;2063:7;2054:6;2043:9;2039:22;2018:53;:::i;:::-;2008:63;;1963:118;1616:472;;;;;:::o;2094:126::-;2131:7;2171:42;2164:5;2160:54;2149:65;;2094:126;;;:::o;2226:96::-;2263:7;2292:24;2310:5;2292:24;:::i;:::-;2281:35;;2226:96;;;:::o;2328:122::-;2401:24;2419:5;2401:24;:::i;:::-;2394:5;2391:35;2381:63;;2440:1;2437;2430:12;2381:63;2328:122;:::o;2456:139::-;2502:5;2540:6;2527:20;2518:29;;2556:33;2583:5;2556:33;:::i;:::-;2456:139;;;;:::o;2601:329::-;2660:6;2709:2;2697:9;2688:7;2684:23;2680:32;2677:119;;;2715:79;;:::i;:::-;2677:119;2835:1;2860:53;2905:7;2896:6;2885:9;2881:22;2860:53;:::i;:::-;2850:63;;2806:117;2601:329;;;;:::o;2936:77::-;2973:7;3002:5;2991:16;;2936:77;;;:::o;3019:118::-;3106:24;3124:5;3106:24;:::i;:::-;3101:3;3094:37;3019:118;;:::o;3143:222::-;3236:4;3274:2;3263:9;3259:18;3251:26;;3287:71;3355:1;3344:9;3340:17;3331:6;3287:71;:::i;:::-;3143:222;;;;:::o;3371:108::-;3448:24;3466:5;3448:24;:::i;:::-;3443:3;3436:37;3371:108;;:::o;3535:528::-;3692:4;3687:3;3683:14;3784:4;3777:5;3773:16;3767:23;3803:63;3860:4;3855:3;3851:14;3837:12;3803:63;:::i;:::-;3707:169;3964:4;3957:5;3953:16;3947:23;3983:63;4040:4;4035:3;4031:14;4017:12;3983:63;:::i;:::-;3886:170;3661:402;3535:528;;:::o;4069:342::-;4222:4;4260:2;4249:9;4245:18;4237:26;;4273:131;4401:1;4390:9;4386:17;4377:6;4273:131;:::i;:::-;4069:342;;;;:::o;4417:60::-;4445:3;4466:5;4459:12;;4417:60;;;:::o;4483:142::-;4533:9;4566:53;4584:34;4593:24;4611:5;4593:24;:::i;:::-;4584:34;:::i;:::-;4566:53;:::i;:::-;4553:66;;4483:142;;;:::o;4631:126::-;4681:9;4714:37;4745:5;4714:37;:::i;:::-;4701:50;;4631:126;;;:::o;4763:155::-;4842:9;4875:37;4906:5;4875:37;:::i;:::-;4862:50;;4763:155;;;:::o;4924:189::-;5040:66;5100:5;5040:66;:::i;:::-;5035:3;5028:79;4924:189;;:::o;5119:280::-;5241:4;5279:2;5268:9;5264:18;5256:26;;5292:100;5389:1;5378:9;5374:17;5365:6;5292:100;:::i;:::-;5119:280;;;;:::o;5405:118::-;5492:24;5510:5;5492:24;:::i;:::-;5487:3;5480:37;5405:118;;:::o;5529:222::-;5622:4;5660:2;5649:9;5645:18;5637:26;;5673:71;5741:1;5730:9;5726:17;5717:6;5673:71;:::i;:::-;5529:222;;;;:::o;5757:118::-;5794:7;5834:34;5827:5;5823:46;5812:57;;5757:118;;;:::o;5881:122::-;5954:24;5972:5;5954:24;:::i;:::-;5947:5;5944:35;5934:63;;5993:1;5990;5983:12;5934:63;5881:122;:::o;6009:139::-;6055:5;6093:6;6080:20;6071:29;;6109:33;6136:5;6109:33;:::i;:::-;6009:139;;;;:::o;6154:329::-;6213:6;6262:2;6250:9;6241:7;6237:23;6233:32;6230:119;;;6268:79;;:::i;:::-;6230:119;6388:1;6413:53;6458:7;6449:6;6438:9;6434:22;6413:53;:::i;:::-;6403:63;;6359:117;6154:329;;;;:::o;6489:327::-;6547:6;6596:2;6584:9;6575:7;6571:23;6567:32;6564:119;;;6602:79;;:::i;:::-;6564:119;6722:1;6747:52;6791:7;6782:6;6771:9;6767:22;6747:52;:::i;:::-;6737:62;;6693:116;6489:327;;;;:::o;6822:118::-;6909:24;6927:5;6909:24;:::i;:::-;6904:3;6897:37;6822:118;;:::o;6946:222::-;7039:4;7077:2;7066:9;7062:18;7054:26;;7090:71;7158:1;7147:9;7143:17;7134:6;7090:71;:::i;:::-;6946:222;;;;:::o;7174:150::-;7248:9;7281:37;7312:5;7281:37;:::i;:::-;7268:50;;7174:150;;;:::o;7330:179::-;7441:61;7496:5;7441:61;:::i;:::-;7436:3;7429:74;7330:179;;:::o;7515:270::-;7632:4;7670:2;7659:9;7655:18;7647:26;;7683:95;7775:1;7764:9;7760:17;7751:6;7683:95;:::i;:::-;7515:270;;;;:::o;7791:118::-;7878:24;7896:5;7878:24;:::i;:::-;7873:3;7866:37;7791:118;;:::o;7915:222::-;8008:4;8046:2;8035:9;8031:18;8023:26;;8059:71;8127:1;8116:9;8112:17;8103:6;8059:71;:::i;:::-;7915:222;;;;:::o;8143:122::-;8216:24;8234:5;8216:24;:::i;:::-;8209:5;8206:35;8196:63;;8255:1;8252;8245:12;8196:63;8143:122;:::o;8271:143::-;8328:5;8359:6;8353:13;8344:22;;8375:33;8402:5;8375:33;:::i;:::-;8271:143;;;;:::o;8420:351::-;8490:6;8539:2;8527:9;8518:7;8514:23;8510:32;8507:119;;;8545:79;;:::i;:::-;8507:119;8665:1;8690:64;8746:7;8737:6;8726:9;8722:22;8690:64;:::i;:::-;8680:74;;8636:128;8420:351;;;;:::o;8777:442::-;8926:4;8964:2;8953:9;8949:18;8941:26;;8977:71;9045:1;9034:9;9030:17;9021:6;8977:71;:::i;:::-;9058:72;9126:2;9115:9;9111:18;9102:6;9058:72;:::i;:::-;9140;9208:2;9197:9;9193:18;9184:6;9140:72;:::i;:::-;8777:442;;;;;;:::o;9225:332::-;9346:4;9384:2;9373:9;9369:18;9361:26;;9397:71;9465:1;9454:9;9450:17;9441:6;9397:71;:::i;:::-;9478:72;9546:2;9535:9;9531:18;9522:6;9478:72;:::i;:::-;9225:332;;;;;:::o;9563:108::-;9640:24;9658:5;9640:24;:::i;:::-;9635:3;9628:37;9563:108;;:::o;9677:105::-;9752:23;9769:5;9752:23;:::i;:::-;9747:3;9740:36;9677:105;;:::o;9838:518::-;9985:4;9980:3;9976:14;10077:4;10070:5;10066:16;10060:23;10096:63;10153:4;10148:3;10144:14;10130:12;10096:63;:::i;:::-;10000:169;10257:4;10250:5;10246:16;10240:23;10276:63;10333:4;10328:3;10324:14;10310:12;10276:63;:::i;:::-;10179:170;9954:402;9838:518;;:::o;10420:757::-;10585:4;10580:3;10576:14;10672:4;10665:5;10661:16;10655:23;10691:63;10748:4;10743:3;10739:14;10725:12;10691:63;:::i;:::-;10600:164;10847:4;10840:5;10836:16;10830:23;10866:61;10921:4;10916:3;10912:14;10898:12;10866:61;:::i;:::-;10774:163;11018:4;11011:5;11007:16;11001:23;11037:123;11154:4;11149:3;11145:14;11131:12;11037:123;:::i;:::-;10947:223;10554:623;10420:757;;:::o;11183:469::-;11372:4;11410:3;11399:9;11395:19;11387:27;;11424:71;11492:1;11481:9;11477:17;11468:6;11424:71;:::i;:::-;11505:140;11641:2;11630:9;11626:18;11617:6;11505:140;:::i;:::-;11183:469;;;;;:::o;11658:332::-;11779:4;11817:2;11806:9;11802:18;11794:26;;11830:71;11898:1;11887:9;11883:17;11874:6;11830:71;:::i;:::-;11911:72;11979:2;11968:9;11964:18;11955:6;11911:72;:::i;:::-;11658:332;;;;;:::o;11996:115::-;12081:23;12098:5;12081:23;:::i;:::-;12076:3;12069:36;11996:115;;:::o;12117:328::-;12236:4;12274:2;12263:9;12259:18;12251:26;;12287:69;12353:1;12342:9;12338:17;12329:6;12287:69;:::i;:::-;12366:72;12434:2;12423:9;12419:18;12410:6;12366:72;:::i;:::-;12117:328;;;;;:::o;12451:180::-;12499:77;12496:1;12489:88;12596:4;12593:1;12586:15;12620:4;12617:1;12610:15;12637:194;12677:4;12697:20;12715:1;12697:20;:::i;:::-;12692:25;;12731:20;12749:1;12731:20;:::i;:::-;12726:25;;12775:1;12772;12768:9;12760:17;;12799:1;12793:4;12790:11;12787:37;;;12804:18;;:::i;:::-;12787:37;12637:194;;;;:::o;12837:105::-;12912:23;12929:5;12912:23;:::i;:::-;12907:3;12900:36;12837:105;;:::o;12948:98::-;12999:6;13033:5;13027:12;13017:22;;12948:98;;;:::o;13052:158::-;13125:11;13159:6;13154:3;13147:19;13199:4;13194:3;13190:14;13175:29;;13052:158;;;;:::o;13216:139::-;13305:6;13300:3;13295;13289:23;13346:1;13337:6;13332:3;13328:16;13321:27;13216:139;;;:::o;13361:102::-;13402:6;13453:2;13449:7;13444:2;13437:5;13433:14;13429:28;13419:38;;13361:102;;;:::o;13469:353::-;13545:3;13573:38;13605:5;13573:38;:::i;:::-;13627:60;13680:6;13675:3;13627:60;:::i;:::-;13620:67;;13696:65;13754:6;13749:3;13742:4;13735:5;13731:16;13696:65;:::i;:::-;13786:29;13808:6;13786:29;:::i;:::-;13781:3;13777:39;13770:46;;13549:273;13469:353;;;;:::o;13828:90::-;13862:7;13905:5;13898:13;13891:21;13880:32;;13828:90;;;:::o;13924:99::-;13995:21;14010:5;13995:21;:::i;:::-;13990:3;13983:34;13924:99;;:::o;14085:1223::-;14220:3;14256:4;14251:3;14247:14;14345:4;14338:5;14334:16;14328:23;14364:61;14419:4;14414:3;14410:14;14396:12;14364:61;:::i;:::-;14271:164;14521:4;14514:5;14510:16;14504:23;14540:63;14597:4;14592:3;14588:14;14574:12;14540:63;:::i;:::-;14445:168;14698:4;14691:5;14687:16;14681:23;14751:3;14745:4;14741:14;14734:4;14729:3;14725:14;14718:38;14777:71;14843:4;14829:12;14777:71;:::i;:::-;14769:79;;14623:236;14944:4;14937:5;14933:16;14927:23;14997:3;14991:4;14987:14;14980:4;14975:3;14971:14;14964:38;15023:71;15089:4;15075:12;15023:71;:::i;:::-;15015:79;;14869:236;15195:4;15188:5;15184:16;15178:23;15214:57;15265:4;15260:3;15256:14;15242:12;15214:57;:::i;:::-;15115:166;15298:4;15291:11;;14225:1083;14085:1223;;;;:::o;15314:515::-;15501:4;15539:2;15528:9;15524:18;15516:26;;15588:9;15582:4;15578:20;15574:1;15563:9;15559:17;15552:47;15616:124;15735:4;15726:6;15616:124;:::i;:::-;15608:132;;15750:72;15818:2;15807:9;15803:18;15794:6;15750:72;:::i;:::-;15314:515;;;;;:::o;15835:117::-;15944:1;15941;15934:12;15958:180;16006:77;16003:1;15996:88;16103:4;16100:1;16093:15;16127:4;16124:1;16117:15;16144:281;16227:27;16249:4;16227:27;:::i;:::-;16219:6;16215:40;16357:6;16345:10;16342:22;16321:18;16309:10;16306:34;16303:62;16300:88;;;16368:18;;:::i;:::-;16300:88;16408:10;16404:2;16397:22;16187:238;16144:281;;:::o;16431:129::-;16465:6;16492:20;;:::i;:::-;16482:30;;16521:33;16549:4;16541:6;16521:33;:::i;:::-;16431:129;;;:::o;16716:623::-;16806:5;16850:4;16838:9;16833:3;16829:19;16825:30;16822:117;;;16858:79;;:::i;:::-;16822:117;16957:21;16973:4;16957:21;:::i;:::-;16948:30;;17042:1;17082:60;17138:3;17129:6;17118:9;17114:22;17082:60;:::i;:::-;17075:4;17068:5;17064:16;17057:86;16988:166;17219:2;17260:60;17316:3;17307:6;17296:9;17292:22;17260:60;:::i;:::-;17253:4;17246:5;17242:16;17235:86;17164:168;16716:623;;;;:::o;17345:411::-;17445:6;17494:2;17482:9;17473:7;17469:23;17465:32;17462:119;;;17500:79;;:::i;:::-;17462:119;17620:1;17645:94;17731:7;17722:6;17711:9;17707:22;17645:94;:::i;:::-;17635:104;;17591:158;17345:411;;;;:::o;17762:143::-;17819:5;17850:6;17844:13;17835:22;;17866:33;17893:5;17866:33;:::i;:::-;17762:143;;;;:::o;17911:120::-;17983:23;18000:5;17983:23;:::i;:::-;17976:5;17973:34;17963:62;;18021:1;18018;18011:12;17963:62;17911:120;:::o;18037:141::-;18093:5;18124:6;18118:13;18109:22;;18140:32;18166:5;18140:32;:::i;:::-;18037:141;;;;:::o;18215:817::-;18309:5;18353:4;18341:9;18336:3;18332:19;18328:30;18325:117;;;18361:79;;:::i;:::-;18325:117;18460:21;18476:4;18460:21;:::i;:::-;18451:30;;18540:1;18580:60;18636:3;18627:6;18616:9;18612:22;18580:60;:::i;:::-;18573:4;18566:5;18562:16;18555:86;18491:161;18712:2;18753:59;18808:3;18799:6;18788:9;18784:22;18753:59;:::i;:::-;18746:4;18739:5;18735:16;18728:85;18662:162;18882:2;18923:90;19009:3;19000:6;18989:9;18985:22;18923:90;:::i;:::-;18916:4;18909:5;18905:16;18898:116;18834:191;18215:817;;;;:::o;19038:420::-;19142:6;19191:3;19179:9;19170:7;19166:23;19162:33;19159:120;;;19198:79;;:::i;:::-;19159:120;19318:1;19343:98;19433:7;19424:6;19413:9;19409:22;19343:98;:::i;:::-;19333:108;;19289:162;19038:420;;;;:::o;19464:89::-;19500:7;19540:6;19533:5;19529:18;19518:29;;19464:89;;;:::o;19559:96::-;19593:8;19642:5;19637:3;19633:15;19612:36;;19559:96;;;:::o;19661:94::-;19699:7;19728:21;19743:5;19728:21;:::i;:::-;19717:32;;19661:94;;;:::o;19761:153::-;19864:43;19883:23;19900:5;19883:23;:::i;:::-;19864:43;:::i;:::-;19859:3;19852:56;19761:153;;:::o;19920:251::-;20030:3;20045:73;20114:3;20105:6;20045:73;:::i;:::-;20143:1;20138:3;20134:11;20127:18;;20162:3;20155:10;;19920:251;;;;:::o;20177:115::-;20262:23;20279:5;20262:23;:::i;:::-;20257:3;20250:36;20177:115;;:::o;20298:218::-;20389:4;20427:2;20416:9;20412:18;20404:26;;20440:69;20506:1;20495:9;20491:17;20482:6;20440:69;:::i;:::-;20298:218;;;;:::o;20522:::-;20613:4;20651:2;20640:9;20636:18;20628:26;;20664:69;20730:1;20719:9;20715:17;20706:6;20664:69;:::i;:::-;20522:218;;;;:::o;20746:143::-;20803:5;20834:6;20828:13;20819:22;;20850:33;20877:5;20850:33;:::i;:::-;20746:143;;;;:::o;20895:351::-;20965:6;21014:2;21002:9;20993:7;20989:23;20985:32;20982:119;;;21020:79;;:::i;:::-;20982:119;21140:1;21165:64;21221:7;21212:6;21201:9;21197:22;21165:64;:::i;:::-;21155:74;;21111:128;20895:351;;;;:::o;21252:191::-;21292:3;21311:20;21329:1;21311:20;:::i;:::-;21306:25;;21345:20;21363:1;21345:20;:::i;:::-;21340:25;;21388:1;21385;21381:9;21374:16;;21409:3;21406:1;21403:10;21400:36;;;21416:18;;:::i;:::-;21400:36;21252:191;;;;:::o;21449:169::-;21533:11;21567:6;21562:3;21555:19;21607:4;21602:3;21598:14;21583:29;;21449:169;;;;:::o;21624:170::-;21764:22;21760:1;21752:6;21748:14;21741:46;21624:170;:::o;21800:366::-;21942:3;21963:67;22027:2;22022:3;21963:67;:::i;:::-;21956:74;;22039:93;22128:3;22039:93;:::i;:::-;22157:2;22152:3;22148:12;22141:19;;21800:366;;;:::o;22172:419::-;22338:4;22376:2;22365:9;22361:18;22353:26;;22425:9;22419:4;22415:20;22411:1;22400:9;22396:17;22389:47;22453:131;22579:4;22453:131;:::i;:::-;22445:139;;22172:419;;;:::o;22597:96::-;22631:8;22680:5;22675:3;22671:15;22650:36;;22597:96;;;:::o;22699:95::-;22738:7;22767:21;22782:5;22767:21;:::i;:::-;22756:32;;22699:95;;;:::o;22800:157::-;22905:45;22925:24;22943:5;22925:24;:::i;:::-;22905:45;:::i;:::-;22900:3;22893:58;22800:157;;:::o;22963:397::-;23103:3;23118:75;23189:3;23180:6;23118:75;:::i;:::-;23218:2;23213:3;23209:12;23202:19;;23231:75;23302:3;23293:6;23231:75;:::i;:::-;23331:2;23326:3;23322:12;23315:19;;23351:3;23344:10;;22963:397;;;;;:::o;23366:256::-;23478:3;23493:75;23564:3;23555:6;23493:75;:::i;:::-;23593:2;23588:3;23584:12;23577:19;;23613:3;23606:10;;23366:256;;;;:::o;23628:193::-;23667:3;23686:19;23703:1;23686:19;:::i;:::-;23681:24;;23719:19;23736:1;23719:19;:::i;:::-;23714:24;;23761:1;23758;23754:9;23747:16;;23784:6;23779:3;23776:15;23773:41;;;23794:18;;:::i;:::-;23773:41;23628:193;;;;:::o;23827:147::-;23928:11;23965:3;23950:18;;23827:147;;;;:::o;23980:386::-;24084:3;24112:38;24144:5;24112:38;:::i;:::-;24166:88;24247:6;24242:3;24166:88;:::i;:::-;24159:95;;24263:65;24321:6;24316:3;24309:4;24302:5;24298:16;24263:65;:::i;:::-;24353:6;24348:3;24344:16;24337:23;;24088:278;23980:386;;;;:::o;24372:86::-;24407:7;24447:4;24440:5;24436:16;24425:27;;24372:86;;;:::o;24464:96::-;24498:8;24547:5;24542:3;24538:15;24517:36;;24464:96;;;:::o;24566:93::-;24603:7;24632:21;24647:5;24632:21;:::i;:::-;24621:32;;24566:93;;;:::o;24665:149::-;24766:41;24784:22;24800:5;24784:22;:::i;:::-;24766:41;:::i;:::-;24761:3;24754:54;24665:149;;:::o;24820:827::-;25070:3;25092:93;25181:3;25172:6;25092:93;:::i;:::-;25085:100;;25195:71;25262:3;25253:6;25195:71;:::i;:::-;25291:1;25286:3;25282:11;25275:18;;25303:73;25372:3;25363:6;25303:73;:::i;:::-;25401:1;25396:3;25392:11;25385:18;;25413:71;25480:3;25471:6;25413:71;:::i;:::-;25509:1;25504:3;25500:11;25493:18;;25528:93;25617:3;25608:6;25528:93;:::i;:::-;25521:100;;25638:3;25631:10;;24820:827;;;;;;;;:::o;25653:442::-;25802:4;25840:2;25829:9;25825:18;25817:26;;25853:71;25921:1;25910:9;25906:17;25897:6;25853:71;:::i;:::-;25934:72;26002:2;25991:9;25987:18;25978:6;25934:72;:::i;:::-;26016;26084:2;26073:9;26069:18;26060:6;26016:72;:::i;:::-;25653:442;;;;;;:::o;26101:86::-;26147:7;26176:5;26165:16;;26101:86;;;:::o;26193:156::-;26250:9;26283:60;26299:43;26308:33;26335:5;26308:33;:::i;:::-;26299:43;:::i;:::-;26283:60;:::i;:::-;26270:73;;26193:156;;;:::o;26355:145::-;26449:44;26487:5;26449:44;:::i;:::-;26444:3;26437:57;26355:145;;:::o;26506:346::-;26634:4;26672:2;26661:9;26657:18;26649:26;;26685:78;26760:1;26749:9;26745:17;26736:6;26685:78;:::i;:::-;26773:72;26841:2;26830:9;26826:18;26817:6;26773:72;:::i;:::-;26506:346;;;;;:::o", - "linkReferences": {}, - "immutableReferences": { - "45956": [{ "start": 3228, "length": 32 }], - "45958": [ - { "start": 1188, "length": 32 }, - { "start": 1565, "length": 32 }, - { "start": 1673, "length": 32 } - ], - "535": [ - { "start": 1851, "length": 32 }, - { "start": 2511, "length": 32 }, - { "start": 3754, "length": 32 }, - { "start": 4088, "length": 32 }, - { "start": 4903, "length": 32 }, - { "start": 5151, "length": 32 } - ] - } - }, - "methodIdentifiers": { - "bridgeStorage()": "d3d82578", - "bridgeTo(address)": "5c6d3da4", - "bridgedAmount(address)": "348f0209", - "endpoint()": "5e280f11", - "gasLimit()": "f68016b7", - "oAppVersion()": "17442b70", - "owner()": "8da5cb5b", - "peers(uint32)": "bb0b6a53", - "quoteBridge()": "472fa443", - "renounceOwnership()": "715018a6", - "setBridgeStorage(address)": "9a9f2e06", - "setDelegate(address)": "ca5eb5e1", - "setGasLimit(uint128)": "a1da9dae", - "setPeer(uint32,bytes32)": "3400288b", - "transferOwnership(address)": "f2fde38b", - "transferStorageOwnership(address)": "ee0b5445" - }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_endpoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_delegate\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_dstEid\",\"type\":\"uint32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BalanceLessThanBridged\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientNativeFee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidBridgeStorage\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDelegate\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidEndpointCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidGasLimit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"optionType\",\"type\":\"uint16\"}],\"name\":\"InvalidOptionType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LzTokenUnavailable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoDelta\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"}],\"name\":\"NoPeer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"msgValue\",\"type\":\"uint256\"}],\"name\":\"NotEnoughNative\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"}],\"name\":\"OnlyPeer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"bits\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"SafeCastOverflowedUintDowncast\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"guid\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nativeFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lzTokenFee\",\"type\":\"uint256\"}],\"internalType\":\"struct MessagingFee\",\"name\":\"fee\",\"type\":\"tuple\"}],\"indexed\":false,\"internalType\":\"struct MessagingReceipt\",\"name\":\"receipt\",\"type\":\"tuple\"}],\"name\":\"BridgeRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldStorage\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newStorage\",\"type\":\"address\"}],\"name\":\"BridgeStorageUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"oldLimit\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"newLimit\",\"type\":\"uint128\"}],\"name\":\"GasLimitUpdated\",\"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\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"peer\",\"type\":\"bytes32\"}],\"name\":\"PeerSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"bridgeStorage\",\"outputs\":[{\"internalType\":\"contract IBridgeStorage\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"bridgeTo\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"bridgedAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"endpoint\",\"outputs\":[{\"internalType\":\"contract ILayerZeroEndpointV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasLimit\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oAppVersion\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"senderVersion\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"receiverVersion\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"}],\"name\":\"peers\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"peer\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"quoteBridge\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"nativeFee\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"lzTokenFee\",\"type\":\"uint256\"}],\"internalType\":\"struct MessagingFee\",\"name\":\"fee\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_bridgeStorage\",\"type\":\"address\"}],\"name\":\"setBridgeStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegate\",\"type\":\"address\"}],\"name\":\"setDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint128\",\"name\":\"_gasLimit\",\"type\":\"uint128\"}],\"name\":\"setGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_eid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"_peer\",\"type\":\"bytes32\"}],\"name\":\"setPeer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferStorageOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"BalanceLessThanBridged()\":[{\"details\":\"Thrown when current balance is less than previously bridged amount\"}],\"InsufficientNativeFee()\":[{\"details\":\"Thrown when insufficient native fee is provided for bridging\"}],\"InvalidBridgeStorage()\":[{\"details\":\"Thrown when an invalid bridge storage address is provided (e.g., zero address)\"}],\"InvalidGasLimit()\":[{\"details\":\"Thrown when an invalid gas limit is provided (e.g., zero or negative value)\"}],\"NoDelta()\":[{\"details\":\"Thrown when there's no delta between current and previous balance\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}],\"RecipientZero()\":[{\"details\":\"Thrown when recipient address is zero\"}],\"ReentrancyGuardReentrantCall()\":[{\"details\":\"Unauthorized reentrant call.\"}],\"SafeCastOverflowedUintDowncast(uint8,uint256)\":[{\"details\":\"Value doesn't fit in an uint of `bits` size.\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"BridgeRequested(address,uint256,address,(bytes32,uint64,(uint256,uint256)))\":{\"details\":\"Emitted when a bridge request is initiated\",\"params\":{\"amount\":\"The amount of tokens being bridged\",\"receipt\":\"The LayerZero messaging receipt containing guid and nonce\",\"recipient\":\"The recipient address on destination chain\",\"user\":\"The user initiating the bridge\"}},\"BridgeStorageUpdated(address,address)\":{\"details\":\"Emitted when the bridge storage contract is updated\",\"params\":{\"newStorage\":\"The new bridge storage contract address\",\"oldStorage\":\"The previous bridge storage contract address\"}},\"GasLimitUpdated(uint128,uint128)\":{\"details\":\"Emitted when the gas limit for LayerZero execution is updated\",\"params\":{\"newLimit\":\"The new gas limit value\",\"oldLimit\":\"The previous gas limit value\"}}},\"kind\":\"dev\",\"methods\":{\"bridgeTo(address)\":{\"details\":\"Requires sufficient native fee to be sent with the transactionOnly bridges the delta between current balance and previously bridged amount\",\"params\":{\"recipient\":\"The recipient address on destination chain\"}},\"bridgedAmount(address)\":{\"params\":{\"user\":\"The user address to query\"},\"returns\":{\"_0\":\"The total amount of tokens bridged by the user\"}},\"oAppVersion()\":{\"details\":\"Providing 0 as the default for OAppReceiver version. Indicates that the OAppReceiver is not implemented. ie. this is a SEND only OApp.If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions\",\"returns\":{\"receiverVersion\":\"The version of the OAppReceiver.sol contract.\",\"senderVersion\":\"The version of the OAppSender.sol contract.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"quoteBridge()\":{\"returns\":{\"fee\":\"The estimated messaging fee\"}},\"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.\"},\"setDelegate(address)\":{\"details\":\"Only the owner/admin of the OApp can call this function.Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract.\",\"params\":{\"_delegate\":\"The address of the delegate to be set.\"}},\"setGasLimit(uint128)\":{\"details\":\"Only callable by contract ownerEmits GasLimitUpdated event\",\"params\":{\"_gasLimit\":\"The new gas limit value (must be greater than 0)\"}},\"setPeer(uint32,bytes32)\":{\"details\":\"Only the owner/admin of the OApp can call this function.Indicates that the peer is trusted to send LayerZero messages to this OApp.Set this to bytes32(0) to remove the peer address.Peer is a bytes32 to accommodate non-evm chains.\",\"params\":{\"_eid\":\"The endpoint ID.\",\"_peer\":\"The address of the peer to be associated with the corresponding endpoint.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"transferStorageOwnership(address)\":{\"details\":\"Only callable by contract ownerReverts if newOwner is the zero address\",\"params\":{\"newOwner\":\"The address of the new owner for BridgeStorage\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"bridgeTo(address)\":{\"notice\":\"Bridge tokens to a recipient on the destination chain\"},\"bridgedAmount(address)\":{\"notice\":\"Get the total amount of tokens bridged by a user\"},\"endpoint()\":{\"notice\":\"Retrieves the LayerZero endpoint associated with the OApp.\"},\"oAppVersion()\":{\"notice\":\"Retrieves the OApp version information.\"},\"peers(uint32)\":{\"notice\":\"Retrieves the peer (OApp) associated with a corresponding endpoint.\"},\"quoteBridge()\":{\"notice\":\"Get the estimated fee for bridging\"},\"setDelegate(address)\":{\"notice\":\"Sets the delegate address for the OApp.\"},\"setGasLimit(uint128)\":{\"notice\":\"Set the gas limit for LayerZero message execution on the destination chain\"},\"setPeer(uint32,bytes32)\":{\"notice\":\"Sets the peer address (OApp instance) for a corresponding endpoint.\"},\"transferStorageOwnership(address)\":{\"notice\":\"Transfer ownership of the BridgeStorage contract\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/BaseBridgeOApp.sol\":\"BaseBridgeOApp\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@layerzerolabs/lz-evm-messagelib-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/messagelib/\",\":@layerzerolabs/lz-evm-protocol-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/\",\":@layerzerolabs/oapp/=lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/\",\":@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":LayerZero-v2/=lib/LayerZero-v2/\",\":ds-test/=lib/solidity-bytes-utils/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":solidity-bytes-utils/=lib/solidity-bytes-utils/\"]},\"sources\":{\"lib/LayerZero-v2/packages/layerzero-v2/evm/messagelib/contracts/uln/libs/DVNOptions.sol\":{\"keccak256\":\"0x2beee03cdf59a9bc72e94d08b69cb2e908725f4ceabb48651494938100e21e35\",\"license\":\"LZBL-1.2\",\"urls\":[\"bzz-raw://d88e121a39e74309f3575417df2318e2d2ee8bc8314e68dbf78544a9c393b141\",\"dweb:/ipfs/QmRojBRAyENK21HnjevAWeoZZxtWkYZubB9Y78vCJPYeU6\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OApp.sol\":{\"keccak256\":\"0xac362c4c291fad2f1511a968424b2e78a5ad502d1c867bd31da04be742aca8c5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e1f8cf9f20a2b683a53c3883972aa0676af97a24c678f461fae08e1fb056df28\",\"dweb:/ipfs/QmPpKNqda3rgxDwnq3XiRTtT3NfWeqrCJT6LwmhYd2AoT2\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppCore.sol\":{\"keccak256\":\"0x13a9c2d1d2c1f086b8624f2e84c4a4702212daae36f701d92bb915b535cbe4cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://606515dd9193551bd2c94ac8c304f3776fafcc70e544ebf441f334658b2fd5f0\",\"dweb:/ipfs/QmZ88ey7DdZqV5taAoebabvszX5kdPMSrQCAmTteVdDtcH\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppReceiver.sol\":{\"keccak256\":\"0x0174e9f1ec4cefe4b5adc26c392269c699b9ff75965364e5b7264426a462c70b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cd12bb4fe5802c53911b9a0081a2ea10639b1f99925d1e5c1b1421d1bdc17075\",\"dweb:/ipfs/QmZonarwbKiEwQ8qoASKur2bbMjusdy9pqK9RCR4P1YPtc\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppSender.sol\":{\"keccak256\":\"0x518cf4adca601923ed4baa6619846a253ea32b8d8775f8bc1faa3dfac7f67c20\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d42b471418efadcc3577ef3fa9f8f504e8bed7db90c3b0c862038d8b29529eb2\",\"dweb:/ipfs/QmZETDQiJN4U92fmLKo8T9ZbdDf7BNBUUvo9H7M7GqAyFU\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppCore.sol\":{\"keccak256\":\"0x40e49f2de74506e1da5dcaed53a39853f691647f4ceb0fccc8f49a68d3f47c58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a1deb2a6a3eb1fb83936c9578469142bff470295f403d7d07d955a76be3adbd\",\"dweb:/ipfs/QmS9bjSfBaE4YhQ1PCQ1TknbEPbNfRXzBK9E7SaPGyiZEv\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppReceiver.sol\":{\"keccak256\":\"0xd26135185e19b3732746d4a9e2923e896f28dec8664bab161faea2ee26fcdc3d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c236dfe386b508be33c3a1a74ae1d4fd64b8c77ae207767e9dbed0f2429518a2\",\"dweb:/ipfs/QmXVbZJjfryTRti98uN3BMh5qh4K7NuEs1RSCoBjRoYd4q\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/libs/OptionsBuilder.sol\":{\"keccak256\":\"0x9ba881395fe0906e40d9222c318b8c74d45cc4035369db4a4c6c7d5de2c42378\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bae80a870a797838741f3fcffc57ae6216487ea0640a0f9707efd13a7830372f\",\"dweb:/ipfs/QmVHqnqVP9De8X2ZiDRAn6LXnoUD3Xm7PHWGYrRD1EuBEG\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroEndpointV2.sol\":{\"keccak256\":\"0xf7f941bee89ea6369950fe54e8ac476ae6478b958b20fc0e8a83e8ff1364eac3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bacc29fd3866af71e59cb0bdc1cf82c882a4a7f4e2652fd413c9f12649762083\",\"dweb:/ipfs/QmZh2toLnrQDWaNYhS5K4NoW7Vxd2GdZx9KA77vKEDLAqs\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroReceiver.sol\":{\"keccak256\":\"0x9641abba8d53b08bb517d1b74801dd15ea7b84d77a6719085bd96c8ea94e3ca0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77415ae0820859e0faf3fabdce683cce9fa03ea026ae0f6fe081ef1c9205f933\",\"dweb:/ipfs/QmXd7APqoCunQ2jYy73AHvi5gsZofLpm3SzM6FPo7zRPfL\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessageLibManager.sol\":{\"keccak256\":\"0xd710f9efe703982e8eabe15d19d6114af753ef42f2796551da782a0fb6633e4b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b5c9c874871469c871004d49a1cb5304e63ea3faaf366bfed9d718abbb9cc20a\",\"dweb:/ipfs/QmarXxE4dezAa5gBe82KCrcvWcMwa3BYqkfXbDQ3rRjfEB\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingChannel.sol\":{\"keccak256\":\"0x0878f64dffebf58c4165569416372f40860fab546b88cd926eba0d5cb6d8d972\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7e1b245d58221d16d8b5e0f01ef3e289a24a7df1ace3b94239e4d5b954ad5927\",\"dweb:/ipfs/Qmappsgp7PCY9rSSNE9Cdn4BTRX591WfCSEgq2HxhA3z6S\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingComposer.sol\":{\"keccak256\":\"0x85bc7090134529ec474866dc4bb1c48692d518c756eb0a961c82574829c51901\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b18b23a1643fc6636c4ad9d9023e2e6ca2d3c2a4a046482d4655bff09950598d\",\"dweb:/ipfs/Qma6G5SqiovwrMPfgqTrRngK1HWW373Wkf9c6YP2NhXpPk\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingContext.sol\":{\"keccak256\":\"0xff0c546c2813dae3e440882f46b377375f7461b0714efd80bd3f0c6e5cb8da4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5173fc9143bea314b159ca5a9adb5626659ef763bc598e27de5fa46efe3291a6\",\"dweb:/ipfs/QmSLFeMFPmVeGxT4sxRPW28ictjAS22M8rLeYRu9TXkA6D\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/libs/CalldataBytesLib.sol\":{\"keccak256\":\"0x5c0db161cef6603c3b256d4220f489419e7478ef775e52a80056654129c61875\",\"license\":\"LZBL-1.2\",\"urls\":[\"bzz-raw://a33245d0fdd3992bb56b31d1840108d36bb46c8d617b659ef1af8dd7ed86302d\",\"dweb:/ipfs/QmWyBqT7Tdrfn5zz9xYM3V1PBtfAZAVwwCrrKwwfi3wMQK\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/messagelib/libs/BitMaps.sol\":{\"keccak256\":\"0xaad3c72ef43480d2253fd48b394e8fb7286d009991d2bc4e61be58ce48ac5ee9\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b8c02b14f954416ba2148b389c87da8378ac8dd16ba3d458cbbfba8b0fd8639f\",\"dweb:/ipfs/Qmd2EEQhYL2VmgJi1V4uiHM2WcYxF9iBtxSgcFkbS21rQD\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/messagelib/libs/ExecutorOptions.sol\":{\"keccak256\":\"0x621c6090fc432f94a99f677a95d72b75f56db89ddc5fc870669777a313587c28\",\"license\":\"LZBL-1.2\",\"urls\":[\"bzz-raw://69086166f16d29e30c5eb9ca2f97afb27569afe619807d79736833a809a512d2\",\"dweb:/ipfs/QmcZqXjFuVdTrfbteKBF3GuEpjVFZ2YNZTa3J87dyLsqav\"]},\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6\",\"dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol\":{\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100\",\"dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037\",\"dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d\",\"dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303\",\"dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508\",\"dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol\":{\"keccak256\":\"0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3cf0c69ab827e3251db9ee6a50647d62c90ba580a4d7bbff21f2bea39e7b2f4a\",\"dweb:/ipfs/QmZiKwtKU1SBX4RGfQtY7PZfiapbbu6SZ9vizGQD9UHjRA\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol\":{\"keccak256\":\"0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8\",\"dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy\"]},\"lib/solidity-bytes-utils/contracts/BytesLib.sol\":{\"keccak256\":\"0xf4b07e5d8f69407bb43c6db224adfcf6c73b512dd64e85008ac3c222910c3555\",\"license\":\"Unlicense\",\"urls\":[\"bzz-raw://db020721e59008f7159b65962cc24038c92ac1c2ee8b7cfaa28a1771ced663f5\",\"dweb:/ipfs/QmQ8rznRTYc3AoVCJno8tY6vQVKCbhDJ3husfytUUvMrSN\"]},\"src/BaseBridgeOApp.sol\":{\"keccak256\":\"0x713913dd10c60dac673e9b49faa5db799d53d4dd1c877712a03f07bf2c178742\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2ea6e6cd292e35033b0492e24de089e5ae65a5dd118e8d5ec8d94d478a760d27\",\"dweb:/ipfs/QmQXVPrnuEBLGPNMFk5mTnjhFMQf8EyetskYhvEkFCErLH\"]},\"src/interfaces/IBaseBridgeOApp.sol\":{\"keccak256\":\"0x67e12bf13988c6d4c86e4f1927a65363466136b6cba0d630e59cbb9a39a63558\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://03852609cae00931df9d52c0770e314b4f5639d134701e643da86ce7ab29928d\",\"dweb:/ipfs/Qmf1bMnd51NoQhCwEbQH8TzRFZpyXN5a4KgDinKKMBpH9Y\"]},\"src/interfaces/IBridgeStorage.sol\":{\"keccak256\":\"0xeb540ee0f9c934d62f349628184a199bf539267e38254200c3acc2bb18b513ca\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8922e33cbf24115faa4efd03b83a7af866981bc580f2c48a148de455a00036d5\",\"dweb:/ipfs/QmU8PqXhzXFVKThZmThVXasg2vzWidsZXap53nUmyKtygo\"]}},\"version\":1}", - "metadata": { - "compiler": { "version": "0.8.30+commit.73712a01" }, - "language": "Solidity", - "output": { - "abi": [ - { - "inputs": [ - { "internalType": "address", "name": "_endpoint", "type": "address" }, - { "internalType": "address", "name": "_delegate", "type": "address" }, - { "internalType": "address", "name": "_owner", "type": "address" }, - { "internalType": "address", "name": "_token", "type": "address" }, - { "internalType": "uint32", "name": "_dstEid", "type": "uint32" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { "inputs": [], "type": "error", "name": "BalanceLessThanBridged" }, - { "inputs": [], "type": "error", "name": "InsufficientNativeFee" }, - { "inputs": [], "type": "error", "name": "InvalidBridgeStorage" }, - { "inputs": [], "type": "error", "name": "InvalidDelegate" }, - { "inputs": [], "type": "error", "name": "InvalidEndpointCall" }, - { "inputs": [], "type": "error", "name": "InvalidGasLimit" }, - { - "inputs": [{ "internalType": "uint16", "name": "optionType", "type": "uint16" }], - "type": "error", - "name": "InvalidOptionType" - }, - { "inputs": [], "type": "error", "name": "LzTokenUnavailable" }, - { "inputs": [], "type": "error", "name": "NoDelta" }, - { - "inputs": [{ "internalType": "uint32", "name": "eid", "type": "uint32" }], - "type": "error", - "name": "NoPeer" - }, - { - "inputs": [{ "internalType": "uint256", "name": "msgValue", "type": "uint256" }], - "type": "error", - "name": "NotEnoughNative" - }, - { - "inputs": [ - { "internalType": "uint32", "name": "eid", "type": "uint32" }, - { "internalType": "bytes32", "name": "sender", "type": "bytes32" } - ], - "type": "error", - "name": "OnlyPeer" - }, - { - "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], - "type": "error", - "name": "OwnableInvalidOwner" - }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "type": "error", - "name": "OwnableUnauthorizedAccount" - }, - { "inputs": [], "type": "error", "name": "RecipientZero" }, - { "inputs": [], "type": "error", "name": "ReentrancyGuardReentrantCall" }, - { - "inputs": [ - { "internalType": "uint8", "name": "bits", "type": "uint8" }, - { "internalType": "uint256", "name": "value", "type": "uint256" } - ], - "type": "error", - "name": "SafeCastOverflowedUintDowncast" - }, - { - "inputs": [{ "internalType": "address", "name": "token", "type": "address" }], - "type": "error", - "name": "SafeERC20FailedOperation" - }, - { - "inputs": [ - { "internalType": "address", "name": "recipient", "type": "address", "indexed": true }, - { "internalType": "uint256", "name": "amount", "type": "uint256", "indexed": false }, - { "internalType": "address", "name": "user", "type": "address", "indexed": true }, - { - "internalType": "struct MessagingReceipt", - "name": "receipt", - "type": "tuple", - "components": [ - { "internalType": "bytes32", "name": "guid", "type": "bytes32" }, - { "internalType": "uint64", "name": "nonce", "type": "uint64" }, - { - "internalType": "struct MessagingFee", - "name": "fee", - "type": "tuple", - "components": [ - { "internalType": "uint256", "name": "nativeFee", "type": "uint256" }, - { "internalType": "uint256", "name": "lzTokenFee", "type": "uint256" } - ] - } - ], - "indexed": false - } - ], - "type": "event", - "name": "BridgeRequested", - "anonymous": false - }, - { - "inputs": [ - { "internalType": "address", "name": "oldStorage", "type": "address", "indexed": true }, - { "internalType": "address", "name": "newStorage", "type": "address", "indexed": true } - ], - "type": "event", - "name": "BridgeStorageUpdated", - "anonymous": false - }, - { - "inputs": [ - { "internalType": "uint128", "name": "oldLimit", "type": "uint128", "indexed": false }, - { "internalType": "uint128", "name": "newLimit", "type": "uint128", "indexed": false } - ], - "type": "event", - "name": "GasLimitUpdated", - "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": [ - { "internalType": "uint32", "name": "eid", "type": "uint32", "indexed": false }, - { "internalType": "bytes32", "name": "peer", "type": "bytes32", "indexed": false } - ], - "type": "event", - "name": "PeerSet", - "anonymous": false - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "bridgeStorage", - "outputs": [{ "internalType": "contract IBridgeStorage", "name": "", "type": "address" }] - }, - { - "inputs": [{ "internalType": "address", "name": "recipient", "type": "address" }], - "stateMutability": "payable", - "type": "function", - "name": "bridgeTo" - }, - { - "inputs": [{ "internalType": "address", "name": "user", "type": "address" }], - "stateMutability": "view", - "type": "function", - "name": "bridgedAmount", - "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "endpoint", - "outputs": [ - { "internalType": "contract ILayerZeroEndpointV2", "name": "", "type": "address" } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "gasLimit", - "outputs": [{ "internalType": "uint128", "name": "", "type": "uint128" }] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "oAppVersion", - "outputs": [ - { "internalType": "uint64", "name": "senderVersion", "type": "uint64" }, - { "internalType": "uint64", "name": "receiverVersion", "type": "uint64" } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }] - }, - { - "inputs": [{ "internalType": "uint32", "name": "eid", "type": "uint32" }], - "stateMutability": "view", - "type": "function", - "name": "peers", - "outputs": [{ "internalType": "bytes32", "name": "peer", "type": "bytes32" }] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "quoteBridge", - "outputs": [ - { - "internalType": "struct MessagingFee", - "name": "fee", - "type": "tuple", - "components": [ - { "internalType": "uint256", "name": "nativeFee", "type": "uint256" }, - { "internalType": "uint256", "name": "lzTokenFee", "type": "uint256" } - ] - } - ] - }, - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "function", - "name": "renounceOwnership" - }, - { - "inputs": [{ "internalType": "address", "name": "_bridgeStorage", "type": "address" }], - "stateMutability": "nonpayable", - "type": "function", - "name": "setBridgeStorage" - }, - { - "inputs": [{ "internalType": "address", "name": "_delegate", "type": "address" }], - "stateMutability": "nonpayable", - "type": "function", - "name": "setDelegate" - }, - { - "inputs": [{ "internalType": "uint128", "name": "_gasLimit", "type": "uint128" }], - "stateMutability": "nonpayable", - "type": "function", - "name": "setGasLimit" - }, - { - "inputs": [ - { "internalType": "uint32", "name": "_eid", "type": "uint32" }, - { "internalType": "bytes32", "name": "_peer", "type": "bytes32" } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "setPeer" - }, - { - "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], - "stateMutability": "nonpayable", - "type": "function", - "name": "transferOwnership" - }, - { - "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], - "stateMutability": "nonpayable", - "type": "function", - "name": "transferStorageOwnership" - } - ], - "devdoc": { - "kind": "dev", - "methods": { - "bridgeTo(address)": { - "details": "Requires sufficient native fee to be sent with the transactionOnly bridges the delta between current balance and previously bridged amount", - "params": { "recipient": "The recipient address on destination chain" } - }, - "bridgedAmount(address)": { - "params": { "user": "The user address to query" }, - "returns": { "_0": "The total amount of tokens bridged by the user" } - }, - "oAppVersion()": { - "details": "Providing 0 as the default for OAppReceiver version. Indicates that the OAppReceiver is not implemented. ie. this is a SEND only OApp.If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions", - "returns": { - "receiverVersion": "The version of the OAppReceiver.sol contract.", - "senderVersion": "The version of the OAppSender.sol contract." - } - }, - "owner()": { "details": "Returns the address of the current owner." }, - "quoteBridge()": { "returns": { "fee": "The estimated messaging fee" } }, - "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." - }, - "setDelegate(address)": { - "details": "Only the owner/admin of the OApp can call this function.Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract.", - "params": { "_delegate": "The address of the delegate to be set." } - }, - "setGasLimit(uint128)": { - "details": "Only callable by contract ownerEmits GasLimitUpdated event", - "params": { "_gasLimit": "The new gas limit value (must be greater than 0)" } - }, - "setPeer(uint32,bytes32)": { - "details": "Only the owner/admin of the OApp can call this function.Indicates that the peer is trusted to send LayerZero messages to this OApp.Set this to bytes32(0) to remove the peer address.Peer is a bytes32 to accommodate non-evm chains.", - "params": { - "_eid": "The endpoint ID.", - "_peer": "The address of the peer to be associated with the corresponding endpoint." - } - }, - "transferOwnership(address)": { - "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." - }, - "transferStorageOwnership(address)": { - "details": "Only callable by contract ownerReverts if newOwner is the zero address", - "params": { "newOwner": "The address of the new owner for BridgeStorage" } - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "bridgeTo(address)": { - "notice": "Bridge tokens to a recipient on the destination chain" - }, - "bridgedAmount(address)": { - "notice": "Get the total amount of tokens bridged by a user" - }, - "endpoint()": { "notice": "Retrieves the LayerZero endpoint associated with the OApp." }, - "oAppVersion()": { "notice": "Retrieves the OApp version information." }, - "peers(uint32)": { - "notice": "Retrieves the peer (OApp) associated with a corresponding endpoint." - }, - "quoteBridge()": { "notice": "Get the estimated fee for bridging" }, - "setDelegate(address)": { "notice": "Sets the delegate address for the OApp." }, - "setGasLimit(uint128)": { - "notice": "Set the gas limit for LayerZero message execution on the destination chain" - }, - "setPeer(uint32,bytes32)": { - "notice": "Sets the peer address (OApp instance) for a corresponding endpoint." - }, - "transferStorageOwnership(address)": { - "notice": "Transfer ownership of the BridgeStorage contract" - } - }, - "version": 1 - } - }, - "settings": { - "remappings": [ - "@layerzerolabs/lz-evm-messagelib-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/messagelib/", - "@layerzerolabs/lz-evm-protocol-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/", - "@layerzerolabs/oapp/=lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/", - "@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/", - "@openzeppelin/=lib/openzeppelin-contracts/", - "LayerZero-v2/=lib/LayerZero-v2/", - "ds-test/=lib/solidity-bytes-utils/lib/forge-std/lib/ds-test/src/", - "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", - "forge-std/=lib/forge-std/src/", - "halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/", - "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/", - "solidity-bytes-utils/=lib/solidity-bytes-utils/" - ], - "optimizer": { "enabled": false, "runs": 200 }, - "metadata": { "bytecodeHash": "ipfs" }, - "compilationTarget": { "src/BaseBridgeOApp.sol": "BaseBridgeOApp" }, - "evmVersion": "cancun", - "libraries": {} - }, - "sources": { - "lib/LayerZero-v2/packages/layerzero-v2/evm/messagelib/contracts/uln/libs/DVNOptions.sol": { - "keccak256": "0x2beee03cdf59a9bc72e94d08b69cb2e908725f4ceabb48651494938100e21e35", - "urls": [ - "bzz-raw://d88e121a39e74309f3575417df2318e2d2ee8bc8314e68dbf78544a9c393b141", - "dweb:/ipfs/QmRojBRAyENK21HnjevAWeoZZxtWkYZubB9Y78vCJPYeU6" - ], - "license": "LZBL-1.2" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OApp.sol": { - "keccak256": "0xac362c4c291fad2f1511a968424b2e78a5ad502d1c867bd31da04be742aca8c5", - "urls": [ - "bzz-raw://e1f8cf9f20a2b683a53c3883972aa0676af97a24c678f461fae08e1fb056df28", - "dweb:/ipfs/QmPpKNqda3rgxDwnq3XiRTtT3NfWeqrCJT6LwmhYd2AoT2" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppCore.sol": { - "keccak256": "0x13a9c2d1d2c1f086b8624f2e84c4a4702212daae36f701d92bb915b535cbe4cc", - "urls": [ - "bzz-raw://606515dd9193551bd2c94ac8c304f3776fafcc70e544ebf441f334658b2fd5f0", - "dweb:/ipfs/QmZ88ey7DdZqV5taAoebabvszX5kdPMSrQCAmTteVdDtcH" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppReceiver.sol": { - "keccak256": "0x0174e9f1ec4cefe4b5adc26c392269c699b9ff75965364e5b7264426a462c70b", - "urls": [ - "bzz-raw://cd12bb4fe5802c53911b9a0081a2ea10639b1f99925d1e5c1b1421d1bdc17075", - "dweb:/ipfs/QmZonarwbKiEwQ8qoASKur2bbMjusdy9pqK9RCR4P1YPtc" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppSender.sol": { - "keccak256": "0x518cf4adca601923ed4baa6619846a253ea32b8d8775f8bc1faa3dfac7f67c20", - "urls": [ - "bzz-raw://d42b471418efadcc3577ef3fa9f8f504e8bed7db90c3b0c862038d8b29529eb2", - "dweb:/ipfs/QmZETDQiJN4U92fmLKo8T9ZbdDf7BNBUUvo9H7M7GqAyFU" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppCore.sol": { - "keccak256": "0x40e49f2de74506e1da5dcaed53a39853f691647f4ceb0fccc8f49a68d3f47c58", - "urls": [ - "bzz-raw://4a1deb2a6a3eb1fb83936c9578469142bff470295f403d7d07d955a76be3adbd", - "dweb:/ipfs/QmS9bjSfBaE4YhQ1PCQ1TknbEPbNfRXzBK9E7SaPGyiZEv" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppReceiver.sol": { - "keccak256": "0xd26135185e19b3732746d4a9e2923e896f28dec8664bab161faea2ee26fcdc3d", - "urls": [ - "bzz-raw://c236dfe386b508be33c3a1a74ae1d4fd64b8c77ae207767e9dbed0f2429518a2", - "dweb:/ipfs/QmXVbZJjfryTRti98uN3BMh5qh4K7NuEs1RSCoBjRoYd4q" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/libs/OptionsBuilder.sol": { - "keccak256": "0x9ba881395fe0906e40d9222c318b8c74d45cc4035369db4a4c6c7d5de2c42378", - "urls": [ - "bzz-raw://bae80a870a797838741f3fcffc57ae6216487ea0640a0f9707efd13a7830372f", - "dweb:/ipfs/QmVHqnqVP9De8X2ZiDRAn6LXnoUD3Xm7PHWGYrRD1EuBEG" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroEndpointV2.sol": { - "keccak256": "0xf7f941bee89ea6369950fe54e8ac476ae6478b958b20fc0e8a83e8ff1364eac3", - "urls": [ - "bzz-raw://bacc29fd3866af71e59cb0bdc1cf82c882a4a7f4e2652fd413c9f12649762083", - "dweb:/ipfs/QmZh2toLnrQDWaNYhS5K4NoW7Vxd2GdZx9KA77vKEDLAqs" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroReceiver.sol": { - "keccak256": "0x9641abba8d53b08bb517d1b74801dd15ea7b84d77a6719085bd96c8ea94e3ca0", - "urls": [ - "bzz-raw://77415ae0820859e0faf3fabdce683cce9fa03ea026ae0f6fe081ef1c9205f933", - "dweb:/ipfs/QmXd7APqoCunQ2jYy73AHvi5gsZofLpm3SzM6FPo7zRPfL" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessageLibManager.sol": { - "keccak256": "0xd710f9efe703982e8eabe15d19d6114af753ef42f2796551da782a0fb6633e4b", - "urls": [ - "bzz-raw://b5c9c874871469c871004d49a1cb5304e63ea3faaf366bfed9d718abbb9cc20a", - "dweb:/ipfs/QmarXxE4dezAa5gBe82KCrcvWcMwa3BYqkfXbDQ3rRjfEB" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingChannel.sol": { - "keccak256": "0x0878f64dffebf58c4165569416372f40860fab546b88cd926eba0d5cb6d8d972", - "urls": [ - "bzz-raw://7e1b245d58221d16d8b5e0f01ef3e289a24a7df1ace3b94239e4d5b954ad5927", - "dweb:/ipfs/Qmappsgp7PCY9rSSNE9Cdn4BTRX591WfCSEgq2HxhA3z6S" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingComposer.sol": { - "keccak256": "0x85bc7090134529ec474866dc4bb1c48692d518c756eb0a961c82574829c51901", - "urls": [ - "bzz-raw://b18b23a1643fc6636c4ad9d9023e2e6ca2d3c2a4a046482d4655bff09950598d", - "dweb:/ipfs/Qma6G5SqiovwrMPfgqTrRngK1HWW373Wkf9c6YP2NhXpPk" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingContext.sol": { - "keccak256": "0xff0c546c2813dae3e440882f46b377375f7461b0714efd80bd3f0c6e5cb8da4e", - "urls": [ - "bzz-raw://5173fc9143bea314b159ca5a9adb5626659ef763bc598e27de5fa46efe3291a6", - "dweb:/ipfs/QmSLFeMFPmVeGxT4sxRPW28ictjAS22M8rLeYRu9TXkA6D" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/libs/CalldataBytesLib.sol": { - "keccak256": "0x5c0db161cef6603c3b256d4220f489419e7478ef775e52a80056654129c61875", - "urls": [ - "bzz-raw://a33245d0fdd3992bb56b31d1840108d36bb46c8d617b659ef1af8dd7ed86302d", - "dweb:/ipfs/QmWyBqT7Tdrfn5zz9xYM3V1PBtfAZAVwwCrrKwwfi3wMQK" - ], - "license": "LZBL-1.2" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/messagelib/libs/BitMaps.sol": { - "keccak256": "0xaad3c72ef43480d2253fd48b394e8fb7286d009991d2bc4e61be58ce48ac5ee9", - "urls": [ - "bzz-raw://b8c02b14f954416ba2148b389c87da8378ac8dd16ba3d458cbbfba8b0fd8639f", - "dweb:/ipfs/Qmd2EEQhYL2VmgJi1V4uiHM2WcYxF9iBtxSgcFkbS21rQD" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/messagelib/libs/ExecutorOptions.sol": { - "keccak256": "0x621c6090fc432f94a99f677a95d72b75f56db89ddc5fc870669777a313587c28", - "urls": [ - "bzz-raw://69086166f16d29e30c5eb9ca2f97afb27569afe619807d79736833a809a512d2", - "dweb:/ipfs/QmcZqXjFuVdTrfbteKBF3GuEpjVFZ2YNZTa3J87dyLsqav" - ], - "license": "LZBL-1.2" - }, - "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { - "keccak256": "0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb", - "urls": [ - "bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6", - "dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol": { - "keccak256": "0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d", - "urls": [ - "bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100", - "dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol": { - "keccak256": "0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc", - "urls": [ - "bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037", - "dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol": { - "keccak256": "0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44", - "urls": [ - "bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d", - "dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { - "keccak256": "0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2", - "urls": [ - "bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303", - "dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol": { - "keccak256": "0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5", - "urls": [ - "bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508", - "dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/utils/Context.sol": { - "keccak256": "0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2", - "urls": [ - "bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12", - "dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sol": { - "keccak256": "0x11a5a79827df29e915a12740caf62fe21ebe27c08c9ae3e09abe9ee3ba3866d3", - "urls": [ - "bzz-raw://3cf0c69ab827e3251db9ee6a50647d62c90ba580a4d7bbff21f2bea39e7b2f4a", - "dweb:/ipfs/QmZiKwtKU1SBX4RGfQtY7PZfiapbbu6SZ9vizGQD9UHjRA" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { - "keccak256": "0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c", - "urls": [ - "bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617", - "dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/utils/math/SafeCast.sol": { - "keccak256": "0x195533c86d0ef72bcc06456a4f66a9b941f38eb403739b00f21fd7c1abd1ae54", - "urls": [ - "bzz-raw://b1d578337048cad08c1c03041cca5978eff5428aa130c781b271ad9e5566e1f8", - "dweb:/ipfs/QmPFKL2r9CBsMwmUqqdcFPfHZB2qcs9g1HDrPxzWSxomvy" - ], - "license": "MIT" - }, - "lib/solidity-bytes-utils/contracts/BytesLib.sol": { - "keccak256": "0xf4b07e5d8f69407bb43c6db224adfcf6c73b512dd64e85008ac3c222910c3555", - "urls": [ - "bzz-raw://db020721e59008f7159b65962cc24038c92ac1c2ee8b7cfaa28a1771ced663f5", - "dweb:/ipfs/QmQ8rznRTYc3AoVCJno8tY6vQVKCbhDJ3husfytUUvMrSN" - ], - "license": "Unlicense" - }, - "src/BaseBridgeOApp.sol": { - "keccak256": "0x713913dd10c60dac673e9b49faa5db799d53d4dd1c877712a03f07bf2c178742", - "urls": [ - "bzz-raw://2ea6e6cd292e35033b0492e24de089e5ae65a5dd118e8d5ec8d94d478a760d27", - "dweb:/ipfs/QmQXVPrnuEBLGPNMFk5mTnjhFMQf8EyetskYhvEkFCErLH" - ], - "license": "MIT" - }, - "src/interfaces/IBaseBridgeOApp.sol": { - "keccak256": "0x67e12bf13988c6d4c86e4f1927a65363466136b6cba0d630e59cbb9a39a63558", - "urls": [ - "bzz-raw://03852609cae00931df9d52c0770e314b4f5639d134701e643da86ce7ab29928d", - "dweb:/ipfs/Qmf1bMnd51NoQhCwEbQH8TzRFZpyXN5a4KgDinKKMBpH9Y" - ], - "license": "MIT" - }, - "src/interfaces/IBridgeStorage.sol": { - "keccak256": "0xeb540ee0f9c934d62f349628184a199bf539267e38254200c3acc2bb18b513ca", - "urls": [ - "bzz-raw://8922e33cbf24115faa4efd03b83a7af866981bc580f2c48a148de455a00036d5", - "dweb:/ipfs/QmU8PqXhzXFVKThZmThVXasg2vzWidsZXap53nUmyKtygo" - ], - "license": "MIT" - } - }, - "version": 1 - }, - "id": 50 + ] } diff --git a/packages/shared/src/abi/MainnetBridgeOApp.json b/packages/shared/src/abi/MainnetBridgeOApp.json index 530bfdf..caf0f76 100644 --- a/packages/shared/src/abi/MainnetBridgeOApp.json +++ b/packages/shared/src/abi/MainnetBridgeOApp.json @@ -287,651 +287,5 @@ "name": "SafeERC20FailedOperation", "inputs": [{ "name": "token", "type": "address", "internalType": "address" }] } - ], - "bytecode": { - "object": "0x610100604052348015610010575f5ffd5b50604051611e7f380380611e7f8339818101604052810190610032919061039e565b8585855f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100a5575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161009c9190610436565b60405180910390fd5b6100b48161021360201b60201c565b508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361014e576040517fb586360400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60805173ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b81526004016101899190610436565b5f604051808303815f87803b1580156101a0575f5ffd5b505af11580156101b2573d5f5f3e3d5ffd5b5050505050508273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508163ffffffff1660c08163ffffffff16815250508060e0818152505050505050505061044f565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610301826102d8565b9050919050565b610311816102f7565b811461031b575f5ffd5b50565b5f8151905061032c81610308565b92915050565b5f63ffffffff82169050919050565b61034a81610332565b8114610354575f5ffd5b50565b5f8151905061036581610341565b92915050565b5f819050919050565b61037d8161036b565b8114610387575f5ffd5b50565b5f8151905061039881610374565b92915050565b5f5f5f5f5f5f60c087890312156103b8576103b76102d4565b5b5f6103c589828a0161031e565b96505060206103d689828a0161031e565b95505060406103e789828a0161031e565b94505060606103f889828a0161031e565b935050608061040989828a01610357565b92505060a061041a89828a0161038a565b9150509295509295509295565b610430816102f7565b82525050565b5f6020820190506104495f830184610427565b92915050565b60805160a05160c05160e0516119d96104a65f395f50505f50505f81816104700152610c6401525f818161053c015281816105f10152818161069c015281816107c80152818161086a015261092101526119d95ff3fe6080604052600436106100f2575f3560e01c80637d25a05e11610089578063bb0b6a5311610058578063bb0b6a53146102fb578063ca5eb5e114610337578063f2fde38b1461035f578063ff7bd03d14610387576100f2565b80637d25a05e1461023157806382413eac1461026d5780638da5cb5b146102a9578063b9a9c0d6146102d3576100f2565b806317442b70116100c557806317442b701461019e5780633400288b146101c95780635e280f11146101f1578063715018a61461021b576100f2565b806306b091f9146100f65780630787bddb1461011e5780630a96997d1461015a57806313137d6514610182575b5f5ffd5b348015610101575f5ffd5b5061011c60048036038101906101179190610f70565b6103c3565b005b348015610129575f5ffd5b50610144600480360381019061013f91906110b8565b610506565b6040516101519190611168565b60405180910390f35b348015610165575f5ffd5b50610180600480360381019061017b91906111a3565b6105e7565b005b61019c60048036038101906101979190611214565b610683565b005b3480156101a9575f5ffd5b506101b26107a3565b6040516101c09291906112da565b60405180910390f35b3480156101d4575f5ffd5b506101ef60048036038101906101ea9190611301565b6107b0565b005b3480156101fc575f5ffd5b506102056107c6565b604051610212919061139a565b60405180910390f35b348015610226575f5ffd5b5061022f6107ea565b005b34801561023c575f5ffd5b5061025760048036038101906102529190611301565b6107fd565b60405161026491906113b3565b60405180910390f35b348015610278575f5ffd5b50610293600480360381019061028e91906113cc565b610807565b6040516102a09190611168565b60405180910390f35b3480156102b4575f5ffd5b506102bd610841565b6040516102ca919061144c565b60405180910390f35b3480156102de575f5ffd5b506102f960048036038101906102f49190611465565b610868565b005b348015610306575f5ffd5b50610321600480360381019061031c9190611508565b610902565b60405161032e9190611542565b60405180910390f35b348015610342575f5ffd5b5061035d6004803603810190610358919061155b565b610917565b005b34801561036a575f5ffd5b506103856004803603810190610380919061155b565b6109a8565b005b348015610392575f5ffd5b506103ad60048036038101906103a89190611586565b610a2c565b6040516103ba9190611168565b60405180910390f35b6103cb610a69565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610430576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610469576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104b482827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610af09092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b826040516104fa91906115c0565b60405180910390a25050565b5f5f84848460405160200161051d93929190611635565b60405160208183030381529060405290505f81805190602001209050807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9fc7bcd308c8c8c6040518563ffffffff1660e01b8152600401610599949392919061166d565b602060405180830381865afa1580156105b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d891906116c4565b14925050509695505050505050565b6105ef610a69565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632a56c1b030868686866040518663ffffffff1660e01b8152600401610650959493929190611802565b5f604051808303815f87803b158015610667575f5ffd5b505af1158015610679573d5f5f3e3d5ffd5b5050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461071357336040517f91ac5e4f00000000000000000000000000000000000000000000000000000000815260040161070a919061144c565b60405180910390fd5b8660200135610732885f01602081019061072d9190611508565b610b6f565b1461078b57865f0160208101906107499190611508565b87602001356040517fc26bebcc00000000000000000000000000000000000000000000000000000000815260040161078292919061184e565b60405180910390fd5b61079a87878787878787610be0565b50505050505050565b5f5f5f6002915091509091565b6107b8610a69565b6107c28282610d19565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6107f2610a69565b6107fb5f610d78565b565b5f5f905092915050565b5f3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050949350505050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630c0c389e873088888888886040518863ffffffff1660e01b81526004016108cd9796959493929190611875565b5f604051808303815f87803b1580156108e4575f5ffd5b505af11580156108f6573d5f5f3e3d5ffd5b50505050505050505050565b6001602052805f5260405f205f915090505481565b61091f610a69565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b8152600401610978919061144c565b5f604051808303815f87803b15801561098f575f5ffd5b505af11580156109a1573d5f5f3e3d5ffd5b5050505050565b6109b0610a69565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a20575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610a17919061144c565b60405180910390fd5b610a2981610d78565b50565b5f816020013560015f845f016020810190610a479190611508565b63ffffffff1663ffffffff1681526020019081526020015f2054149050919050565b610a71610e39565b73ffffffffffffffffffffffffffffffffffffffff16610a8f610841565b73ffffffffffffffffffffffffffffffffffffffff1614610aee57610ab2610e39565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610ae5919061144c565b60405180910390fd5b565b610b6a838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401610b239291906118d8565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610e40565b505050565b5f5f60015f8463ffffffff1663ffffffff1681526020019081526020015f205490505f5f1b8103610bd757826040517ff6ff4fb7000000000000000000000000000000000000000000000000000000008152600401610bce91906118ff565b60405180910390fd5b80915050919050565b5f5f5f8787810190610bf29190611953565b9250925092505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c5d576040517f3d9eb1db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ca883837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610af09092919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fdd9f27a2298663148e8518b15d063f9febfad5269089f80b35cd6f59074190c684604051610d0591906115c0565b60405180910390a350505050505050505050565b8060015f8463ffffffff1663ffffffff1681526020019081526020015f20819055507f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b8282604051610d6c92919061184e565b60405180910390a15050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f5f60205f8451602086015f885af180610e5f576040513d5f823e3d81fd5b3d92505f519150505f8214610e78576001811415610e93565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b15610ed557836040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401610ecc919061144c565b60405180910390fd5b50505050565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610f0c82610ee3565b9050919050565b610f1c81610f02565b8114610f26575f5ffd5b50565b5f81359050610f3781610f13565b92915050565b5f819050919050565b610f4f81610f3d565b8114610f59575f5ffd5b50565b5f81359050610f6a81610f46565b92915050565b5f5f60408385031215610f8657610f85610edb565b5b5f610f9385828601610f29565b9250506020610fa485828601610f5c565b9150509250929050565b5f63ffffffff82169050919050565b610fc681610fae565b8114610fd0575f5ffd5b50565b5f81359050610fe181610fbd565b92915050565b5f819050919050565b610ff981610fe7565b8114611003575f5ffd5b50565b5f8135905061101481610ff0565b92915050565b5f67ffffffffffffffff82169050919050565b6110368161101a565b8114611040575f5ffd5b50565b5f813590506110518161102d565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261107857611077611057565b5b8235905067ffffffffffffffff8111156110955761109461105b565b5b6020830191508360018202830111156110b1576110b061105f565b5b9250929050565b5f5f5f5f5f5f60a087890312156110d2576110d1610edb565b5b5f6110df89828a01610fd3565b96505060206110f089828a01611006565b955050604061110189828a01611043565b945050606061111289828a01611006565b935050608087013567ffffffffffffffff81111561113357611132610edf565b5b61113f89828a01611063565b92509250509295509295509295565b5f8115159050919050565b6111628161114e565b82525050565b5f60208201905061117b5f830184611159565b92915050565b5f5ffd5b5f6060828403121561119a57611199611181565b5b81905092915050565b5f5f5f5f60a085870312156111bb576111ba610edb565b5b5f6111c887828801611185565b94505060606111d987828801611006565b935050608085013567ffffffffffffffff8111156111fa576111f9610edf565b5b61120687828801611063565b925092505092959194509250565b5f5f5f5f5f5f5f60e0888a03121561122f5761122e610edb565b5b5f61123c8a828b01611185565b975050606061124d8a828b01611006565b965050608088013567ffffffffffffffff81111561126e5761126d610edf565b5b61127a8a828b01611063565b955095505060a061128d8a828b01610f29565b93505060c088013567ffffffffffffffff8111156112ae576112ad610edf565b5b6112ba8a828b01611063565b925092505092959891949750929550565b6112d48161101a565b82525050565b5f6040820190506112ed5f8301856112cb565b6112fa60208301846112cb565b9392505050565b5f5f6040838503121561131757611316610edb565b5b5f61132485828601610fd3565b925050602061133585828601611006565b9150509250929050565b5f819050919050565b5f61136261135d61135884610ee3565b61133f565b610ee3565b9050919050565b5f61137382611348565b9050919050565b5f61138482611369565b9050919050565b6113948161137a565b82525050565b5f6020820190506113ad5f83018461138b565b92915050565b5f6020820190506113c65f8301846112cb565b92915050565b5f5f5f5f60a085870312156113e4576113e3610edb565b5b5f6113f187828801611185565b945050606085013567ffffffffffffffff81111561141257611411610edf565b5b61141e87828801611063565b9350935050608061143187828801610f29565b91505092959194509250565b61144681610f02565b82525050565b5f60208201905061145f5f83018461143d565b92915050565b5f5f5f5f5f5f60c0878903121561147f5761147e610edb565b5b5f61148c89828a01611185565b965050606061149d89828a01611006565b955050608087013567ffffffffffffffff8111156114be576114bd610edf565b5b6114ca89828a01611063565b945094505060a087013567ffffffffffffffff8111156114ed576114ec610edf565b5b6114f989828a01611063565b92509250509295509295509295565b5f6020828403121561151d5761151c610edb565b5b5f61152a84828501610fd3565b91505092915050565b61153c81610fe7565b82525050565b5f6020820190506115555f830184611533565b92915050565b5f602082840312156115705761156f610edb565b5b5f61157d84828501610f29565b91505092915050565b5f6060828403121561159b5761159a610edb565b5b5f6115a884828501611185565b91505092915050565b6115ba81610f3d565b82525050565b5f6020820190506115d35f8301846115b1565b92915050565b5f819050919050565b6115f36115ee82610fe7565b6115d9565b82525050565b5f81905092915050565b828183375f83830152505050565b5f61161c83856115f9565b9350611629838584611603565b82840190509392505050565b5f61164082866115e2565b602082019150611651828486611611565b9150819050949350505050565b61166781610fae565b82525050565b5f6080820190506116805f83018761143d565b61168d602083018661165e565b61169a6040830185611533565b6116a760608301846112cb565b95945050505050565b5f815190506116be81610ff0565b92915050565b5f602082840312156116d9576116d8610edb565b5b5f6116e6848285016116b0565b91505092915050565b5f6116fd6020840184610fd3565b905092915050565b61170e81610fae565b82525050565b5f6117226020840184611006565b905092915050565b61173381610fe7565b82525050565b5f6117476020840184611043565b905092915050565b6117588161101a565b82525050565b6060820161176e5f8301836116ef565b61177a5f850182611705565b506117886020830183611714565b611795602085018261172a565b506117a36040830183611739565b6117b0604085018261174f565b50505050565b5f82825260208201905092915050565b5f601f19601f8301169050919050565b5f6117e183856117b6565b93506117ee838584611603565b6117f7836117c6565b840190509392505050565b5f60c0820190506118155f83018861143d565b611822602083018761175e565b61182f6080830186611533565b81810360a08301526118428184866117d6565b90509695505050505050565b5f6040820190506118615f83018561165e565b61186e6020830184611533565b9392505050565b5f60e0820190506118885f83018a61175e565b611895606083018961143d565b6118a26080830188611533565b81810360a08301526118b58186886117d6565b905081810360c08301526118ca8184866117d6565b905098975050505050505050565b5f6040820190506118eb5f83018561143d565b6118f860208301846115b1565b9392505050565b5f6020820190506119125f83018461165e565b92915050565b5f61192282610ee3565b9050919050565b61193281611918565b811461193c575f5ffd5b50565b5f8135905061194d81611929565b92915050565b5f5f5f6060848603121561196a57611969610edb565b5b5f6119778682870161193f565b935050602061198886828701610f5c565b92505060406119998682870161193f565b915050925092509256fea26469706673582212207202fd70410df61eca847a9ccc44a55e49e9ecf277f8e0c05a6f0c0dbacc0b6564736f6c634300081e0033", - "sourceMap": "586:2357:52:-:0;;;808:321;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;989:9;1000;1019:6;1297:1:37;1273:26;;:12;:26;;;1269:95;;1350:1;1322:31;;;;;;;;;;;:::i;:::-;;;;;;;;1269:95;1373:32;1392:12;1373:18;;;:32;;:::i;:::-;1225:187;1079:9:2;1047:42;;;;;;;;;;1125:1;1104:23;;:9;:23;;;1100:53;;1136:17;;;;;;;;;;;;;;1100:53;1163:8;;:20;;;1184:9;1163:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;987:214;;1053:6:52::2;1037:23;;;;;;;;::::0;::::2;1081:7;1070:18;;;;;;;;::::0;::::2;1112:10;1098:24;;;;::::0;::::2;808:321:::0;;;;;;586:2357;;2912:187:37;2985:16;3004:6;;;;;;;;;;;2985:25;;3029:8;3020:6;;:17;;;;;;;;;;;;;;;;;;3083:8;3052:40;;3073:8;3052:40;;;;;;;;;;;;2975:124;2912:187;:::o;88:117:59:-;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:143::-;753:5;784:6;778:13;769:22;;800:33;827:5;800:33;:::i;:::-;696:143;;;;:::o;845:93::-;881:7;921:10;914:5;910:22;899:33;;845:93;;;:::o;944:120::-;1016:23;1033:5;1016:23;:::i;:::-;1009:5;1006:34;996:62;;1054:1;1051;1044:12;996:62;944:120;:::o;1070:141::-;1126:5;1157:6;1151:13;1142:22;;1173:32;1199:5;1173:32;:::i;:::-;1070:141;;;;:::o;1217:77::-;1254:7;1283:5;1272:16;;1217:77;;;:::o;1300:122::-;1373:24;1391:5;1373:24;:::i;:::-;1366:5;1363:35;1353:63;;1412:1;1409;1402:12;1353:63;1300:122;:::o;1428:143::-;1485:5;1516:6;1510:13;1501:22;;1532:33;1559:5;1532:33;:::i;:::-;1428:143;;;;:::o;1577:1132::-;1691:6;1699;1707;1715;1723;1731;1780:3;1768:9;1759:7;1755:23;1751:33;1748:120;;;1787:79;;:::i;:::-;1748:120;1907:1;1932:64;1988:7;1979:6;1968:9;1964:22;1932:64;:::i;:::-;1922:74;;1878:128;2045:2;2071:64;2127:7;2118:6;2107:9;2103:22;2071:64;:::i;:::-;2061:74;;2016:129;2184:2;2210:64;2266:7;2257:6;2246:9;2242:22;2210:64;:::i;:::-;2200:74;;2155:129;2323:2;2349:64;2405:7;2396:6;2385:9;2381:22;2349:64;:::i;:::-;2339:74;;2294:129;2462:3;2489:63;2544:7;2535:6;2524:9;2520:22;2489:63;:::i;:::-;2479:73;;2433:129;2601:3;2628:64;2684:7;2675:6;2664:9;2660:22;2628:64;:::i;:::-;2618:74;;2572:130;1577:1132;;;;;;;;:::o;2715:118::-;2802:24;2820:5;2802:24;:::i;:::-;2797:3;2790:37;2715:118;;:::o;2839:222::-;2932:4;2970:2;2959:9;2955:18;2947:26;;2983:71;3051:1;3040:9;3036:17;3027:6;2983:71;:::i;:::-;2839:222;;;;:::o;586:2357:52:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", - "linkReferences": {} - }, - "deployedBytecode": { - "object": "0x6080604052600436106100f2575f3560e01c80637d25a05e11610089578063bb0b6a5311610058578063bb0b6a53146102fb578063ca5eb5e114610337578063f2fde38b1461035f578063ff7bd03d14610387576100f2565b80637d25a05e1461023157806382413eac1461026d5780638da5cb5b146102a9578063b9a9c0d6146102d3576100f2565b806317442b70116100c557806317442b701461019e5780633400288b146101c95780635e280f11146101f1578063715018a61461021b576100f2565b806306b091f9146100f65780630787bddb1461011e5780630a96997d1461015a57806313137d6514610182575b5f5ffd5b348015610101575f5ffd5b5061011c60048036038101906101179190610f70565b6103c3565b005b348015610129575f5ffd5b50610144600480360381019061013f91906110b8565b610506565b6040516101519190611168565b60405180910390f35b348015610165575f5ffd5b50610180600480360381019061017b91906111a3565b6105e7565b005b61019c60048036038101906101979190611214565b610683565b005b3480156101a9575f5ffd5b506101b26107a3565b6040516101c09291906112da565b60405180910390f35b3480156101d4575f5ffd5b506101ef60048036038101906101ea9190611301565b6107b0565b005b3480156101fc575f5ffd5b506102056107c6565b604051610212919061139a565b60405180910390f35b348015610226575f5ffd5b5061022f6107ea565b005b34801561023c575f5ffd5b5061025760048036038101906102529190611301565b6107fd565b60405161026491906113b3565b60405180910390f35b348015610278575f5ffd5b50610293600480360381019061028e91906113cc565b610807565b6040516102a09190611168565b60405180910390f35b3480156102b4575f5ffd5b506102bd610841565b6040516102ca919061144c565b60405180910390f35b3480156102de575f5ffd5b506102f960048036038101906102f49190611465565b610868565b005b348015610306575f5ffd5b50610321600480360381019061031c9190611508565b610902565b60405161032e9190611542565b60405180910390f35b348015610342575f5ffd5b5061035d6004803603810190610358919061155b565b610917565b005b34801561036a575f5ffd5b506103856004803603810190610380919061155b565b6109a8565b005b348015610392575f5ffd5b506103ad60048036038101906103a89190611586565b610a2c565b6040516103ba9190611168565b60405180910390f35b6103cb610a69565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610430576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8111610469576040517f2c5211c600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104b482827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610af09092919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b826040516104fa91906115c0565b60405180910390a25050565b5f5f84848460405160200161051d93929190611635565b60405160208183030381529060405290505f81805190602001209050807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9fc7bcd308c8c8c6040518563ffffffff1660e01b8152600401610599949392919061166d565b602060405180830381865afa1580156105b4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d891906116c4565b14925050509695505050505050565b6105ef610a69565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632a56c1b030868686866040518663ffffffff1660e01b8152600401610650959493929190611802565b5f604051808303815f87803b158015610667575f5ffd5b505af1158015610679573d5f5f3e3d5ffd5b5050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461071357336040517f91ac5e4f00000000000000000000000000000000000000000000000000000000815260040161070a919061144c565b60405180910390fd5b8660200135610732885f01602081019061072d9190611508565b610b6f565b1461078b57865f0160208101906107499190611508565b87602001356040517fc26bebcc00000000000000000000000000000000000000000000000000000000815260040161078292919061184e565b60405180910390fd5b61079a87878787878787610be0565b50505050505050565b5f5f5f6002915091509091565b6107b8610a69565b6107c28282610d19565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6107f2610a69565b6107fb5f610d78565b565b5f5f905092915050565b5f3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16149050949350505050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16630c0c389e873088888888886040518863ffffffff1660e01b81526004016108cd9796959493929190611875565b5f604051808303815f87803b1580156108e4575f5ffd5b505af11580156108f6573d5f5f3e3d5ffd5b50505050505050505050565b6001602052805f5260405f205f915090505481565b61091f610a69565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ca5eb5e1826040518263ffffffff1660e01b8152600401610978919061144c565b5f604051808303815f87803b15801561098f575f5ffd5b505af11580156109a1573d5f5f3e3d5ffd5b5050505050565b6109b0610a69565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a20575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610a17919061144c565b60405180910390fd5b610a2981610d78565b50565b5f816020013560015f845f016020810190610a479190611508565b63ffffffff1663ffffffff1681526020019081526020015f2054149050919050565b610a71610e39565b73ffffffffffffffffffffffffffffffffffffffff16610a8f610841565b73ffffffffffffffffffffffffffffffffffffffff1614610aee57610ab2610e39565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401610ae5919061144c565b60405180910390fd5b565b610b6a838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401610b239291906118d8565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610e40565b505050565b5f5f60015f8463ffffffff1663ffffffff1681526020019081526020015f205490505f5f1b8103610bd757826040517ff6ff4fb7000000000000000000000000000000000000000000000000000000008152600401610bce91906118ff565b60405180910390fd5b80915050919050565b5f5f5f8787810190610bf29190611953565b9250925092505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c5d576040517f3d9eb1db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ca883837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16610af09092919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fdd9f27a2298663148e8518b15d063f9febfad5269089f80b35cd6f59074190c684604051610d0591906115c0565b60405180910390a350505050505050505050565b8060015f8463ffffffff1663ffffffff1681526020019081526020015f20819055507f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b8282604051610d6c92919061184e565b60405180910390a15050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f5f60205f8451602086015f885af180610e5f576040513d5f823e3d81fd5b3d92505f519150505f8214610e78576001811415610e93565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b15610ed557836040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401610ecc919061144c565b60405180910390fd5b50505050565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610f0c82610ee3565b9050919050565b610f1c81610f02565b8114610f26575f5ffd5b50565b5f81359050610f3781610f13565b92915050565b5f819050919050565b610f4f81610f3d565b8114610f59575f5ffd5b50565b5f81359050610f6a81610f46565b92915050565b5f5f60408385031215610f8657610f85610edb565b5b5f610f9385828601610f29565b9250506020610fa485828601610f5c565b9150509250929050565b5f63ffffffff82169050919050565b610fc681610fae565b8114610fd0575f5ffd5b50565b5f81359050610fe181610fbd565b92915050565b5f819050919050565b610ff981610fe7565b8114611003575f5ffd5b50565b5f8135905061101481610ff0565b92915050565b5f67ffffffffffffffff82169050919050565b6110368161101a565b8114611040575f5ffd5b50565b5f813590506110518161102d565b92915050565b5f5ffd5b5f5ffd5b5f5ffd5b5f5f83601f84011261107857611077611057565b5b8235905067ffffffffffffffff8111156110955761109461105b565b5b6020830191508360018202830111156110b1576110b061105f565b5b9250929050565b5f5f5f5f5f5f60a087890312156110d2576110d1610edb565b5b5f6110df89828a01610fd3565b96505060206110f089828a01611006565b955050604061110189828a01611043565b945050606061111289828a01611006565b935050608087013567ffffffffffffffff81111561113357611132610edf565b5b61113f89828a01611063565b92509250509295509295509295565b5f8115159050919050565b6111628161114e565b82525050565b5f60208201905061117b5f830184611159565b92915050565b5f5ffd5b5f6060828403121561119a57611199611181565b5b81905092915050565b5f5f5f5f60a085870312156111bb576111ba610edb565b5b5f6111c887828801611185565b94505060606111d987828801611006565b935050608085013567ffffffffffffffff8111156111fa576111f9610edf565b5b61120687828801611063565b925092505092959194509250565b5f5f5f5f5f5f5f60e0888a03121561122f5761122e610edb565b5b5f61123c8a828b01611185565b975050606061124d8a828b01611006565b965050608088013567ffffffffffffffff81111561126e5761126d610edf565b5b61127a8a828b01611063565b955095505060a061128d8a828b01610f29565b93505060c088013567ffffffffffffffff8111156112ae576112ad610edf565b5b6112ba8a828b01611063565b925092505092959891949750929550565b6112d48161101a565b82525050565b5f6040820190506112ed5f8301856112cb565b6112fa60208301846112cb565b9392505050565b5f5f6040838503121561131757611316610edb565b5b5f61132485828601610fd3565b925050602061133585828601611006565b9150509250929050565b5f819050919050565b5f61136261135d61135884610ee3565b61133f565b610ee3565b9050919050565b5f61137382611348565b9050919050565b5f61138482611369565b9050919050565b6113948161137a565b82525050565b5f6020820190506113ad5f83018461138b565b92915050565b5f6020820190506113c65f8301846112cb565b92915050565b5f5f5f5f60a085870312156113e4576113e3610edb565b5b5f6113f187828801611185565b945050606085013567ffffffffffffffff81111561141257611411610edf565b5b61141e87828801611063565b9350935050608061143187828801610f29565b91505092959194509250565b61144681610f02565b82525050565b5f60208201905061145f5f83018461143d565b92915050565b5f5f5f5f5f5f60c0878903121561147f5761147e610edb565b5b5f61148c89828a01611185565b965050606061149d89828a01611006565b955050608087013567ffffffffffffffff8111156114be576114bd610edf565b5b6114ca89828a01611063565b945094505060a087013567ffffffffffffffff8111156114ed576114ec610edf565b5b6114f989828a01611063565b92509250509295509295509295565b5f6020828403121561151d5761151c610edb565b5b5f61152a84828501610fd3565b91505092915050565b61153c81610fe7565b82525050565b5f6020820190506115555f830184611533565b92915050565b5f602082840312156115705761156f610edb565b5b5f61157d84828501610f29565b91505092915050565b5f6060828403121561159b5761159a610edb565b5b5f6115a884828501611185565b91505092915050565b6115ba81610f3d565b82525050565b5f6020820190506115d35f8301846115b1565b92915050565b5f819050919050565b6115f36115ee82610fe7565b6115d9565b82525050565b5f81905092915050565b828183375f83830152505050565b5f61161c83856115f9565b9350611629838584611603565b82840190509392505050565b5f61164082866115e2565b602082019150611651828486611611565b9150819050949350505050565b61166781610fae565b82525050565b5f6080820190506116805f83018761143d565b61168d602083018661165e565b61169a6040830185611533565b6116a760608301846112cb565b95945050505050565b5f815190506116be81610ff0565b92915050565b5f602082840312156116d9576116d8610edb565b5b5f6116e6848285016116b0565b91505092915050565b5f6116fd6020840184610fd3565b905092915050565b61170e81610fae565b82525050565b5f6117226020840184611006565b905092915050565b61173381610fe7565b82525050565b5f6117476020840184611043565b905092915050565b6117588161101a565b82525050565b6060820161176e5f8301836116ef565b61177a5f850182611705565b506117886020830183611714565b611795602085018261172a565b506117a36040830183611739565b6117b0604085018261174f565b50505050565b5f82825260208201905092915050565b5f601f19601f8301169050919050565b5f6117e183856117b6565b93506117ee838584611603565b6117f7836117c6565b840190509392505050565b5f60c0820190506118155f83018861143d565b611822602083018761175e565b61182f6080830186611533565b81810360a08301526118428184866117d6565b90509695505050505050565b5f6040820190506118615f83018561165e565b61186e6020830184611533565b9392505050565b5f60e0820190506118885f83018a61175e565b611895606083018961143d565b6118a26080830188611533565b81810360a08301526118b58186886117d6565b905081810360c08301526118ca8184866117d6565b905098975050505050505050565b5f6040820190506118eb5f83018561143d565b6118f860208301846115b1565b9392505050565b5f6020820190506119125f83018461165e565b92915050565b5f61192282610ee3565b9050919050565b61193281611918565b811461193c575f5ffd5b50565b5f8135905061194d81611929565b92915050565b5f5f5f6060848603121561196a57611969610edb565b5b5f6119778682870161193f565b935050602061198886828701610f5c565b92505060406119998682870161193f565b915050925092509256fea26469706673582212207202fd70410df61eca847a9ccc44a55e49e9ecf277f8e0c05a6f0c0dbacc0b6564736f6c634300081e0033", - "sourceMap": "586:2357:52:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2291:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2557:384;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2107:178;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4368:708:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1193:143;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1724:108:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;446:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2293:101:37;;;;;;;;;;;;;:::i;:::-;;3507:128:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2013:216;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1638:85:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1879:222:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;569:48:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3252:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2543:215:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2771:149:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2291:260:52;1531:13:37;:11;:13::i;:::-;2394:1:52::1;2380:16;;:2;:16;;::::0;2372:43:::1;;;;;;;;;;;;;;;;;2442:1;2433:6;:10;2425:36;;;;;;;;;;;;;;;;;2471:31;2491:2;2495:6;2471;:19;;;;:31;;;;;:::i;:::-;2533:2;2517:27;;;2537:6;2517:27;;;;;;:::i;:::-;;;;;;;;2291:260:::0;;:::o;2557:384::-;2713:4;2733:20;2773:4;2779:7;;2756:31;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2733:54;;2797:19;2829:7;2819:18;;;;;;2797:40;;2923:11;2854:8;:27;;;2890:4;2897:6;2905;2913:5;2854:65;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:80;2847:87;;;;2557:384;;;;;;;;:::o;2107:178::-;1531:13:37;:11;:13::i;:::-;2223:8:52::1;:14;;;2246:4;2253:7;2262:5;2269:8;;2223:55;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2107:178:::0;;;;:::o;4368:708:3:-;4694:10;4673:31;;4681:8;4673:31;;;4669:68;;4726:10;4713:24;;;;;;;;;;;:::i;:::-;;;;;;;;4669:68;4873:7;:14;;;4837:32;4854:7;:14;;;;;;;;;;:::i;:::-;4837:16;:32::i;:::-;:50;4833:103;;4905:7;:14;;;;;;;;;;:::i;:::-;4921:7;:14;;;4896:40;;;;;;;;;;;;:::i;:::-;;;;;;;;4833:103;5010:59;5021:7;5030:5;5037:8;;5047:9;5058:10;;5010;:59::i;:::-;4368:708;;;;;;;:::o;1193:143::-;1245:20;1267:22;1309:1;678;1301:28;;;;1193:143;;:::o;1724:108:2:-;1531:13:37;:11;:13::i;:::-;1804:21:2::1;1813:4;1819:5;1804:8;:21::i;:::-;1724:108:::0;;:::o;446:46::-;;;:::o;2293:101:37:-;1531:13;:11;:13::i;:::-;2357:30:::1;2384:1;2357:18;:30::i;:::-;2293:101::o:0;3507:128:3:-;3596:12;3627:1;3620:8;;3507:128;;;;:::o;2013:216::-;2175:4;2217;2198:24;;:7;:24;;;2191:31;;2013:216;;;;;;:::o;1638:85:37:-;1684:7;1710:6;;;;;;;;;;;1703:13;;1638:85;:::o;1879:222:52:-;2023:8;:18;;;2042:7;2059:4;2066:5;2073:8;;2083:10;;2023:71;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1879:222;;;;;;:::o;569:48:2:-;;;;;;;;;;;;;;;;;:::o;3252:105::-;1531:13:37;:11;:13::i;:::-;3319:8:2::1;:20;;;3340:9;3319:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3252:105:::0;:::o;2543:215:37:-;1531:13;:11;:13::i;:::-;2647:1:::1;2627:22;;:8;:22;;::::0;2623:91:::1;;2700:1;2672:31;;;;;;;;;;;:::i;:::-;;;;;;;;2623:91;2723:28;2742:8;2723:18;:28::i;:::-;2543:215:::0;:::o;2771:149:3:-;2853:4;2900:6;:13;;;2876:5;:20;2882:6;:13;;;;;;;;;;:::i;:::-;2876:20;;;;;;;;;;;;;;;;:37;2869:44;;2771:149;;;:::o;1796:162:37:-;1866:12;:10;:12::i;:::-;1855:23;;:7;:5;:7::i;:::-;:23;;;1851:101;;1928:12;:10;:12::i;:::-;1901:40;;;;;;;;;;;:::i;:::-;;;;;;;;1851:101;1796:162::o;1219:160:42:-;1301:71;1321:5;1343;:14;;;1360:2;1364:5;1328:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1301:19;:71::i;:::-;1219:160;;;:::o;2718:196:2:-;2788:7;2807:12;2822:5;:11;2828:4;2822:11;;;;;;;;;;;;;;;;2807:26;;2863:1;2855:10;;2847:4;:18;2843:43;;2881:4;2874:12;;;;;;;;;;;:::i;:::-;;;;;;;;2843:43;2903:4;2896:11;;;2718:196;;;:::o;1221:581:52:-;1525:17;1544:14;1560:15;1590:8;;1579:49;;;;;;;:::i;:::-;1524:104;;;;;;1668:1;1647:23;;:9;:23;;;1639:49;;;;;;;;;;;;;;;;;1699:38;1719:9;1730:6;1699;:19;;;;:38;;;;;:::i;:::-;1777:9;1752:43;;1768:7;1752:43;;;1788:6;1752:43;;;;;;:::i;:::-;;;;;;;;1440:362;;;1221:581;;;;;;;:::o;2286:134:2:-;2373:5;2359;:11;2365:4;2359:11;;;;;;;;;;;;;;;:19;;;;2393:20;2401:4;2407:5;2393:20;;;;;;;:::i;:::-;;;;;;;;2286:134;;:::o;2912:187:37:-;2985:16;3004:6;;;;;;;;;;;2985:25;;3029:8;3020:6;;:17;;;;;;;;;;;;;;;;;;3083:8;3052:40;;3073:8;3052:40;;;;;;;;;;;;2975:124;2912:187;:::o;656:96:43:-;709:7;735:10;728:17;;656:96;:::o;8370:720:42:-;8450:18;8478:19;8616:4;8613:1;8606:4;8600:11;8593:4;8587;8583:15;8580:1;8573:5;8566;8561:60;8673:7;8663:176;;8717:4;8711:11;8762:16;8759:1;8754:3;8739:40;8808:16;8803:3;8796:29;8663:176;8866:16;8852:30;;8916:1;8910:8;8895:23;;8532:396;8956:1;8942:10;:15;:68;;9009:1;8994:11;:16;;8942:68;;;8990:1;8968:5;8960:26;;;:31;8942:68;8938:146;;;9066:5;9033:40;;;;;;;;;;;:::i;:::-;;;;;;;;8938:146;8440:650;;8370:720;;:::o;88:117:59:-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:93::-;1713:7;1753:10;1746:5;1742:22;1731:33;;1677:93;;;:::o;1776:120::-;1848:23;1865:5;1848:23;:::i;:::-;1841:5;1838:34;1828:62;;1886:1;1883;1876:12;1828:62;1776:120;:::o;1902:137::-;1947:5;1985:6;1972:20;1963:29;;2001:32;2027:5;2001:32;:::i;:::-;1902:137;;;;:::o;2045:77::-;2082:7;2111:5;2100:16;;2045:77;;;:::o;2128:122::-;2201:24;2219:5;2201:24;:::i;:::-;2194:5;2191:35;2181:63;;2240:1;2237;2230:12;2181:63;2128:122;:::o;2256:139::-;2302:5;2340:6;2327:20;2318:29;;2356:33;2383:5;2356:33;:::i;:::-;2256:139;;;;:::o;2401:101::-;2437:7;2477:18;2470:5;2466:30;2455:41;;2401:101;;;:::o;2508:120::-;2580:23;2597:5;2580:23;:::i;:::-;2573:5;2570:34;2560:62;;2618:1;2615;2608:12;2560:62;2508:120;:::o;2634:137::-;2679:5;2717:6;2704:20;2695:29;;2733:32;2759:5;2733:32;:::i;:::-;2634:137;;;;:::o;2777:117::-;2886:1;2883;2876:12;2900:117;3009:1;3006;2999:12;3023:117;3132:1;3129;3122:12;3159:552;3216:8;3226:6;3276:3;3269:4;3261:6;3257:17;3253:27;3243:122;;3284:79;;:::i;:::-;3243:122;3397:6;3384:20;3374:30;;3427:18;3419:6;3416:30;3413:117;;;3449:79;;:::i;:::-;3413:117;3563:4;3555:6;3551:17;3539:29;;3617:3;3609:4;3601:6;3597:17;3587:8;3583:32;3580:41;3577:128;;;3624:79;;:::i;:::-;3577:128;3159:552;;;;;:::o;3717:1105::-;3821:6;3829;3837;3845;3853;3861;3910:3;3898:9;3889:7;3885:23;3881:33;3878:120;;;3917:79;;:::i;:::-;3878:120;4037:1;4062:52;4106:7;4097:6;4086:9;4082:22;4062:52;:::i;:::-;4052:62;;4008:116;4163:2;4189:53;4234:7;4225:6;4214:9;4210:22;4189:53;:::i;:::-;4179:63;;4134:118;4291:2;4317:52;4361:7;4352:6;4341:9;4337:22;4317:52;:::i;:::-;4307:62;;4262:117;4418:2;4444:53;4489:7;4480:6;4469:9;4465:22;4444:53;:::i;:::-;4434:63;;4389:118;4574:3;4563:9;4559:19;4546:33;4606:18;4598:6;4595:30;4592:117;;;4628:79;;:::i;:::-;4592:117;4741:64;4797:7;4788:6;4777:9;4773:22;4741:64;:::i;:::-;4723:82;;;;4517:298;3717:1105;;;;;;;;:::o;4828:90::-;4862:7;4905:5;4898:13;4891:21;4880:32;;4828:90;;;:::o;4924:109::-;5005:21;5020:5;5005:21;:::i;:::-;5000:3;4993:34;4924:109;;:::o;5039:210::-;5126:4;5164:2;5153:9;5149:18;5141:26;;5177:65;5239:1;5228:9;5224:17;5215:6;5177:65;:::i;:::-;5039:210;;;;:::o;5255:117::-;5364:1;5361;5354:12;5399:230;5471:5;5512:2;5503:6;5498:3;5494:16;5490:25;5487:112;;;5518:79;;:::i;:::-;5487:112;5617:6;5608:15;;5399:230;;;;:::o;5635:871::-;5749:6;5757;5765;5773;5822:3;5810:9;5801:7;5797:23;5793:33;5790:120;;;5829:79;;:::i;:::-;5790:120;5949:1;5974:79;6045:7;6036:6;6025:9;6021:22;5974:79;:::i;:::-;5964:89;;5920:143;6102:2;6128:53;6173:7;6164:6;6153:9;6149:22;6128:53;:::i;:::-;6118:63;;6073:118;6258:3;6247:9;6243:19;6230:33;6290:18;6282:6;6279:30;6276:117;;;6312:79;;:::i;:::-;6276:117;6425:64;6481:7;6472:6;6461:9;6457:22;6425:64;:::i;:::-;6407:82;;;;6201:298;5635:871;;;;;;;:::o;6512:1361::-;6655:6;6663;6671;6679;6687;6695;6703;6752:3;6740:9;6731:7;6727:23;6723:33;6720:120;;;6759:79;;:::i;:::-;6720:120;6879:1;6904:79;6975:7;6966:6;6955:9;6951:22;6904:79;:::i;:::-;6894:89;;6850:143;7032:2;7058:53;7103:7;7094:6;7083:9;7079:22;7058:53;:::i;:::-;7048:63;;7003:118;7188:3;7177:9;7173:19;7160:33;7220:18;7212:6;7209:30;7206:117;;;7242:79;;:::i;:::-;7206:117;7355:64;7411:7;7402:6;7391:9;7387:22;7355:64;:::i;:::-;7337:82;;;;7131:298;7468:3;7495:53;7540:7;7531:6;7520:9;7516:22;7495:53;:::i;:::-;7485:63;;7439:119;7625:3;7614:9;7610:19;7597:33;7657:18;7649:6;7646:30;7643:117;;;7679:79;;:::i;:::-;7643:117;7792:64;7848:7;7839:6;7828:9;7824:22;7792:64;:::i;:::-;7774:82;;;;7568:298;6512:1361;;;;;;;;;;:::o;7879:115::-;7964:23;7981:5;7964:23;:::i;:::-;7959:3;7952:36;7879:115;;:::o;8000:324::-;8117:4;8155:2;8144:9;8140:18;8132:26;;8168:69;8234:1;8223:9;8219:17;8210:6;8168:69;:::i;:::-;8247:70;8313:2;8302:9;8298:18;8289:6;8247:70;:::i;:::-;8000:324;;;;;:::o;8330:472::-;8397:6;8405;8454:2;8442:9;8433:7;8429:23;8425:32;8422:119;;;8460:79;;:::i;:::-;8422:119;8580:1;8605:52;8649:7;8640:6;8629:9;8625:22;8605:52;:::i;:::-;8595:62;;8551:116;8706:2;8732:53;8777:7;8768:6;8757:9;8753:22;8732:53;:::i;:::-;8722:63;;8677:118;8330:472;;;;;:::o;8808:60::-;8836:3;8857:5;8850:12;;8808:60;;;:::o;8874:142::-;8924:9;8957:53;8975:34;8984:24;9002:5;8984:24;:::i;:::-;8975:34;:::i;:::-;8957:53;:::i;:::-;8944:66;;8874:142;;;:::o;9022:126::-;9072:9;9105:37;9136:5;9105:37;:::i;:::-;9092:50;;9022:126;;;:::o;9154:155::-;9233:9;9266:37;9297:5;9266:37;:::i;:::-;9253:50;;9154:155;;;:::o;9315:189::-;9431:66;9491:5;9431:66;:::i;:::-;9426:3;9419:79;9315:189;;:::o;9510:280::-;9632:4;9670:2;9659:9;9655:18;9647:26;;9683:100;9780:1;9769:9;9765:17;9756:6;9683:100;:::i;:::-;9510:280;;;;:::o;9796:218::-;9887:4;9925:2;9914:9;9910:18;9902:26;;9938:69;10004:1;9993:9;9989:17;9980:6;9938:69;:::i;:::-;9796:218;;;;:::o;10020:871::-;10134:6;10142;10150;10158;10207:3;10195:9;10186:7;10182:23;10178:33;10175:120;;;10214:79;;:::i;:::-;10175:120;10334:1;10359:79;10430:7;10421:6;10410:9;10406:22;10359:79;:::i;:::-;10349:89;;10305:143;10515:2;10504:9;10500:18;10487:32;10546:18;10538:6;10535:30;10532:117;;;10568:79;;:::i;:::-;10532:117;10681:64;10737:7;10728:6;10717:9;10713:22;10681:64;:::i;:::-;10663:82;;;;10458:297;10794:3;10821:53;10866:7;10857:6;10846:9;10842:22;10821:53;:::i;:::-;10811:63;;10765:119;10020:871;;;;;;;:::o;10897:118::-;10984:24;11002:5;10984:24;:::i;:::-;10979:3;10972:37;10897:118;;:::o;11021:222::-;11114:4;11152:2;11141:9;11137:18;11129:26;;11165:71;11233:1;11222:9;11218:17;11209:6;11165:71;:::i;:::-;11021:222;;;;:::o;11249:1215::-;11383:6;11391;11399;11407;11415;11423;11472:3;11460:9;11451:7;11447:23;11443:33;11440:120;;;11479:79;;:::i;:::-;11440:120;11599:1;11624:79;11695:7;11686:6;11675:9;11671:22;11624:79;:::i;:::-;11614:89;;11570:143;11752:2;11778:53;11823:7;11814:6;11803:9;11799:22;11778:53;:::i;:::-;11768:63;;11723:118;11908:3;11897:9;11893:19;11880:33;11940:18;11932:6;11929:30;11926:117;;;11962:79;;:::i;:::-;11926:117;12075:64;12131:7;12122:6;12111:9;12107:22;12075:64;:::i;:::-;12057:82;;;;11851:298;12216:3;12205:9;12201:19;12188:33;12248:18;12240:6;12237:30;12234:117;;;12270:79;;:::i;:::-;12234:117;12383:64;12439:7;12430:6;12419:9;12415:22;12383:64;:::i;:::-;12365:82;;;;12159:298;11249:1215;;;;;;;;:::o;12470:327::-;12528:6;12577:2;12565:9;12556:7;12552:23;12548:32;12545:119;;;12583:79;;:::i;:::-;12545:119;12703:1;12728:52;12772:7;12763:6;12752:9;12748:22;12728:52;:::i;:::-;12718:62;;12674:116;12470:327;;;;:::o;12803:118::-;12890:24;12908:5;12890:24;:::i;:::-;12885:3;12878:37;12803:118;;:::o;12927:222::-;13020:4;13058:2;13047:9;13043:18;13035:26;;13071:71;13139:1;13128:9;13124:17;13115:6;13071:71;:::i;:::-;12927:222;;;;:::o;13155:329::-;13214:6;13263:2;13251:9;13242:7;13238:23;13234:32;13231:119;;;13269:79;;:::i;:::-;13231:119;13389:1;13414:53;13459:7;13450:6;13439:9;13435:22;13414:53;:::i;:::-;13404:63;;13360:117;13155:329;;;;:::o;13490:381::-;13575:6;13624:2;13612:9;13603:7;13599:23;13595:32;13592:119;;;13630:79;;:::i;:::-;13592:119;13750:1;13775:79;13846:7;13837:6;13826:9;13822:22;13775:79;:::i;:::-;13765:89;;13721:143;13490:381;;;;:::o;13877:118::-;13964:24;13982:5;13964:24;:::i;:::-;13959:3;13952:37;13877:118;;:::o;14001:222::-;14094:4;14132:2;14121:9;14117:18;14109:26;;14145:71;14213:1;14202:9;14198:17;14189:6;14145:71;:::i;:::-;14001:222;;;;:::o;14229:79::-;14268:7;14297:5;14286:16;;14229:79;;;:::o;14314:157::-;14419:45;14439:24;14457:5;14439:24;:::i;:::-;14419:45;:::i;:::-;14414:3;14407:58;14314:157;;:::o;14477:147::-;14578:11;14615:3;14600:18;;14477:147;;;;:::o;14630:148::-;14728:6;14723:3;14718;14705:30;14769:1;14760:6;14755:3;14751:16;14744:27;14630:148;;;:::o;14806:327::-;14920:3;14941:88;15022:6;15017:3;14941:88;:::i;:::-;14934:95;;15039:56;15088:6;15083:3;15076:5;15039:56;:::i;:::-;15120:6;15115:3;15111:16;15104:23;;14806:327;;;;;:::o;15139:432::-;15307:3;15322:75;15393:3;15384:6;15322:75;:::i;:::-;15422:2;15417:3;15413:12;15406:19;;15442:103;15541:3;15532:6;15524;15442:103;:::i;:::-;15435:110;;15562:3;15555:10;;15139:432;;;;;;:::o;15577:115::-;15662:23;15679:5;15662:23;:::i;:::-;15657:3;15650:36;15577:115;;:::o;15698:545::-;15871:4;15909:3;15898:9;15894:19;15886:27;;15923:71;15991:1;15980:9;15976:17;15967:6;15923:71;:::i;:::-;16004:70;16070:2;16059:9;16055:18;16046:6;16004:70;:::i;:::-;16084:72;16152:2;16141:9;16137:18;16128:6;16084:72;:::i;:::-;16166:70;16232:2;16221:9;16217:18;16208:6;16166:70;:::i;:::-;15698:545;;;;;;;:::o;16249:143::-;16306:5;16337:6;16331:13;16322:22;;16353:33;16380:5;16353:33;:::i;:::-;16249:143;;;;:::o;16398:351::-;16468:6;16517:2;16505:9;16496:7;16492:23;16488:32;16485:119;;;16523:79;;:::i;:::-;16485:119;16643:1;16668:64;16724:7;16715:6;16704:9;16700:22;16668:64;:::i;:::-;16658:74;;16614:128;16398:351;;;;:::o;16755:120::-;16806:5;16831:38;16865:2;16860:3;16856:12;16851:3;16831:38;:::i;:::-;16822:47;;16755:120;;;;:::o;16881:105::-;16956:23;16973:5;16956:23;:::i;:::-;16951:3;16944:36;16881:105;;:::o;16992:122::-;17044:5;17069:39;17104:2;17099:3;17095:12;17090:3;17069:39;:::i;:::-;17060:48;;16992:122;;;;:::o;17120:108::-;17197:24;17215:5;17197:24;:::i;:::-;17192:3;17185:37;17120:108;;:::o;17234:120::-;17285:5;17310:38;17344:2;17339:3;17335:12;17330:3;17310:38;:::i;:::-;17301:47;;17234:120;;;;:::o;17360:105::-;17435:23;17452:5;17435:23;:::i;:::-;17430:3;17423:36;17360:105;;:::o;17509:761::-;17656:4;17651:3;17647:14;17728:49;17771:4;17764:5;17760:16;17753:5;17728:49;:::i;:::-;17790:61;17845:4;17840:3;17836:14;17822:12;17790:61;:::i;:::-;17671:190;17928:50;17972:4;17965:5;17961:16;17954:5;17928:50;:::i;:::-;17991:63;18048:4;18043:3;18039:14;18025:12;17991:63;:::i;:::-;17871:193;18130:49;18173:4;18166:5;18162:16;18155:5;18130:49;:::i;:::-;18192:61;18247:4;18242:3;18238:14;18224:12;18192:61;:::i;:::-;18074:189;17625:645;17509:761;;:::o;18276:168::-;18359:11;18393:6;18388:3;18381:19;18433:4;18428:3;18424:14;18409:29;;18276:168;;;;:::o;18450:102::-;18491:6;18542:2;18538:7;18533:2;18526:5;18522:14;18518:28;18508:38;;18450:102;;;:::o;18580:314::-;18676:3;18697:70;18760:6;18755:3;18697:70;:::i;:::-;18690:77;;18777:56;18826:6;18821:3;18814:5;18777:56;:::i;:::-;18858:29;18880:6;18858:29;:::i;:::-;18853:3;18849:39;18842:46;;18580:314;;;;;:::o;18900:762::-;19155:4;19193:3;19182:9;19178:19;19170:27;;19207:71;19275:1;19264:9;19260:17;19251:6;19207:71;:::i;:::-;19288:122;19406:2;19395:9;19391:18;19382:6;19288:122;:::i;:::-;19420:73;19488:3;19477:9;19473:19;19464:6;19420:73;:::i;:::-;19541:9;19535:4;19531:20;19525:3;19514:9;19510:19;19503:49;19569:86;19650:4;19641:6;19633;19569:86;:::i;:::-;19561:94;;18900:762;;;;;;;;:::o;19668:328::-;19787:4;19825:2;19814:9;19810:18;19802:26;;19838:69;19904:1;19893:9;19889:17;19880:6;19838:69;:::i;:::-;19917:72;19985:2;19974:9;19970:18;19961:6;19917:72;:::i;:::-;19668:328;;;;;:::o;20002:980::-;20313:4;20351:3;20340:9;20336:19;20328:27;;20365:121;20483:1;20472:9;20468:17;20459:6;20365:121;:::i;:::-;20496:72;20564:2;20553:9;20549:18;20540:6;20496:72;:::i;:::-;20578:73;20646:3;20635:9;20631:19;20622:6;20578:73;:::i;:::-;20699:9;20693:4;20689:20;20683:3;20672:9;20668:19;20661:49;20727:86;20808:4;20799:6;20791;20727:86;:::i;:::-;20719:94;;20861:9;20855:4;20851:20;20845:3;20834:9;20830:19;20823:49;20889:86;20970:4;20961:6;20953;20889:86;:::i;:::-;20881:94;;20002:980;;;;;;;;;;:::o;20988:332::-;21109:4;21147:2;21136:9;21132:18;21124:26;;21160:71;21228:1;21217:9;21213:17;21204:6;21160:71;:::i;:::-;21241:72;21309:2;21298:9;21294:18;21285:6;21241:72;:::i;:::-;20988:332;;;;;:::o;21326:218::-;21417:4;21455:2;21444:9;21440:18;21432:26;;21468:69;21534:1;21523:9;21519:17;21510:6;21468:69;:::i;:::-;21326:218;;;;:::o;21550:104::-;21595:7;21624:24;21642:5;21624:24;:::i;:::-;21613:35;;21550:104;;;:::o;21660:138::-;21741:32;21767:5;21741:32;:::i;:::-;21734:5;21731:43;21721:71;;21788:1;21785;21778:12;21721:71;21660:138;:::o;21804:155::-;21858:5;21896:6;21883:20;21874:29;;21912:41;21947:5;21912:41;:::i;:::-;21804:155;;;;:::o;21965:651::-;22058:6;22066;22074;22123:2;22111:9;22102:7;22098:23;22094:32;22091:119;;;22129:79;;:::i;:::-;22091:119;22249:1;22274:61;22327:7;22318:6;22307:9;22303:22;22274:61;:::i;:::-;22264:71;;22220:125;22384:2;22410:53;22455:7;22446:6;22435:9;22431:22;22410:53;:::i;:::-;22400:63;;22355:118;22512:2;22538:61;22591:7;22582:6;22571:9;22567:22;22538:61;:::i;:::-;22528:71;;22483:126;21965:651;;;;;:::o", - "linkReferences": {}, - "immutableReferences": { - "46390": [{ "start": 1136, "length": 32 }, { "start": 3172, "length": 32 }], - "535": [ - { "start": 1340, "length": 32 }, - { "start": 1521, "length": 32 }, - { "start": 1692, "length": 32 }, - { "start": 1992, "length": 32 }, - { "start": 2154, "length": 32 }, - { "start": 2337, "length": 32 } - ] - } - }, - "methodIdentifiers": { - "allowInitializePath((uint32,bytes32,uint64))": "ff7bd03d", - "clearMessage((uint32,bytes32,uint64),bytes32,bytes)": "0a96997d", - "endpoint()": "5e280f11", - "hasStoredPayload(uint32,bytes32,uint64,bytes32,bytes)": "0787bddb", - "isComposeMsgSender((uint32,bytes32,uint64),bytes,address)": "82413eac", - "lzReceive((uint32,bytes32,uint64),bytes32,bytes,address,bytes)": "13137d65", - "manualRetry((uint32,bytes32,uint64),bytes32,bytes,bytes)": "b9a9c0d6", - "nextNonce(uint32,bytes32)": "7d25a05e", - "oAppVersion()": "17442b70", - "owner()": "8da5cb5b", - "peers(uint32)": "bb0b6a53", - "renounceOwnership()": "715018a6", - "setDelegate(address)": "ca5eb5e1", - "setPeer(uint32,bytes32)": "3400288b", - "transferOwnership(address)": "f2fde38b", - "withdrawTokens(address,uint256)": "06b091f9" - }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.8.30+commit.73712a01\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_endpoint\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_delegate\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"_srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"_srcSender\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"BadSender\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadSrcEid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDelegate\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidEndpointCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"}],\"name\":\"NoPeer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"OnlyEndpoint\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"}],\"name\":\"OnlyPeer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RecipientZero\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"srcUser\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BridgeFulfilled\",\"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\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"peer\",\"type\":\"bytes32\"}],\"name\":\"PeerSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensWithdrawn\",\"type\":\"event\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"struct Origin\",\"name\":\"origin\",\"type\":\"tuple\"}],\"name\":\"allowInitializePath\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"struct Origin\",\"name\":\"_origin\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_guid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"name\":\"clearMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"endpoint\",\"outputs\":[{\"internalType\":\"contract ILayerZeroEndpointV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"guid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"hasStoredPayload\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"struct Origin\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"}],\"name\":\"isComposeMsgSender\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"struct Origin\",\"name\":\"_origin\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_guid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"_executor\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"lzReceive\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"srcEid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"sender\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"struct Origin\",\"name\":\"_origin\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"_guid\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_extraData\",\"type\":\"bytes\"}],\"name\":\"manualRetry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"nextNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"oAppVersion\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"senderVersion\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"receiverVersion\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"eid\",\"type\":\"uint32\"}],\"name\":\"peers\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"peer\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_delegate\",\"type\":\"address\"}],\"name\":\"setDelegate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"_eid\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"_peer\",\"type\":\"bytes32\"}],\"name\":\"setPeer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"BadSender()\":[{\"details\":\"Thrown when the sender address is invalid\"}],\"BadSrcEid()\":[{\"details\":\"Thrown when the source endpoint ID is invalid\"}],\"InvalidAddress()\":[{\"details\":\"Thrown when an invalid address is provided\"}],\"InvalidAmount()\":[{\"details\":\"Thrown when an invalid amount is provided\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}],\"RecipientZero()\":[{\"details\":\"Thrown when recipient address is zero\"}],\"SafeERC20FailedOperation(address)\":[{\"details\":\"An operation with an ERC-20 token failed.\"}]},\"events\":{\"BridgeFulfilled(address,address,uint256)\":{\"details\":\"Emitted when a bridge request is fulfilled on the destination chain\",\"params\":{\"amount\":\"The amount of tokens transferred\",\"recipient\":\"The recipient who received the tokens\",\"srcUser\":\"The original user who initiated the bridge on source chain\"}},\"TokensWithdrawn(address,uint256)\":{\"details\":\"Emitted when tokens are withdrawn by owner\",\"params\":{\"amount\":\"The amount of tokens withdrawn\",\"to\":\"The address that received the withdrawn tokens\"}}},\"kind\":\"dev\",\"methods\":{\"allowInitializePath((uint32,bytes32,uint64))\":{\"details\":\"This indicates to the endpoint that the OApp has enabled msgs for this particular path to be received.This defaults to assuming if a peer has been set, its initialized. Can be overridden by the OApp if there is other logic to determine this.\",\"params\":{\"origin\":\"The origin information containing the source endpoint and sender address.\"},\"returns\":{\"_0\":\"Whether the path has been initialized.\"}},\"clearMessage((uint32,bytes32,uint64),bytes32,bytes)\":{\"details\":\"Only callable by contract ownerUsed to clear messages that cannot be retried and need to be skipped\",\"params\":{\"_guid\":\"The globally unique identifier of the message\",\"_message\":\"The message payload to clear\",\"_origin\":\"The origin information of the message\"}},\"hasStoredPayload(uint32,bytes32,uint64,bytes32,bytes)\":{\"details\":\"Used to verify if a message failed execution and is stored for retry\",\"params\":{\"guid\":\"The globally unique identifier of the message\",\"message\":\"The message payload\",\"nonce\":\"The message nonce\",\"sender\":\"The sender address on source chain\",\"srcEid\":\"The source endpoint ID\"},\"returns\":{\"_0\":\"True if the payload is stored, false otherwise\"}},\"isComposeMsgSender((uint32,bytes32,uint64),bytes,address)\":{\"details\":\"_origin The origin information containing the source endpoint and sender address. - srcEid: The source chain endpoint ID. - sender: The sender address on the src chain. - nonce: The nonce of the message._message The lzReceive payload.Applications can optionally choose to implement separate composeMsg senders that are NOT the bridging layer.The default sender IS the OAppReceiver implementer.\",\"params\":{\"_sender\":\"The sender address.\"},\"returns\":{\"_0\":\"isSender Is a valid sender.\"}},\"lzReceive((uint32,bytes32,uint64),bytes32,bytes,address,bytes)\":{\"details\":\"Entry point for receiving messages or packets from the endpoint.Entry point for receiving msg/packet from the LayerZero endpoint.\",\"params\":{\"_executor\":\"The address of the executor for the received message.\",\"_extraData\":\"Additional arbitrary data provided by the corresponding executor.\",\"_guid\":\"The unique identifier for the received LayerZero message.\",\"_message\":\"The payload of the received message.\",\"_origin\":\"The origin information containing the source endpoint and sender address. - srcEid: The source chain endpoint ID. - sender: The sender address on the src chain. - nonce: The nonce of the message.\"}},\"manualRetry((uint32,bytes32,uint64),bytes32,bytes,bytes)\":{\"details\":\"Used when a message fails to execute and needs manual intervention\",\"params\":{\"_extraData\":\"Additional data for the retry\",\"_guid\":\"The globally unique identifier of the message\",\"_message\":\"The message payload\",\"_origin\":\"The origin information of the message\"}},\"nextNonce(uint32,bytes32)\":{\"details\":\"_srcEid The source endpoint ID._sender The sender address.The path nonce starts from 1. If 0 is returned it means that there is NO nonce ordered enforcement.Is required by the off-chain executor to determine the OApp expects msg execution is ordered.This is also enforced by the OApp.By default this is NOT enabled. ie. nextNonce is hardcoded to return 0.\",\"returns\":{\"nonce\":\"The next nonce.\"}},\"oAppVersion()\":{\"details\":\"Providing 0 as the default for OAppSender version. Indicates that the OAppSender is not implemented. ie. this is a RECEIVE only OApp.If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions.\",\"returns\":{\"receiverVersion\":\"The version of the OAppReceiver.sol contract.\",\"senderVersion\":\"The version of the OAppSender.sol 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.\"},\"setDelegate(address)\":{\"details\":\"Only the owner/admin of the OApp can call this function.Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract.\",\"params\":{\"_delegate\":\"The address of the delegate to be set.\"}},\"setPeer(uint32,bytes32)\":{\"details\":\"Only the owner/admin of the OApp can call this function.Indicates that the peer is trusted to send LayerZero messages to this OApp.Set this to bytes32(0) to remove the peer address.Peer is a bytes32 to accommodate non-evm chains.\",\"params\":{\"_eid\":\"The endpoint ID.\",\"_peer\":\"The address of the peer to be associated with the corresponding endpoint.\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"withdrawTokens(address,uint256)\":{\"details\":\"Only callable by contract ownerValidates that 'to' is not zero address and amount is greater than 0\",\"params\":{\"amount\":\"The amount of tokens to withdraw\",\"to\":\"The address to send tokens to\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"allowInitializePath((uint32,bytes32,uint64))\":{\"notice\":\"Checks if the path initialization is allowed based on the provided origin.\"},\"clearMessage((uint32,bytes32,uint64),bytes32,bytes)\":{\"notice\":\"Clear a stuck LayerZero message (owner only)\"},\"endpoint()\":{\"notice\":\"Retrieves the LayerZero endpoint associated with the OApp.\"},\"hasStoredPayload(uint32,bytes32,uint64,bytes32,bytes)\":{\"notice\":\"Check if a payload is stored on the LayerZero endpoint\"},\"isComposeMsgSender((uint32,bytes32,uint64),bytes,address)\":{\"notice\":\"Indicates whether an address is an approved composeMsg sender to the Endpoint.\"},\"manualRetry((uint32,bytes32,uint64),bytes32,bytes,bytes)\":{\"notice\":\"Manually retry a failed LayerZero message\"},\"nextNonce(uint32,bytes32)\":{\"notice\":\"Retrieves the next nonce for a given source endpoint and sender address.\"},\"oAppVersion()\":{\"notice\":\"Retrieves the OApp version information.\"},\"peers(uint32)\":{\"notice\":\"Retrieves the peer (OApp) associated with a corresponding endpoint.\"},\"setDelegate(address)\":{\"notice\":\"Sets the delegate address for the OApp.\"},\"setPeer(uint32,bytes32)\":{\"notice\":\"Sets the peer address (OApp instance) for a corresponding endpoint.\"},\"withdrawTokens(address,uint256)\":{\"notice\":\"Withdraw tokens from the contract (owner only)\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/MainnetBridgeOApp.sol\":\"MainnetBridgeOApp\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":@layerzerolabs/lz-evm-messagelib-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/messagelib/\",\":@layerzerolabs/lz-evm-protocol-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/\",\":@layerzerolabs/oapp/=lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/\",\":@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":@openzeppelin/=lib/openzeppelin-contracts/\",\":LayerZero-v2/=lib/LayerZero-v2/\",\":ds-test/=lib/solidity-bytes-utils/lib/forge-std/lib/ds-test/src/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":solidity-bytes-utils/=lib/solidity-bytes-utils/\"]},\"sources\":{\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppCore.sol\":{\"keccak256\":\"0x13a9c2d1d2c1f086b8624f2e84c4a4702212daae36f701d92bb915b535cbe4cc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://606515dd9193551bd2c94ac8c304f3776fafcc70e544ebf441f334658b2fd5f0\",\"dweb:/ipfs/QmZ88ey7DdZqV5taAoebabvszX5kdPMSrQCAmTteVdDtcH\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppReceiver.sol\":{\"keccak256\":\"0x0174e9f1ec4cefe4b5adc26c392269c699b9ff75965364e5b7264426a462c70b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cd12bb4fe5802c53911b9a0081a2ea10639b1f99925d1e5c1b1421d1bdc17075\",\"dweb:/ipfs/QmZonarwbKiEwQ8qoASKur2bbMjusdy9pqK9RCR4P1YPtc\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppCore.sol\":{\"keccak256\":\"0x40e49f2de74506e1da5dcaed53a39853f691647f4ceb0fccc8f49a68d3f47c58\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4a1deb2a6a3eb1fb83936c9578469142bff470295f403d7d07d955a76be3adbd\",\"dweb:/ipfs/QmS9bjSfBaE4YhQ1PCQ1TknbEPbNfRXzBK9E7SaPGyiZEv\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppReceiver.sol\":{\"keccak256\":\"0xd26135185e19b3732746d4a9e2923e896f28dec8664bab161faea2ee26fcdc3d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c236dfe386b508be33c3a1a74ae1d4fd64b8c77ae207767e9dbed0f2429518a2\",\"dweb:/ipfs/QmXVbZJjfryTRti98uN3BMh5qh4K7NuEs1RSCoBjRoYd4q\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroEndpointV2.sol\":{\"keccak256\":\"0xf7f941bee89ea6369950fe54e8ac476ae6478b958b20fc0e8a83e8ff1364eac3\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bacc29fd3866af71e59cb0bdc1cf82c882a4a7f4e2652fd413c9f12649762083\",\"dweb:/ipfs/QmZh2toLnrQDWaNYhS5K4NoW7Vxd2GdZx9KA77vKEDLAqs\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroReceiver.sol\":{\"keccak256\":\"0x9641abba8d53b08bb517d1b74801dd15ea7b84d77a6719085bd96c8ea94e3ca0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://77415ae0820859e0faf3fabdce683cce9fa03ea026ae0f6fe081ef1c9205f933\",\"dweb:/ipfs/QmXd7APqoCunQ2jYy73AHvi5gsZofLpm3SzM6FPo7zRPfL\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessageLibManager.sol\":{\"keccak256\":\"0xd710f9efe703982e8eabe15d19d6114af753ef42f2796551da782a0fb6633e4b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b5c9c874871469c871004d49a1cb5304e63ea3faaf366bfed9d718abbb9cc20a\",\"dweb:/ipfs/QmarXxE4dezAa5gBe82KCrcvWcMwa3BYqkfXbDQ3rRjfEB\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingChannel.sol\":{\"keccak256\":\"0x0878f64dffebf58c4165569416372f40860fab546b88cd926eba0d5cb6d8d972\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7e1b245d58221d16d8b5e0f01ef3e289a24a7df1ace3b94239e4d5b954ad5927\",\"dweb:/ipfs/Qmappsgp7PCY9rSSNE9Cdn4BTRX591WfCSEgq2HxhA3z6S\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingComposer.sol\":{\"keccak256\":\"0x85bc7090134529ec474866dc4bb1c48692d518c756eb0a961c82574829c51901\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b18b23a1643fc6636c4ad9d9023e2e6ca2d3c2a4a046482d4655bff09950598d\",\"dweb:/ipfs/Qma6G5SqiovwrMPfgqTrRngK1HWW373Wkf9c6YP2NhXpPk\"]},\"lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingContext.sol\":{\"keccak256\":\"0xff0c546c2813dae3e440882f46b377375f7461b0714efd80bd3f0c6e5cb8da4e\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5173fc9143bea314b159ca5a9adb5626659ef763bc598e27de5fa46efe3291a6\",\"dweb:/ipfs/QmSLFeMFPmVeGxT4sxRPW28ictjAS22M8rLeYRu9TXkA6D\"]},\"lib/openzeppelin-contracts/contracts/access/Ownable.sol\":{\"keccak256\":\"0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6\",\"dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol\":{\"keccak256\":\"0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100\",\"dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol\":{\"keccak256\":\"0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037\",\"dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ\"]},\"lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d\",\"dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303\",\"dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV\"]},\"lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol\":{\"keccak256\":\"0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508\",\"dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB\"]},\"lib/openzeppelin-contracts/contracts/utils/Context.sol\":{\"keccak256\":\"0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12\",\"dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF\"]},\"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol\":{\"keccak256\":\"0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617\",\"dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u\"]},\"src/MainnetBridgeOApp.sol\":{\"keccak256\":\"0xe7ec0a4c4e145e689f150f058d68a2b1517dd4fff736645e773126d551c43880\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://44394bd5000239b731ceb1d7b517efa26d4fa312a518f12f07f694c0994eea7f\",\"dweb:/ipfs/QmVTGcaVSgzmsNMXs7QBiWDh3iQiNgrUAHbh2utJAhEkjg\"]},\"src/interfaces/IMainnetBridgeOApp.sol\":{\"keccak256\":\"0xcb5a5dfffb3d72ccdb2080d1c0eba322b2f14d89755989ef5712ad7592976344\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e36433c7a852f73feca736a1d0bc215280d6a3c74f82aae227f35d8f46b61ec5\",\"dweb:/ipfs/QmbwPJJ5GyVs5y9Ycya5zWdhXgn3JfG41TMM5N6kKfaT3y\"]}},\"version\":1}", - "metadata": { - "compiler": { "version": "0.8.30+commit.73712a01" }, - "language": "Solidity", - "output": { - "abi": [ - { - "inputs": [ - { "internalType": "address", "name": "_endpoint", "type": "address" }, - { "internalType": "address", "name": "_delegate", "type": "address" }, - { "internalType": "address", "name": "_owner", "type": "address" }, - { "internalType": "address", "name": "_token", "type": "address" }, - { "internalType": "uint32", "name": "_srcEid", "type": "uint32" }, - { "internalType": "bytes32", "name": "_srcSender", "type": "bytes32" } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { "inputs": [], "type": "error", "name": "BadSender" }, - { "inputs": [], "type": "error", "name": "BadSrcEid" }, - { "inputs": [], "type": "error", "name": "InvalidAddress" }, - { "inputs": [], "type": "error", "name": "InvalidAmount" }, - { "inputs": [], "type": "error", "name": "InvalidDelegate" }, - { "inputs": [], "type": "error", "name": "InvalidEndpointCall" }, - { - "inputs": [{ "internalType": "uint32", "name": "eid", "type": "uint32" }], - "type": "error", - "name": "NoPeer" - }, - { - "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }], - "type": "error", - "name": "OnlyEndpoint" - }, - { - "inputs": [ - { "internalType": "uint32", "name": "eid", "type": "uint32" }, - { "internalType": "bytes32", "name": "sender", "type": "bytes32" } - ], - "type": "error", - "name": "OnlyPeer" - }, - { - "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], - "type": "error", - "name": "OwnableInvalidOwner" - }, - { - "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], - "type": "error", - "name": "OwnableUnauthorizedAccount" - }, - { "inputs": [], "type": "error", "name": "RecipientZero" }, - { - "inputs": [{ "internalType": "address", "name": "token", "type": "address" }], - "type": "error", - "name": "SafeERC20FailedOperation" - }, - { - "inputs": [ - { "internalType": "address", "name": "srcUser", "type": "address", "indexed": true }, - { "internalType": "address", "name": "recipient", "type": "address", "indexed": true }, - { "internalType": "uint256", "name": "amount", "type": "uint256", "indexed": false } - ], - "type": "event", - "name": "BridgeFulfilled", - "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": [ - { "internalType": "uint32", "name": "eid", "type": "uint32", "indexed": false }, - { "internalType": "bytes32", "name": "peer", "type": "bytes32", "indexed": false } - ], - "type": "event", - "name": "PeerSet", - "anonymous": false - }, - { - "inputs": [ - { "internalType": "address", "name": "to", "type": "address", "indexed": true }, - { "internalType": "uint256", "name": "amount", "type": "uint256", "indexed": false } - ], - "type": "event", - "name": "TokensWithdrawn", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "struct Origin", - "name": "origin", - "type": "tuple", - "components": [ - { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, - { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, - { "internalType": "uint64", "name": "nonce", "type": "uint64" } - ] - } - ], - "stateMutability": "view", - "type": "function", - "name": "allowInitializePath", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] - }, - { - "inputs": [ - { - "internalType": "struct Origin", - "name": "_origin", - "type": "tuple", - "components": [ - { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, - { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, - { "internalType": "uint64", "name": "nonce", "type": "uint64" } - ] - }, - { "internalType": "bytes32", "name": "_guid", "type": "bytes32" }, - { "internalType": "bytes", "name": "_message", "type": "bytes" } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "clearMessage" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "endpoint", - "outputs": [ - { "internalType": "contract ILayerZeroEndpointV2", "name": "", "type": "address" } - ] - }, - { - "inputs": [ - { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, - { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, - { "internalType": "uint64", "name": "nonce", "type": "uint64" }, - { "internalType": "bytes32", "name": "guid", "type": "bytes32" }, - { "internalType": "bytes", "name": "message", "type": "bytes" } - ], - "stateMutability": "view", - "type": "function", - "name": "hasStoredPayload", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] - }, - { - "inputs": [ - { - "internalType": "struct Origin", - "name": "", - "type": "tuple", - "components": [ - { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, - { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, - { "internalType": "uint64", "name": "nonce", "type": "uint64" } - ] - }, - { "internalType": "bytes", "name": "", "type": "bytes" }, - { "internalType": "address", "name": "_sender", "type": "address" } - ], - "stateMutability": "view", - "type": "function", - "name": "isComposeMsgSender", - "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] - }, - { - "inputs": [ - { - "internalType": "struct Origin", - "name": "_origin", - "type": "tuple", - "components": [ - { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, - { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, - { "internalType": "uint64", "name": "nonce", "type": "uint64" } - ] - }, - { "internalType": "bytes32", "name": "_guid", "type": "bytes32" }, - { "internalType": "bytes", "name": "_message", "type": "bytes" }, - { "internalType": "address", "name": "_executor", "type": "address" }, - { "internalType": "bytes", "name": "_extraData", "type": "bytes" } - ], - "stateMutability": "payable", - "type": "function", - "name": "lzReceive" - }, - { - "inputs": [ - { - "internalType": "struct Origin", - "name": "_origin", - "type": "tuple", - "components": [ - { "internalType": "uint32", "name": "srcEid", "type": "uint32" }, - { "internalType": "bytes32", "name": "sender", "type": "bytes32" }, - { "internalType": "uint64", "name": "nonce", "type": "uint64" } - ] - }, - { "internalType": "bytes32", "name": "_guid", "type": "bytes32" }, - { "internalType": "bytes", "name": "_message", "type": "bytes" }, - { "internalType": "bytes", "name": "_extraData", "type": "bytes" } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "manualRetry" - }, - { - "inputs": [ - { "internalType": "uint32", "name": "", "type": "uint32" }, - { "internalType": "bytes32", "name": "", "type": "bytes32" } - ], - "stateMutability": "view", - "type": "function", - "name": "nextNonce", - "outputs": [{ "internalType": "uint64", "name": "nonce", "type": "uint64" }] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "oAppVersion", - "outputs": [ - { "internalType": "uint64", "name": "senderVersion", "type": "uint64" }, - { "internalType": "uint64", "name": "receiverVersion", "type": "uint64" } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "owner", - "outputs": [{ "internalType": "address", "name": "", "type": "address" }] - }, - { - "inputs": [{ "internalType": "uint32", "name": "eid", "type": "uint32" }], - "stateMutability": "view", - "type": "function", - "name": "peers", - "outputs": [{ "internalType": "bytes32", "name": "peer", "type": "bytes32" }] - }, - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "function", - "name": "renounceOwnership" - }, - { - "inputs": [{ "internalType": "address", "name": "_delegate", "type": "address" }], - "stateMutability": "nonpayable", - "type": "function", - "name": "setDelegate" - }, - { - "inputs": [ - { "internalType": "uint32", "name": "_eid", "type": "uint32" }, - { "internalType": "bytes32", "name": "_peer", "type": "bytes32" } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "setPeer" - }, - { - "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], - "stateMutability": "nonpayable", - "type": "function", - "name": "transferOwnership" - }, - { - "inputs": [ - { "internalType": "address", "name": "to", "type": "address" }, - { "internalType": "uint256", "name": "amount", "type": "uint256" } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "withdrawTokens" - } - ], - "devdoc": { - "kind": "dev", - "methods": { - "allowInitializePath((uint32,bytes32,uint64))": { - "details": "This indicates to the endpoint that the OApp has enabled msgs for this particular path to be received.This defaults to assuming if a peer has been set, its initialized. Can be overridden by the OApp if there is other logic to determine this.", - "params": { - "origin": "The origin information containing the source endpoint and sender address." - }, - "returns": { "_0": "Whether the path has been initialized." } - }, - "clearMessage((uint32,bytes32,uint64),bytes32,bytes)": { - "details": "Only callable by contract ownerUsed to clear messages that cannot be retried and need to be skipped", - "params": { - "_guid": "The globally unique identifier of the message", - "_message": "The message payload to clear", - "_origin": "The origin information of the message" - } - }, - "hasStoredPayload(uint32,bytes32,uint64,bytes32,bytes)": { - "details": "Used to verify if a message failed execution and is stored for retry", - "params": { - "guid": "The globally unique identifier of the message", - "message": "The message payload", - "nonce": "The message nonce", - "sender": "The sender address on source chain", - "srcEid": "The source endpoint ID" - }, - "returns": { "_0": "True if the payload is stored, false otherwise" } - }, - "isComposeMsgSender((uint32,bytes32,uint64),bytes,address)": { - "details": "_origin The origin information containing the source endpoint and sender address. - srcEid: The source chain endpoint ID. - sender: The sender address on the src chain. - nonce: The nonce of the message._message The lzReceive payload.Applications can optionally choose to implement separate composeMsg senders that are NOT the bridging layer.The default sender IS the OAppReceiver implementer.", - "params": { "_sender": "The sender address." }, - "returns": { "_0": "isSender Is a valid sender." } - }, - "lzReceive((uint32,bytes32,uint64),bytes32,bytes,address,bytes)": { - "details": "Entry point for receiving messages or packets from the endpoint.Entry point for receiving msg/packet from the LayerZero endpoint.", - "params": { - "_executor": "The address of the executor for the received message.", - "_extraData": "Additional arbitrary data provided by the corresponding executor.", - "_guid": "The unique identifier for the received LayerZero message.", - "_message": "The payload of the received message.", - "_origin": "The origin information containing the source endpoint and sender address. - srcEid: The source chain endpoint ID. - sender: The sender address on the src chain. - nonce: The nonce of the message." - } - }, - "manualRetry((uint32,bytes32,uint64),bytes32,bytes,bytes)": { - "details": "Used when a message fails to execute and needs manual intervention", - "params": { - "_extraData": "Additional data for the retry", - "_guid": "The globally unique identifier of the message", - "_message": "The message payload", - "_origin": "The origin information of the message" - } - }, - "nextNonce(uint32,bytes32)": { - "details": "_srcEid The source endpoint ID._sender The sender address.The path nonce starts from 1. If 0 is returned it means that there is NO nonce ordered enforcement.Is required by the off-chain executor to determine the OApp expects msg execution is ordered.This is also enforced by the OApp.By default this is NOT enabled. ie. nextNonce is hardcoded to return 0.", - "returns": { "nonce": "The next nonce." } - }, - "oAppVersion()": { - "details": "Providing 0 as the default for OAppSender version. Indicates that the OAppSender is not implemented. ie. this is a RECEIVE only OApp.If the OApp uses both OAppSender and OAppReceiver, then this needs to be override returning the correct versions.", - "returns": { - "receiverVersion": "The version of the OAppReceiver.sol contract.", - "senderVersion": "The version of the OAppSender.sol 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." - }, - "setDelegate(address)": { - "details": "Only the owner/admin of the OApp can call this function.Provides the ability for a delegate to set configs, on behalf of the OApp, directly on the Endpoint contract.", - "params": { "_delegate": "The address of the delegate to be set." } - }, - "setPeer(uint32,bytes32)": { - "details": "Only the owner/admin of the OApp can call this function.Indicates that the peer is trusted to send LayerZero messages to this OApp.Set this to bytes32(0) to remove the peer address.Peer is a bytes32 to accommodate non-evm chains.", - "params": { - "_eid": "The endpoint ID.", - "_peer": "The address of the peer to be associated with the corresponding endpoint." - } - }, - "transferOwnership(address)": { - "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." - }, - "withdrawTokens(address,uint256)": { - "details": "Only callable by contract ownerValidates that 'to' is not zero address and amount is greater than 0", - "params": { - "amount": "The amount of tokens to withdraw", - "to": "The address to send tokens to" - } - } - }, - "version": 1 - }, - "userdoc": { - "kind": "user", - "methods": { - "allowInitializePath((uint32,bytes32,uint64))": { - "notice": "Checks if the path initialization is allowed based on the provided origin." - }, - "clearMessage((uint32,bytes32,uint64),bytes32,bytes)": { - "notice": "Clear a stuck LayerZero message (owner only)" - }, - "endpoint()": { "notice": "Retrieves the LayerZero endpoint associated with the OApp." }, - "hasStoredPayload(uint32,bytes32,uint64,bytes32,bytes)": { - "notice": "Check if a payload is stored on the LayerZero endpoint" - }, - "isComposeMsgSender((uint32,bytes32,uint64),bytes,address)": { - "notice": "Indicates whether an address is an approved composeMsg sender to the Endpoint." - }, - "manualRetry((uint32,bytes32,uint64),bytes32,bytes,bytes)": { - "notice": "Manually retry a failed LayerZero message" - }, - "nextNonce(uint32,bytes32)": { - "notice": "Retrieves the next nonce for a given source endpoint and sender address." - }, - "oAppVersion()": { "notice": "Retrieves the OApp version information." }, - "peers(uint32)": { - "notice": "Retrieves the peer (OApp) associated with a corresponding endpoint." - }, - "setDelegate(address)": { "notice": "Sets the delegate address for the OApp." }, - "setPeer(uint32,bytes32)": { - "notice": "Sets the peer address (OApp instance) for a corresponding endpoint." - }, - "withdrawTokens(address,uint256)": { - "notice": "Withdraw tokens from the contract (owner only)" - } - }, - "version": 1 - } - }, - "settings": { - "remappings": [ - "@layerzerolabs/lz-evm-messagelib-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/messagelib/", - "@layerzerolabs/lz-evm-protocol-v2/=lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/", - "@layerzerolabs/oapp/=lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/", - "@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/", - "@openzeppelin/=lib/openzeppelin-contracts/", - "LayerZero-v2/=lib/LayerZero-v2/", - "ds-test/=lib/solidity-bytes-utils/lib/forge-std/lib/ds-test/src/", - "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", - "forge-std/=lib/forge-std/src/", - "halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/", - "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", - "openzeppelin-contracts/=lib/openzeppelin-contracts/", - "solidity-bytes-utils/=lib/solidity-bytes-utils/" - ], - "optimizer": { "enabled": false, "runs": 200 }, - "metadata": { "bytecodeHash": "ipfs" }, - "compilationTarget": { "src/MainnetBridgeOApp.sol": "MainnetBridgeOApp" }, - "evmVersion": "cancun", - "libraries": {} - }, - "sources": { - "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppCore.sol": { - "keccak256": "0x13a9c2d1d2c1f086b8624f2e84c4a4702212daae36f701d92bb915b535cbe4cc", - "urls": [ - "bzz-raw://606515dd9193551bd2c94ac8c304f3776fafcc70e544ebf441f334658b2fd5f0", - "dweb:/ipfs/QmZ88ey7DdZqV5taAoebabvszX5kdPMSrQCAmTteVdDtcH" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/OAppReceiver.sol": { - "keccak256": "0x0174e9f1ec4cefe4b5adc26c392269c699b9ff75965364e5b7264426a462c70b", - "urls": [ - "bzz-raw://cd12bb4fe5802c53911b9a0081a2ea10639b1f99925d1e5c1b1421d1bdc17075", - "dweb:/ipfs/QmZonarwbKiEwQ8qoASKur2bbMjusdy9pqK9RCR4P1YPtc" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppCore.sol": { - "keccak256": "0x40e49f2de74506e1da5dcaed53a39853f691647f4ceb0fccc8f49a68d3f47c58", - "urls": [ - "bzz-raw://4a1deb2a6a3eb1fb83936c9578469142bff470295f403d7d07d955a76be3adbd", - "dweb:/ipfs/QmS9bjSfBaE4YhQ1PCQ1TknbEPbNfRXzBK9E7SaPGyiZEv" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/oapp/contracts/oapp/interfaces/IOAppReceiver.sol": { - "keccak256": "0xd26135185e19b3732746d4a9e2923e896f28dec8664bab161faea2ee26fcdc3d", - "urls": [ - "bzz-raw://c236dfe386b508be33c3a1a74ae1d4fd64b8c77ae207767e9dbed0f2429518a2", - "dweb:/ipfs/QmXVbZJjfryTRti98uN3BMh5qh4K7NuEs1RSCoBjRoYd4q" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroEndpointV2.sol": { - "keccak256": "0xf7f941bee89ea6369950fe54e8ac476ae6478b958b20fc0e8a83e8ff1364eac3", - "urls": [ - "bzz-raw://bacc29fd3866af71e59cb0bdc1cf82c882a4a7f4e2652fd413c9f12649762083", - "dweb:/ipfs/QmZh2toLnrQDWaNYhS5K4NoW7Vxd2GdZx9KA77vKEDLAqs" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/ILayerZeroReceiver.sol": { - "keccak256": "0x9641abba8d53b08bb517d1b74801dd15ea7b84d77a6719085bd96c8ea94e3ca0", - "urls": [ - "bzz-raw://77415ae0820859e0faf3fabdce683cce9fa03ea026ae0f6fe081ef1c9205f933", - "dweb:/ipfs/QmXd7APqoCunQ2jYy73AHvi5gsZofLpm3SzM6FPo7zRPfL" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessageLibManager.sol": { - "keccak256": "0xd710f9efe703982e8eabe15d19d6114af753ef42f2796551da782a0fb6633e4b", - "urls": [ - "bzz-raw://b5c9c874871469c871004d49a1cb5304e63ea3faaf366bfed9d718abbb9cc20a", - "dweb:/ipfs/QmarXxE4dezAa5gBe82KCrcvWcMwa3BYqkfXbDQ3rRjfEB" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingChannel.sol": { - "keccak256": "0x0878f64dffebf58c4165569416372f40860fab546b88cd926eba0d5cb6d8d972", - "urls": [ - "bzz-raw://7e1b245d58221d16d8b5e0f01ef3e289a24a7df1ace3b94239e4d5b954ad5927", - "dweb:/ipfs/Qmappsgp7PCY9rSSNE9Cdn4BTRX591WfCSEgq2HxhA3z6S" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingComposer.sol": { - "keccak256": "0x85bc7090134529ec474866dc4bb1c48692d518c756eb0a961c82574829c51901", - "urls": [ - "bzz-raw://b18b23a1643fc6636c4ad9d9023e2e6ca2d3c2a4a046482d4655bff09950598d", - "dweb:/ipfs/Qma6G5SqiovwrMPfgqTrRngK1HWW373Wkf9c6YP2NhXpPk" - ], - "license": "MIT" - }, - "lib/LayerZero-v2/packages/layerzero-v2/evm/protocol/contracts/interfaces/IMessagingContext.sol": { - "keccak256": "0xff0c546c2813dae3e440882f46b377375f7461b0714efd80bd3f0c6e5cb8da4e", - "urls": [ - "bzz-raw://5173fc9143bea314b159ca5a9adb5626659ef763bc598e27de5fa46efe3291a6", - "dweb:/ipfs/QmSLFeMFPmVeGxT4sxRPW28ictjAS22M8rLeYRu9TXkA6D" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/access/Ownable.sol": { - "keccak256": "0xff6d0bb2e285473e5311d9d3caacb525ae3538a80758c10649a4d61029b017bb", - "urls": [ - "bzz-raw://8ed324d3920bb545059d66ab97d43e43ee85fd3bd52e03e401f020afb0b120f6", - "dweb:/ipfs/QmfEckWLmZkDDcoWrkEvMWhms66xwTLff9DDhegYpvHo1a" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/interfaces/IERC1363.sol": { - "keccak256": "0xd5ea07362ab630a6a3dee4285a74cf2377044ca2e4be472755ad64d7c5d4b69d", - "urls": [ - "bzz-raw://da5e832b40fc5c3145d3781e2e5fa60ac2052c9d08af7e300dc8ab80c4343100", - "dweb:/ipfs/QmTzf7N5ZUdh5raqtzbM11yexiUoLC9z3Ws632MCuycq1d" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/interfaces/IERC165.sol": { - "keccak256": "0x0afcb7e740d1537b252cb2676f600465ce6938398569f09ba1b9ca240dde2dfc", - "urls": [ - "bzz-raw://1c299900ac4ec268d4570ecef0d697a3013cd11a6eb74e295ee3fbc945056037", - "dweb:/ipfs/Qmab9owJoxcA7vJT5XNayCMaUR1qxqj1NDzzisduwaJMcZ" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/interfaces/IERC20.sol": { - "keccak256": "0x1a6221315ce0307746c2c4827c125d821ee796c74a676787762f4778671d4f44", - "urls": [ - "bzz-raw://1bb2332a7ee26dd0b0de9b7fe266749f54820c99ab6a3bcb6f7e6b751d47ee2d", - "dweb:/ipfs/QmcRWpaBeCYkhy68PR3B4AgD7asuQk7PwkWxrvJbZcikLF" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol": { - "keccak256": "0x74ed01eb66b923d0d0cfe3be84604ac04b76482a55f9dd655e1ef4d367f95bc2", - "urls": [ - "bzz-raw://5282825a626cfe924e504274b864a652b0023591fa66f06a067b25b51ba9b303", - "dweb:/ipfs/QmeCfPykghhMc81VJTrHTC7sF6CRvaA1FXVq2pJhwYp1dV" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sol": { - "keccak256": "0x982c5cb790ab941d1e04f807120a71709d4c313ba0bfc16006447ffbd27fbbd5", - "urls": [ - "bzz-raw://8150ceb4ac947e8a442b2a9c017e01e880b2be2dd958f1fa9bc405f4c5a86508", - "dweb:/ipfs/QmbcBmFX66AY6Kbhnd5gx7zpkgqnUafo43XnmayAM7zVdB" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/utils/Context.sol": { - "keccak256": "0x493033a8d1b176a037b2cc6a04dad01a5c157722049bbecf632ca876224dd4b2", - "urls": [ - "bzz-raw://6a708e8a5bdb1011c2c381c9a5cfd8a9a956d7d0a9dc1bd8bcdaf52f76ef2f12", - "dweb:/ipfs/Qmax9WHBnVsZP46ZxEMNRQpLQnrdE4dK8LehML1Py8FowF" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol": { - "keccak256": "0x8891738ffe910f0cf2da09566928589bf5d63f4524dd734fd9cedbac3274dd5c", - "urls": [ - "bzz-raw://971f954442df5c2ef5b5ebf1eb245d7105d9fbacc7386ee5c796df1d45b21617", - "dweb:/ipfs/QmadRjHbkicwqwwh61raUEapaVEtaLMcYbQZWs9gUkgj3u" - ], - "license": "MIT" - }, - "src/MainnetBridgeOApp.sol": { - "keccak256": "0xe7ec0a4c4e145e689f150f058d68a2b1517dd4fff736645e773126d551c43880", - "urls": [ - "bzz-raw://44394bd5000239b731ceb1d7b517efa26d4fa312a518f12f07f694c0994eea7f", - "dweb:/ipfs/QmVTGcaVSgzmsNMXs7QBiWDh3iQiNgrUAHbh2utJAhEkjg" - ], - "license": "MIT" - }, - "src/interfaces/IMainnetBridgeOApp.sol": { - "keccak256": "0xcb5a5dfffb3d72ccdb2080d1c0eba322b2f14d89755989ef5712ad7592976344", - "urls": [ - "bzz-raw://e36433c7a852f73feca736a1d0bc215280d6a3c74f82aae227f35d8f46b61ec5", - "dweb:/ipfs/QmbwPJJ5GyVs5y9Ycya5zWdhXgn3JfG41TMM5N6kKfaT3y" - ], - "license": "MIT" - } - }, - "version": 1 - }, - "id": 52 + ] } diff --git a/packages/shared/src/config/index.ts b/packages/shared/src/config/index.ts index 6808f45..125614e 100644 --- a/packages/shared/src/config/index.ts +++ b/packages/shared/src/config/index.ts @@ -1,6 +1,6 @@ import { bool, cleanEnv, json, num, str, url } from "envalid"; import { version } from "../../../../package.json"; -import { l1Chain, l2Chain, rpcUrls } from "./validator"; +import { l1Chain, l2Chain, layerZeroNetwork, rpcUrls } from "./validator"; export const config = cleanEnv(process.env, { // app @@ -59,6 +59,7 @@ export const config = cleanEnv(process.env, { default: 0.3, desc: "Rate at which the transaction wait time increases on each retry", }), + LAYER_ZERO_NETWORK: layerZeroNetwork({ default: "testnet" }), // mint MINT_AVAILABLE_FROM: str({ devDefault: "2025-06-23T00:00:00Z", diff --git a/packages/shared/src/config/validator.ts b/packages/shared/src/config/validator.ts index 80b1e27..360f316 100644 --- a/packages/shared/src/config/validator.ts +++ b/packages/shared/src/config/validator.ts @@ -49,6 +49,13 @@ export const l1Chain = makeValidator<"mainnet" | "sepolia">((input) => { return input as "mainnet" | "sepolia"; }); +export const layerZeroNetwork = makeValidator<"mainnet" | "testnet">((input) => { + if (input !== "mainnet" && input !== "testnet") { + throw new Error("LAYER_ZERO_NETWORK must be either 'mainnet' or 'testnet'"); + } + return input as "mainnet" | "testnet"; +}); + export const l2Chain = makeValidator<"scroll" | "scrollSepolia">((input) => { if (input !== "scroll" && input !== "scrollSepolia") { throw new Error("L2_CHAIN must be either 'scroll' or 'scrollSepolia'"); diff --git a/packages/shared/src/constants/constants.ts b/packages/shared/src/constants/constants.ts index f923106..e520336 100644 --- a/packages/shared/src/constants/constants.ts +++ b/packages/shared/src/constants/constants.ts @@ -73,6 +73,10 @@ export const BASE_BRIDGE_O_APP_CONTRACT_ADDRESS = config.BASE_BRIDGE_O_APP_CONTRACT_ADDRESS as `0x${string}`; export const BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK = config.BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK; +export const MAINNET_BRIDGE_O_APP_CONTRACT_ADDRESS = + config.MAINNET_BRIDGE_O_APP_CONTRACT_ADDRESS as `0x${string}`; +export const MAINNET_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK = + config.MAINNET_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK; // mock export const MOCK_L1_SCROLL_MESSENGER_CONTRACT_ADDRESS = diff --git a/packages/shared/src/db/bridgeTransaction.ts b/packages/shared/src/db/bridgeTransaction.ts index 748173d..8ac63b8 100644 --- a/packages/shared/src/db/bridgeTransaction.ts +++ b/packages/shared/src/db/bridgeTransaction.ts @@ -44,6 +44,7 @@ export class BridgeTransaction { { ...input, status: BridgeTransactionStatus.QUEUED, + updatedAt: now, createdAt: now, }, { merge: false }, @@ -115,8 +116,8 @@ export class BridgeTransaction { async fetchBridgeTransactions(filter?: BridgeTransactionFilter) { return this.list((query) => { let modified = query; - if (filter?.tokenIndexes) { - modified = modified.where("__name__", "in", filter.tokenIndexes); + if (filter?.statuses && filter.statuses.length > 0) { + modified = modified.where("status", "in", filter.statuses); } return modified; }); diff --git a/packages/shared/src/types/bridgeTransaction.ts b/packages/shared/src/types/bridgeTransaction.ts index 623003a..ebc7cb5 100644 --- a/packages/shared/src/types/bridgeTransaction.ts +++ b/packages/shared/src/types/bridgeTransaction.ts @@ -2,6 +2,8 @@ export interface BridgeTransactionData { guid: string; status: BridgeTransactionStatus; nonce: number; + verifiedAt?: FirebaseFirestore.Timestamp; + updatedAt: FirebaseFirestore.Timestamp; createdAt: FirebaseFirestore.Timestamp; } @@ -10,7 +12,7 @@ export interface BridgeTransactionInput { } export interface BridgeTransactionFilter { - tokenIndexes?: string[]; + statuses: BridgeTransactionStatus[]; } export enum BridgeTransactionStatus { diff --git a/yarn.lock b/yarn.lock index 57e8664..f677d3b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1042,6 +1042,15 @@ __metadata: languageName: node linkType: hard +"@noble/curves@npm:1.9.6": + version: 1.9.6 + resolution: "@noble/curves@npm:1.9.6" + dependencies: + "@noble/hashes": "npm:1.8.0" + checksum: 10c0/e462875ad752d2cdffc3c7b27b6de3adcff5fae0731e94138bd9e452c5f9b7aaf4c01ea6c62d3c0544b4e7419662535bb2ef1103311de48d51885c053206e118 + languageName: node + linkType: hard + "@noble/curves@npm:^1.4.2, @noble/curves@npm:~1.9.0": version: 1.9.1 resolution: "@noble/curves@npm:1.9.1" @@ -1997,9 +2006,10 @@ __metadata: resolution: "bridge-monitor@workspace:packages/bridge-monitor" dependencies: "@intmax2-function/shared": "workspace:*" + axios: "npm:^1.11.0" tsx: "npm:^4.20.4" typescript: "npm:^5.9.2" - viem: "npm:^2.33.3" + viem: "npm:^2.34.0" vitest: "npm:^3.2.4" languageName: unknown linkType: soft @@ -3970,6 +3980,27 @@ __metadata: languageName: node linkType: hard +"ox@npm:0.8.7": + version: 0.8.7 + resolution: "ox@npm:0.8.7" + dependencies: + "@adraffy/ens-normalize": "npm:^1.11.0" + "@noble/ciphers": "npm:^1.3.0" + "@noble/curves": "npm:^1.9.1" + "@noble/hashes": "npm:^1.8.0" + "@scure/bip32": "npm:^1.7.0" + "@scure/bip39": "npm:^1.6.0" + abitype: "npm:^1.0.8" + eventemitter3: "npm:5.0.1" + peerDependencies: + typescript: ">=5.4.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/a0919651e35b60d741f745ef6a0cfa1f63daf17d43e95cae7957c291eba90248be0968ee0a6d2f268e5e79f6dbbc3ab3b4617df0bcadcae722843168639795e1 + languageName: node + linkType: hard + "p-limit@npm:^3.0.1": version: 3.1.0 resolution: "p-limit@npm:3.1.0" @@ -5016,6 +5047,27 @@ __metadata: languageName: node linkType: hard +"viem@npm:^2.34.0": + version: 2.34.0 + resolution: "viem@npm:2.34.0" + dependencies: + "@noble/curves": "npm:1.9.6" + "@noble/hashes": "npm:1.8.0" + "@scure/bip32": "npm:1.7.0" + "@scure/bip39": "npm:1.6.0" + abitype: "npm:1.0.8" + isows: "npm:1.0.7" + ox: "npm:0.8.7" + ws: "npm:8.18.3" + peerDependencies: + typescript: ">=5.0.4" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10c0/e2cd2a672d1912db63e8e0a7e95d0ce551e30ba4c4fa1fde042b23cde590eed7144fcdfce88777bfcbb8503c5f45a7b8d439e82853bc2ef746e408bf1394c4a3 + languageName: node + linkType: hard + "vite-node@npm:3.2.4": version: 3.2.4 resolution: "vite-node@npm:3.2.4" @@ -5292,6 +5344,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:8.18.3": + version: 8.18.3 + resolution: "ws@npm:8.18.3" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/eac918213de265ef7cb3d4ca348b891a51a520d839aa51cdb8ca93d4fa7ff9f6ccb339ccee89e4075324097f0a55157c89fa3f7147bde9d8d7e90335dc087b53 + languageName: node + linkType: hard + "ws@npm:^7.5.10": version: 7.5.10 resolution: "ws@npm:7.5.10" From ad073040f4a7023a61c02326980848fd31b8ebd1 Mon Sep 17 00:00:00 2001 From: signature18632 Date: Sat, 23 Aug 2025 12:59:44 +0700 Subject: [PATCH 11/12] fix --- .../src/service/job.service.ts | 5 ++- packages/bridge-monitor/src/lib/blockchain.ts | 3 ++ .../bridge-monitor/src/service/job.service.ts | 15 ++++---- .../src/service/process.service.ts | 12 +++---- .../src/service/submit.service.ts | 6 ++-- packages/shared/src/db/bridgeTransaction.ts | 34 ++++++++++++++++--- packages/shared/src/types/blockchain.ts | 2 +- .../shared/src/types/bridgeTransaction.ts | 7 ++++ 8 files changed, 60 insertions(+), 24 deletions(-) create mode 100644 packages/bridge-monitor/src/lib/blockchain.ts diff --git a/packages/bridge-event-watcher/src/service/job.service.ts b/packages/bridge-event-watcher/src/service/job.service.ts index d5b7eff..43d1deb 100644 --- a/packages/bridge-event-watcher/src/service/job.service.ts +++ b/packages/bridge-event-watcher/src/service/job.service.ts @@ -44,7 +44,7 @@ const processBridgeMonitor = async ( } const bridgeRequestedEvents = await fetchEvents(l2Client, { - startBlockNumber, + startBlockNumber: BigInt(BASE_BRIDGE_O_APP_CONTRACT_DEPLOYED_BLOCK), endBlockNumber: currentBlockNumber, blockRange: BLOCK_RANGE_TINY, contractAddress: BASE_BRIDGE_O_APP_CONTRACT_ADDRESS, @@ -54,6 +54,9 @@ const processBridgeMonitor = async ( const bridgeRequestedInputs = bridgeRequestedEvents.map((event) => ({ guid: event.args.receipt.guid, nonce: Number(event.args.receipt.nonce), + recipient: event.args.recipient, + amount: event.args.amount.toString(), + transactionHash: event.transactionHash, })); await BridgeTransaction.getInstance().saveBridgeTransactionsBatch(bridgeRequestedInputs); diff --git a/packages/bridge-monitor/src/lib/blockchain.ts b/packages/bridge-monitor/src/lib/blockchain.ts new file mode 100644 index 0000000..bdb64e1 --- /dev/null +++ b/packages/bridge-monitor/src/lib/blockchain.ts @@ -0,0 +1,3 @@ +import { createNetworkClient } from "@intmax2-function/shared"; + +export const l1Client = createNetworkClient("l1"); diff --git a/packages/bridge-monitor/src/service/job.service.ts b/packages/bridge-monitor/src/service/job.service.ts index b97a78d..7ba7d25 100644 --- a/packages/bridge-monitor/src/service/job.service.ts +++ b/packages/bridge-monitor/src/service/job.service.ts @@ -25,14 +25,12 @@ export const performJob = async () => { const sortedTransactions = bridgeTransactions.sort((a, b) => a.nonce - b.nonce); for (const bridgeTransaction of sortedTransactions) { - await processBridgeTransaction(bridgeTransaction, sortedTransactions); + await processBridgeTransaction(bridgeTransaction); } }; -const processBridgeTransaction = async ( - bridgeTransaction: BridgeTransactionData, - allTransactions: BridgeTransactionData[], -) => { +const processBridgeTransaction = async (bridgeTransaction: BridgeTransactionData) => { + // TODO: sleep and retry const bridgeGuidTransaction = await fetchBridgeGuidTransaction(bridgeTransaction.guid); const statusName = bridgeGuidTransaction.status.name; @@ -55,8 +53,7 @@ const processBridgeTransaction = async ( break; } - // updateStatus - - // if (statusName === BridgeTransactionStatus.DELIVERED) { - // } + await BridgeTransaction.getInstance().updateBridgeTransaction(bridgeTransaction.guid, { + status: statusName as BridgeTransactionStatus, + }); }; diff --git a/packages/bridge-monitor/src/service/process.service.ts b/packages/bridge-monitor/src/service/process.service.ts index 059982f..5e6cbe0 100644 --- a/packages/bridge-monitor/src/service/process.service.ts +++ b/packages/bridge-monitor/src/service/process.service.ts @@ -2,20 +2,20 @@ import { API_TIMEOUT, BridgeTransactionData, config, - createNetworkClient, Discord, logger, - MainnetBridgeOAppAbi, MAINNET_BRIDGE_O_APP_CONTRACT_ADDRESS, + MainnetBridgeOAppAbi, } from "@intmax2-function/shared"; import axios, { AxiosError } from "axios"; +import type { Abi } from "viem"; import { LAYER_ZERO_SCAN_API } from "../constants"; +import { l1Client } from "../lib/blockchain"; import type { BridgeGuidTransaction, BridgeGuidTransactionResponse } from "../types"; import { submitTransaction } from "./submit.service"; -import type { Abi } from "viem"; export const fetchBridgeGuidTransaction = async (guid: string) => { - const layerZeroMessagesUrl = `${LAYER_ZERO_SCAN_API[config.LAYER_ZERO_NETWORK]}/messages/${guid}`; + const layerZeroMessagesUrl = `${LAYER_ZERO_SCAN_API[config.LAYER_ZERO_NETWORK]}/messages/guid/${guid}`; try { const response = await axios.get(layerZeroMessagesUrl, { timeout: API_TIMEOUT, @@ -37,6 +37,7 @@ export const fetchBridgeGuidTransaction = async (guid: string) => { logger.error( `Failed to fetch bridge transaction status url: ${layerZeroMessagesUrl} ${error instanceof Error ? error.message : error}`, ); + // 404 if (error instanceof AxiosError) { throw new Error(`Failed to fetch status: ${error.response?.status}`); @@ -50,7 +51,7 @@ export const fetchBridgeGuidTransaction = async (guid: string) => { } }; -export const handleFailedStatus = async (bridgeGuidTransaction: BridgeGuidTransaction) => { +export const handleFailedStatus = async (_: BridgeGuidTransaction) => { await submitTransaction("clear"); }; @@ -92,7 +93,6 @@ export const handlePayloadStored = async (bridgeGuidTransaction: BridgeGuidTrans }; const hasStoredPayload = async () => { - const l1Client = createNetworkClient("l1"); const currentBlockNumber = await l1Client.getBlockNumber(); const args = [ diff --git a/packages/bridge-monitor/src/service/submit.service.ts b/packages/bridge-monitor/src/service/submit.service.ts index f77e69a..64a3872 100644 --- a/packages/bridge-monitor/src/service/submit.service.ts +++ b/packages/bridge-monitor/src/service/submit.service.ts @@ -1,3 +1,3 @@ -export const submitTransaction = async (operation: string) { - console.log(`Submitting transaction for operation: ${operation}`) -} \ No newline at end of file +export const submitTransaction = async (operation: string) => { + console.log(`Submitting transaction for operation: ${operation}`); +}; diff --git a/packages/shared/src/db/bridgeTransaction.ts b/packages/shared/src/db/bridgeTransaction.ts index 8ac63b8..61bff76 100644 --- a/packages/shared/src/db/bridgeTransaction.ts +++ b/packages/shared/src/db/bridgeTransaction.ts @@ -6,6 +6,7 @@ import { type BridgeTransactionFilter, type BridgeTransactionInput, BridgeTransactionStatus, + type BridgeTransactionUpdateInput, } from "../types"; import { db } from "./firestore"; @@ -36,13 +37,13 @@ export class BridgeTransaction { const batch = this.db.batch(); const batchInputs = inputs.slice(i, i + FIRESTORE_MAX_BATCH_SIZE); - for (const input of batchInputs) { - const ref = this.collection.doc(); + for (const { guid, ...rest } of batchInputs) { + const ref = this.collection.doc(guid); batch.set( ref, { - ...input, + ...rest, status: BridgeTransactionStatus.QUEUED, updatedAt: now, createdAt: now, @@ -69,6 +70,31 @@ export class BridgeTransaction { } } + async updateBridgeTransaction(guid: string, updateData: Partial) { + const now = new Date(); + try { + const { guid: _, ...dataToUpdate } = updateData as any; + const ref = this.collection.doc(guid); + + await ref.update({ + ...dataToUpdate, + updatedAt: now, + }); + + return { + guid, + success: true, + }; + } catch (error) { + logger.error(error); + throw new AppError( + 500, + ErrorCode.INTERNAL_SERVER_ERROR, + `Failed to update bridge transaction ${guid}: ${(error as Error).message}`, + ); + } + } + private async list(buildQuery?: (query: Query) => Query) { try { let query = this.collection.orderBy( @@ -91,7 +117,7 @@ export class BridgeTransaction { const snapshot = await batchQuery.get(); const batchItems = snapshot.docs.map((doc) => { - return { ...doc.data() } as BridgeTransactionData; + return { ...doc.data(), guid: doc.id } as BridgeTransactionData; }); allItems.push(...batchItems); diff --git a/packages/shared/src/types/blockchain.ts b/packages/shared/src/types/blockchain.ts index 34d6661..3cb31fc 100644 --- a/packages/shared/src/types/blockchain.ts +++ b/packages/shared/src/types/blockchain.ts @@ -87,7 +87,7 @@ export interface TransferredToLiquidityEventLog { amount: bigint; } -export interface BridgeRequestedEvent { +export interface BridgeRequestedEvent extends BaseEvent { args: BridgeRequestedEventLog; } diff --git a/packages/shared/src/types/bridgeTransaction.ts b/packages/shared/src/types/bridgeTransaction.ts index ebc7cb5..89d7d96 100644 --- a/packages/shared/src/types/bridgeTransaction.ts +++ b/packages/shared/src/types/bridgeTransaction.ts @@ -9,6 +9,13 @@ export interface BridgeTransactionData { export interface BridgeTransactionInput { guid: string; + amount: string; + recipient: string; + transactionHash: string; +} + +export interface BridgeTransactionUpdateInput { + status: BridgeTransactionStatus; } export interface BridgeTransactionFilter { From 8f9236038b4ec1485ce63fe9c6206ec150d8dcc3 Mon Sep 17 00:00:00 2001 From: signature18632 Date: Sat, 23 Aug 2025 14:05:52 +0700 Subject: [PATCH 12/12] readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 9e78597..e1ecaf5 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,8 @@ The project is divided into the following workspaces: ```sh packages ├── block-sync-monitor +├── bridge-event-watcher +├── bridge-monitor ├── deposit-analyzer ├── indexer ├── indexer-cache-validator