create-avalanche-app 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/l1-launch/CLAUDE.md +91 -0
- package/templates/l1-launch/README.md +45 -0
- package/templates/l1-launch/app/globals.css +95 -0
- package/templates/l1-launch/app/layout.tsx +23 -0
- package/templates/l1-launch/app/page.tsx +5 -0
- package/templates/l1-launch/app/providers.tsx +22 -0
- package/templates/l1-launch/components/demo.tsx +396 -0
- package/templates/l1-launch/contracts/foundry.toml +9 -0
- package/templates/l1-launch/contracts/src/AvaKitToken.sol +53 -0
- package/templates/l1-launch/cursor/rules/avakit.mdc +36 -0
- package/templates/l1-launch/env.example +9 -0
- package/templates/l1-launch/gitignore +15 -0
- package/templates/l1-launch/l1.config.json +10 -0
- package/templates/l1-launch/lib/l1.ts +40 -0
- package/templates/l1-launch/lib/token-artifact.ts +239 -0
- package/templates/l1-launch/llms.txt +31 -0
- package/templates/l1-launch/manifest.json +6 -0
- package/templates/l1-launch/next.config.ts +7 -0
- package/templates/l1-launch/package.json +34 -0
- package/templates/l1-launch/pnpm-workspace.yaml +11 -0
- package/templates/l1-launch/postcss.config.mjs +7 -0
- package/templates/l1-launch/scripts/l1-fuji.sh +100 -0
- package/templates/l1-launch/scripts/l1.sh +108 -0
- package/templates/l1-launch/tsconfig.json +23 -0
- package/templates/token-bridge/CLAUDE.md +70 -0
- package/templates/token-bridge/README.md +39 -0
- package/templates/token-bridge/app/globals.css +95 -0
- package/templates/token-bridge/app/layout.tsx +23 -0
- package/templates/token-bridge/app/page.tsx +5 -0
- package/templates/token-bridge/app/providers.tsx +22 -0
- package/templates/token-bridge/bridge.config.json +6 -0
- package/templates/token-bridge/components/demo.tsx +352 -0
- package/templates/token-bridge/cursor/rules/avakit.mdc +36 -0
- package/templates/token-bridge/env.example +7 -0
- package/templates/token-bridge/gitignore +15 -0
- package/templates/token-bridge/lib/ictt-artifacts.json +1 -0
- package/templates/token-bridge/lib/ictt.ts +70 -0
- package/templates/token-bridge/llms.txt +25 -0
- package/templates/token-bridge/manifest.json +6 -0
- package/templates/token-bridge/next.config.ts +7 -0
- package/templates/token-bridge/package.json +33 -0
- package/templates/token-bridge/pnpm-workspace.yaml +11 -0
- package/templates/token-bridge/postcss.config.mjs +7 -0
- package/templates/token-bridge/scripts/bridge.sh +95 -0
- package/templates/token-bridge/scripts/deploy-bridge.mjs +107 -0
- package/templates/token-bridge/tsconfig.json +23 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"ERC20TokenHome": {"abi": [{"inputs": [{"internalType": "address", "name": "teleporterRegistryAddress", "type": "address"}, {"internalType": "address", "name": "teleporterManager", "type": "address"}, {"internalType": "uint256", "name": "minTeleporterVersion", "type": "uint256"}, {"internalType": "address", "name": "tokenAddress", "type": "address"}, {"internalType": "uint8", "name": "tokenDecimals", "type": "uint8"}], "stateMutability": "nonpayable", "type": "constructor"}, {"inputs": [{"internalType": "address", "name": "target", "type": "address"}], "name": "AddressEmptyCode", "type": "error"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "AddressInsufficientBalance", "type": "error"}, {"inputs": [], "name": "FailedInnerCall", "type": "error"}, {"inputs": [], "name": "InvalidInitialization", "type": "error"}, {"inputs": [], "name": "NotInitializing", "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": "ReentrancyGuardReentrantCall", "type": "error"}, {"inputs": [{"internalType": "address", "name": "token", "type": "address"}], "name": "SafeERC20FailedOperation", "type": "error"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "recipientContract", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "CallFailed", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "recipientContract", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "CallSucceeded", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "bytes32", "name": "remoteBlockchainID", "type": "bytes32"}, {"indexed": true, "internalType": "address", "name": "remoteTokenTransferrerAddress", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}, {"indexed": false, "internalType": "uint256", "name": "remaining", "type": "uint256"}], "name": "CollateralAdded", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint64", "name": "version", "type": "uint64"}], "name": "Initialized", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "oldMinTeleporterVersion", "type": "uint256"}, {"indexed": true, "internalType": "uint256", "name": "newMinTeleporterVersion", "type": "uint256"}], "name": "MinTeleporterVersionUpdated", "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": true, "internalType": "bytes32", "name": "remoteBlockchainID", "type": "bytes32"}, {"indexed": true, "internalType": "address", "name": "remoteTokenTransferrerAddress", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "initialCollateralNeeded", "type": "uint256"}, {"indexed": false, "internalType": "uint8", "name": "tokenDecimals", "type": "uint8"}], "name": "RemoteRegistered", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "teleporterAddress", "type": "address"}], "name": "TeleporterAddressPaused", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "teleporterAddress", "type": "address"}], "name": "TeleporterAddressUnpaused", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "bytes32", "name": "teleporterMessageID", "type": "bytes32"}, {"components": [{"internalType": "bytes32", "name": "destinationBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "destinationTokenTransferrerAddress", "type": "address"}, {"internalType": "address", "name": "recipientContract", "type": "address"}, {"internalType": "bytes", "name": "recipientPayload", "type": "bytes"}, {"internalType": "uint256", "name": "requiredGasLimit", "type": "uint256"}, {"internalType": "uint256", "name": "recipientGasLimit", "type": "uint256"}, {"internalType": "address", "name": "multiHopFallback", "type": "address"}, {"internalType": "address", "name": "fallbackRecipient", "type": "address"}, {"internalType": "address", "name": "primaryFeeTokenAddress", "type": "address"}, {"internalType": "uint256", "name": "primaryFee", "type": "uint256"}, {"internalType": "uint256", "name": "secondaryFee", "type": "uint256"}], "indexed": false, "internalType": "struct SendAndCallInput", "name": "input", "type": "tuple"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "TokensAndCallRouted", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "bytes32", "name": "teleporterMessageID", "type": "bytes32"}, {"indexed": true, "internalType": "address", "name": "sender", "type": "address"}, {"components": [{"internalType": "bytes32", "name": "destinationBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "destinationTokenTransferrerAddress", "type": "address"}, {"internalType": "address", "name": "recipientContract", "type": "address"}, {"internalType": "bytes", "name": "recipientPayload", "type": "bytes"}, {"internalType": "uint256", "name": "requiredGasLimit", "type": "uint256"}, {"internalType": "uint256", "name": "recipientGasLimit", "type": "uint256"}, {"internalType": "address", "name": "multiHopFallback", "type": "address"}, {"internalType": "address", "name": "fallbackRecipient", "type": "address"}, {"internalType": "address", "name": "primaryFeeTokenAddress", "type": "address"}, {"internalType": "uint256", "name": "primaryFee", "type": "uint256"}, {"internalType": "uint256", "name": "secondaryFee", "type": "uint256"}], "indexed": false, "internalType": "struct SendAndCallInput", "name": "input", "type": "tuple"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "TokensAndCallSent", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "bytes32", "name": "teleporterMessageID", "type": "bytes32"}, {"components": [{"internalType": "bytes32", "name": "destinationBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "destinationTokenTransferrerAddress", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "address", "name": "primaryFeeTokenAddress", "type": "address"}, {"internalType": "uint256", "name": "primaryFee", "type": "uint256"}, {"internalType": "uint256", "name": "secondaryFee", "type": "uint256"}, {"internalType": "uint256", "name": "requiredGasLimit", "type": "uint256"}, {"internalType": "address", "name": "multiHopFallback", "type": "address"}], "indexed": false, "internalType": "struct SendTokensInput", "name": "input", "type": "tuple"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "TokensRouted", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "bytes32", "name": "teleporterMessageID", "type": "bytes32"}, {"indexed": true, "internalType": "address", "name": "sender", "type": "address"}, {"components": [{"internalType": "bytes32", "name": "destinationBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "destinationTokenTransferrerAddress", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "address", "name": "primaryFeeTokenAddress", "type": "address"}, {"internalType": "uint256", "name": "primaryFee", "type": "uint256"}, {"internalType": "uint256", "name": "secondaryFee", "type": "uint256"}, {"internalType": "uint256", "name": "requiredGasLimit", "type": "uint256"}, {"internalType": "address", "name": "multiHopFallback", "type": "address"}], "indexed": false, "internalType": "struct SendTokensInput", "name": "input", "type": "tuple"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "TokensSent", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "recipient", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "TokensWithdrawn", "type": "event"}, {"inputs": [], "name": "ERC20_TOKEN_HOME_STORAGE_LOCATION", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "TELEPORTER_REGISTRY_APP_STORAGE_LOCATION", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "TOKEN_HOME_STORAGE_LOCATION", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "remoteBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "remoteTokenTransferrerAddress", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "addCollateral", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "getBlockchainID", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMinTeleporterVersion", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "remoteBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "remoteTokenTransferrerAddress", "type": "address"}], "name": "getRemoteTokenTransferrerSettings", "outputs": [{"components": [{"internalType": "bool", "name": "registered", "type": "bool"}, {"internalType": "uint256", "name": "collateralNeeded", "type": "uint256"}, {"internalType": "uint256", "name": "tokenMultiplier", "type": "uint256"}, {"internalType": "bool", "name": "multiplyOnRemote", "type": "bool"}], "internalType": "struct RemoteTokenTransferrerSettings", "name": "", "type": "tuple"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getTokenAddress", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "remoteBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "remoteTokenTransferrerAddress", "type": "address"}], "name": "getTransferredBalance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "teleporterRegistryAddress", "type": "address"}, {"internalType": "address", "name": "teleporterManager", "type": "address"}, {"internalType": "uint256", "name": "minTeleporterVersion", "type": "uint256"}, {"internalType": "address", "name": "tokenAddress", "type": "address"}, {"internalType": "uint8", "name": "tokenDecimals", "type": "uint8"}], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "teleporterAddress", "type": "address"}], "name": "isTeleporterAddressPaused", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "owner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "teleporterAddress", "type": "address"}], "name": "pauseTeleporterAddress", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "sourceBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "originSenderAddress", "type": "address"}, {"internalType": "bytes", "name": "message", "type": "bytes"}], "name": "receiveTeleporterMessage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "bytes32", "name": "destinationBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "destinationTokenTransferrerAddress", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "address", "name": "primaryFeeTokenAddress", "type": "address"}, {"internalType": "uint256", "name": "primaryFee", "type": "uint256"}, {"internalType": "uint256", "name": "secondaryFee", "type": "uint256"}, {"internalType": "uint256", "name": "requiredGasLimit", "type": "uint256"}, {"internalType": "address", "name": "multiHopFallback", "type": "address"}], "internalType": "struct SendTokensInput", "name": "input", "type": "tuple"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "send", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "bytes32", "name": "destinationBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "destinationTokenTransferrerAddress", "type": "address"}, {"internalType": "address", "name": "recipientContract", "type": "address"}, {"internalType": "bytes", "name": "recipientPayload", "type": "bytes"}, {"internalType": "uint256", "name": "requiredGasLimit", "type": "uint256"}, {"internalType": "uint256", "name": "recipientGasLimit", "type": "uint256"}, {"internalType": "address", "name": "multiHopFallback", "type": "address"}, {"internalType": "address", "name": "fallbackRecipient", "type": "address"}, {"internalType": "address", "name": "primaryFeeTokenAddress", "type": "address"}, {"internalType": "uint256", "name": "primaryFee", "type": "uint256"}, {"internalType": "uint256", "name": "secondaryFee", "type": "uint256"}], "internalType": "struct SendAndCallInput", "name": "input", "type": "tuple"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "sendAndCall", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "newOwner", "type": "address"}], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "teleporterAddress", "type": "address"}], "name": "unpauseTeleporterAddress", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "version", "type": "uint256"}], "name": "updateMinTeleporterVersion", "outputs": [], "stateMutability": "nonpayable", "type": "function"}], "bytecode": "0x608060405234801561000f575f80fd5b5060405161500b38038061500b83398101604081905261002e91610893565b61003b8585858585610048565b505050505061090d565b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff1615906001600160401b03165f811580156100915750825b90505f826001600160401b031660011480156100ac5750303b155b9050811580156100ba575080155b156100d85760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561010657845460ff60401b1916680100000000000000001785555b6101138a8a8a8a8a610165565b831561015957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b61016d61018a565b61017a85858585856101da565b610183826101ff565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff166101d857604051631afcd79f60e31b815260040160405180910390fd5b565b6101e261018a565b6101ed858585610248565b6101f5610268565b6101838282610278565b61020761018a565b7f914a9547f6c3ddce1d5efbd9e687708f0d1d408ce129e8e1a88bce4f40e2950080546001600160a01b0319166001600160a01b0392909216919091179055565b61025061018a565b61025a8382610404565b6102638261042a565b505050565b61027061018a565b6101d861043b565b61028061018a565b6001600160a01b0382166102db5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f20746f6b656e206164647265737300000060448201526064015b60405180910390fd5b60128160ff16111561033a5760405162461bcd60e51b815260206004820152602260248201527f546f6b656e486f6d653a20746f6b656e20646563696d616c7320746f6f2068696044820152610ced60f31b60648201526084016102d2565b5f7f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e60090507302000000000000000000000000000000000000056001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d291906108f6565b8155600101805460ff909216600160a01b026001600160a81b03199092166001600160a01b0390931692909217179055565b61040c61018a565b610414610465565b61041c610475565b610426828261047d565b5050565b61043261018a565b61004581610607565b5f7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c75005b6001905550565b61046d61018a565b6101d8610641565b6101d861018a565b61048561018a565b6001600160a01b0382166105015760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016102d2565b5f7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0090505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610566573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061058a91906108f6565b116105df5760405162461bcd60e51b815260206004820152603260248201525f80516020614feb833981519152604482015271656c65706f7274657220726567697374727960701b60648201526084016102d2565b81546001600160a01b0319166001600160a01b03821617825561060183610670565b50505050565b61060f61018a565b6001600160a01b03811661063857604051631e4fbdf760e01b81525f60048201526024016102d2565b61004581610808565b61064961018a565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0061045e565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0080546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa1580156106d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fb91906108f6565b60028301549091508184111561075a5760405162461bcd60e51b815260206004820152603160248201525f80516020614feb83398151915260448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016102d2565b8084116107cf5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016102d2565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b80516001600160a01b038116811461088e575f80fd5b919050565b5f805f805f60a086880312156108a7575f80fd5b6108b086610878565b94506108be60208701610878565b9350604086015192506108d360608701610878565b9150608086015160ff811681146108e8575f80fd5b809150509295509295909350565b5f60208284031215610906575f80fd5b5051919050565b6146d18061091a5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806365690038116100a9578063c8511ada1161006e578063c8511ada146102b4578063c868efaa14610388578063d2cc7a701461039b578063f2fde38b146103c2578063fd658268146103d5575f80fd5b80636569003814610232578063715018a6146102455780638da5cb5b1461024d578063909a6ac01461027d5780639731429714610291575f80fd5b80634511243e116100ef5780634511243e146101d15780634797735f146101e45780635d16225d146101f85780635eb995141461020b57806362e3901b1461021e575f80fd5b806310fe9ae81461012b578063154d625a146101745780632b0d8f18146101955780633bb03890146101aa5780634213cf78146101bd575b5f80fd5b7f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e601546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b61018761018236600461368c565b6103e8565b60405190815260200161016b565b6101a86101a33660046136ba565b610430565b005b6101a86101b83660046136e3565b610532565b5f805160206145fc83398151915254610187565b6101a86101df3660046136ba565b610646565b6101875f8051602061465c83398151915281565b6101a8610206366004613747565b610735565b6101a8610219366004613776565b610751565b6101875f805160206145fc83398151915281565b6101a861024036600461378d565b610765565b6101a861078e565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b0316610157565b6101875f8051602061467c83398151915281565b6102a461029f3660046136ba565b6107a1565b604051901515815260200161016b565b6103516102c236600461368c565b60408051608080820183525f808352602080840182905283850182905260609384018290529581525f8051602061461c83398151915286528381206001600160a01b039590951681529385529282902082519384018352805460ff9081161515855260018201549585019590955260028101549284019290925260039091015490921615159181019190915290565b60405161016b9190815115158152602080830151908201526040808301519082015260609182015115159181019190915260800190565b6101a86103963660046137d3565b6107c1565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0254610187565b6101a86103d03660046136ba565b61097e565b6101a86103e3366004613854565b6109b8565b5f8281527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03851684529091529020545b92915050565b5f8051602061467c8339815191526104466109c8565b6001600160a01b0382166104755760405162461bcd60e51b815260040161046c90613889565b60405180910390fd5b61047f81836109d0565b156104e25760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b606482015260840161046c565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156105765750825b90505f826001600160401b031660011480156105915750303b155b90508115801561059f575080155b156105bd5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156105e757845460ff60401b1916600160401b1785555b6105f48a8a8a8a8a6109f1565b831561063a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b5f8051602061467c83398151915261065c6109c8565b6001600160a01b0382166106825760405162461bcd60e51b815260040161046c90613889565b61068c81836109d0565b6106ea5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b606482015260840161046c565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b61074d61074736849003840184613989565b82610a16565b5050565b6107596109c8565b61076281610c27565b50565b61074d61077d5f805160206145fc8339815191525490565b303361078886613a8b565b85610dbf565b610796610fcb565b61079f5f611026565b565b5f5f8051602061467c8339815191526107ba81846109d0565b9392505050565b6107c9611096565b5f5f8051602061467c83398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610834573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108589190613b59565b10156108bf5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b606482015260840161046c565b6108c981336109d0565b1561092f5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b606482015260840161046c565b61096f858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506110e092505050565b506109786114d3565b50505050565b610986610fcb565b6001600160a01b0381166109af57604051631e4fbdf760e01b81525f600482015260240161046c565b61076281611026565b6109c38383836114fd565b505050565b61079f610fcb565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b6109f96116ed565b610a068585858585611736565b610a0f8261175b565b5050505050565b5f8051602061463c8339815191528054600114610a455760405162461bcd60e51b815260040161046c90613b70565b60028155610a5283611791565b60e08301516001600160a01b031615610a7d5760405162461bcd60e51b815260040161046c90613bb4565b5f80610a9b855f01518660200151868860600151896080015161183a565b915091505f604051806040016040528060016004811115610abe57610abe613bfa565b8152602001604051806040016040528089604001516001600160a01b0316815260200186815250604051602001610af59190613c0e565b60405160208183030381529060405281525090505f610bd46040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b606001516001600160a01b031681526020018781525081526020018960c0015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b604051908082528060200260200182016040528015610ba6578160200160208202803683370190505b50815260200184604051602001610bbd9190613c5c565b6040516020818303038152906040528152506119ff565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb528987604051610c12929190613c9e565b60405180910390a35050600190925550505050565b5f8051602061467c83398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015610c7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9f9190613b59565b600283015490915081841115610d115760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b606482015260840161046c565b808411610d865760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e00606482015260840161046c565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b5f8051602061463c8339815191528054600114610dee5760405162461bcd60e51b815260040161046c90613b70565b60028155610dfb83611b1a565b60c08301516001600160a01b031615610e265760405162461bcd60e51b815260040161046c90613bb4565b5f80610e46855f015186602001518688610100015189610120015161183a565b915091505f604051806040016040528060026004811115610e6957610e69613bfa565b81526020016040518061010001604052808c81526020018b6001600160a01b031681526020018a6001600160a01b0316815260200189604001516001600160a01b03168152602001868152602001896060015181526020018960a0015181526020018960e001516001600160a01b0316815250604051602001610eec9190613d1f565b60405160208183030381529060405281525090505f610f756040518060c00160405280895f0151815260200189602001516001600160a01b0316815260200160405180604001604052808b61010001516001600160a01b03168152602001878152508152602001896080015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b9050876001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168987604051610fb3929190613dbd565b60405180910390a35050600190925550505050505050565b33610ffd7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461079f5760405163118cdaa760e01b815233600482015260240161046c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016110da57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f5f805160206145fc83398151915290505f828060200190518101906111069190613eec565b905060018151600481111561111d5761111d613bfa565b03611165575f816020015180602001905181019061113b9190613f74565b90505f61114d87878460200151611cff565b905061115c825f015182611d8a565b50505050505050565b60028151600481111561117a5761117a613bfa565b03611293575f81602001518060200190518101906111989190613fac565b90505f6111aa87878460800151611cff565b825190915087146112105760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a206d69736d61746368656420736f7572636520626c6f60448201526918dad8da185a5b88125160b21b606482015260840161046c565b856001600160a01b031682602001516001600160a01b0316146112895760405162461bcd60e51b815260206004820152602b60248201527f546f6b656e486f6d653a206d69736d617463686564206f726967696e2073656e60448201526a646572206164647265737360a81b606482015260840161046c565b61115c8282611ded565b6003815160048111156112a8576112a8613bfa565b0361137c575f81602001518060200190518101906112c69190614076565b90505f806112de888885606001518660800151611fcd565b91509150611372604051806101000160405280855f0151815260200185602001516001600160a01b0316815260200185604001516001600160a01b03168152602001876001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018381526020015f81526020018560a0015181526020018560c001516001600160a01b031681525083612078565b5050505050505050565b60048151600481111561139157611391613bfa565b0361148c575f81602001518060200190518101906113af919061410f565b90505f806113c888888560800151866101400151611fcd565b915091506113728888855f01516040518061016001604052808860200151815260200188604001516001600160a01b0316815260200188606001516001600160a01b031681526020018860a00151815260200188610100015181526020018860c0015181526020018861012001516001600160a01b031681526020018860e001516001600160a01b031681526020018a6001015f9054906101000a90046001600160a01b03166001600160a01b031681526020018681526020015f81525086612203565b5f815160048111156114a0576114a0613bfa565b03610a0f575f81602001518060200190518101906114be9190614207565b90506114cb8686836123e0565b505050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b5f8051602061463c833981519152805460011461152c5760405162461bcd60e51b815260040161046c90613b70565b60028082555f8581525f8051602061461c833981519152602090815260408083206001600160a01b03881684528252918290208251608081018452815460ff9081161515808352600184015494830194909452948201549381019390935260030154909216151560608201525f805160206145fc833981519152916115c35760405162461bcd60e51b815260040161046c9061426d565b5f8160200151116116205760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20636f6c6c61746572616c206e656564656044820152601960fa1b606482015260840161046c565b611629846127e7565b93505f80826020015186106116585760208301515f925061164a90876142b6565b90508260200151955061166b565b85836020015161166891906142b6565b91505b5f88815260028501602090815260408083206001600160a01b038b168085529083529281902060010185905580518981529182018590528a917f6769a5f9bfc8b6e0db839ab981cbf9239274ae72d2d035081a9157d43bd33cb6910160405180910390a380156116df576116df3382611d8a565b505060019092555050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661079f57604051631afcd79f60e31b815260040160405180910390fd5b61173e6116ed565b61174985858561280e565b611751612829565b610a0f8282612839565b6117636116ed565b5f8051602061465c83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60408101516001600160a01b03166117f55760405162461bcd60e51b815260206004820152602160248201527f546f6b656e486f6d653a207a65726f20726563697069656e74206164647265736044820152607360f81b606482015260840161046c565b5f8160c00151116118185760405162461bcd60e51b815260040161046c906142c9565b60a0810151156107625760405162461bcd60e51b815260040161046c9061430b565b5f8581525f8051602061461c833981519152602090815260408083206001600160a01b038816845282528083208151608081018352815460ff90811615158083526001840154958301959095526002830154938201939093526003909101549091161515606082015282915f805160206145fc83398151915291906118d15760405162461bcd60e51b815260040161046c9061426d565b6020810151156119335760405162461bcd60e51b815260206004820152602760248201527f546f6b656e486f6d653a20636f6c6c61746572616c206e656564656420666f726044820152662072656d6f746560c81b606482015260840161046c565b61193c876127e7565b965084156119525761194f8633876129a0565b94505b5f611966826040015183606001518a612af9565b90505f81116119b75760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f207363616c656420616d6f756e74000000604482015260640161046c565b5f8a815260038401602090815260408083206001600160a01b038d168452909152812080548392906119ea90849061434c565b90915550909a95995094975050505050505050565b5f80611a09612b0f565b60408401516020015190915015611aae576040830151516001600160a01b0316611a8b5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b606482015260840161046c565b604083015160208101519051611aae916001600160a01b03909116908390612bff565b604051630624488560e41b81526001600160a01b03821690636244885090611ada90869060040161435f565b6020604051808303815f875af1158015611af6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba9190613b59565b60408101516001600160a01b0316611b875760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420636f6e7472616044820152696374206164647265737360b01b606482015260840161046c565b5f816080015111611baa5760405162461bcd60e51b815260040161046c906142c9565b5f8160a0015111611c095760405162461bcd60e51b815260206004820152602360248201527f546f6b656e486f6d653a207a65726f20726563697069656e7420676173206c696044820152621b5a5d60ea1b606482015260840161046c565b80608001518160a0015110611c6f5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420726563697069656e7420676173604482015265081b1a5b5a5d60d21b606482015260840161046c565b60e08101516001600160a01b0316611cdc5760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e486f6d653a207a65726f2066616c6c6261636b20726563697069656044820152696e74206164647265737360b01b606482015260840161046c565b610140810151156107625760405162461bcd60e51b815260040161046c9061430b565b5f8381525f8051602061461c833981519152602090815260408083206001600160a01b038616845282528083208151608081018352815460ff9081161515825260018301549482019490945260028201549281019290925260030154909116151560608201525f805160206145fc83398151915290611d8081878787612c86565b9695505050505050565b6040518181525f8051602061465c833981519152906001600160a01b038416907f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b9060200160405180910390a280546109c3906001600160a01b03168484612d7d565b5f8051602061465c833981519152805460608401516001600160a01b0390911690611e1a90829085612bff565b5f845f01518560200151866040015184878960a00151604051602401611e4596959493929190614416565b60408051601f198184030181529190526020810180516001600160e01b03166394395edd60e01b17905260c086015160608701519192505f91611e89919084612ddc565b6060870151604051636eb1769f60e11b81523060048201526001600160a01b0391821660248201529192505f919085169063dd62ed3e90604401602060405180830381865afa158015611ede573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f029190613b59565b9050611f138488606001515f612de9565b8115611f655786606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff487604051611f5891815260200190565b60405180910390a2611fad565b86606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb087604051611fa491815260200190565b60405180910390a25b801561115c5760e087015161115c906001600160a01b0386169083612d7d565b5f8481525f8051602061461c833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff90811615158252600183015494820194909452600282015492810192909252600301549091161515606082015281905f805160206145fc8339815191529082612051828a8a8a612c86565b90505f6120678360400151846060015189612e78565b919a91995090975050505050505050565b5f8051602061463c83398151915280546001146120a75760405162461bcd60e51b815260040161046c90613b70565b600281556120b483611791565b5f6120cc845f01518560200151858760800151612e85565b9050805f036120e9576120e38460e0015184611d8a565b506121fb565b604080518082019091525f908060018152602001604051806040016040528088604001516001600160a01b031681526020018581525060405160200161212f9190613c0e565b60405160208183030381529060405281525090505f6121bb6040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a606001516001600160a01b031681526020018a6080015181525081526020018860c0015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b9050807f825080857c76cef4a1629c0705a7f8b4ef0282ddcafde0b6715c4fb34b68aaf087856040516121ef929190613c9e565b60405180910390a25050505b600190555050565b5f8051602061463c83398151915280546001146122325760405162461bcd60e51b815260040161046c90613b70565b6002815561223f83611b1a565b5f612258845f0151856020015185876101200151612e85565b9050805f036122755761226f8460c0015184611d8a565b506123d5565b604080518082019091525f9080600281526020016040518061010001604052808b81526020018a6001600160a01b03168152602001896001600160a01b0316815260200188604001516001600160a01b03168152602001858152602001886060015181526020018860a0015181526020018860e001516001600160a01b03168152506040516020016123079190613d1f565b60405160208183030381529060405281525090505f6123956040518060c00160405280885f0151815260200188602001516001600160a01b0316815260200160405180604001604052808a61010001516001600160a01b031681526020018a61012001518152508152602001886080015181526020015f6001600160401b03811115610b7d57610b7d6138d7565b9050807f42eff9005856e3c586b096d67211a566dc926052119fd7cc08023c70937ecb3087856040516123c9929190613dbd565b60405180910390a25050505b600190555050505050565b5f805160206145fc833981519152836124475760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a207a65726f2072656d6f746520626c6f636b636861696044820152631b88125160e21b606482015260840161046c565b805484036124af5760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e486f6d653a2063616e6e6f742072656769737465722072656d6f7460448201526e329037b71039b0b6b29031b430b4b760891b606482015260840161046c565b6001600160a01b03831661251e5760405162461bcd60e51b815260206004820152603060248201527f546f6b656e486f6d653a207a65726f2072656d6f746520746f6b656e2074726160448201526f6e73666572726572206164647265737360801b606482015260840161046c565b5f84815260028201602090815260408083206001600160a01b038716845290915290205460ff161561259e5760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f746520616c726561647920726567697374604482015263195c995960e21b606482015260840161046c565b6012826040015160ff1611156126085760405162461bcd60e51b815260206004820152602960248201527f546f6b656e486f6d653a2072656d6f746520746f6b656e20646563696d616c73604482015268040e8dede40d0d2ced60bb1b606482015260840161046c565b6001810154602083015160ff908116600160a01b909204161461267c5760405162461bcd60e51b815260206004820152602660248201527f546f6b656e486f6d653a20696e76616c696420686f6d6520746f6b656e20646560448201526563696d616c7360d01b606482015260840161046c565b5f8061269d8360010160149054906101000a900460ff168560400151612ff6565b915091505f6126b08383875f0151612e78565b90508180156126ca575084516126c790849061446a565b15155b156126dd576126da60018261434c565b90505b6040518060800160405280600115158152602001828152602001848152602001831515815250846002015f8981526020019081526020015f205f886001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a81548160ff02191690831515021790555060208201518160010155604082015181600201556060820151816003015f6101000a81548160ff021916908315150217905550905050856001600160a01b0316877ff229b02a51a4c8d5ef03a096ae0dd727d7b48b710d21b50ebebb560eef739b908388604001516040516127d692919091825260ff16602082015260400190565b60405180910390a350505050505050565b5f8051602061465c83398151915280545f91906107ba906001600160a01b031633856129a0565b6128166116ed565b612820838261303e565b6109c382613060565b6128316116ed565b61079f613071565b6128416116ed565b6001600160a01b0382166128975760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e486f6d653a207a65726f20746f6b656e2061646472657373000000604482015260640161046c565b60128160ff1611156128f65760405162461bcd60e51b815260206004820152602260248201527f546f6b656e486f6d653a20746f6b656e20646563696d616c7320746f6f2068696044820152610ced60f31b606482015260840161046c565b5f5f805160206145fc83398151915290506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561294a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296e9190613b59565b8155600101805460ff909216600160a01b026001600160a81b03199092166001600160a01b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa1580156129e6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0a9190613b59565b9050612a216001600160a01b038616853086613085565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612a65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a899190613b59565b9050818111612aef5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161046c565b611d8082826142b6565b5f612b0784848460016130be565b949350505050565b5f8051602061467c83398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612b69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b8d919061447d565b9050612b9982826109d0565b1561042a5760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b606482015260840161046c565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612c4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c709190613b59565b90506109788484612c81858561434c565b612de9565b83515f90612ca65760405162461bcd60e51b815260040161046c9061426d565b602085015115612d045760405162461bcd60e51b8152602060048201526024808201527f546f6b656e486f6d653a2072656d6f7465206e6f7420636f6c6c61746572616c6044820152631a5e995960e21b606482015260840161046c565b612d0f8484846130e5565b5f612d238660400151876060015185612e78565b90505f8111612d745760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e486f6d653a207a65726f20746f6b656e20616d6f756e7400000000604482015260640161046c565b95945050505050565b6040516001600160a01b038381166024830152604482018390526109c391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506131d2565b5f612b07845f8585613233565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612e3a8482613303565b610978576040516001600160a01b0384811660248301525f6044830152612e6e91869182169063095ea7b390606401612daa565b61097884826131d2565b5f612b078484845f6130be565b5f8481525f8051602061461c833981519152602090815260408083206001600160a01b038716845282528083208151608081018352815460ff9081161580158352600184015495830195909552600283015493820193909352600390910154909116151560608201525f805160206145fc8339815191529180612f0b57505f8160200151115b15612f1a575f92505050612b07565b838511612f7e5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e486f6d653a20696e73756666696369656e7420616d6f756e74207460448201526b6f20636f766572206665657360a01b606482015260840161046c565b612f8884866142b6565b94505f612f9e8260400151836060015188612af9565b9050805f03612fb2575f9350505050612b07565b5f88815260038401602090815260408083206001600160a01b038b16845290915281208054839290612fe590849061434c565b909155509098975050505050505050565b5f8060ff808516908416118181613019576130118587614498565b60ff16613027565b6130238686614498565b60ff165b61303290600a614591565b96919550909350505050565b6130466116ed565b61304e6133a0565b6130566133b0565b61074d82826133b8565b6130686116ed565b6107628161353c565b5f5f8051602061463c8339815191526114f6565b6040516001600160a01b0384811660248301528381166044830152606482018390526109789186918216906323b872dd90608401612daa565b5f811515841515036130db576130d4858461459c565b9050612b07565b612d7485846145b3565b5f8381527f9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e603602090815260408083206001600160a01b03861684529091529020545f805160206145fc833981519152908281101561319c5760405162461bcd60e51b815260206004820152602e60248201527f546f6b656e486f6d653a20696e73756666696369656e7420746f6b656e20747260448201526d616e736665722062616c616e636560901b606482015260840161046c565b6131a683826142b6565b5f9586526003909201602090815260408087206001600160a01b03909616875294905250919092205550565b5f6131e66001600160a01b03841683613544565b905080515f1415801561320a57508080602001905181019061320891906145c6565b155b156109c357604051635274afe760e01b81526001600160a01b038416600482015260240161046c565b5f845a10156132845760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e74206761730000000000604482015260640161046c565b834710156132d45760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c7565000000604482015260640161046c565b826001600160a01b03163b5f036132ec57505f612b07565b5f805f84516020860188888bf19695505050505050565b5f805f846001600160a01b03168460405161331e91906145e5565b5f604051808303815f865af19150503d805f8114613357576040519150601f19603f3d011682016040523d82523d5f602084013e61335c565b606091505b509150915081801561338657508051158061338657508080602001905181019061338691906145c6565b8015612d745750505050506001600160a01b03163b151590565b6133a86116ed565b61079f613551565b61079f6116ed565b6133c06116ed565b6001600160a01b03821661343c5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f727465722072656769737472792061646472657373000000000000000000606482015260840161046c565b5f5f8051602061467c83398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134b29190613b59565b1161351a5760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b606482015260840161046c565b81546001600160a01b0319166001600160a01b03821617825561097883610c27565b6109866116ed565b60606107ba83835f613559565b6114d36116ed565b60608147101561357e5760405163cd78605960e01b815230600482015260240161046c565b5f80856001600160a01b0316848660405161359991906145e5565b5f6040518083038185875af1925050503d805f81146135d3576040519150601f19603f3d011682016040523d82523d5f602084013e6135d8565b606091505b5091509150611d808683836060826135f8576135f38261363f565b6107ba565b815115801561360f57506001600160a01b0384163b155b1561363857604051639996b31560e01b81526001600160a01b038516600482015260240161046c565b50806107ba565b80511561364f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b0381168114610762575f80fd5b803561368781613668565b919050565b5f806040838503121561369d575f80fd5b8235915060208301356136af81613668565b809150509250929050565b5f602082840312156136ca575f80fd5b81356107ba81613668565b60ff81168114610762575f80fd5b5f805f805f60a086880312156136f7575f80fd5b853561370281613668565b9450602086013561371281613668565b935060408601359250606086013561372981613668565b91506080860135613739816136d5565b809150509295509295909350565b5f8082840361012081121561375a575f80fd5b61010080821215613769575f80fd5b9395938601359450505050565b5f60208284031215613786575f80fd5b5035919050565b5f806040838503121561379e575f80fd5b82356001600160401b038111156137b3575f80fd5b830161016081860312156137c5575f80fd5b946020939093013593505050565b5f805f80606085870312156137e6575f80fd5b8435935060208501356137f881613668565b925060408501356001600160401b0380821115613813575f80fd5b818701915087601f830112613826575f80fd5b813581811115613834575f80fd5b886020828501011115613845575f80fd5b95989497505060200194505050565b5f805f60608486031215613866575f80fd5b83359250602084013561387881613668565b929592945050506040919091013590565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b634e487b7160e01b5f52604160045260245ffd5b60405161010081016001600160401b038111828210171561390e5761390e6138d7565b60405290565b60405161016081016001600160401b038111828210171561390e5761390e6138d7565b604080519081016001600160401b038111828210171561390e5761390e6138d7565b604051601f8201601f191681016001600160401b0381118282101715613981576139816138d7565b604052919050565b5f610100828403121561399a575f80fd5b6139a26138eb565b8235815260208301356139b481613668565b602082015260408301356139c781613668565b60408201526139d86060840161367c565b60608201526080830135608082015260a083013560a082015260c083013560c0820152613a0760e0840161367c565b60e08201529392505050565b5f6001600160401b03821115613a2b57613a2b6138d7565b50601f01601f191660200190565b5f82601f830112613a48575f80fd5b8135613a5b613a5682613a13565b613959565b818152846020838601011115613a6f575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6101608236031215613a9c575f80fd5b613aa4613914565b82358152613ab46020840161367c565b6020820152613ac56040840161367c565b604082015260608301356001600160401b03811115613ae2575f80fd5b613aee36828601613a39565b6060830152506080830135608082015260a083013560a0820152613b1460c0840161367c565b60c0820152613b2560e0840161367c565b60e0820152610100613b3881850161367c565b90820152610120838101359082015261014092830135928101929092525090565b5f60208284031215613b69575f80fd5b5051919050565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b60208082526026908201527f546f6b656e486f6d653a206e6f6e2d7a65726f206d756c74692d686f702066616040820152656c6c6261636b60d01b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b81516001600160a01b03168152602080830151908201526040810161042a565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f825160058110613c7f57634e487b7160e01b5f52602160045260245ffd5b806020840152506020830151604080840152612b076060840182613c2e565b5f6101208201905083518252602084015160018060a01b03808216602085015280604087015116604085015280606087015116606085015250506080840151608083015260a084015160a083015260c084015160c083015260e0840151613d1060e08401826001600160a01b03169052565b50826101008301529392505050565b60208152815160208201525f602083015160018060a01b03808216604085015280604086015116606085015250506060830151613d6760808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c0850152613d8e610120850183613c2e565b915060c085015160e085015260e0850151613db3828601826001600160a01b03169052565b5090949350505050565b60408152825160408201525f6020840151613de360608401826001600160a01b03169052565b5060408401516001600160a01b03166080830152606084015161016060a08401819052613e146101a0850183613c2e565b9150608086015160c085015260a086015160e085015260c0860151610100613e46818701836001600160a01b03169052565b60e08801519150610120613e64818801846001600160a01b03169052565b90880151915061014090613e82878301846001600160a01b03169052565b880151928601929092525090940151610180830152506020015290565b5f82601f830112613eae575f80fd5b8151613ebc613a5682613a13565b818152846020838601011115613ed0575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613efc575f80fd5b81516001600160401b0380821115613f12575f80fd5b9083019060408286031215613f25575f80fd5b613f2d613937565b825160058110613f3b575f80fd5b8152602083015182811115613f4e575f80fd5b613f5a87828601613e9f565b60208301525095945050505050565b805161368781613668565b5f60408284031215613f84575f80fd5b613f8c613937565b8251613f9781613668565b81526020928301519281019290925250919050565b5f60208284031215613fbc575f80fd5b81516001600160401b0380821115613fd2575f80fd5b908301906101008286031215613fe6575f80fd5b613fee6138eb565b82518152613ffe60208401613f69565b602082015261400f60408401613f69565b604082015261402060608401613f69565b60608201526080830151608082015260a083015182811115614040575f80fd5b61404c87828601613e9f565b60a08301525060c083015160c082015261406860e08401613f69565b60e082015295945050505050565b5f60e08284031215614086575f80fd5b60405160e081018181106001600160401b03821117156140a8576140a86138d7565b6040528251815260208301516140bd81613668565b602082015260408301516140d081613668565b80604083015250606083015160608201526080830151608082015260a083015160a082015260c083015161410381613668565b60c08201529392505050565b5f6020828403121561411f575f80fd5b81516001600160401b0380821115614135575f80fd5b908301906101608286031215614149575f80fd5b614151613914565b61415a83613f69565b81526020830151602082015261417260408401613f69565b604082015261418360608401613f69565b60608201526080830151608082015260a0830151828111156141a3575f80fd5b6141af87828601613e9f565b60a08301525060c083015160c08201526141cb60e08401613f69565b60e0820152610100838101519082015261012091506141eb828401613f69565b9181019190915261014091820151918101919091529392505050565b5f60608284031215614217575f80fd5b604051606081018181106001600160401b0382111715614239576142396138d7565b60405282518152602083015161424e816136d5565b60208201526040830151614261816136d5565b60408201529392505050565b6020808252818101527f546f6b656e486f6d653a2072656d6f7465206e6f742072656769737465726564604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561042a5761042a6142a2565b60208082526022908201527f546f6b656e486f6d653a207a65726f20726571756972656420676173206c696d6040820152611a5d60f21b606082015260800190565b60208082526021908201527f546f6b656e486f6d653a206e6f6e2d7a65726f207365636f6e646172792066656040820152606560f81b606082015260800190565b8082018082111561042a5761042a6142a2565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b808410156143ec578451831682529385019360019390930192908501906143ca565b5060a0880151878203601f190160e0890152945061440a8186613c2e565b98975050505050505050565b8681526001600160a01b0386811660208301528581166040830152841660608201526080810183905260c060a082018190525f9061440a90830184613c2e565b634e487b7160e01b5f52601260045260245ffd5b5f8261447857614478614456565b500690565b5f6020828403121561448d575f80fd5b81516107ba81613668565b60ff828116828216039081111561042a5761042a6142a2565b600181815b808511156144eb57815f19048211156144d1576144d16142a2565b808516156144de57918102915b93841c93908002906144b6565b509250929050565b5f826145015750600161042a565b8161450d57505f61042a565b8160018114614523576002811461452d57614549565b600191505061042a565b60ff84111561453e5761453e6142a2565b50506001821b61042a565b5060208310610133831016604e8410600b841016171561456c575081810a61042a565b61457683836144b1565b805f1904821115614589576145896142a2565b029392505050565b5f6107ba83836144f3565b808202811582820484141761042a5761042a6142a2565b5f826145c1576145c1614456565b500490565b5f602082840312156145d6575f80fd5b815180151581146107ba575f80fd5b5f82518060208501845e5f92019182525091905056fe9316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e6009316912b5a9db88acbe872c934fdd0a46c436c6dcba332d649c4d57c7bc9e602d2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500914a9547f6c3ddce1d5efbd9e687708f0d1d408ce129e8e1a88bce4f40e29500de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a2646970667358221220e82b828f198402bad387e8b38acf067c7bc2d95651629d0716b94a9370642b3264736f6c6343000819003354656c65706f7274657252656769737472794170703a20696e76616c69642054"}, "ERC20TokenRemote": {"abi": [{"inputs": [{"components": [{"internalType": "address", "name": "teleporterRegistryAddress", "type": "address"}, {"internalType": "address", "name": "teleporterManager", "type": "address"}, {"internalType": "uint256", "name": "minTeleporterVersion", "type": "uint256"}, {"internalType": "bytes32", "name": "tokenHomeBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "tokenHomeAddress", "type": "address"}, {"internalType": "uint8", "name": "tokenHomeDecimals", "type": "uint8"}], "internalType": "struct TokenRemoteSettings", "name": "settings", "type": "tuple"}, {"internalType": "string", "name": "tokenName", "type": "string"}, {"internalType": "string", "name": "tokenSymbol", "type": "string"}, {"internalType": "uint8", "name": "tokenDecimals", "type": "uint8"}], "stateMutability": "nonpayable", "type": "constructor"}, {"inputs": [{"internalType": "address", "name": "target", "type": "address"}], "name": "AddressEmptyCode", "type": "error"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "AddressInsufficientBalance", "type": "error"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "allowance", "type": "uint256"}, {"internalType": "uint256", "name": "needed", "type": "uint256"}], "name": "ERC20InsufficientAllowance", "type": "error"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}, {"internalType": "uint256", "name": "balance", "type": "uint256"}, {"internalType": "uint256", "name": "needed", "type": "uint256"}], "name": "ERC20InsufficientBalance", "type": "error"}, {"inputs": [{"internalType": "address", "name": "approver", "type": "address"}], "name": "ERC20InvalidApprover", "type": "error"}, {"inputs": [{"internalType": "address", "name": "receiver", "type": "address"}], "name": "ERC20InvalidReceiver", "type": "error"}, {"inputs": [{"internalType": "address", "name": "sender", "type": "address"}], "name": "ERC20InvalidSender", "type": "error"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}], "name": "ERC20InvalidSpender", "type": "error"}, {"inputs": [], "name": "FailedInnerCall", "type": "error"}, {"inputs": [], "name": "InvalidInitialization", "type": "error"}, {"inputs": [], "name": "NotInitializing", "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": "ReentrancyGuardReentrantCall", "type": "error"}, {"inputs": [{"internalType": "address", "name": "token", "type": "address"}], "name": "SafeERC20FailedOperation", "type": "error"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "owner", "type": "address"}, {"indexed": true, "internalType": "address", "name": "spender", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Approval", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "recipientContract", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "CallFailed", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "recipientContract", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "CallSucceeded", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": false, "internalType": "uint64", "name": "version", "type": "uint64"}], "name": "Initialized", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "oldMinTeleporterVersion", "type": "uint256"}, {"indexed": true, "internalType": "uint256", "name": "newMinTeleporterVersion", "type": "uint256"}], "name": "MinTeleporterVersionUpdated", "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": true, "internalType": "address", "name": "teleporterAddress", "type": "address"}], "name": "TeleporterAddressPaused", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "teleporterAddress", "type": "address"}], "name": "TeleporterAddressUnpaused", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "bytes32", "name": "teleporterMessageID", "type": "bytes32"}, {"indexed": true, "internalType": "address", "name": "sender", "type": "address"}, {"components": [{"internalType": "bytes32", "name": "destinationBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "destinationTokenTransferrerAddress", "type": "address"}, {"internalType": "address", "name": "recipientContract", "type": "address"}, {"internalType": "bytes", "name": "recipientPayload", "type": "bytes"}, {"internalType": "uint256", "name": "requiredGasLimit", "type": "uint256"}, {"internalType": "uint256", "name": "recipientGasLimit", "type": "uint256"}, {"internalType": "address", "name": "multiHopFallback", "type": "address"}, {"internalType": "address", "name": "fallbackRecipient", "type": "address"}, {"internalType": "address", "name": "primaryFeeTokenAddress", "type": "address"}, {"internalType": "uint256", "name": "primaryFee", "type": "uint256"}, {"internalType": "uint256", "name": "secondaryFee", "type": "uint256"}], "indexed": false, "internalType": "struct SendAndCallInput", "name": "input", "type": "tuple"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "TokensAndCallSent", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "bytes32", "name": "teleporterMessageID", "type": "bytes32"}, {"indexed": true, "internalType": "address", "name": "sender", "type": "address"}, {"components": [{"internalType": "bytes32", "name": "destinationBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "destinationTokenTransferrerAddress", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "address", "name": "primaryFeeTokenAddress", "type": "address"}, {"internalType": "uint256", "name": "primaryFee", "type": "uint256"}, {"internalType": "uint256", "name": "secondaryFee", "type": "uint256"}, {"internalType": "uint256", "name": "requiredGasLimit", "type": "uint256"}, {"internalType": "address", "name": "multiHopFallback", "type": "address"}], "indexed": false, "internalType": "struct SendTokensInput", "name": "input", "type": "tuple"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "TokensSent", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "recipient", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "TokensWithdrawn", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "address", "name": "from", "type": "address"}, {"indexed": true, "internalType": "address", "name": "to", "type": "address"}, {"indexed": false, "internalType": "uint256", "name": "value", "type": "uint256"}], "name": "Transfer", "type": "event"}, {"inputs": [], "name": "ERC20_TOKEN_REMOTE_STORAGE_LOCATION", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "MULTI_HOP_CALL_GAS_PER_WORD", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "MULTI_HOP_CALL_REQUIRED_GAS", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "MULTI_HOP_SEND_REQUIRED_GAS", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "REGISTER_REMOTE_REQUIRED_GAS", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "TELEPORTER_REGISTRY_APP_STORAGE_LOCATION", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "TOKEN_REMOTE_STORAGE_LOCATION", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "owner", "type": "address"}, {"internalType": "address", "name": "spender", "type": "address"}], "name": "allowance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "spender", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}], "name": "approve", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "account", "type": "address"}], "name": "balanceOf", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "payloadSize", "type": "uint256"}], "name": "calculateNumWords", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "pure", "type": "function"}, {"inputs": [], "name": "decimals", "outputs": [{"internalType": "uint8", "name": "", "type": "uint8"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getBlockchainID", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getInitialReserveImbalance", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getIsCollateralized", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMinTeleporterVersion", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getMultiplyOnRemote", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getTokenHomeAddress", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getTokenHomeBlockchainID", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getTokenMultiplier", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"components": [{"internalType": "address", "name": "teleporterRegistryAddress", "type": "address"}, {"internalType": "address", "name": "teleporterManager", "type": "address"}, {"internalType": "uint256", "name": "minTeleporterVersion", "type": "uint256"}, {"internalType": "bytes32", "name": "tokenHomeBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "tokenHomeAddress", "type": "address"}, {"internalType": "uint8", "name": "tokenHomeDecimals", "type": "uint8"}], "internalType": "struct TokenRemoteSettings", "name": "settings", "type": "tuple"}, {"internalType": "string", "name": "tokenName", "type": "string"}, {"internalType": "string", "name": "tokenSymbol", "type": "string"}, {"internalType": "uint8", "name": "tokenDecimals", "type": "uint8"}], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "teleporterAddress", "type": "address"}], "name": "isTeleporterAddressPaused", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "name", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "owner", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "teleporterAddress", "type": "address"}], "name": "pauseTeleporterAddress", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "bytes32", "name": "sourceBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "originSenderAddress", "type": "address"}, {"internalType": "bytes", "name": "message", "type": "bytes"}], "name": "receiveTeleporterMessage", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "address", "name": "feeTokenAddress", "type": "address"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "internalType": "struct TeleporterFeeInfo", "name": "feeInfo", "type": "tuple"}], "name": "registerWithHome", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "bytes32", "name": "destinationBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "destinationTokenTransferrerAddress", "type": "address"}, {"internalType": "address", "name": "recipient", "type": "address"}, {"internalType": "address", "name": "primaryFeeTokenAddress", "type": "address"}, {"internalType": "uint256", "name": "primaryFee", "type": "uint256"}, {"internalType": "uint256", "name": "secondaryFee", "type": "uint256"}, {"internalType": "uint256", "name": "requiredGasLimit", "type": "uint256"}, {"internalType": "address", "name": "multiHopFallback", "type": "address"}], "internalType": "struct SendTokensInput", "name": "input", "type": "tuple"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "send", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"components": [{"internalType": "bytes32", "name": "destinationBlockchainID", "type": "bytes32"}, {"internalType": "address", "name": "destinationTokenTransferrerAddress", "type": "address"}, {"internalType": "address", "name": "recipientContract", "type": "address"}, {"internalType": "bytes", "name": "recipientPayload", "type": "bytes"}, {"internalType": "uint256", "name": "requiredGasLimit", "type": "uint256"}, {"internalType": "uint256", "name": "recipientGasLimit", "type": "uint256"}, {"internalType": "address", "name": "multiHopFallback", "type": "address"}, {"internalType": "address", "name": "fallbackRecipient", "type": "address"}, {"internalType": "address", "name": "primaryFeeTokenAddress", "type": "address"}, {"internalType": "uint256", "name": "primaryFee", "type": "uint256"}, {"internalType": "uint256", "name": "secondaryFee", "type": "uint256"}], "internalType": "struct SendAndCallInput", "name": "input", "type": "tuple"}, {"internalType": "uint256", "name": "amount", "type": "uint256"}], "name": "sendAndCall", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "symbol", "outputs": [{"internalType": "string", "name": "", "type": "string"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "totalSupply", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "to", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}], "name": "transfer", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "from", "type": "address"}, {"internalType": "address", "name": "to", "type": "address"}, {"internalType": "uint256", "name": "value", "type": "uint256"}], "name": "transferFrom", "outputs": [{"internalType": "bool", "name": "", "type": "bool"}], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "newOwner", "type": "address"}], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "address", "name": "teleporterAddress", "type": "address"}], "name": "unpauseTeleporterAddress", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "version", "type": "uint256"}], "name": "updateMinTeleporterVersion", "outputs": [], "stateMutability": "nonpayable", "type": "function"}], "bytecode": "0x608060405234801561000f575f80fd5b506040516156c33803806156c383398101604081905261002e91610bce565b61003a84848484610046565b50505050610f2e565b50565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff1615906001600160401b03165f8115801561008f5750825b90505f826001600160401b031660011480156100aa5750303b155b9050811580156100b8575080155b156100d65760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b0319166001178555831561010457845460ff60401b1916680100000000000000001785555b61011089898989610161565b831561015657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b6101696101b3565b6101738383610203565b61017e845f83610219565b7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf62622300805460ff191660ff83161790555b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff1661020157604051631afcd79f60e31b815260040160405180910390fd5b565b61020b6101b3565b6102158282610250565b5050565b6102216101b3565b8251602084015160408501516102389291906102b3565b6102406102ce565b61024b8383836102de565b505050565b6102586101b3565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace007f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036102a48482610d33565b50600481016101ad8382610d33565b6102bb6101b3565b6102c5838261062d565b61024b8261064f565b6102d66101b3565b610201610660565b6102e66101b3565b5f7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0090507302000000000000000000000000000000000000056001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561035a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061037e9190610df2565b815560608401516103e95760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d6520626c6f60448201526918dad8da185a5b88125160b21b60648201526084015b60405180910390fd5b80546060850151036104635760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e52656d6f74653a2063616e6e6f74206465706c6f7920746f20736160448201527f6d6520626c6f636b636861696e20617320746f6b656e20686f6d65000000000060648201526084016103e0565b60808401516001600160a01b03166104c95760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d65206164646044820152637265737360e01b60648201526084016103e0565b60128460a0015160ff1611156105335760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20746f6b656e20686f6d6520646563696d616c73604482015268040e8dede40d0d2ced60bb1b60648201526084016103e0565b60128260ff1611156105935760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a20746f6b656e20646563696d616c7320746f6f206044820152630d0d2ced60e31b60648201526084016103e0565b60608401516001820155608084015160028201805460058401869055600684018054871560ff1990911617905560a08701516001600160a01b039093166001600160a81b031990911617600160a01b60ff808516919091029190911760ff60a81b1916600160a81b9186169190910217905561060f908361068a565b60048301805460ff1916911515919091179055600390910155505050565b6106356101b3565b61063d6106d2565b6106456106e2565b61021582826106ea565b6106576101b3565b6100438161086e565b5f7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c75005b6001905550565b5f8060ff8085169084161181816106ad576106a58587610e1d565b60ff166106bb565b6106b78686610e1d565b60ff165b6106c690600a610f1c565b96919550909350505050565b6106da6101b3565b6102016108a8565b6102016101b3565b6106f26101b3565b6001600160a01b03821661076e5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084016103e0565b5f7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0090505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f79190610df2565b1161084c5760405162461bcd60e51b815260206004820152603260248201525f805160206156a3833981519152604482015271656c65706f7274657220726567697374727960701b60648201526084016103e0565b81546001600160a01b0319166001600160a01b0382161782556101ad836108d7565b6108766101b3565b6001600160a01b03811661089f57604051631e4fbdf760e01b81525f60048201526024016103e0565b61004381610a6f565b6108b06101b3565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00610683565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0080546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa15801561093e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109629190610df2565b6002830154909150818411156109c15760405162461bcd60e51b815260206004820152603160248201525f805160206156a383398151915260448201527032b632b837b93a32b9103b32b939b4b7b760791b60648201526084016103e0565b808411610a365760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e0060648201526084016103e0565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b0381118282101715610b1557610b15610adf565b60405290565b80516001600160a01b0381168114610b31575f80fd5b919050565b805160ff81168114610b31575f80fd5b5f82601f830112610b55575f80fd5b81516001600160401b0380821115610b6f57610b6f610adf565b604051601f8301601f19908116603f01168101908282118183101715610b9757610b97610adf565b81604052838152866020858801011115610baf575f80fd5b8360208701602083015e5f602085830101528094505050505092915050565b5f805f80848603610120811215610be3575f80fd5b60c0811215610bf0575f80fd5b50610bf9610af3565b610c0286610b1b565b8152610c1060208701610b1b565b60208201526040860151604082015260608601516060820152610c3560808701610b1b565b6080820152610c4660a08701610b36565b60a082015260c08601519094506001600160401b0380821115610c67575f80fd5b610c7388838901610b46565b945060e0870151915080821115610c88575f80fd5b50610c9587828801610b46565b925050610ca56101008601610b36565b905092959194509250565b600181811c90821680610cc457607f821691505b602082108103610ce257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561024b57805f5260205f20601f840160051c81016020851015610d0d5750805b601f840160051c820191505b81811015610d2c575f8155600101610d19565b5050505050565b81516001600160401b03811115610d4c57610d4c610adf565b610d6081610d5a8454610cb0565b84610ce8565b602080601f831160018114610d93575f8415610d7c5750858301515b5f19600386901b1c1916600185901b178555610dea565b5f85815260208120601f198616915b82811015610dc157888601518255948401946001909101908401610da2565b5085821015610dde57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215610e02575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b60ff8281168282160390811115610e3657610e36610e09565b92915050565b600181815b80851115610e7657815f1904821115610e5c57610e5c610e09565b80851615610e6957918102915b93841c9390800290610e41565b509250929050565b5f82610e8c57506001610e36565b81610e9857505f610e36565b8160018114610eae5760028114610eb857610ed4565b6001915050610e36565b60ff841115610ec957610ec9610e09565b50506001821b610e36565b5060208310610133831016604e8410600b8410161715610ef7575081810a610e36565b610f018383610e3c565b805f1904821115610f1457610f14610e09565b029392505050565b5f610f278383610e7e565b9392505050565b61476880610f3b5f395ff3fe608060405234801561000f575f80fd5b506004361061021e575f3560e01c806370a082311161012a578063b8a46d02116100b4578063dd62ed3e11610079578063dd62ed3e146104bd578063e0fd9cb8146104d0578063ef793e2a146104d8578063f2fde38b146104e0578063f3f981d8146104f3575f80fd5b8063b8a46d0214610474578063c3cd692714610487578063c868efaa1461048f578063c9fe4ddf146104a2578063d2cc7a70146104b5575f80fd5b80638da5cb5b116100fa5780638da5cb5b146103ee578063909a6ac01461043257806395d89b4114610446578063973142971461044e578063a9059cbb14610461575f80fd5b806370a08231146103a0578063715018a6146103d457806371717c18146103dc5780637ee3779a146103e6575f80fd5b8063313ce567116101ab5780635507f3d11161017b5780635507f3d1146103365780635d16225d146103405780635eb995141461035357806362431a6514610366578063656900381461038d575f80fd5b8063313ce567146102c057806335cac159146102f45780634213cf781461031b5780634511243e14610323575f80fd5b806315beb59f116101f157806315beb59f1461027d57806318160ddd1461028657806323b872dd1461028e578063254ac160146102a15780632b0d8f18146102ab575f80fd5b806302a30c7d1461022257806306fdde031461023f5780630733c8c814610254578063095ea7b31461026a575b5f80fd5b61022a610506565b60405190151581526020015b60405180910390f35b61024761051d565b60405161023691906136cd565b61025c6105dd565b604051908152602001610236565b61022a610278366004613703565b6105f1565b61025c6105dc81565b61025c61060a565b61022a61029c36600461372d565b610625565b61025c6201fbd081565b6102be6102b936600461376b565b61064a565b005b7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf626223005460405160ff9091168152602001610236565b61025c7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0081565b61025c61074c565b6102be61033136600461376b565b61075d565b61025c6205302081565b6102be61034e366004613786565b61084c565b6102be6103613660046137b5565b61085a565b61025c7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf6262230081565b6102be61039b3660046137cc565b61086e565b61025c6103ae36600461376b565b6001600160a01b03165f9081525f805160206146f3833981519152602052604090205490565b6102be610878565b61025c6205573081565b61022a61088b565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610236565b61025c5f8051602061471383398151915281565b6102476108a2565b61022a61045c36600461376b565b6108e0565b61022a61046f366004613703565b6108f9565b6102be610482366004613804565b610906565b61041a610acd565b6102be61049d36600461381a565b610aea565b6102be6104b03660046139d4565b610ca7565b61025c610db9565b61025c6104cb366004613abd565b610dce565b61025c610e17565b61025c610e2b565b6102be6104ee36600461376b565b610e3f565b61025c6105013660046137b5565b610e79565b5f80610510610e8f565b6006015460ff1692915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f805160206146f38339815191529161055b90613af4565b80601f016020809104026020016040519081016040528092919081815260200182805461058790613af4565b80156105d25780601f106105a9576101008083540402835291602001916105d2565b820191905f5260205f20905b8154815290600101906020018083116105b557829003601f168201915b505050505091505090565b5f806105e7610e8f565b6003015492915050565b5f336105fe818585610eb3565b60019150505b92915050565b5f805f805160206146f38339815191525b6002015492915050565b5f33610632858285610ec5565b61063d858585610f22565b60019150505b9392505050565b5f80516020614713833981519152610660610f7f565b6001600160a01b03821661068f5760405162461bcd60e51b815260040161068690613b26565b60405180910390fd5b6106998183610f87565b156106fc5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b6064820152608401610686565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b5f80610756610e8f565b5492915050565b5f80516020614713833981519152610773610f7f565b6001600160a01b0382166107995760405162461bcd60e51b815260040161068690613b26565b6107a38183610f87565b6108015760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b6064820152608401610686565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b6108568282610fa8565b5050565b610862610f7f565b61086b81611030565b50565b61085682826111c8565b610880611250565b6108895f6112ab565b565b5f80610895610e8f565b6004015460ff1692915050565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f805160206146f38339815191529161055b90613af4565b5f5f805160206147138339815191526106438184610f87565b5f336105fe818585610f22565b5f61090f610e8f565b6006810154909150610100900460ff161561096c5760405162461bcd60e51b815260206004820152601f60248201527f546f6b656e52656d6f74653a20616c72656164792072656769737465726564006044820152606401610686565b604080516060808201835260058401548252600284015460ff600160a01b820481166020808601918252600160a81b9093048216858701908152865180880188525f808252885188518188015293518516848a01529151909316828601528651808303909501855260809091019095528082019290925291929091610a01906109f79087018761376b565b866020013561131b565b6040805160c0810182526001870154815260028701546001600160a01b031660208083019190915282518084018452939450610ac5939192830191908190610a4b908b018b61376b565b6001600160a01b0316815260209081018690529082526201fbd0908201526040015f5b604051908082528060200260200182016040528015610a97578160200160208202803683370190505b50815260200184604051602001610aae9190613b88565b604051602081830303815290604052815250611363565b505050505050565b5f80610ad7610e8f565b600201546001600160a01b031692915050565b610af261147e565b5f5f8051602061471383398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015610b5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b819190613bca565b1015610be85760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b6064820152608401610686565b610bf28133610f87565b15610c585760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b6064820152608401610686565b610c98858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506114c892505050565b50610ca16116df565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ceb5750825b90505f826001600160401b03166001148015610d065750303b155b905081158015610d14575080155b15610d325760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610d5c57845460ff60401b1916600160401b1785555b610d6889898989611709565b8315610dae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050565b5f805f8051602061471383398151915261061b565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b5f80610e21610e8f565b6001015492915050565b5f80610e35610e8f565b6005015492915050565b610e47611250565b6001600160a01b038116610e7057604051631e4fbdf760e01b81525f6004820152602401610686565b61086b816112ab565b5f6005610e8783601f613bf5565b901c92915050565b7f600d6a9b283d1eda563de594ce4843869b6f128a4baa222422ed94a60b0cef0090565b610ec08383836001611759565b505050565b5f610ed08484610dce565b90505f198114610ca15781811015610f1457604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610686565b610ca184848484035f611759565b6001600160a01b038316610f4b57604051634b637e8f60e11b81525f6004820152602401610686565b6001600160a01b038216610f745760405163ec442f0560e01b81525f6004820152602401610686565b610ec083838361183c565b610889611250565b6001600160a01b03165f908152600191909101602052604090205460ff1690565b7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c75008054600114610fea5760405162461bcd60e51b815260040161068690613c08565b600281555f610ff7610e8f565b905061100284611975565b600181015484350361101d576110188484611a60565b611027565b6110278484611be4565b50600190555050565b5f8051602061471383398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa158015611084573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a89190613bca565b60028301549091508184111561111a5760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b6064820152608401610686565b80841161118f5760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e006064820152608401610686565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500805460011461120a5760405162461bcd60e51b815260040161068690613c08565b600281555f611217610e8f565b905061122284611daf565b600181015484350361123e576112388484611fe9565b50611248565b61123884846121f8565b600190555050565b336112827f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108895760405163118cdaa760e01b8152336004820152602401610686565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f815f0361132a57505f610604565b306001600160a01b0384160361135857611346335b3084610ec5565b611351333084610f22565b5080610604565b610643833384612494565b5f8061136d6125f7565b60408401516020015190915015611412576040830151516001600160a01b03166113ef5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b6064820152608401610686565b604083015160208101519051611412916001600160a01b039091169083906126e7565b604051630624488560e41b81526001600160a01b0382169063624488509061143e908690600401613c4c565b6020604051808303815f875af115801561145a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106439190613bca565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016114c257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6114d1610e8f565b9050806001015484146115385760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20696e76616c696420736f7572636520626c6f636044820152681ad8da185a5b88125160ba1b6064820152608401610686565b60028101546001600160a01b038481169116146115aa5760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a20696e76616c6964206f726967696e2073656e646044820152696572206164647265737360b01b6064820152608401610686565b5f828060200190518101906115bf9190613d50565b6006830154909150610100900460ff1615806115e05750600682015460ff16155b156115f75760068201805461ffff19166101011790555b60018151600481111561160c5761160c613b74565b03611643575f816020015180602001905181019061162a9190613dd8565b905061163d815f0151826020015161276e565b506116d8565b60028151600481111561165857611658613b74565b03611686575f81602001518060200190518101906116769190613e10565b905061163d8182608001516127bb565b60405162461bcd60e51b815260206004820152602160248201527f546f6b656e52656d6f74653a20696e76616c6964206d657373616765207479706044820152606560f81b6064820152608401610686565b5050505050565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005b6001905550565b611711612914565b61171b838361295d565b611726845f8361296f565b7f9b9029a3537fcf0e984763da4ac33bbf592a3462819171bf424e91cf62622300805460ff191660ff8316179055610ca1565b5f805160206146f38339815191526001600160a01b0385166117905760405163e602df0560e01b81525f6004820152602401610686565b6001600160a01b0384166117b957604051634a1406b160e11b81525f6004820152602401610686565b6001600160a01b038086165f908152600183016020908152604080832093881683529290522083905581156116d857836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161182d91815260200190565b60405180910390a35050505050565b5f805160206146f38339815191526001600160a01b0384166118765781816002015f82825461186b9190613bf5565b909155506118e69050565b6001600160a01b0384165f90815260208290526040902054828110156118c85760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401610686565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b038316611904576002810180548390039055611922565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161196791815260200190565b60405180910390a350505050565b5f611986606083016040840161376b565b6001600160a01b0316036119e85760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e74206164647260448201526265737360e81b6064820152608401610686565b5f8160c0013511611a0b5760405162461bcd60e51b815260040161068690613eda565b8035611a295760405162461bcd60e51b815260040161068690613f1e565b5f611a3a604083016020840161376b565b6001600160a01b03160361086b5760405162461bcd60e51b815260040161068690613f69565b5f611a69610e8f565b9050611a99611a7e604085016020860161376b565b60a0850135611a94610100870160e0880161376b565b6129a0565b5f611abd83611aae608087016060880161376b565b86608001358760a00135612a9d565b6040805180820190915291945091505f9080600181526020016040518060400160405280886040016020810190611af4919061376b565b6001600160a01b0316815260200187815250604051602001611b169190613fc6565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92611b969282019080611b6e60808c0160608d0161376b565b6001600160a01b03168152602090810188905290825260c08a0135908201526040015f610a6e565b9050336001600160a01b0316817f93f19bf1ec58a15dc643b37e7e18a1c13e85e06cd11929e283154691ace9fb528888604051611bd4929190613fe6565b60405180910390a3505050505050565b5f611bed610e8f565b9050611c1a8335611c04604086016020870161376b565b611c15610100870160e0880161376b565b612b60565b5f611c2f83611aae608087016060880161376b565b60408051808201825260038152815160e081018352883581529396509193505f9260208084019282820191611c68918b01908b0161376b565b6001600160a01b03168152602001611c8660608a0160408b0161376b565b6001600160a01b031681526020810188905260a0890135604082015260c08901356060820152608001611cc06101008a0160e08b0161376b565b6001600160a01b03169052604051611d309190602001815181526020808301516001600160a01b0390811691830191909152604080840151821690830152606080840151908301526080808401519083015260a0808401519083015260c092830151169181019190915260e00190565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f92611b969282019080611d8860808c0160608d0161376b565b6001600160a01b03168152602090810188905290825262053020908201526040015f610a6e565b8035611dcd5760405162461bcd60e51b815260040161068690613f1e565b5f611dde604083016020840161376b565b6001600160a01b031603611e045760405162461bcd60e51b815260040161068690613f69565b5f611e15606083016040840161376b565b6001600160a01b031603611e805760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420636f6e7460448201526b72616374206164647265737360a01b6064820152608401610686565b5f816080013511611ea35760405162461bcd60e51b815260040161068690613eda565b5f8160a0013511611f045760405162461bcd60e51b815260206004820152602560248201527f546f6b656e52656d6f74653a207a65726f20726563697069656e7420676173206044820152641b1a5b5a5d60da1b6064820152608401610686565b80608001358160a0013510611f6c5760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a20696e76616c696420726563697069656e742067604482015267185cc81b1a5b5a5d60c21b6064820152608401610686565b5f611f7e610100830160e0840161376b565b6001600160a01b03160361086b5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a207a65726f2066616c6c6261636b20726563697060448201526b69656e74206164647265737360a01b6064820152608401610686565b5f611ff2610e8f565b905061201d612007604085016020860161376b565b610140850135611a9460e0870160c0880161376b565b5f612045836120346101208701610100880161376b565b866101200135876101400135612a9d565b6040805180820190915291945091505f908060028152602001604051806101000160405280865f01548152602001306001600160a01b031681526020016120893390565b6001600160a01b031681526020016120a760608a0160408b0161376b565b6001600160a01b03168152602081018890526040016120c960608a018a614085565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a0890135602082015260400161211d6101008a0160e08b0161376b565b6001600160a01b0316905260405161213891906020016140c7565b60408051601f198184030181529181529152805160c0810182526001860154815260028601546001600160a01b03166020820152815180830183529293505f926121ba92820190806121926101208c016101008d0161376b565b6001600160a01b03168152602090810188905290825260808a0135908201526040015f610a6e565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b168888604051611bd49291906141ce565b5f612201610e8f565b90506122288335612218604086016020870161376b565b611c1560e0870160c0880161376b565b5f61223f836120346101208701610100880161376b565b6040805180820190915291945091505f90806004815260200160405180610160016040528061226b3390565b6001600160a01b03168152602001885f01358152602001886020016020810190612295919061376b565b6001600160a01b031681526020016122b360608a0160408b0161376b565b6001600160a01b03168152602081018890526040016122d560608a018a614085565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060a089013560208201526040016123296101008a0160e08b0161376b565b6001600160a01b031681526080890135602082015260400161235160e08a0160c08b0161376b565b6001600160a01b031681526101408901356020918201526040516123769291016142dc565b60408051601f19818403018152919052905290505f6105dc6123a561239e6060890189614085565b9050610e79565b6123af91906143b9565b6123bc9062055730613bf5565b6040805160c0810182526001870154815260028701546001600160a01b03166020820152815180830183529293505f9261244592820190806124066101208d016101008e0161376b565b6001600160a01b031681526020908101899052908252818101869052604080515f815280830182528184015251606090920191610aae91889101613b88565b9050336001600160a01b0316817f5d76dff81bf773b908b050fa113d39f7d8135bb4175398f313ea19cd3a1a0b1689896040516124839291906141ce565b60405180910390a350505050505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038616906370a0823190602401602060405180830381865afa1580156124da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124fe9190613bca565b90506125156001600160a01b038616853086612bfe565b6040516370a0823160e01b81523060048201525f906001600160a01b038716906370a0823190602401602060405180830381865afa158015612559573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061257d9190613bca565b90508181116125e35760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610686565b6125ed82826143d0565b9695505050505050565b5f8051602061471383398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015612651573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267591906143e3565b90506126818282610f87565b156106045760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b6064820152608401610686565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa158015612734573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127589190613bca565b9050610ca184846127698585613bf5565b612c65565b816001600160a01b03167f6352c5382c4a4578e712449ca65e83cdb392d045dfcf1cad9615189db2da244b826040516127a991815260200190565b60405180910390a26108568282612cf4565b6127c53082612cf4565b6127d430836060015183610eb3565b5f825f01518360200151846040015130858760a001516040516024016127ff969594939291906143fe565b60408051601f198184030181529190526020810180516001600160e01b03166394395edd60e01b17905260c084015160608501519192505f91612843919084612d28565b90505f612854308660600151610dce565b90506128653086606001515f610eb3565b81156128b75784606001516001600160a01b03167f104deb555f67e63782bb817bc26c39050894645f9b9f29c4be8ae68d0e8b7ff4856040516128aa91815260200190565b60405180910390a26128ff565b84606001516001600160a01b03167fb9eaeae386d339f8115782f297a9e5f0e13fb587cd6b0d502f113cb8dd4d6cb0856040516128f691815260200190565b60405180910390a25b80156116d8576116d8308660e0015183610f22565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661088957604051631afcd79f60e31b815260040160405180910390fd5b612965612914565b6108568282612d3d565b612977612914565b61298d835f015184602001518560400151612d8d565b612995612da8565b610ec0838383612db8565b5f6129a9610e8f565b60028101549091506001600160a01b038581169116146129db5760405162461bcd60e51b81526004016106869061443e565b8215612a355760405162461bcd60e51b815260206004820152602360248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f207365636f6e646172792060448201526266656560e81b6064820152608401610686565b6001600160a01b03821615610ca15760405162461bcd60e51b815260206004820152602860248201527f546f6b656e52656d6f74653a206e6f6e2d7a65726f206d756c74692d686f702060448201526766616c6c6261636b60c01b6064820152608401610686565b5f805f612aa8610e8f565b9050612ab3876130dc565b9650612abf868661131b565b60038201546004830154919650612ad99160ff16866130f4565b60038201546004830154612af1919060ff168a6130f4565b11612b535760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e52656d6f74653a20696e73756666696369656e7420746f6b656e7360448201526b103a37903a3930b739b332b960a11b6064820152608401610686565b5094959294509192505050565b5f612b69610e8f565b80549091508403612b9c57306001600160a01b03841603612b9c5760405162461bcd60e51b81526004016106869061443e565b6001600160a01b038216610ca15760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f206d756c74692d686f702066616c6c6044820152636261636b60e01b6064820152608401610686565b6040516001600160a01b038481166024830152838116604483015260648201839052610ca19186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613101565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052612cb68482613162565b610ca1576040516001600160a01b0384811660248301525f6044830152612cea91869182169063095ea7b390606401612c33565b610ca18482613101565b6001600160a01b038216612d1d5760405163ec442f0560e01b81525f6004820152602401610686565b6108565f838361183c565b5f612d35845f8585613203565b949350505050565b612d45612914565b5f805160206146f38339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03612d7e84826144df565b5060048101610ca183826144df565b612d95612914565b612d9f83826132d3565b610ec0826132f5565b612db0612914565b610889613306565b612dc0612914565b5f612dc9610e8f565b90506005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e329190613bca565b81556060840151612e985760405162461bcd60e51b815260206004820152602a60248201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d6520626c6f60448201526918dad8da185a5b88125160b21b6064820152608401610686565b8054606085015103612f125760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e52656d6f74653a2063616e6e6f74206465706c6f7920746f20736160448201527f6d6520626c6f636b636861696e20617320746f6b656e20686f6d6500000000006064820152608401610686565b60808401516001600160a01b0316612f785760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a207a65726f20746f6b656e20686f6d65206164646044820152637265737360e01b6064820152608401610686565b60128460a0015160ff161115612fe25760405162461bcd60e51b815260206004820152602960248201527f546f6b656e52656d6f74653a20746f6b656e20686f6d6520646563696d616c73604482015268040e8dede40d0d2ced60bb1b6064820152608401610686565b60128260ff1611156130425760405162461bcd60e51b8152602060048201526024808201527f546f6b656e52656d6f74653a20746f6b656e20646563696d616c7320746f6f206044820152630d0d2ced60e31b6064820152608401610686565b60608401516001820155608084015160028201805460058401869055600684018054871560ff1990911617905560a08701516001600160a01b039093166001600160a81b031990911617600160a01b60ff808516919091029190911760ff60a81b1916600160a81b918616919091021790556130be908361332d565b60048301805460ff1916911515919091179055600390910155505050565b5f6130e63361133f565b6130f03383613377565b5090565b5f612d358484845f6133ab565b5f6131156001600160a01b038416836133d2565b905080515f14158015613139575080806020019051810190613137919061459a565b155b15610ec057604051635274afe760e01b81526001600160a01b0384166004820152602401610686565b5f805f846001600160a01b03168460405161317d91906145b9565b5f604051808303815f865af19150503d805f81146131b6576040519150601f19603f3d011682016040523d82523d5f602084013e6131bb565b606091505b50915091508180156131e55750805115806131e55750808060200190518101906131e5919061459a565b80156131fa57505f856001600160a01b03163b115b95945050505050565b5f845a10156132545760405162461bcd60e51b815260206004820152601b60248201527f43616c6c5574696c733a20696e73756666696369656e742067617300000000006044820152606401610686565b834710156132a45760405162461bcd60e51b815260206004820152601d60248201527f43616c6c5574696c733a20696e73756666696369656e742076616c75650000006044820152606401610686565b826001600160a01b03163b5f036132bc57505f612d35565b5f805f84516020860188888bf19695505050505050565b6132db612914565b6132e36133df565b6132eb6133ef565b61085682826133f7565b6132fd612914565b61086b8161357b565b5f7fd2f1ed38b7d242bfb8b41862afb813a15193219a4bc717f2056607593e6c7500611702565b5f8060ff8085169084161181816133505761334885876145cf565b60ff1661335e565b61335a86866145cf565b60ff165b61336990600a6146c8565b9350909150505b9250929050565b6001600160a01b0382166133a057604051634b637e8f60e11b81525f6004820152602401610686565b610856825f8361183c565b5f811515841515036133c8576133c185846143b9565b9050612d35565b6131fa85846146d3565b606061064383835f613583565b6133e7612914565b610889613612565b610889612914565b6133ff612914565b6001600160a01b03821661347b5760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560448201527f706f7274657220726567697374727920616464726573730000000000000000006064820152608401610686565b5f5f8051602061471383398151915290505f8390505f816001600160a01b031663c07f47d46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134f19190613bca565b116135595760405162461bcd60e51b815260206004820152603260248201527f54656c65706f7274657252656769737472794170703a20696e76616c69642054604482015271656c65706f7274657220726567697374727960701b6064820152608401610686565b81546001600160a01b0319166001600160a01b038216178255610ca183611030565b610e47612914565b6060814710156135a85760405163cd78605960e01b8152306004820152602401610686565b5f80856001600160a01b031684866040516135c391906145b9565b5f6040518083038185875af1925050503d805f81146135fd576040519150601f19603f3d011682016040523d82523d5f602084013e613602565b606091505b50915091506125ed86838361361a565b6116df612914565b60608261362f5761362a82613676565b610643565b815115801561364657506001600160a01b0384163b155b1561366f57604051639996b31560e01b81526001600160a01b0385166004820152602401610686565b5080610643565b8051156136865780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610643602083018461369f565b6001600160a01b038116811461086b575f80fd5b80356136fe816136df565b919050565b5f8060408385031215613714575f80fd5b823561371f816136df565b946020939093013593505050565b5f805f6060848603121561373f575f80fd5b833561374a816136df565b9250602084013561375a816136df565b929592945050506040919091013590565b5f6020828403121561377b575f80fd5b8135610643816136df565b5f80828403610120811215613799575f80fd5b610100808212156137a8575f80fd5b9395938601359450505050565b5f602082840312156137c5575f80fd5b5035919050565b5f80604083850312156137dd575f80fd5b82356001600160401b038111156137f2575f80fd5b8301610160818603121561371f575f80fd5b5f60408284031215613814575f80fd5b50919050565b5f805f806060858703121561382d575f80fd5b84359350602085013561383f816136df565b925060408501356001600160401b038082111561385a575f80fd5b818701915087601f83011261386d575f80fd5b81358181111561387b575f80fd5b88602082850101111561388c575f80fd5b95989497505060200194505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b03811182821017156138d1576138d161389b565b60405290565b604080519081016001600160401b03811182821017156138d1576138d161389b565b60405161010081016001600160401b03811182821017156138d1576138d161389b565b604051601f8201601f191681016001600160401b03811182821017156139445761394461389b565b604052919050565b803560ff811681146136fe575f80fd5b5f6001600160401b038211156139745761397461389b565b50601f01601f191660200190565b5f82601f830112613991575f80fd5b81356139a461399f8261395c565b61391c565b8181528460208386010111156139b8575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f808486036101208112156139e9575f80fd5b60c08112156139f6575f80fd5b506139ff6138af565b8535613a0a816136df565b81526020860135613a1a816136df565b8060208301525060408601356040820152606086013560608201526080860135613a43816136df565b6080820152613a5460a0870161394c565b60a0820152935060c08501356001600160401b0380821115613a74575f80fd5b613a8088838901613982565b945060e0870135915080821115613a95575f80fd5b50613aa287828801613982565b925050613ab2610100860161394c565b905092959194509250565b5f8060408385031215613ace575f80fd5b8235613ad9816136df565b91506020830135613ae9816136df565b809150509250929050565b600181811c90821680613b0857607f821691505b60208210810361381457634e487b7160e01b5f52602260045260245ffd5b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b634e487b7160e01b5f52602160045260245ffd5b602081525f825160058110613bab57634e487b7160e01b5f52602160045260245ffd5b806020840152506020830151604080840152612d35606084018261369f565b5f60208284031215613bda575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561060457610604613be1565b60208082526024908201527f53656e645265656e7472616e637947756172643a2073656e64207265656e7472604082015263616e637960e01b606082015260800190565b6020808252825182820152828101516001600160a01b039081166040808501919091528401518051821660608501528083015160808501525f929161010085019190606087015160a0870152608087015160e060c08801528051938490528401925f92506101208701905b80841015613cd957845183168252938501936001939093019290850190613cb7565b5060a0880151878203601f190160e08901529450613cf7818661369f565b98975050505050505050565b5f82601f830112613d12575f80fd5b8151613d2061399f8261395c565b818152846020838601011115613d34575f80fd5b8160208501602083015e5f918101602001919091529392505050565b5f60208284031215613d60575f80fd5b81516001600160401b0380821115613d76575f80fd5b9083019060408286031215613d89575f80fd5b613d916138d7565b825160058110613d9f575f80fd5b8152602083015182811115613db2575f80fd5b613dbe87828601613d03565b60208301525095945050505050565b80516136fe816136df565b5f60408284031215613de8575f80fd5b613df06138d7565b8251613dfb816136df565b81526020928301519281019290925250919050565b5f60208284031215613e20575f80fd5b81516001600160401b0380821115613e36575f80fd5b908301906101008286031215613e4a575f80fd5b613e526138f9565b82518152613e6260208401613dcd565b6020820152613e7360408401613dcd565b6040820152613e8460608401613dcd565b60608201526080830151608082015260a083015182811115613ea4575f80fd5b613eb087828601613d03565b60a08301525060c083015160c0820152613ecc60e08401613dcd565b60e082015295945050505050565b60208082526024908201527f546f6b656e52656d6f74653a207a65726f20726571756972656420676173206c6040820152631a5b5a5d60e21b606082015260800190565b6020808252602b908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20626c60408201526a1bd8dad8da185a5b88125160aa1b606082015260800190565b60208082526037908201527f546f6b656e52656d6f74653a207a65726f2064657374696e6174696f6e20746f60408201527f6b656e207472616e736665727265722061646472657373000000000000000000606082015260800190565b81516001600160a01b031681526020808301519082015260408101610604565b8235815261012081016020840135613ffd816136df565b6001600160a01b03908116602084015260408501359061401c826136df565b16604083015261402e606085016136f3565b6001600160a01b0381166060840152506080840135608083015260a084013560a083015260c084013560c083015261406860e085016136f3565b6001600160a01b031660e083015261010090910191909152919050565b5f808335601e1984360301811261409a575f80fd5b8301803591506001600160401b038211156140b3575f80fd5b602001915036819003821315613370575f80fd5b60208152815160208201525f602083015160018060a01b0380821660408501528060408601511660608501525050606083015161410f60808401826001600160a01b03169052565b50608083015160a083015260a08301516101008060c085015261413661012085018361369f565b915060c085015160e085015260e085015161415b828601826001600160a01b03169052565b5090949350505050565b5f808335601e1984360301811261417a575f80fd5b83016020810192503590506001600160401b03811115614198575f80fd5b803603821315613370575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60408152823560408201525f6141e6602085016136f3565b6001600160a01b03166060830152614200604085016136f3565b6001600160a01b0316608083015261421b6060850185614165565b6101608060a08601526142336101a0860183856141a6565b9250608087013560c086015260a087013560e086015261425560c088016136f3565b915061010061426e818701846001600160a01b03169052565b61427a60e089016136f3565b9250610120614293818801856001600160a01b03169052565b61429e828a016136f3565b935061014091506142b9828801856001600160a01b03169052565b880135918601919091529095013561018084015260209092019290925292915050565b602081526142f66020820183516001600160a01b03169052565b602082015160408201525f604083015161431b60608401826001600160a01b03169052565b5060608301516001600160a01b038116608084015250608083015160a083015260a08301516101608060c085015261435761018085018361369f565b915060c085015160e085015260e085015161010061437f818701836001600160a01b03169052565b8601516101208681019190915286015190506101406143a8818701836001600160a01b03169052565b959095015193019290925250919050565b808202811582820484141761060457610604613be1565b8181038181111561060457610604613be1565b5f602082840312156143f3575f80fd5b8151610643816136df565b8681526001600160a01b0386811660208301528581166040830152841660608201526080810183905260c060a082018190525f90613cf79083018461369f565b6020808252603a908201527f546f6b656e52656d6f74653a20696e76616c69642064657374696e6174696f6e60408201527f20746f6b656e207472616e736665727265722061646472657373000000000000606082015260800190565b601f821115610ec057805f5260205f20601f840160051c810160208510156144c05750805b601f840160051c820191505b818110156116d8575f81556001016144cc565b81516001600160401b038111156144f8576144f861389b565b61450c816145068454613af4565b8461449b565b602080601f83116001811461453f575f84156145285750858301515b5f19600386901b1c1916600185901b178555610ac5565b5f85815260208120601f198616915b8281101561456d5788860151825594840194600190910190840161454e565b508582101561458a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156145aa575f80fd5b81518015158114610643575f80fd5b5f82518060208501845e5f920191825250919050565b60ff828116828216039081111561060457610604613be1565b600181815b8085111561462257815f190482111561460857614608613be1565b8085161561461557918102915b93841c93908002906145ed565b509250929050565b5f8261463857506001610604565b8161464457505f610604565b816001811461465a576002811461466457614680565b6001915050610604565b60ff84111561467557614675613be1565b50506001821b610604565b5060208310610133831016604e8410600b84101617156146a3575081810a610604565b6146ad83836145e8565b805f19048211156146c0576146c0613be1565b029392505050565b5f610643838361462a565b5f826146ed57634e487b7160e01b5f52601260045260245ffd5b50049056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00de77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a264697066735822122081c99f49dbd05728af26993ebb6f1e52dcd01d23ea2ecc39a6eba752580fdda164736f6c6343000819003354656c65706f7274657252656769737472794170703a20696e76616c69642054"}, "TeleporterRegistry": {"abi": [{"inputs": [{"components": [{"internalType": "uint256", "name": "version", "type": "uint256"}, {"internalType": "address", "name": "protocolAddress", "type": "address"}], "internalType": "struct ProtocolRegistryEntry[]", "name": "initialEntries", "type": "tuple[]"}], "stateMutability": "nonpayable", "type": "constructor"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "version", "type": "uint256"}, {"indexed": true, "internalType": "address", "name": "protocolAddress", "type": "address"}], "name": "AddProtocolVersion", "type": "event"}, {"anonymous": false, "inputs": [{"indexed": true, "internalType": "uint256", "name": "oldVersion", "type": "uint256"}, {"indexed": true, "internalType": "uint256", "name": "newVersion", "type": "uint256"}], "name": "LatestVersionUpdated", "type": "event"}, {"inputs": [], "name": "MAX_VERSION_INCREMENT", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "VALIDATORS_SOURCE_ADDRESS", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "WARP_MESSENGER", "outputs": [{"internalType": "contract IWarpMessenger", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint32", "name": "messageIndex", "type": "uint32"}], "name": "addProtocolVersion", "outputs": [], "stateMutability": "nonpayable", "type": "function"}, {"inputs": [], "name": "blockchainID", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "version", "type": "uint256"}], "name": "getAddressFromVersion", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "getLatestTeleporter", "outputs": [{"internalType": "contract ITeleporterMessenger", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "uint256", "name": "version", "type": "uint256"}], "name": "getTeleporterFromVersion", "outputs": [{"internalType": "contract ITeleporterMessenger", "name": "", "type": "address"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"internalType": "address", "name": "protocolAddress", "type": "address"}], "name": "getVersionFromAddress", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "latestVersion", "outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}], "stateMutability": "view", "type": "function"}], "bytecode": "0x60a060405234801561000f575f80fd5b50604051610fca380380610fca83398101604081905261002e916103e2565b7302000000000000000000000000000000000000056001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561007e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100a291906104bc565b60805280515f5b818110156100e1576100d98382815181106100c6576100c66104d3565b60200260200101516100e960201b60201c565b6001016100a9565b50505061050c565b80515f0361013e5760405162461bcd60e51b815260206004820181905260248201527f54656c65706f7274657252656769737472793a207a65726f2076657273696f6e60448201526064015b60405180910390fd5b80515f908152600160205260409020546001600160a01b0316156101b75760405162461bcd60e51b815260206004820152602a60248201527f54656c65706f7274657252656769737472793a2076657273696f6e20616c72656044820152696164792065786973747360b01b6064820152608401610135565b60208101516001600160a01b03166102235760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472793a207a65726f2070726f746f636f6044820152686c206164647265737360b81b6064820152608401610135565b5f546102316101f4826104e7565b825111156102985760405162461bcd60e51b815260206004820152602e60248201527f54656c65706f7274657252656769737472793a2076657273696f6e20696e637260448201526d0cadacadce840e8dede40d0d2ced60931b6064820152608401610135565b6020828101805184515f90815260018452604080822080546001600160a01b0319166001600160a01b03948516179055925190911681526002909252902054825111156102ff5781516020808401516001600160a01b03165f908152600290915260409020555b602082015182516040516001600160a01b03909216917fa5eed93d951a9603d5f7c0a57de79a299dd3dbd5e51429be209d8053a42ab43a905f90a381518110156103725781515f81815560405183917f30623e953733f6474dabdfbef1103ce15ab73cdc77c6dfad0f9874d167e8a9b091a35b5050565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156103ac576103ac610376565b60405290565b604051601f8201601f191681016001600160401b03811182821017156103da576103da610376565b604052919050565b5f60208083850312156103f3575f80fd5b82516001600160401b0380821115610409575f80fd5b818501915085601f83011261041c575f80fd5b81518181111561042e5761042e610376565b61043c848260051b016103b2565b818152848101925060069190911b83018401908782111561045b575f80fd5b928401925b818410156104b15760408489031215610477575f80fd5b61047f61038a565b84518152858501516001600160a01b038116811461049b575f80fd5b8187015283526040939093019291840191610460565b979650505050505050565b5f602082840312156104cc575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561050657634e487b7160e01b5f52601160045260245ffd5b92915050565b608051610a9f61052b5f395f818161014301526102580152610a9f5ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063ac473ac311610063578063ac473ac31461011f578063b771b3bc14610128578063c07f47d414610136578063d127dc9b1461013e578063d820e64f14610165575f80fd5b80630731775d1461009f578063215abce9146100c357806341f34ed9146100d657806346f9ef49146100eb5780634c1f08ce146100fe575b5f80fd5b6100a65f81565b6040516001600160a01b0390911681526020015b60405180910390f35b6100a66100d13660046107aa565b61016d565b6100e96100e43660046107c1565b61017d565b005b6100a66100f93660046107aa565b6103ec565b61011161010c366004610802565b6104ae565b6040519081526020016100ba565b6101116101f481565b6100a66005600160991b0181565b6101115f5481565b6101117f000000000000000000000000000000000000000000000000000000000000000081565b6100a6610554565b5f610177826103ec565b92915050565b6040516306f8253560e41b815263ffffffff821660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156101c6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526101ed919081019061089f565b91509150806102545760405162461bcd60e51b815260206004820152602860248201527f54656c65706f7274657252656769737472793a20696e76616c69642077617270604482015267206d65737361676560c01b60648201526084015b60405180910390fd5b81517f0000000000000000000000000000000000000000000000000000000000000000146102d85760405162461bcd60e51b815260206004820152602b60248201527f54656c65706f7274657252656769737472793a20696e76616c696420736f757260448201526a18d94818da185a5b88125160aa1b606482015260840161024b565b60208201516001600160a01b03161561034d5760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472793a20696e76616c6964206f726967604482015270696e2073656e646572206164647265737360781b606482015260840161024b565b5f8083604001518060200190518101906103679190610988565b90925090506001600160a01b03811630146103dc5760405162461bcd60e51b815260206004820152602f60248201527f54656c65706f7274657252656769737472793a20696e76616c6964206465737460448201526e696e6174696f6e206164647265737360881b606482015260840161024b565b6103e582610564565b5050505050565b5f815f0361043c5760405162461bcd60e51b815260206004820181905260248201527f54656c65706f7274657252656769737472793a207a65726f2076657273696f6e604482015260640161024b565b5f828152600160205260409020546001600160a01b0316806101775760405162461bcd60e51b815260206004820152602560248201527f54656c65706f7274657252656769737472793a2076657273696f6e206e6f7420604482015264199bdd5b9960da1b606482015260840161024b565b5f6001600160a01b0382166104d55760405162461bcd60e51b815260040161024b90610a01565b6001600160a01b0382165f90815260026020526040812054908190036101775760405162461bcd60e51b815260206004820152602e60248201527f54656c65706f7274657252656769737472793a2070726f746f636f6c2061646460448201526d1c995cdcc81b9bdd08199bdd5b9960921b606482015260840161024b565b5f61055f5f546103ec565b905090565b80515f036105b45760405162461bcd60e51b815260206004820181905260248201527f54656c65706f7274657252656769737472793a207a65726f2076657273696f6e604482015260640161024b565b80515f908152600160205260409020546001600160a01b03161561062d5760405162461bcd60e51b815260206004820152602a60248201527f54656c65706f7274657252656769737472793a2076657273696f6e20616c72656044820152696164792065786973747360b01b606482015260840161024b565b60208101516001600160a01b03166106575760405162461bcd60e51b815260040161024b90610a01565b5f546106656101f482610a4a565b825111156106cc5760405162461bcd60e51b815260206004820152602e60248201527f54656c65706f7274657252656769737472793a2076657273696f6e20696e637260448201526d0cadacadce840e8dede40d0d2ced60931b606482015260840161024b565b6020828101805184515f90815260018452604080822080546001600160a01b0319166001600160a01b03948516179055925190911681526002909252902054825111156107335781516020808401516001600160a01b03165f908152600290915260409020555b602082015182516040516001600160a01b03909216917fa5eed93d951a9603d5f7c0a57de79a299dd3dbd5e51429be209d8053a42ab43a905f90a381518110156107a65781515f81815560405183917f30623e953733f6474dabdfbef1103ce15ab73cdc77c6dfad0f9874d167e8a9b091a35b5050565b5f602082840312156107ba575f80fd5b5035919050565b5f602082840312156107d1575f80fd5b813563ffffffff811681146107e4575f80fd5b9392505050565b6001600160a01b03811681146107ff575f80fd5b50565b5f60208284031215610812575f80fd5b81356107e4816107eb565b634e487b7160e01b5f52604160045260245ffd5b6040516060810167ffffffffffffffff811182821017156108545761085461081d565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156108835761088361081d565b604052919050565b8051801515811461089a575f80fd5b919050565b5f80604083850312156108b0575f80fd5b825167ffffffffffffffff808211156108c7575f80fd5b90840190606082870312156108da575f80fd5b6108e2610831565b825181526020808401516108f5816107eb565b8282015260408401518381111561090a575f80fd5b80850194505087601f85011261091e575f80fd5b8351838111156109305761093061081d565b610942601f8201601f1916830161085a565b93508084528882828701011115610957575f80fd5b808286018386015e5f8282860101525082604083015281955061097b81880161088b565b9450505050509250929050565b5f80828403606081121561099a575f80fd5b60408112156109a7575f80fd5b506040516040810181811067ffffffffffffffff821117156109cb576109cb61081d565b6040528351815260208401516109e0816107eb565b602082015260408401519092506109f6816107eb565b809150509250929050565b60208082526029908201527f54656c65706f7274657252656769737472793a207a65726f2070726f746f636f6040820152686c206164647265737360b81b606082015260800190565b8082018082111561017757634e487b7160e01b5f52601160045260245ffdfea264697066735822122040919fdbe25d0287b09e1faa066858e1886fb412bd1672ee076cc6ac5e40948664736f6c63430008190033"}, "DemoToken": {"abi": [{"type": "function", "name": "allowance", "inputs": [{"name": "", "type": "address", "internalType": "address"}, {"name": "", "type": "address", "internalType": "address"}], "outputs": [{"name": "", "type": "uint256", "internalType": "uint256"}], "stateMutability": "view"}, {"type": "function", "name": "approve", "inputs": [{"name": "spender", "type": "address", "internalType": "address"}, {"name": "value", "type": "uint256", "internalType": "uint256"}], "outputs": [{"name": "", "type": "bool", "internalType": "bool"}], "stateMutability": "nonpayable"}, {"type": "function", "name": "balanceOf", "inputs": [{"name": "", "type": "address", "internalType": "address"}], "outputs": [{"name": "", "type": "uint256", "internalType": "uint256"}], "stateMutability": "view"}, {"type": "function", "name": "decimals", "inputs": [], "outputs": [{"name": "", "type": "uint8", "internalType": "uint8"}], "stateMutability": "view"}, {"type": "function", "name": "mint", "inputs": [], "outputs": [], "stateMutability": "nonpayable"}, {"type": "function", "name": "name", "inputs": [], "outputs": [{"name": "", "type": "string", "internalType": "string"}], "stateMutability": "view"}, {"type": "function", "name": "symbol", "inputs": [], "outputs": [{"name": "", "type": "string", "internalType": "string"}], "stateMutability": "view"}, {"type": "function", "name": "totalSupply", "inputs": [], "outputs": [{"name": "", "type": "uint256", "internalType": "uint256"}], "stateMutability": "view"}, {"type": "function", "name": "transfer", "inputs": [{"name": "to", "type": "address", "internalType": "address"}, {"name": "value", "type": "uint256", "internalType": "uint256"}], "outputs": [{"name": "", "type": "bool", "internalType": "bool"}], "stateMutability": "nonpayable"}, {"type": "function", "name": "transferFrom", "inputs": [{"name": "from", "type": "address", "internalType": "address"}, {"name": "to", "type": "address", "internalType": "address"}, {"name": "value", "type": "uint256", "internalType": "uint256"}], "outputs": [{"name": "", "type": "bool", "internalType": "bool"}], "stateMutability": "nonpayable"}, {"type": "event", "name": "Approval", "inputs": [{"name": "owner", "type": "address", "indexed": true, "internalType": "address"}, {"name": "spender", "type": "address", "indexed": true, "internalType": "address"}, {"name": "value", "type": "uint256", "indexed": false, "internalType": "uint256"}], "anonymous": false}, {"type": "event", "name": "Transfer", "inputs": [{"name": "from", "type": "address", "indexed": true, "internalType": "address"}, {"name": "to", "type": "address", "indexed": true, "internalType": "address"}, {"name": "value", "type": "uint256", "indexed": false, "internalType": "uint256"}], "anonymous": false}], "bytecode": "0x6080604052348015600e575f5ffd5b5061066f8061001c5f395ff3fe608060405234801561000f575f5ffd5b506004361061009b575f3560e01c8063313ce56711610063578063313ce5671461013657806370a082311461015057806395d89b411461016f578063a9059cbb14610191578063dd62ed3e146101a4575f5ffd5b806306fdde031461009f578063095ea7b3146100e05780631249c58b1461010357806318160ddd1461010d57806323b872dd14610123575b5f5ffd5b6100ca6040518060400160405280600c81526020016b20bb30a5b4ba102a37b5b2b760a11b81525081565b6040516100d791906103f4565b60405180910390f35b6100f36100ee366004610444565b6101ce565b60405190151581526020016100d7565b61010b61023a565b005b6101155f5481565b6040519081526020016100d7565b6100f361013136600461046c565b6102b2565b61013e601281565b60405160ff90911681526020016100d7565b61011561015e3660046104a6565b60016020525f908152604090205481565b6100ca604051806040016040528060038152602001621052d560ea1b81525081565b6100f361019f366004610444565b61037e565b6101156101b23660046104c6565b600260209081525f928352604080842090915290825290205481565b335f8181526002602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102289086815260200190565b60405180910390a35060015b92915050565b5f6102476012600a6105ee565b6102529060646105fc565b9050805f5f8282546102649190610613565b9091555050335f818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350565b6001600160a01b0383165f9081526002602090815260408083203384529091528120805483919083906102e6908490610626565b90915550506001600160a01b0384165f9081526001602052604081208054849290610312908490610626565b90915550506001600160a01b038084165f81815260016020526040908190208054860190555190918616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061036c9086815260200190565b60405180910390a35060019392505050565b335f9081526001602052604081208054839190839061039e908490610626565b90915550506001600160a01b0383165f81815260016020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906102289086815260200190565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b038116811461043f575f5ffd5b919050565b5f5f60408385031215610455575f5ffd5b61045e83610429565b946020939093013593505050565b5f5f5f6060848603121561047e575f5ffd5b61048784610429565b925061049560208501610429565b929592945050506040919091013590565b5f602082840312156104b6575f5ffd5b6104bf82610429565b9392505050565b5f5f604083850312156104d7575f5ffd5b6104e083610429565b91506104ee60208401610429565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001815b60018411156105465780850481111561052a5761052a6104f7565b600184161561053857908102905b60019390931c92800261050f565b935093915050565b5f8261055c57506001610234565b8161056857505f610234565b816001811461057e5760028114610588576105a4565b6001915050610234565b60ff841115610599576105996104f7565b50506001821b610234565b5060208310610133831016604e8410600b84101617156105c7575081810a610234565b6105d35f19848461050b565b805f19048211156105e6576105e66104f7565b029392505050565b5f6104bf60ff84168361054e565b8082028115828204841417610234576102346104f7565b80820180821115610234576102346104f7565b81810381811115610234576102346104f756fea26469706673582212203ba8f5901a64d91a7beec3bdc98521ea0a7279a4ebafb699842fb133050e658e64736f6c634300081c0033"}}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local ICTT bridge configuration.
|
|
3
|
+
*
|
|
4
|
+
* `scripts/bridge.sh` (`pnpm bridge`) spins up two Avalanche L1s and deploys a
|
|
5
|
+
* full Interchain Token Transfer bridge across them, writing every address into
|
|
6
|
+
* `bridge.config.json`. This module turns that into AvaKit chains + the ABIs the
|
|
7
|
+
* app needs to bridge tokens.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { type AvaChain, defineChain } from "@avakit/core/chains";
|
|
11
|
+
import type { Abi, Address } from "viem";
|
|
12
|
+
import artifacts from "./ictt-artifacts.json";
|
|
13
|
+
import config from "../bridge.config.json";
|
|
14
|
+
|
|
15
|
+
export interface BridgeChainConfig {
|
|
16
|
+
name: string;
|
|
17
|
+
token: string;
|
|
18
|
+
evmChainId: number;
|
|
19
|
+
rpcUrl: string;
|
|
20
|
+
/** The bytes32 (Avalanche) blockchain ID in hex — ICM's routing key. */
|
|
21
|
+
blockchainIdHex: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface BridgeAddresses {
|
|
25
|
+
/** The demo ERC-20 on chain1 (the token you bridge). */
|
|
26
|
+
demoToken: Address;
|
|
27
|
+
registry1: Address;
|
|
28
|
+
/** ERC20TokenHome on chain1 — locks the token and sends it across. */
|
|
29
|
+
home: Address;
|
|
30
|
+
registry2: Address;
|
|
31
|
+
/** ERC20TokenRemote on chain2 — the bridged token (itself an ERC-20). */
|
|
32
|
+
remote: Address;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface BridgeConfig {
|
|
36
|
+
configured: boolean;
|
|
37
|
+
chain1: BridgeChainConfig;
|
|
38
|
+
chain2: BridgeChainConfig;
|
|
39
|
+
bridge: BridgeAddresses | null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export const bridge = config as BridgeConfig;
|
|
43
|
+
|
|
44
|
+
/** True once `pnpm bridge` has deployed everything and filled in the addresses. */
|
|
45
|
+
export const isConfigured = Boolean(bridge.configured && bridge.bridge);
|
|
46
|
+
|
|
47
|
+
function toAvaChain(c: BridgeChainConfig): AvaChain {
|
|
48
|
+
return defineChain({
|
|
49
|
+
id: c.evmChainId,
|
|
50
|
+
name: c.name,
|
|
51
|
+
rpcUrl: c.rpcUrl || "http://127.0.0.1:9650",
|
|
52
|
+
explorerUrl: "",
|
|
53
|
+
nativeCurrency: { name: c.token, symbol: c.token, decimals: 18 },
|
|
54
|
+
testnet: true,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const homeChain = toAvaChain(bridge.chain1);
|
|
59
|
+
export const remoteChain = toAvaChain(bridge.chain2);
|
|
60
|
+
|
|
61
|
+
/** Blockchain ID (bytes32 hex) for a chain — the ICM/ICTT routing key. */
|
|
62
|
+
export function blockchainIdOf(chain: AvaChain): `0x${string}` {
|
|
63
|
+
const hex = chain.id === bridge.chain1.evmChainId ? bridge.chain1.blockchainIdHex : bridge.chain2.blockchainIdHex;
|
|
64
|
+
return hex as `0x${string}`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// ABIs from the embedded artifacts (compiled from ava-labs/icm-contracts).
|
|
68
|
+
export const homeAbi = artifacts.ERC20TokenHome.abi as Abi;
|
|
69
|
+
export const remoteAbi = artifacts.ERC20TokenRemote.abi as Abi;
|
|
70
|
+
export const erc20Abi = artifacts.DemoToken.abi as Abi;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# __PROJECT_NAME__
|
|
2
|
+
|
|
3
|
+
> Bridge an ERC-20 between two Avalanche L1s with Interchain Token Transfer (ICTT), over a one-command local devnet. Next.js + @avakit/react + viem + avalanche-cli + ava-labs/icm-contracts.
|
|
4
|
+
|
|
5
|
+
## Project map
|
|
6
|
+
|
|
7
|
+
- [scripts/bridge.sh](scripts/bridge.sh): `pnpm bridge` — 2 L1s + relayer, then deploy the bridge.
|
|
8
|
+
- [scripts/deploy-bridge.mjs](scripts/deploy-bridge.mjs): deploys demo ERC-20 + Home + Remote + registers them (viem + embedded artifacts + EWOQ key); writes bridge.config.json.
|
|
9
|
+
- [lib/ictt-artifacts.json](lib/ictt-artifacts.json): ABIs + optimized bytecode for TeleporterRegistry, ERC20TokenHome, ERC20TokenRemote, demo ERC-20 (from ava-labs/icm-contracts).
|
|
10
|
+
- [lib/ictt.ts](lib/ictt.ts): bridge.config.json → AvaKit chains + addresses + ABIs; `blockchainIdOf`, `isConfigured`.
|
|
11
|
+
- [components/demo.tsx](components/demo.tsx): the bridge UI — balances, mint, bridge in either direction.
|
|
12
|
+
- [CLAUDE.md](CLAUDE.md): agent guide — how ICTT works (lock/mint/burn/unlock), SendTokensInput, regeneration.
|
|
13
|
+
|
|
14
|
+
## Key APIs
|
|
15
|
+
|
|
16
|
+
- Bridge home→remote: `approve(home, amount)` on the token, then `home.send(SendTokensInput, amount)`.
|
|
17
|
+
- Bridge remote→home: `remote.send(SendTokensInput, amount)` (no approval; burns the remote token).
|
|
18
|
+
- SendTokensInput: `{ destinationBlockchainID (bytes32 via blockchainIdOf), destinationTokenTransferrerAddress, recipient, primaryFeeTokenAddress (0x0 local), primaryFee (0), secondaryFee (0), requiredGasLimit (250000), multiHopFallback (0x0) }`.
|
|
19
|
+
- Balances: `demoToken.balanceOf` on the home chain, `remote.balanceOf` on the remote chain. 18 decimals — use parseEther/formatEther.
|
|
20
|
+
|
|
21
|
+
## External docs
|
|
22
|
+
|
|
23
|
+
- ICTT contracts: https://github.com/ava-labs/icm-contracts (contracts/ictt)
|
|
24
|
+
- ICTT overview: https://build.avax.network/docs/avalanche-l1s/interchain-token-transfer
|
|
25
|
+
- avalanche-cli: https://build.avax.network/docs/tooling/avalanche-cli/get-avalanche-cli
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "__PROJECT_NAME__",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "next dev",
|
|
8
|
+
"build": "next build",
|
|
9
|
+
"start": "next start",
|
|
10
|
+
"typecheck": "tsc --noEmit",
|
|
11
|
+
"bridge": "bash scripts/bridge.sh"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@avakit/core": "__AVAKIT_DEP__",
|
|
15
|
+
"@avakit/react": "__AVAKIT_DEP__",
|
|
16
|
+
"lucide-react": "1.22.0",
|
|
17
|
+
"next": "16.2.9",
|
|
18
|
+
"next-themes": "0.4.6",
|
|
19
|
+
"react": "19.2.7",
|
|
20
|
+
"react-dom": "19.2.7",
|
|
21
|
+
"viem": "2.54.1"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@tailwindcss/postcss": "4.3.2",
|
|
25
|
+
"@types/node": "26.0.1",
|
|
26
|
+
"@types/react": "19.2.17",
|
|
27
|
+
"@types/react-dom": "19.2.3",
|
|
28
|
+
"postcss": "8.5.16",
|
|
29
|
+
"tailwindcss": "4.3.2",
|
|
30
|
+
"tw-animate-css": "1.4.0",
|
|
31
|
+
"typescript": "6.0.3"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# pnpm settings for this scaffolded app.
|
|
2
|
+
# allowBuilds: pre-approve native postinstall scripts so `pnpm install` / `pnpm dev`
|
|
3
|
+
# don't fail with ERR_PNPM_IGNORED_BUILDS on pnpm 10+.
|
|
4
|
+
# minimumReleaseAgeExclude: pnpm's supply-chain age gate blocks very fresh releases;
|
|
5
|
+
# exempt AvaKit's own packages so a new @avakit publish never breaks a fresh install
|
|
6
|
+
# (third-party deps keep the protection). Delete this file to opt back into defaults.
|
|
7
|
+
allowBuilds:
|
|
8
|
+
sharp: true
|
|
9
|
+
minimumReleaseAgeExclude:
|
|
10
|
+
- '@avakit/core'
|
|
11
|
+
- '@avakit/react'
|