UNPKG

@andrekorol/kollateral-contracts

Version:

Kollateral protocol, the flash loan building block

394 lines 344 kB
{ "contractName": "KollateralLiquidityProxy", "abi": [ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "stateMutability": "payable", "type": "fallback" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" }, { "inputs": [ { "internalType": "address", "name": "tokenAddress", "type": "address" }, { "internalType": "address", "name": "kTokenAddress", "type": "address" } ], "name": "registerPool", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenAddress", "type": "address" } ], "name": "deregisterPool", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenAddress", "type": "address" } ], "name": "getRepaymentAddress", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenAddress", "type": "address" } ], "name": "getTotalReserve", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenAddress", "type": "address" }, { "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "name": "getRepaymentAmount", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenAddress", "type": "address" }, { "internalType": "uint256", "name": "tokenAmount", "type": "uint256" } ], "name": "borrow", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "execute", "outputs": [], "stateMutability": "payable", "type": "function" } ], "metadata": "{\"compiler\":{\"version\":\"0.7.3+commit.9bfce1f6\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenAmount\",\"type\":\"uint256\"}],\"name\":\"borrow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"deregisterPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"getRepaymentAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenAmount\",\"type\":\"uint256\"}],\"name\":\"getRepaymentAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"getTotalReserve\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"kTokenAddress\",\"type\":\"address\"}],\"name\":\"registerPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/andrekorol/src/kollateral/protocol/contracts/liquidity/kollateral/KollateralLiquidityProxy.sol\":\"KollateralLiquidityProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/andrekorol/src/kollateral/protocol/contracts/common/invoke/IInvocationHook.sol\":{\"keccak256\":\"0x36fb31db8a8e7eed7038b37554582655826969a556005d8ee3ab5070fe034860\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://e0dde70be03ea1e086a5bce0d3a7bb1ac65549eab7ea2618343255332edddca7\",\"dweb:/ipfs/QmVaQG686g3tbgM3L3mtw4ei1WxzcDRcS9UxipSt4KCYs1\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/common/invoke/IInvokable.sol\":{\"keccak256\":\"0x372bca80a3e9d20439e9bf88cc026d6d1ec01556463e902511c67b6fc92e12d5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://a5e6b5ef4246d03871bbd44b34e1212a9567d963f1b1e8e58e6273709442d4fb\",\"dweb:/ipfs/Qmb5Es45FLS4hhNGb9md3KU7L7hyMW7HHzumrVfsZZgxgC\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/common/invoke/IInvoker.sol\":{\"keccak256\":\"0x8a9fcbe16fdb00f3b5f32c528564cf4ba5c47ed9741a673973087d4d604e0b5a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://b4af56bf9d2bd95bddca2156c6eea65c5caf0117d9a99d6cc575ac2c329bd672\",\"dweb:/ipfs/QmTxg3NpWNAxaVHKYU1cdVboo962auWmq5pmS9XvXcXNAF\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/common/utils/BalanceCarrier.sol\":{\"keccak256\":\"0x69e63e482d839c831c8c32f002e6454f6a8d9e602b39e9cdc1c0649451df3337\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://0a40661372b8f95cbed7714a16323b435ccbe85205178d32bc6012e47bfc0640\",\"dweb:/ipfs/QmTyHr1Ag4AkcyazzTT5GDcWabAMHPTrELoGhL85ZWDgBy\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/common/utils/ExtendedMath.sol\":{\"keccak256\":\"0x5ced249631b5dfe431f449d725d9f318b01ab0785306ca5e73cdf43760ab271a\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3f3aef65abfcc02e451ad27a849caba0e6375abb26e28e7605928d19d561c3dd\",\"dweb:/ipfs/QmY5zMeH5x3QMS5xkxkY3DH4SDPWLGJyfPk1R8wPJXH9vr\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/common/utils/ExternalCaller.sol\":{\"keccak256\":\"0x54f88a1f0ac5dd7ab99a0519124cb09f1e19b4efb9baf240bc2500f8caa0b4ff\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://3170671378d20b47498224d065e33fccc223ae772d7f0af2c5ef314f94b75c98\",\"dweb:/ipfs/Qme8ZEEBnBG5Vvj8uyJCD2YVPcLx6funKsSSCpGkTyn1zi\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/ktoken/KToken.sol\":{\"keccak256\":\"0xc8c0d9869f316491406bc2d135d00682926f2a4b62fe1e3a6daf5b37515bbe8b\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://856af08828c3a5516a4018bdd2ed93eea5c02e60305bbc7e31fd8bd46446a97b\",\"dweb:/ipfs/QmVFroDk751zBN2fM6TiwCyhUinzGt2sRPwT3DUhnVgczU\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/liquidity/ILiquidityProxy.sol\":{\"keccak256\":\"0xd463abb162d0ce2e2d1a5f80b6b1254857e8800b930b4d8d1c3557c444d6363d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1c65c049566e4b8586ffb7ab62018d49f09d8f915450f6e79a0db84e4500fffb\",\"dweb:/ipfs/QmNSjMiWsY2Tt9eMYyNf3oGTFWDJjnWpgmVWTY6zKBAy3f\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/liquidity/kollateral/KollateralLiquidityProxy.sol\":{\"keccak256\":\"0x0cd14cde36fad2c1329df2fde762270252f486054b9363969211ffcd3a4a5cc2\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://02b82f6325ce1fc24bf46fddfe27292455c6f2dcbb566b02497dcb224dccd5fc\",\"dweb:/ipfs/QmZA9QoJGdqKTa6kc7nEArRhdhQNTYL7Hd2dfXhV1SSKhR\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/token/CollateralizedToken.sol\":{\"keccak256\":\"0xfaaaa4324c6cc78d9d1268426eb04fe41d8584ade05bbf22eac4875ecdf174d7\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1e4149a0ecd14003c261b2243adfc19d7a009c83c32341ebdd6a8929c0bdd14d\",\"dweb:/ipfs/QmQbySda22WBU4oycYfrTye1RsJuz1Ub74ksoST7PeegHW\"]},\"/Users/andrekorol/src/kollateral/protocol/contracts/token/UnlimitedApprovalErc20.sol\":{\"keccak256\":\"0x407178fcd78f0a19d705e64aaaa26ae997d228f077f3cf6833f9f3eb31c72308\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://097906cbe6f8f35ba1763bd122d551ec302f45cf677021bbcdb8a55c706940d9\",\"dweb:/ipfs/QmVh7kcUWsXt3QApppB1njhGHfzdP813KSTUF6bh3VCmMM\"]},\"@openzeppelin/contracts/GSN/Context.sol\":{\"keccak256\":\"0x910a2e625b71168563edf9eeef55a50d6d699acfe27ceba3921f291829a8f938\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://248246ac66e6479dce1ad7d4945ec5540c98ceb09881e93c93f7c48d5772925c\",\"dweb:/ipfs/QmXr8tmUiZgEYid6ixeeBRmTdUnASWjKzhP3KRxMPy8fRt\"]},\"@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0x46d2453e9db55eae25c9abdae2c42229086c54f1a6a247e8ce32658bb785f6ae\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://198ef77ef5d9f7a7709d6bbfba1d4d54d82ccc15358e9dced37f1376dac887fa\",\"dweb:/ipfs/QmQHFvCA74s3AHU3NMn4AAYzFTt6UotWq7yk3WzLQs1oJS\"]},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"keccak256\":\"0xba96bc371ba999f452985a98717cca1e4c4abb598dc038a9a9c3db08129b1ba4\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://26e50e3f7b6482fb6f598f2e006994a74aa492687daa4b3eee7fd4fb5398ce7f\",\"dweb:/ipfs/QmZudqoPSkA4USLMFsBBmt19dDPZFS8aaAmL5R7pECXu6t\"]},\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x482b6d82ba1c9c73758ae15068a438361d4187b7a4e342db17ef0f828cb5e21a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://89725e56bc9c6cfb69521ceaa4a489561b928e930b71e30db85b24024c1c2c03\",\"dweb:/ipfs/QmNvpotZA1Fe48msV6TShSTVxeQ2dkaDS9MTKP4bNxyUG3\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xbd74f587ab9b9711801baf667db1426e4a03fd2d7f15af33e0e0d0394e7cef76\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://2d0913dfbfce90d170df0d496ad7596c0778518e5fa7aba6c32562522546f66b\",\"dweb:/ipfs/QmR6B8nLj2PJf5e1JWD9Nk7ErkAwkqUwadCnvE82FJr1RU\"]},\"@openzeppelin/contracts/utils/Pausable.sol\":{\"keccak256\":\"0x2a245b797741f05f91212b1c2155a1b99a8884e6fd4c27953c4d3073732737f8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://76325ec3159cd859da98cab114513ec81095fa38e1412ffffb9b789bf14d6b38\",\"dweb:/ipfs/QmNdE2779u3DdRczjpx6RoevVa9kVJsCyEfnXWjkUw79jo\"]},\"@openzeppelin/contracts/utils/ReentrancyGuard.sol\":{\"keccak256\":\"0x1153f6dd334c01566417b8c551122450542a2b75a2bbb379d59a8c320ed6da28\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://002b4e5c26a2a069ba42486b83bf9c4b5461f3d5def32f9ef52b0aef8905d6d2\",\"dweb:/ipfs/QmPG44XDF4npiqRzzGvqJroDtUKfcR78wcreQ9bXa6guW6\"]}},\"version\":1}", "bytecode": "0x608060405234801561001057600080fd5b506001600061002361010860201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610110565b600033905090565b6114b88061011f6000396000f3fe6080604052600436106100955760003560e01c80637e72c7d7116100595780637e72c7d7146102755780638da5cb5b146102c6578063aa81905714610307578063c32dc3b614610376578063f2fde38b146103db5761009c565b806309c5eabe1461009e5780634b8a352914610117578063680c7b9414610172578063715018a6146101ed5780637286e5e5146102045761009c565b3661009c57005b005b610115600480360360208110156100b457600080fd5b81019080803590602001906401000000008111156100d157600080fd5b8201836020820111156100e357600080fd5b8035906020019184600183028401116401000000008311171561010557600080fd5b909192939192939050505061042c565b005b34801561012357600080fd5b506101706004803603604081101561013a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610606565b005b34801561017e57600080fd5b506101c16004803603602081101561019557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506107ca565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101f957600080fd5b506102026107dc565b005b34801561021057600080fd5b506102736004803603604081101561022757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610962565b005b34801561028157600080fd5b506102c46004803603602081101561029857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610aac565b005b3480156102d257600080fd5b506102db610bf6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031357600080fd5b506103606004803603604081101561032a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c1f565b6040518082815260200191505060405180910390f35b34801561038257600080fd5b506103c56004803603602081101561039957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610cc2565b6040518082815260200191505060405180910390f35b3480156103e757600080fd5b5061042a600480360360208110156103fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d84565b005b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156104d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061145c6027913960400191505060405180910390fd5b610525600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600554610f8f565b61057a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806114286034913960400191505060405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16630a5ca4e86040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105e957600080fd5b505af11580156105fd573d6000803e3d6000fd5b50505050505050565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600581905550600061069a836110b0565b90508073ffffffffffffffffffffffffffffffffffffffff16639e976db130846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff168152602001806020018381526020018281038252600081526020016020019350505050600060405180830381600087803b15801561072157600080fd5b505af1158015610735573d6000803e3d6000fd5b505050506000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600581905550505050565b60006107d5826110b0565b9050919050565b6107e4611119565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61096a611119565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b610ab4611119565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080610c2b846110b0565b90508073ffffffffffffffffffffffffffffffffffffffff1663b1197239846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610c7e57600080fd5b505afa158015610c92573d6000803e3d6000fd5b505050506040513d6020811015610ca857600080fd5b810190808051906020019092919050505091505092915050565b6000610ccd82611121565b8015610cdf5750610cdd82611162565b155b15610d7a576000610cef836110b0565b90508073ffffffffffffffffffffffffffffffffffffffff16634c68df676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d3757600080fd5b505afa158015610d4b573d6000803e3d6000fd5b505050506040513d6020811015610d6157600080fd5b8101908080519060200190929190505050915050610d7f565b600090505b919050565b610d8c611119565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ed2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806113d86026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610ffa57610ff183836111f4565b600190506110a9565b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561106b57600080fd5b505af115801561107f573d6000803e3d6000fd5b505050506040513d602081101561109557600080fd5b810190808051906020019092919050505090505b9392505050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff16611143836110b0565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600061116d826110b0565b73ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111b257600080fd5b505afa1580156111c6573d6000803e3d6000fd5b505050506040513d60208110156111dc57600080fd5b81019080805190602001909291905050509050919050565b8047101561124d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806113fe602a913960400191505060405180910390fd5b61126782826040518060200160405280600081525061126b565b5050565b600060608473ffffffffffffffffffffffffffffffffffffffff1684846040518082805190602001908083835b602083106112bb5780518252602082019150602081019050602083039250611298565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461131d576040519150601f19603f3d011682016040523d82523d6000602084013e611322565b606091505b50915091508181906113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611394578082015181840152602081019050611379565b50505050905090810190601f1680156113c15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345787465726e616c43616c6c65723a20696e73756666696369656e742065746865722062616c616e63654b6f6c6c61746572616c4c697175696469747950726f78793a207472616e7366657220746f20696e766f6b6572206661696c65644b6f6c6c61746572616c4c697175696469747950726f78793a206e6f74207363686564756c6564a2646970667358221220cfdb2d6f5f3abc44fee9c48729e145d21c967d8aed4c62032fce185aa409b98164736f6c63430007030033", "deployedBytecode": "0x6080604052600436106100955760003560e01c80637e72c7d7116100595780637e72c7d7146102755780638da5cb5b146102c6578063aa81905714610307578063c32dc3b614610376578063f2fde38b146103db5761009c565b806309c5eabe1461009e5780634b8a352914610117578063680c7b9414610172578063715018a6146101ed5780637286e5e5146102045761009c565b3661009c57005b005b610115600480360360208110156100b457600080fd5b81019080803590602001906401000000008111156100d157600080fd5b8201836020820111156100e357600080fd5b8035906020019184600183028401116401000000008311171561010557600080fd5b909192939192939050505061042c565b005b34801561012357600080fd5b506101706004803603604081101561013a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610606565b005b34801561017e57600080fd5b506101c16004803603602081101561019557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506107ca565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101f957600080fd5b506102026107dc565b005b34801561021057600080fd5b506102736004803603604081101561022757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610962565b005b34801561028157600080fd5b506102c46004803603602081101561029857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610aac565b005b3480156102d257600080fd5b506102db610bf6565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031357600080fd5b506103606004803603604081101561032a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610c1f565b6040518082815260200191505060405180910390f35b34801561038257600080fd5b506103c56004803603602081101561039957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610cc2565b6040518082815260200191505060405180910390f35b3480156103e757600080fd5b5061042a600480360360208110156103fe57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d84565b005b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156104d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061145c6027913960400191505060405180910390fd5b610525600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600554610f8f565b61057a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806114286034913960400191505060405180910390fd5b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16630a5ca4e86040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156105e957600080fd5b505af11580156105fd573d6000803e3d6000fd5b50505050505050565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600581905550600061069a836110b0565b90508073ffffffffffffffffffffffffffffffffffffffff16639e976db130846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff168152602001806020018381526020018281038252600081526020016020019350505050600060405180830381600087803b15801561072157600080fd5b505af1158015610735573d6000803e3d6000fd5b505050506000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600581905550505050565b60006107d5826110b0565b9050919050565b6107e4611119565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61096a611119565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b610ab4611119565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080610c2b846110b0565b90508073ffffffffffffffffffffffffffffffffffffffff1663b1197239846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610c7e57600080fd5b505afa158015610c92573d6000803e3d6000fd5b505050506040513d6020811015610ca857600080fd5b810190808051906020019092919050505091505092915050565b6000610ccd82611121565b8015610cdf5750610cdd82611162565b155b15610d7a576000610cef836110b0565b90508073ffffffffffffffffffffffffffffffffffffffff16634c68df676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d3757600080fd5b505afa158015610d4b573d6000803e3d6000fd5b505050506040513d6020811015610d6157600080fd5b8101908080519060200190929190505050915050610d7f565b600090505b919050565b610d8c611119565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ed2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806113d86026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610ffa57610ff183836111f4565b600190506110a9565b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561106b57600080fd5b505af115801561107f573d6000803e3d6000fd5b505050506040513d602081101561109557600080fd5b810190808051906020019092919050505090505b9392505050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff16611143836110b0565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600061116d826110b0565b73ffffffffffffffffffffffffffffffffffffffff16635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111b257600080fd5b505afa1580156111c6573d6000803e3d6000fd5b505050506040513d60208110156111dc57600080fd5b81019080805190602001909291905050509050919050565b8047101561124d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806113fe602a913960400191505060405180910390fd5b61126782826040518060200160405280600081525061126b565b5050565b600060608473ffffffffffffffffffffffffffffffffffffffff1684846040518082805190602001908083835b602083106112bb5780518252602082019150602081019050602083039250611298565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461131d576040519150601f19603f3d011682016040523d82523d6000602084013e611322565b606091505b50915091508181906113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611394578082015181840152602081019050611379565b50505050905090810190601f1680156113c15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50505050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345787465726e616c43616c6c65723a20696e73756666696369656e742065746865722062616c616e63654b6f6c6c61746572616c4c697175696469747950726f78793a207472616e7366657220746f20696e766f6b6572206661696c65644b6f6c6c61746572616c4c697175696469747950726f78793a206e6f74207363686564756c6564a2646970667358221220cfdb2d6f5f3abc44fee9c48729e145d21c967d8aed4c62032fce185aa409b98164736f6c63430007030033", "immutableReferences": {}, "generatedSources": [], "deployedGeneratedSources": [], "sourceMap": "976:3085:25:-:0;;;1293:43;;;;;;;;;;1330:1;865:17:39;885:12;:10;;;:12;;:::i;:::-;865:32;;916:9;907:6;;:18;;;;;;;;;;;;;;;;;;973:9;940:43;;969:1;940:43;;;;;;;;;;;;840:150;916:15:7;897:16;;:34;;;;;;;;;;;;;;;;;;850:88;976:3085:25;;590:104:38;643:15;677:10;670:17;;590:104;:::o;976:3085:25:-;;;;;;;", "deployedSourceMap": "976:3085:25:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3076:551;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;2594:476;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1743:177;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1689:145:39;;;;;;;;;;;;;:::i;:::-;;1413:181:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1600:137;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1066:77:39;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2317:271:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1926:385;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1983:240:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3076:551:25;3206:1;3171:37;;:23;;;;;;;;;;;:37;;;;3150:123;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3305:140;3331:21;;;;;;;;;;;3370:23;;;;;;;;;;;3411:20;;3305:8;:140::i;:::-;3284:239;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3534:16;3562:23;;;;;;;;;;;3534:52;;3596:7;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3076:551;;;:::o;2594:476::-;2727:10;2701:23;;:36;;;;;;;;;;;;;;;;;;2771:12;2747:21;;:36;;;;;;;;;;;;;;;;;;2816:11;2793:20;:34;;;;2838:11;2859:25;2871:12;2859:11;:25::i;:::-;2838:47;;2895:4;:11;;;2915:4;2926:11;2895:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2983:1;2949:23;;:36;;;;;;;;;;;;;;;;;;3027:1;2995:21;;:34;;;;;;;;;;;;;;;;;;3062:1;3039:20;:24;;;;2594:476;;;:::o;1743:177::-;1858:7;1888:25;1900:12;1888:11;:25::i;:::-;1881:32;;1743:177;;;:::o;1689:145:39:-;1280:12;:10;:12::i;:::-;1270:22;;:6;;;;;;;;;;:22;;;1262:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1795:1:::1;1758:40;;1779:6;::::0;::::1;;;;;;;;1758:40;;;;;;;;;;;;1825:1;1808:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;1689:145::o:0;1413:181:25:-;1280:12:39;:10;:12::i;:::-;1270:22;;:6;;;;;;;;;;:22;;;1262:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1574:13:25::1;1529:28;:42;1558:12;1529:42;;;;;;;;;;;;;;;;:58;;;;;;;;;;;;;;;;;;1413:181:::0;;:::o;1600:137::-;1280:12:39;:10;:12::i;:::-;1270:22;;:6;;;;;;;;;;:22;;;1262:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1728:1:25::1;1675:28;:42;1704:12;1675:42;;;;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;1600:137:::0;:::o;1066:77:39:-;1104:7;1130:6;;;;;;;;;;;1123:13;;1066:77;:::o;2317:271:25:-;2452:7;2475:11;2496:25;2508:12;2496:11;:25::i;:::-;2475:47;;2539:4;:29;;;2569:11;2539:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2532:49;;;2317:271;;;;:::o;1926:385::-;2037:7;2064:26;2077:12;2064;:26::i;:::-;:53;;;;;2095:22;2104:12;2095:8;:22::i;:::-;2094:23;2064:53;2060:227;;;2133:24;2197:25;2209:12;2197:11;:25::i;:::-;2133:103;;2257:4;:17;;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2250:26;;;;;2060:227;2303:1;2296:8;;1926:385;;;;:::o;1983:240:39:-;1280:12;:10;:12::i;:::-;1270:22;;:6;;;;;;;;;;:22;;;1262:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2091:1:::1;2071:22;;:8;:22;;;;2063:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2180:8;2151:38;;2172:6;::::0;::::1;;;;;;;;2151:38;;;;;;;;;;;;2208:8;2199:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;1983:240:::0;:::o;944:333:7:-;1060:4;1096:16;;;;;;;;;;;1080:32;;:12;:32;;;1076:195;;;1128:28;1145:2;1149:6;1128:16;:28::i;:::-;1177:4;1170:11;;;;1076:195;1226:12;1219:29;;;1249:2;1253:6;1219:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1212:48;;944:333;;;;;;:::o;3633:141:25:-;3699:7;3725:28;:42;3754:12;3725:42;;;;;;;;;;;;;;;;;;;;;;;;;3718:49;;3633:141;;;:::o;590:104:38:-;643:15;677:10;670:17;;590:104;:::o;3780:136:25:-;3847:4;3907:1;3870:39;;:25;3882:12;3870:11;:25::i;:::-;:39;;;;3863:46;;3780:136;;;:::o;3922:137::-;3985:4;4017:25;4029:12;4017:11;:25::i;:::-;4008:42;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4001:51;;3922:137;;;:::o;695:240:9:-;815:6;790:21;:31;;769:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;899:29;912:3;917:6;899:29;;;;;;;;;;;;:12;:29::i;:::-;695:240;;:::o;941:267::-;1062:12;1076:23;1103:3;:8;;1119:6;1140:5;1103:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1061:94;;;;1173:7;1189:10;1165:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;941:267;;;;;:::o", "source": "/*\n\n Copyright 2020 Kollateral LLC.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n*/\n\n// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.7.0;\n\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\nimport \"@openzeppelin/contracts/utils/Pausable.sol\";\nimport \"../ILiquidityProxy.sol\";\nimport \"../../token/CollateralizedToken.sol\";\nimport \"../../ktoken/KToken.sol\";\nimport \"../../common/invoke/IInvoker.sol\";\nimport \"../../common/utils/BalanceCarrier.sol\";\n\ncontract KollateralLiquidityProxy is\n Ownable,\n BalanceCarrier,\n ILiquidityProxy,\n IInvokable\n{\n mapping(address => address) _tokenAddressToKTokenAddress;\n\n address payable internal _scheduleInvokerAddress;\n address internal _scheduleTokenAddress;\n uint256 internal _scheduleTokenAmount;\n\n constructor() BalanceCarrier(address(1)) {}\n\n receive() external payable {}\n\n fallback() external payable {}\n\n function registerPool(address tokenAddress, address kTokenAddress)\n external\n onlyOwner\n {\n _tokenAddressToKTokenAddress[tokenAddress] = kTokenAddress;\n }\n\n function deregisterPool(address tokenAddress) external onlyOwner {\n _tokenAddressToKTokenAddress[tokenAddress] = address(0);\n }\n\n function getRepaymentAddress(address tokenAddress)\n external\n view\n override\n returns (address)\n {\n return poolAddress(tokenAddress);\n }\n\n function getTotalReserve(address tokenAddress)\n external\n view\n override\n returns (uint256)\n {\n if (isRegistered(tokenAddress) && !isPaused(tokenAddress)) {\n CollateralizedToken pool = CollateralizedToken(\n poolAddress(tokenAddress)\n );\n return pool.totalReserve();\n }\n return 0;\n }\n\n function getRepaymentAmount(address tokenAddress, uint256 tokenAmount)\n external\n view\n override\n returns (uint256)\n {\n KToken pool = KToken(poolAddress(tokenAddress));\n return pool.calculateRepaymentAmount(tokenAmount);\n }\n\n function borrow(address tokenAddress, uint256 tokenAmount)\n external\n override\n {\n _scheduleInvokerAddress = msg.sender;\n _scheduleTokenAddress = tokenAddress;\n _scheduleTokenAmount = tokenAmount;\n\n KToken pool = KToken(poolAddress(tokenAddress));\n pool.invoke(address(this), \"\", tokenAmount);\n\n _scheduleInvokerAddress = address(0);\n _scheduleTokenAddress = address(0);\n _scheduleTokenAmount = 0;\n }\n\n function execute(bytes calldata data) external payable override {\n require(\n _scheduleInvokerAddress != address(0),\n \"KollateralLiquidityProxy: not scheduled\"\n );\n\n require(\n transfer(\n _scheduleTokenAddress,\n _scheduleInvokerAddress,\n _scheduleTokenAmount\n ),\n \"KollateralLiquidityProxy: transfer to invoker failed\"\n );\n\n IInvoker invoker = IInvoker(_scheduleInvokerAddress);\n invoker.invokeCallback();\n }\n\n function poolAddress(address tokenAddress) internal view returns (address) {\n return _tokenAddressToKTokenAddress[tokenAddress];\n }\n\n function isRegistered(address tokenAddress) internal view returns (bool) {\n return poolAddress(tokenAddress) != address(0);\n }\n\n function isPaused(address tokenAddress) internal view returns (bool) {\n return Pausable(poolAddress(tokenAddress)).paused();\n }\n}\n", "sourcePath": "/Users/andrekorol/src/kollateral/protocol/contracts/liquidity/kollateral/KollateralLiquidityProxy.sol", "ast": { "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/liquidity/kollateral/KollateralLiquidityProxy.sol", "exportedSymbols": { "BalanceCarrier": [ 1464 ], "CollateralizedToken": [ 5197 ], "Context": [ 5279 ], "ERC20": [ 6087 ], "ExtendedMath": [ 1506 ], "ExternalCaller": [ 1563 ], "IERC20": [ 6165 ], "IInvocationHook": [ 1170 ], "IInvokable": [ 1178 ], "IInvoker": [ 1234 ], "ILiquidityProxy": [ 2148 ], "KToken": [ 2115 ], "KollateralLiquidityProxy": [ 3516 ], "Ownable": [ 5388 ], "Pausable": [ 6255 ], "ReentrancyGuard": [ 6295 ], "SafeMath": [ 5584 ], "UnlimitedApprovalErc20": [ 5256 ] }, "id": 3517, "license": "Apache-2.0", "nodeType": "SourceUnit", "nodes": [ { "id": 3228, "literals": [ "solidity", "^", "0.7", ".0" ], "nodeType": "PragmaDirective", "src": "640:23:25" }, { "absolutePath": "@openzeppelin/contracts/access/Ownable.sol", "file": "@openzeppelin/contracts/access/Ownable.sol", "id": 3229, "nodeType": "ImportDirective", "scope": 3517, "sourceUnit": 5389, "src": "665:52:25", "symbolAliases": [], "unitAlias": "" }, { "absolutePath": "@openzeppelin/contracts/utils/Pausable.sol", "file": "@openzeppelin/contracts/utils/Pausable.sol", "id": 3230, "nodeType": "ImportDirective", "scope": 3517, "sourceUnit": 6256, "src": "718:52:25", "symbolAliases": [], "unitAlias": "" }, { "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/liquidity/ILiquidityProxy.sol", "file": "../ILiquidityProxy.sol", "id": 3231, "nodeType": "ImportDirective", "scope": 3517, "sourceUnit": 2149, "src": "771:32:25", "symbolAliases": [], "unitAlias": "" }, { "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/token/CollateralizedToken.sol", "file": "../../token/CollateralizedToken.sol", "id": 3232, "nodeType": "ImportDirective", "scope": 3517, "sourceUnit": 5198, "src": "804:45:25", "symbolAliases": [], "unitAlias": "" }, { "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/ktoken/KToken.sol", "file": "../../ktoken/KToken.sol", "id": 3233, "nodeType": "ImportDirective", "scope": 3517, "sourceUnit": 2116, "src": "850:33:25", "symbolAliases": [], "unitAlias": "" }, { "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/common/invoke/IInvoker.sol", "file": "../../common/invoke/IInvoker.sol", "id": 3234, "nodeType": "ImportDirective", "scope": 3517, "sourceUnit": 1235, "src": "884:42:25", "symbolAliases": [], "unitAlias": "" }, { "absolutePath": "/Users/andrekorol/src/kollateral/protocol/contracts/common/utils/BalanceCarrier.sol", "file": "../../common/utils/BalanceCarrier.sol", "id": 3235, "nodeType": "ImportDirective", "scope": 3517, "sourceUnit": 1465, "src": "927:47:25", "symbolAliases": [], "unitAlias": "" }, { "abstract": false, "baseContracts": [ { "baseName": { "id": 3236, "name": "Ownable", "nodeType": "UserDefinedTypeName", "referencedDeclaration": 5388, "src": "1017:7:25", "typeDescriptions": { "typeIdentifier": "t_contract$_Ownable_$5388", "typeString": "contract Ownable" } }, "id": 3237, "nodeType": "InheritanceSpecifier", "src": "1017:7:25" }, { "baseName": { "id": 3238, "name": "BalanceCarrier", "nodeType": "UserDefinedTypeName", "referencedDeclaration": 1464, "src": "1030:14:25", "typeDescriptions": { "typeIdentifier": "t_contract$_BalanceCarrier_$1464", "typeString": "contract BalanceCarrier" } }, "id": 3239, "nodeType": "InheritanceSpecifier", "src": "1030:14:25" }, { "baseName": { "id": 3240, "name": "ILiquidityProxy", "nodeType": "UserDefinedTypeName", "referen