Address Contract Partially Verified
Address
0xe2d6cCAC3EE3A21AbF7BeDBE2E107FfC0C037e80
Balance
0 ETH
Nonce
1
Code Size
11341 bytes
Creator
0xFE45AB17...73c7 at tx 0x1f82ec93...433f64
Indexed Transactions
0 (1 on-chain, 0.8% indexed)
Contract Bytecode
11341 bytes
0x608060405234801561001057600080fd5b50600436106102275760003560e01c8063715018a611610130578063a9059cbb116100b8578063dd62ed3e1161007c578063dd62ed3e14610ad6578063e30c397814610b04578063eb438fc214610b0c578063f2fde38b14610b29578063f65d901c14610b4f57610227565b8063a9059cbb14610a33578063bd6d894d14610a5f578063c4d66de814610a67578063cd6dc68714610a8d578063db068e0e14610ab957610227565b80638fcbaf0c116100ff5780638fcbaf0c1461095c57806395d89b41146109b65780639dc29fac146109be578063a173b2f6146109ea578063a457c2d714610a0757610227565b8063715018a6146109025780637ecebe001461090a5780638da5cb5b146109305780638f32d59b1461095457610227565b80633644e515116101b35780634e71e0c8116101825780634e71e0c81461054357806353531e391461054b57806354fd4d501461071a5780635dca34521461072257806370a08231146108dc57610227565b80633644e515146104bd57806339509351146104c55780633af9e669146104f157806340c10f191461051757610227565b806318160ddd116101fa57806318160ddd1461043f57806323b872dd1461045957806325e27ed81461048f57806330adf81f14610497578063313ce5671461049f57610227565b806306fdde031461022c578063095ea7b3146102a957806316114acd146102e95780631624f6c614610311575b600080fd5b610234610b75565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026e578181015183820152602001610256565b50505050905090810190601f16801561029b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102d5600480360360408110156102bf57600080fd5b506001600160a01b038135169060200135610c0c565b604080519115158252519081900360200190f35b61030f600480360360208110156102ff57600080fd5b50356001600160a01b0316610c2a565b005b61030f6004803603606081101561032757600080fd5b810190602081018135600160201b81111561034157600080fd5b82018360208201111561035357600080fd5b803590602001918460018302840111600160201b8311171561037457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156103c657600080fd5b8201836020820111156103d857600080fd5b803590602001918460018302840111600160201b831117156103f957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050903560ff169150610d9b9050565b610447610e77565b60408051918252519081900360200190f35b6102d56004803603606081101561046f57600080fd5b506001600160a01b03813581169160208101359091169060400135610e7d565b610447610eda565b610447610ee6565b6104a7610f0a565b6040805160ff9092168252519081900360200190f35b610447610f13565b6102d5600480360360408110156104db57600080fd5b506001600160a01b038135169060200135610f19565b6104476004803603602081101561050757600080fd5b50356001600160a01b0316610f72565b61030f6004803603604081101561052d57600080fd5b506001600160a01b038135169060200135610f85565b61030f610fda565b61030f600480360360e081101561056157600080fd5b8135916001600160a01b036020820135169160408201359190810190608081016060820135600160201b81111561059757600080fd5b8201836020820111156105a957600080fd5b803590602001918460018302840111600160201b831117156105ca57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561061c57600080fd5b82018360208201111561062e57600080fd5b803590602001918460018302840111600160201b8311171561064f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156106a157600080fd5b8201836020820111156106b357600080fd5b803590602001918460018302840111600160201b831117156106d457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050903560ff16915061105a9050565b610234611137565b61030f600480360360a081101561073857600080fd5b81359190810190604081016020820135600160201b81111561075957600080fd5b82018360208201111561076b57600080fd5b803590602001918460018302840111600160201b8311171561078c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156107de57600080fd5b8201836020820111156107f057600080fd5b803590602001918460018302840111600160201b8311171561081157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561086357600080fd5b82018360208201111561087557600080fd5b803590602001918460018302840111600160201b8311171561089657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505050903560ff1691506111c59050565b610447600480360360208110156108f257600080fd5b50356001600160a01b0316611360565b61030f61137b565b6104476004803603602081101561092057600080fd5b50356001600160a01b031661140c565b61093861141e565b604080516001600160a01b039092168252519081900360200190f35b6102d561142d565b61030f600480360361010081101561097357600080fd5b506001600160a01b038135811691602081013590911690604081013590606081013590608081013515159060ff60a0820135169060c08101359060e00135611453565b6102346116f2565b61030f600480360360408110156109d457600080fd5b506001600160a01b038135169060200135611753565b61044760048036036020811015610a0057600080fd5b50356117a4565b6102d560048036036040811015610a1d57600080fd5b506001600160a01b0381351690602001356117d2565b6102d560048036036040811015610a4957600080fd5b506001600160a01b038135169060200135611840565b61044761189b565b61030f60048036036020811015610a7d57600080fd5b50356001600160a01b03166118e6565b61030f60048036036040811015610aa357600080fd5b506001600160a01b038135169060200135611991565b61030f60048036036020811015610acf57600080fd5b5035611a47565b61044760048036036040811015610aec57600080fd5b506001600160a01b0381358116916020013516611a97565b610938611ac2565b61044760048036036020811015610b2257600080fd5b5035611ad1565b61030f60048036036020811015610b3f57600080fd5b50356001600160a01b0316611af4565b61030f60048036036020811015610b6557600080fd5b50356001600160a01b0316611be5565b609b8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b505050505090505b90565b6000610c20610c19611c50565b8484611c54565b5060015b92915050565b610c3261142d565b610c71576040805162461bcd60e51b81526020600482018190526024820152600080516020612a6c833981519152604482015290519081900360640190fd5b6001600160a01b038116600090815260d5602052604090205460ff1615610cc95760405162461bcd60e51b815260040180806020018281038252602a815260200180612934602a913960400191505060405180910390fd5b6001600160a01b038116610d095760405133904780156108fc02916000818181858888f19350505050158015610d03573d6000803e3d6000fd5b50610d98565b604080516370a0823160e01b81523060048201529051610d989133916001600160a01b038516916370a08231916024808301926020929190829003018186803b158015610d5557600080fd5b505afa158015610d69573d6000803e3d6000fd5b505050506040513d6020811015610d7f57600080fd5b50516001600160a01b038416919063ffffffff611d4016565b50565b600054610100900460ff1680610db45750610db4611d92565b80610dc2575060005460ff16155b610dfd5760405162461bcd60e51b815260040180806020018281038252602e815260200180612a8c602e913960400191505060405180910390fd5b600054610100900460ff16158015610e28576000805460ff1961ff0019909116610100171660011790555b8351610e3b90609b90602087019061280e565b508251610e4f90609c90602086019061280e565b50609d805460ff191660ff84161790558015610e71576000805461ff00191690555b50505050565b60685490565b60006001600160a01b038316301415610ec75760405162461bcd60e51b8152600401808060200182810382526029815260200180612b2a6029913960400191505060405180910390fd5b610ed2848484611d98565b949350505050565b670de0b6b3a764000081565b7fea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb81565b609d5460ff1690565b60d35481565b6000610c20610f26611c50565b84610f6d8560676000610f37611c50565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff611e2016565b611c54565b6000610c24610f8083611360565b611ad1565b610f8d61142d565b610fcc576040805162461bcd60e51b81526020600482018190526024820152600080516020612a6c833981519152604482015290519081900360640190fd5b610fd68282611e7a565b5050565b60d4546001600160a01b0316610fee611c50565b6001600160a01b0316146110335760405162461bcd60e51b815260040180806020018281038252602a815260200180612adb602a913960400191505060405180910390fd5b60d454611048906001600160a01b0316611f6c565b60d480546001600160a01b0319169055565b600054610100900460ff16806110735750611073611d92565b80611081575060005460ff16155b6110bc5760405162461bcd60e51b815260040180806020018281038252602e815260200180612a8c602e913960400191505060405180910390fd5b600054610100900460ff161580156110e7576000805460ff1961ff0019909116610100171660011790555b6110f2848484610d9b565b6110fc8787611991565b61110988868686866111c5565b6111128761200d565b61111b876118e6565b801561112d576000805461ff00191690555b5050505050505050565b60d2805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156111bd5780601f10611192576101008083540402835291602001916111bd565b820191906000526020600020905b8154815290600101906020018083116111a057829003601f168201915b505050505081565b600054610100900460ff16806111de57506111de611d92565b806111ec575060005460ff16155b6112275760405162461bcd60e51b815260040180806020018281038252602e815260200180612a8c602e913960400191505060405180910390fd5b600054610100900460ff16158015611252576000805460ff1961ff0019909116610100171660011790555b61125d848484610d9b565b84516112709060d290602088019061280e565b506040518060526129d1823960520190506040518091039020611291610b75565b8051906020012060d260405180828054600181600116156101000203166002900480156112f55780601f106112d35761010080835404028352918201916112f5565b820191906000526020600020905b8154815290600101906020018083116112e1575b505060408051918290038220602080840197909752828201959095526060820194909452608081018b90523060a0808301919091528451808303909101815260c09091019093525050805191012060d3558015611358576000805461ff00191690555b505050505050565b6001600160a01b031660009081526066602052604090205490565b61138361142d565b6113c2576040805162461bcd60e51b81526020600482018190526024820152600080516020612a6c833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b60d16020526000908152604090205481565b6033546001600160a01b031690565b6033546000906001600160a01b0316611444611c50565b6001600160a01b031614905090565b60d354604080517fea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb6020808301919091526001600160a01b03808d16838501819052908c166060840152608083018b905260a083018a905288151560c0808501919091528451808503909101815260e08401855280519083012061190160f01b610100850152610102840195909552610122808401959095528351808403909501855261014290920190925282519290910191909120906115455760405162461bcd60e51b8152600401808060200182810382526026815260200180612bf36026913960400191505060405180910390fd5b6040805160008152602080820180845284905260ff8716828401526060820186905260808201859052915160019260a0808401939192601f1981019281900390910190855afa15801561159c573d6000803e3d6000fd5b505050602060405103516001600160a01b0316896001600160a01b03161461160b576040805162461bcd60e51b815260206004820181905260248201527f455243323057697468526174653a20696e76616c6964207369676e6174757265604482015290519081900360640190fd5b8515806116185750854211155b6116535760405162461bcd60e51b81526004018080602001828103825260218152602001806129b06021913960400191505060405180910390fd5b6001600160a01b038916600090815260d16020526040902080546001810190915587146116c7576040805162461bcd60e51b815260206004820152601c60248201527f455243323057697468526174653a20696e76616c6964206e6f6e636500000000604482015290519081900360640190fd5b6000856116d55760006116d9565b6000195b90506116e68a8a83611c54565b50505050505050505050565b609c8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c015780601f10610bd657610100808354040283529160200191610c01565b61175b61142d565b61179a576040805162461bcd60e51b81526020600482018190526024820152600080516020612a6c833981519152604482015290519081900360640190fd5b610fd682826120a3565b60d054600090610c24906117c684670de0b6b3a764000063ffffffff61219f16565b9063ffffffff6121f816565b6000610c206117df611c50565b84610f6d85604051806060016040528060258152602001612bce6025913960676000611809611c50565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61223a16565b60006001600160a01b03831630141561188a5760405162461bcd60e51b8152600401808060200182810382526029815260200180612b2a6029913960400191505060405180910390fd5b61189483836122d1565b9392505050565b600060d054600014156118df5760405162461bcd60e51b815260040180806020018281038252602c81526020018061295e602c913960400191505060405180910390fd5b5060d05490565b600054610100900460ff16806118ff57506118ff611d92565b8061190d575060005460ff16155b6119485760405162461bcd60e51b815260040180806020018281038252602e815260200180612a8c602e913960400191505060405180910390fd5b600054610100900460ff16158015611973576000805460ff1961ff0019909116610100171660011790555b61197c8261200d565b8015610fd6576000805461ff00191690555050565b600054610100900460ff16806119aa57506119aa611d92565b806119b8575060005460ff16155b6119f35760405162461bcd60e51b815260040180806020018281038252602e815260200180612a8c602e913960400191505060405180910390fd5b600054610100900460ff16158015611a1e576000805460ff1961ff0019909116610100171660011790555b611a27836122e5565b611a30826123d6565b8015611a42576000805461ff00191690555b505050565b611a4f61142d565b611a8e576040805162461bcd60e51b81526020600482018190526024820152600080516020612a6c833981519152604482015290519081900360640190fd5b610d98816123d6565b6001600160a01b03918216600090815260676020908152604080832093909416825291909152205490565b60d4546001600160a01b031681565b6000610c24670de0b6b3a76400006117c660d0548561219f90919063ffffffff16565b611afc61142d565b611b3b576040805162461bcd60e51b81526020600482018190526024820152600080516020612a6c833981519152604482015290519081900360640190fd5b611b4361141e565b6001600160a01b0316816001600160a01b031614158015611b72575060d4546001600160a01b03828116911614155b611bc3576040805162461bcd60e51b815260206004820152601c60248201527f436c61696d61626c653a20696e76616c6964206e6577206f776e657200000000604482015290519081900360640190fd5b60d480546001600160a01b0319166001600160a01b0392909216919091179055565b611bed61142d565b611c2c576040805162461bcd60e51b81526020600482018190526024820152600080516020612a6c833981519152604482015290519081900360640190fd5b6001600160a01b0316600090815260d560205260409020805460ff19166001179055565b3390565b6001600160a01b038316611c995760405162461bcd60e51b8152600401808060200182810382526024815260200180612b536024913960400191505060405180910390fd5b6001600160a01b038216611cde5760405162461bcd60e51b81526004018080602001828103825260228152602001806129126022913960400191505060405180910390fd5b6001600160a01b03808416600081815260676020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611a4290849061241a565b303b1590565b6000611da58484846125d2565b611e1684611db1611c50565b610f6d85604051806060016040528060288152602001612a44602891396001600160a01b038a16600090815260676020526040812090611def611c50565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61223a16565b5060019392505050565b600082820183811015611894576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b038216611ed5576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b606854611ee8908263ffffffff611e2016565b6068556001600160a01b038216600090815260666020526040902054611f14908263ffffffff611e2016565b6001600160a01b03831660008181526066602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038116611fb15760405162461bcd60e51b81526004018080602001828103825260268152602001806128ec6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16806120265750612026611d92565b80612034575060005460ff16155b61206f5760405162461bcd60e51b815260040180806020018281038252602e815260200180612a8c602e913960400191505060405180910390fd5b600054610100900460ff1615801561209a576000805460ff1961ff0019909116610100171660011790555b61197c826122e5565b6001600160a01b0382166120e85760405162461bcd60e51b8152600401808060200182810382526021815260200180612aba6021913960400191505060405180910390fd5b61212b816040518060600160405280602281526020016128ca602291396001600160a01b038516600090815260666020526040902054919063ffffffff61223a16565b6001600160a01b038316600090815260666020526040902055606854612157908263ffffffff61273016565b6068556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000826121ae57506000610c24565b828202828482816121bb57fe5b04146118945760405162461bcd60e51b8152600401808060200182810382526021815260200180612a236021913960400191505060405180910390fd5b600061189483836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612772565b600081848411156122c95760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561228e578181015183820152602001612276565b50505050905090810190601f1680156122bb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000610c206122de611c50565b84846125d2565b600054610100900460ff16806122fe57506122fe611d92565b8061230c575060005460ff16155b6123475760405162461bcd60e51b815260040180806020018281038252602e815260200180612a8c602e913960400191505060405180910390fd5b600054610100900460ff16158015612372576000805460ff1961ff0019909116610100171660011790555b603380546001600160a01b0319166001600160a01b0384811691909117918290556040519116906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38015610fd6576000805461ff00191690555050565b600081116124155760405162461bcd60e51b815260040180806020018281038252602d815260200180612b77602d913960400191505060405180910390fd5b60d055565b61242c826001600160a01b03166127d7565b61247d576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106124bb5780518252601f19909201916020918201910161249c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461251d576040519150601f19603f3d011682016040523d82523d6000602084013e612522565b606091505b509150915081612579576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610e715780806020019051602081101561259557600080fd5b5051610e715760405162461bcd60e51b815260040180806020018281038252602a815260200180612ba4602a913960400191505060405180910390fd5b6001600160a01b0383166126175760405162461bcd60e51b8152600401808060200182810382526025815260200180612b056025913960400191505060405180910390fd5b6001600160a01b03821661265c5760405162461bcd60e51b81526004018080602001828103825260238152602001806128a76023913960400191505060405180910390fd5b61269f8160405180606001604052806026815260200161298a602691396001600160a01b038616600090815260666020526040902054919063ffffffff61223a16565b6001600160a01b0380851660009081526066602052604080822093909355908416815220546126d4908263ffffffff611e2016565b6001600160a01b0380841660008181526066602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600061189483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061223a565b600081836127c15760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561228e578181015183820152602001612276565b5060008385816127cd57fe5b0495945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708115801590610ed25750141592915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061284f57805160ff191683800117855561287c565b8280016001018555821561287c579182015b8281111561287c578251825591602001919060010190612861565b5061288892915061288c565b5090565b610c0991905b80821115612888576000815560010161289256fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737343616e5265636c61696d546f6b656e733a20746f6b656e206973206e6f74207265636f76657261626c65455243323057697468526174653a207261746520686173206e6f74206265656e20696e697469616c697a656445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365455243323057697468526174653a207065726d6974206861732065787069726564454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e747261637429536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572436f6e747261637420696e7374616e63652068617320616c7265616479206265656e20696e697469616c697a656445524332303a206275726e2066726f6d20746865207a65726f2061646472657373436c61696d61626c653a2063616c6c6572206973206e6f74207468652070656e64696e67206f776e657245524332303a207472616e736665722066726f6d20746865207a65726f206164647265737352656e45524332303a2063616e2774207472616e7366657220746f20746f6b656e206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373455243323057697468526174653a2072617465206d7573742062652067726561746572207468616e207a65726f5361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f455243323057697468526174653a2061646472657373206d757374206e6f7420626520307830a265627a7a723158208041b4da1e811475b01056cb492bd65274acbaa894f61093e737202c34c167c964736f6c63430005100032
Verified Source Code Partial Match
Compiler: v0.5.16+commit.9c3226ce
EVM: istanbul
Optimization: Yes (200 runs)
RenERC20LogicV1.sol 895 lines
/**
Deployed by Ren Project, https://renproject.io
Commit hash: 9068f80
Repository: https://github.com/renproject/darknode-sol
Issues: https://github.com/renproject/darknode-sol/issues
Licenses
@openzeppelin/contracts: (MIT) https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/LICENSE
darknode-sol: (GNU GPL V3) https://github.com/renproject/darknode-sol/blob/master/LICENSE
*/
pragma solidity 0.5.16;
contract Initializable {
bool private initialized;
bool private initializing;
modifier initializer() {
require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");
bool isTopLevelCall = !initializing;
if (isTopLevelCall) {
initializing = true;
initialized = true;
}
_;
if (isTopLevelCall) {
initializing = false;
}
}
function isConstructor() private view returns (bool) {
address self = address(this);
uint256 cs;
assembly { cs := extcodesize(self) }
return cs == 0;
}
uint256[50] private ______gap;
}
contract Context is Initializable {
constructor () internal { }
function _msgSender() internal view returns (address payable) {
return msg.sender;
}
function _msgData() internal view returns (bytes memory) {
this;
return msg.data;
}
}
contract Ownable is Initializable, Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
function initialize(address sender) public initializer {
_owner = sender;
emit OwnershipTransferred(address(0), _owner);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(isOwner(), "Ownable: caller is not the owner");
_;
}
function isOwner() public view returns (bool) {
return _msgSender() == _owner;
}
function renounceOwnership() public onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public onlyOwner {
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
uint256[50] private ______gap;
}
contract Proxy {
function () payable external {
_fallback();
}
function _implementation() internal view returns (address);
function _delegate(address implementation) internal {
assembly {
calldatacopy(0, 0, calldatasize)
let result := delegatecall(gas, implementation, 0, calldatasize, 0, 0)
returndatacopy(0, 0, returndatasize)
switch result
case 0 { revert(0, returndatasize) }
default { return(0, returndatasize) }
}
}
function _willFallback() internal {
}
function _fallback() internal {
_willFallback();
_delegate(_implementation());
}
}
library OpenZeppelinUpgradesAddress {
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(account) }
return size > 0;
}
}
contract BaseUpgradeabilityProxy is Proxy {
event Upgraded(address indexed implementation);
bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
function _implementation() internal view returns (address impl) {
bytes32 slot = IMPLEMENTATION_SLOT;
assembly {
impl := sload(slot)
}
}
function _upgradeTo(address newImplementation) internal {
_setImplementation(newImplementation);
emit Upgraded(newImplementation);
}
function _setImplementation(address newImplementation) internal {
require(OpenZeppelinUpgradesAddress.isContract(newImplementation), "Cannot set a proxy implementation to a non-contract address");
bytes32 slot = IMPLEMENTATION_SLOT;
assembly {
sstore(slot, newImplementation)
}
}
}
contract UpgradeabilityProxy is BaseUpgradeabilityProxy {
constructor(address _logic, bytes memory _data) public payable {
assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1));
_setImplementation(_logic);
if(_data.length > 0) {
(bool success,) = _logic.delegatecall(_data);
require(success);
}
}
}
contract BaseAdminUpgradeabilityProxy is BaseUpgradeabilityProxy {
event AdminChanged(address previousAdmin, address newAdmin);
bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;
modifier ifAdmin() {
if (msg.sender == _admin()) {
_;
} else {
_fallback();
}
}
function admin() external ifAdmin returns (address) {
return _admin();
}
function implementation() external ifAdmin returns (address) {
return _implementation();
}
function changeAdmin(address newAdmin) external ifAdmin {
require(newAdmin != address(0), "Cannot change the admin of a proxy to the zero address");
emit AdminChanged(_admin(), newAdmin);
_setAdmin(newAdmin);
}
function upgradeTo(address newImplementation) external ifAdmin {
_upgradeTo(newImplementation);
}
function upgradeToAndCall(address newImplementation, bytes calldata data) payable external ifAdmin {
_upgradeTo(newImplementation);
(bool success,) = newImplementation.delegatecall(data);
require(success);
}
function _admin() internal view returns (address adm) {
bytes32 slot = ADMIN_SLOT;
assembly {
adm := sload(slot)
}
}
function _setAdmin(address newAdmin) internal {
bytes32 slot = ADMIN_SLOT;
assembly {
sstore(slot, newAdmin)
}
}
function _willFallback() internal {
require(msg.sender != _admin(), "Cannot call fallback function from the proxy admin");
super._willFallback();
}
}
contract InitializableUpgradeabilityProxy is BaseUpgradeabilityProxy {
function initialize(address _logic, bytes memory _data) public payable {
require(_implementation() == address(0));
assert(IMPLEMENTATION_SLOT == bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1));
_setImplementation(_logic);
if(_data.length > 0) {
(bool success,) = _logic.delegatecall(_data);
require(success);
}
}
}
contract InitializableAdminUpgradeabilityProxy is BaseAdminUpgradeabilityProxy, InitializableUpgradeabilityProxy {
function initialize(address _logic, address _admin, bytes memory _data) public payable {
require(_implementation() == address(0));
InitializableUpgradeabilityProxy.initialize(_logic, _data);
assert(ADMIN_SLOT == bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1));
_setAdmin(_admin);
}
}
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
contract ERC20 is Initializable, Context, IERC20 {
using SafeMath for uint256;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
function totalSupply() public view returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) public view returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
_transfer(sender, recipient, amount);
_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
return true;
}
function _transfer(address sender, address recipient, uint256 amount) internal {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
function _mint(address account, uint256 amount) internal {
require(account != address(0), "ERC20: mint to the zero address");
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal {
require(account != address(0), "ERC20: burn from the zero address");
_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
function _approve(address owner, address spender, uint256 amount) internal {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _burnFrom(address account, uint256 amount) internal {
_burn(account, amount);
_approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
}
uint256[50] private ______gap;
}
contract ERC20Detailed is Initializable, IERC20 {
string private _name;
string private _symbol;
uint8 private _decimals;
function initialize(string memory name, string memory symbol, uint8 decimals) public initializer {
_name = name;
_symbol = symbol;
_decimals = decimals;
}
function name() public view returns (string memory) {
return _name;
}
function symbol() public view returns (string memory) {
return _symbol;
}
function decimals() public view returns (uint8) {
return _decimals;
}
uint256[50] private ______gap;
}
contract Claimable is Initializable, Ownable {
address public pendingOwner;
function initialize(address _nextOwner) public initializer {
Ownable.initialize(_nextOwner);
}
modifier onlyPendingOwner() {
require(
_msgSender() == pendingOwner,
"Claimable: caller is not the pending owner"
);
_;
}
function transferOwnership(address newOwner) public onlyOwner {
require(
newOwner != owner() && newOwner != pendingOwner,
"Claimable: invalid new owner"
);
pendingOwner = newOwner;
}
function claimOwnership() public onlyPendingOwner {
_transferOwnership(pendingOwner);
delete pendingOwner;
}
}
library Address {
function isContract(address account) internal view returns (bool) {
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
assembly { codehash := extcodehash(account) }
return (codehash != 0x0 && codehash != accountHash);
}
function toPayable(address account) internal pure returns (address payable) {
return address(uint160(account));
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call.value(amount)("");
require(success, "Address: unable to send value, recipient may have reverted");
}
}
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function callOptionalReturn(IERC20 token, bytes memory data) private {
require(address(token).isContract(), "SafeERC20: call to non-contract");
(bool success, bytes memory returndata) = address(token).call(data);
require(success, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
contract CanReclaimTokens is Claimable {
using SafeERC20 for ERC20;
mapping(address => bool) private recoverableTokensBlacklist;
function initialize(address _nextOwner) public initializer {
Claimable.initialize(_nextOwner);
}
function blacklistRecoverableToken(address _token) public onlyOwner {
recoverableTokensBlacklist[_token] = true;
}
function recoverTokens(address _token) external onlyOwner {
require(
!recoverableTokensBlacklist[_token],
"CanReclaimTokens: token is not recoverable"
);
if (_token == address(0x0)) {
msg.sender.transfer(address(this).balance);
} else {
ERC20(_token).safeTransfer(
msg.sender,
ERC20(_token).balanceOf(address(this))
);
}
}
}
contract ERC20WithRate is Initializable, Ownable, ERC20 {
using SafeMath for uint256;
uint256 public constant _rateScale = 1e18;
uint256 internal _rate;
event LogRateChanged(uint256 indexed _rate);
function initialize(address _nextOwner, uint256 _initialRate)
public
initializer
{
Ownable.initialize(_nextOwner);
_setRate(_initialRate);
}
function setExchangeRate(uint256 _nextRate) public onlyOwner {
_setRate(_nextRate);
}
function exchangeRateCurrent() public view returns (uint256) {
require(_rate != 0, "ERC20WithRate: rate has not been initialized");
return _rate;
}
function _setRate(uint256 _nextRate) internal {
require(_nextRate > 0, "ERC20WithRate: rate must be greater than zero");
_rate = _nextRate;
}
function balanceOfUnderlying(address _account)
public
view
returns (uint256)
{
return toUnderlying(balanceOf(_account));
}
function toUnderlying(uint256 _amount) public view returns (uint256) {
return _amount.mul(_rate).div(_rateScale);
}
function fromUnderlying(uint256 _amountUnderlying)
public
view
returns (uint256)
{
return _amountUnderlying.mul(_rateScale).div(_rate);
}
}
contract ERC20WithPermit is Initializable, ERC20, ERC20Detailed {
using SafeMath for uint256;
mapping(address => uint256) public nonces;
string public version;
bytes32 public DOMAIN_SEPARATOR;
bytes32 public constant PERMIT_TYPEHASH = 0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb;
function initialize(
uint256 _chainId,
string memory _version,
string memory _name,
string memory _symbol,
uint8 _decimals
) public initializer {
ERC20Detailed.initialize(_name, _symbol, _decimals);
version = _version;
DOMAIN_SEPARATOR = keccak256(
abi.encode(
keccak256(
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
),
keccak256(bytes(name())),
keccak256(bytes(version)),
_chainId,
address(this)
)
);
}
function permit(
address holder,
address spender,
uint256 nonce,
uint256 expiry,
bool allowed,
uint8 v,
bytes32 r,
bytes32 s
) external {
bytes32 digest = keccak256(
abi.encodePacked(
"\x19\x01",
DOMAIN_SEPARATOR,
keccak256(
abi.encode(
PERMIT_TYPEHASH,
holder,
spender,
nonce,
expiry,
allowed
)
)
)
);
require(holder != address(0), "ERC20WithRate: address must not be 0x0");
require(
holder == ecrecover(digest, v, r, s),
"ERC20WithRate: invalid signature"
);
require(
expiry == 0 || now <= expiry,
"ERC20WithRate: permit has expired"
);
require(nonce == nonces[holder]++, "ERC20WithRate: invalid nonce");
uint256 amount = allowed ? uint256(-1) : 0;
_approve(holder, spender, amount);
}
}
contract RenERC20LogicV1 is
Initializable,
ERC20,
ERC20Detailed,
ERC20WithRate,
ERC20WithPermit,
Claimable,
CanReclaimTokens
{
function initialize(
uint256 _chainId,
address _nextOwner,
uint256 _initialRate,
string memory _version,
string memory _name,
string memory _symbol,
uint8 _decimals
) public initializer {
ERC20Detailed.initialize(_name, _symbol, _decimals);
ERC20WithRate.initialize(_nextOwner, _initialRate);
ERC20WithPermit.initialize(
_chainId,
_version,
_name,
_symbol,
_decimals
);
Claimable.initialize(_nextOwner);
CanReclaimTokens.initialize(_nextOwner);
}
function mint(address _to, uint256 _amount) public onlyOwner {
_mint(_to, _amount);
}
function burn(address _from, uint256 _amount) public onlyOwner {
_burn(_from, _amount);
}
function transfer(address recipient, uint256 amount) public returns (bool) {
require(
recipient != address(this),
"RenERC20: can't transfer to token address"
);
return super.transfer(recipient, amount);
}
function transferFrom(address sender, address recipient, uint256 amount)
public
returns (bool)
{
require(
recipient != address(this),
"RenERC20: can't transfer to token address"
);
return super.transferFrom(sender, recipient, amount);
}
}
contract RenBTC is InitializableAdminUpgradeabilityProxy {}
contract RenZEC is InitializableAdminUpgradeabilityProxy {}
contract RenBCH is InitializableAdminUpgradeabilityProxy {}
Read Contract
DOMAIN_SEPARATOR 0x3644e515 → bytes32
PERMIT_TYPEHASH 0x30adf81f → bytes32
_rateScale 0x25e27ed8 → uint256
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
balanceOfUnderlying 0x3af9e669 → uint256
decimals 0x313ce567 → uint8
exchangeRateCurrent 0xbd6d894d → uint256
fromUnderlying 0xa173b2f6 → uint256
isOwner 0x8f32d59b → bool
name 0x06fdde03 → string
nonces 0x7ecebe00 → uint256
owner 0x8da5cb5b → address
pendingOwner 0xe30c3978 → address
symbol 0x95d89b41 → string
toUnderlying 0xeb438fc2 → uint256
totalSupply 0x18160ddd → uint256
version 0x54fd4d50 → string
Write Contract 19 functions
These functions modify contract state and require a wallet transaction to execute.
approve 0x095ea7b3
address spender
uint256 amount
returns: bool
blacklistRecoverableToken 0xf65d901c
address _token
burn 0x9dc29fac
address _from
uint256 _amount
claimOwnership 0x4e71e0c8
No parameters
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
initialize 0x1624f6c6
string name
string symbol
uint8 decimals
initialize 0x53531e39
uint256 _chainId
address _nextOwner
uint256 _initialRate
string _version
string _name
string _symbol
uint8 _decimals
initialize 0x5dca3452
uint256 _chainId
string _version
string _name
string _symbol
uint8 _decimals
initialize 0xc4d66de8
address _nextOwner
initialize 0xcd6dc687
address _nextOwner
uint256 _initialRate
mint 0x40c10f19
address _to
uint256 _amount
permit 0x8fcbaf0c
address holder
address spender
uint256 nonce
uint256 expiry
bool allowed
uint8 v
bytes32 r
bytes32 s
recoverTokens 0x16114acd
address _token
renounceOwnership 0x715018a6
No parameters
setExchangeRate 0xdb068e0e
uint256 _nextRate
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
Recent Transactions
This address has 1 on-chain transactions, but only 0.8% of the chain is indexed. Transactions will appear as indexing progresses. View on Etherscan →