Overview
APE Balance
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
7658404 | 78 days ago | Contract Creation | 0 APE |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
RoleSetServer
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.8.24; import "@limitbreak/tm-core-lib/src/utils/security/IRoleClient.sol"; /** * @title RoleSetServer * @author Limit Break, Inc. * @notice RoleSetServer stores holders of roles as defined by the role set admin. * Contracts using the RoleClient implementation may receive pushed updates * from the RoleSetServer or may call the RoleSetServer to receive updated role * holder data. */ contract RoleSetServer { /// @dev Struct that defines the pending admin and allowed transfer timestamp. struct PendingAdminTransfer { address pendingAdmin; uint96 allowedTransferTimestamp; } struct RoleHolder { address roleHolder; bool initialized; bool unclearable; } /// @dev Emitted when the holder of a role is updated. event RoleUpdated(bytes32 indexed role, address indexed newRoleHolder, bool clearable); /// @dev Emitted when a role set admin is updated. event RoleSetAdminUpdated(bytes32 indexed roleSet, address indexed prevAdmin, address indexed newAdmin); /// @dev Emitted when a role set admin is proposed to transfer to a new address. event RoleSetAdminPendingTransfer(bytes32 indexed roleSet, address indexed pendingAdmin, uint96 allowedTransferTimestamp); /// @dev Thrown when batch updating role holders and the array lengths are not equal. error RoleSetServer__ArrayLengthMismatch(); /// @dev Thrown when a call is made to set a role and the caller is not the role server admin. error RoleSetServer__CallerMustBeAdmin(); /// @dev Thrown when accepting an admin transfer when the caller is not the pending admin or it is before the allowed transfer time. error RoleSetServer__InvalidAdminTransfer(); /// @dev Thrown when a call is made to create a role set and it already exists. error RoleSetServer__RoleSetAlreadyCreated(); /// @dev Thrown when setting a role holder to the zero address when it is defined as unclearable. error RoleSetServer__RoleUnclearable(); /// @dev Thrown when setting a role and clearable does not match its initial value. error RoleSetServer__ClearableMismatch(); /// @dev Mapping of role sets to admins. mapping (bytes32 roleSet => address roleSetAdmin) public roleSetAdmin; /// @dev Mapping of role set to pending admin awaiting acceptance of admin transfer. mapping (bytes32 roleSet => PendingAdminTransfer pendingAdminTransfer) public roleSetPendingAdmin; /// @dev Mapping of roles to the role holders. mapping (bytes32 role => RoleHolder roleHolder) private _roleHolders; uint48 public constant ADMIN_TRANSFER_DELAY = 1 hours; modifier onlyRoleSetAdmin(bytes32 roleSet) { if (roleSetAdmin[roleSet] != msg.sender) { revert RoleSetServer__CallerMustBeAdmin(); } _; } modifier onlyRoleSetPendingAdmin(bytes32 roleSet) { PendingAdminTransfer memory pendingAdminTransfer = roleSetPendingAdmin[roleSet]; if ( pendingAdminTransfer.pendingAdmin != msg.sender || block.timestamp < pendingAdminTransfer.allowedTransferTimestamp ) { revert RoleSetServer__InvalidAdminTransfer(); } _; } /** * @notice Creates a new role set on the role server that is initially owned by the caller. * * @dev Throws when the role set already exists. * @dev <h4>Postconditions:</h4> * @dev 1. The caller is set as the role admin. * @dev 2. A `RoleSetAdminUpdated` event is emitted. * * @param salt A salt value for creating a unique role set for the admin. * * @return roleSet The role set that has been created. */ function createRoleSet(bytes32 salt) external returns (bytes32 roleSet) { roleSet = keccak256(abi.encode(msg.sender, salt)); if (roleSetAdmin[roleSet] != address(0)) { revert RoleSetServer__RoleSetAlreadyCreated(); } roleSetAdmin[roleSet] = msg.sender; emit RoleSetAdminUpdated(roleSet, address(0), msg.sender); } /** * @notice Transfers ownership of a role set to a new admin. Utilizes a two-step transfer process that * @notice requires the new admin to accept the admin transfer. * * @dev Throws when the caller is not the current role set admin. * @dev <h4>Postconditions:</h4> * @dev 1. The new admin is stored as the pending admin. * @dev 2. A `RoleSetAdminPendingTransfer` event is emitted. * * @param roleSet The role set to update the admin of. * @param newAdmin Address of the new role set admin. */ function transferRoleSetAdmin(bytes32 roleSet, address newAdmin) external onlyRoleSetAdmin(roleSet) { roleSetPendingAdmin[roleSet].pendingAdmin = newAdmin; uint96 allowedTransferTimestamp = uint96(block.timestamp + ADMIN_TRANSFER_DELAY); roleSetPendingAdmin[roleSet].allowedTransferTimestamp = allowedTransferTimestamp; emit RoleSetAdminPendingTransfer(roleSet, newAdmin, allowedTransferTimestamp); } /** * @notice Revokes an admin transfer for a role set prior to the new admin accepting. * * @dev Throws when the caller is not the current role set admin. * @dev <h4>Postconditions:</h4> * @dev 1. The pending admin address is set to the zero address. * @dev 2. A `RoleSetAdminPendingTransfer` event is emitted. * * @param roleSet The role set to revoke the pending admin transfer of. */ function revokeRoleSetAdminTransfer(bytes32 roleSet) external onlyRoleSetAdmin(roleSet) { delete roleSetPendingAdmin[roleSet]; emit RoleSetAdminPendingTransfer(roleSet, address(0), 0); } /** * @notice Accepts the transfer of a role set admin by the pending admin. * * @dev Throws when the caller is not the pending role set admin. * @dev <h4>Postconditions:</h4> * @dev 1. The new admin is stored as the role set admin. * @dev 2. The pending admin is cleared from the role set pending admin mapping. * @dev 2. A `RoleSetAdminUpdated` event is emitted. * * @param roleSet The role set to update the admin of. */ function acceptRoleSetAdmin(bytes32 roleSet) external onlyRoleSetPendingAdmin(roleSet) { address prevAdmin = roleSetAdmin[roleSet]; roleSetAdmin[roleSet] = msg.sender; delete roleSetPendingAdmin[roleSet]; emit RoleSetAdminUpdated(roleSet, prevAdmin, msg.sender); } /** * @notice Returns the holder of a role. * * @param role The role to return role holder for. * * @return roleHolder The holder of the role. */ function getRoleHolder(bytes32 role) external view returns (address roleHolder) { roleHolder = _roleHolders[role].roleHolder; } /** * @notice Updates the role holder for a role. * * @dev Throws when called by an address that is not the admin. * @dev <h4>Postconditions:</h4> * @dev 1. Role holder is updated in the storage mapping. * @dev 2. A `RoleUpdated` event is emitted. * @dev 3. `onRoleHolderChanged` is called on each client supplied in `clients`. * * @param roleSet The role set the role belongs to. * @param baseRole The role to set the holder of prior to hashing with the role set. * @param newRoleHolder The address to set as the holder of the role. * @param clients Array of client addresses to call `onRoleHolderChanged` on. */ function setRoleHolder(bytes32 roleSet, bytes32 baseRole, address newRoleHolder, bool clearable, IRoleClient[] calldata clients) external onlyRoleSetAdmin(roleSet) { _setRoleHolder(roleSet, baseRole, newRoleHolder, clearable, clients); } /** * @notice Updates the role holder for multiple roles. * * @dev Throws when called by an address that is not the admin of the role set. * @dev <h4>Postconditions:</h4> * @dev 1. Role holder is updated in the storage mapping for each role/holder supplied. * @dev 2. A `RoleUpdated` event is emitted for each role/holder supplied. * @dev 3. `onRoleHolderChanged` is called on each client supplied in `clients`. * * @param roleSet The role set the roles belong to. * @param baseRoles Array of roles to set the holder of. * @param newRoleHolders Array of addresses to set as the holders of roles. * @param clients Array of client addresses to call `onRoleHolderChanged` on. */ function setRoleHolders( bytes32 roleSet, bytes32[] calldata baseRoles, address[] calldata newRoleHolders, bool[] calldata clearable, IRoleClient[][] calldata clients ) external onlyRoleSetAdmin(roleSet) { if (baseRoles.length != newRoleHolders.length || baseRoles.length != clients.length || baseRoles.length != clearable.length ) { revert RoleSetServer__ArrayLengthMismatch(); } for (uint256 i = 0; i < baseRoles.length; i++) { _setRoleHolder(roleSet, baseRoles[i], newRoleHolders[i], clearable[i], clients[i]); } } /** * @notice Pushes the latest role holder for an array of `roles` to `client`. * * @dev <h4>Postconditions:</h4> * @dev 1. `onRoleHolderChanged` is called on `client` for each role in `roles`. * * @param roles Array of roles to update the `client` with. * @param client Address of the client to call `onRoleHolderChanged` on. */ function syncClient(bytes32[] calldata roles, IRoleClient client) external { bytes32 role; for (uint256 i = 0; i < roles.length; ++i) { role = roles[i]; client.onRoleHolderChanged(role, _roleHolders[role].roleHolder); } } /** * @notice Pushes the latest role holder for an array of `roles` to an array of `clients`. * * @dev * @dev <h4>Postconditions:</h4> * @dev 1. `onRoleHolderChanged` is called on each client in `clients` for each role in `roles`. * * @param roles Array of roles to update the `client` with. * @param clients Array of client addresses to call `onRoleHolderChanged` on. */ function syncClients(bytes32[] calldata roles, IRoleClient[][] calldata clients) external { if (roles.length != clients.length) { revert RoleSetServer__ArrayLengthMismatch(); } bytes32 role; address roleHolder; for (uint256 i = 0; i < roles.length; ++i) { role = roles[i]; roleHolder = _roleHolders[role].roleHolder; IRoleClient[] calldata roleClients = clients[i]; for (uint256 j = 0; j < roleClients.length; ++j) { roleClients[j].onRoleHolderChanged(role, roleHolder); } } } /** * @dev Internal function to set a role holder. * * @param roleSet The role set the role belongs to. * @param baseRole The role to set the holder of prior to hashing with the role set. * @param newRoleHolder The address to set as the holder of the role. * @param clearable True if the role is clearable in the future. * @param clients Array of client addresses to call `onRoleHolderChanged` on. */ function _setRoleHolder(bytes32 roleSet, bytes32 baseRole, address newRoleHolder, bool clearable, IRoleClient[] calldata clients) internal { bytes32 role = keccak256(abi.encode(roleSet, baseRole)); RoleHolder storage _roleHolder = _roleHolders[role]; if (_roleHolder.unclearable && newRoleHolder == address(0)) { revert RoleSetServer__RoleUnclearable(); } if (_roleHolder.initialized) { if (_roleHolder.unclearable == clearable) { revert RoleSetServer__ClearableMismatch(); } } else { _roleHolder.initialized = true; _roleHolder.unclearable = !clearable; } _roleHolder.roleHolder = newRoleHolder; emit RoleUpdated(role, newRoleHolder, clearable); for (uint256 i = 0; i < clients.length; ++i) { clients[i].onRoleHolderChanged(role, newRoleHolder); } } }
pragma solidity ^0.8.4; interface IRoleClient { function onRoleHolderChanged(bytes32 /*role*/, address /*roleHolder*/) external; }
{ "remappings": [ "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "@limitbreak/tm-core-lib/=lib/tm-core-lib/", "tm-core-lib/=lib/tm-core-lib/src/" ], "optimizer": { "enabled": true, "runs": 1000000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "evmVersion": "cancun", "viaIR": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"RoleSetServer__ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"RoleSetServer__CallerMustBeAdmin","type":"error"},{"inputs":[],"name":"RoleSetServer__ClearableMismatch","type":"error"},{"inputs":[],"name":"RoleSetServer__InvalidAdminTransfer","type":"error"},{"inputs":[],"name":"RoleSetServer__RoleSetAlreadyCreated","type":"error"},{"inputs":[],"name":"RoleSetServer__RoleUnclearable","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"roleSet","type":"bytes32"},{"indexed":true,"internalType":"address","name":"pendingAdmin","type":"address"},{"indexed":false,"internalType":"uint96","name":"allowedTransferTimestamp","type":"uint96"}],"name":"RoleSetAdminPendingTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"roleSet","type":"bytes32"},{"indexed":true,"internalType":"address","name":"prevAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"RoleSetAdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"newRoleHolder","type":"address"},{"indexed":false,"internalType":"bool","name":"clearable","type":"bool"}],"name":"RoleUpdated","type":"event"},{"inputs":[],"name":"ADMIN_TRANSFER_DELAY","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"}],"name":"acceptRoleSetAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"createRoleSet","outputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleHolder","outputs":[{"internalType":"address","name":"roleHolder","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"}],"name":"revokeRoleSetAdminTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"}],"name":"roleSetAdmin","outputs":[{"internalType":"address","name":"roleSetAdmin","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"}],"name":"roleSetPendingAdmin","outputs":[{"internalType":"address","name":"pendingAdmin","type":"address"},{"internalType":"uint96","name":"allowedTransferTimestamp","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"},{"internalType":"bytes32","name":"baseRole","type":"bytes32"},{"internalType":"address","name":"newRoleHolder","type":"address"},{"internalType":"bool","name":"clearable","type":"bool"},{"internalType":"contract IRoleClient[]","name":"clients","type":"address[]"}],"name":"setRoleHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"},{"internalType":"bytes32[]","name":"baseRoles","type":"bytes32[]"},{"internalType":"address[]","name":"newRoleHolders","type":"address[]"},{"internalType":"bool[]","name":"clearable","type":"bool[]"},{"internalType":"contract IRoleClient[][]","name":"clients","type":"address[][]"}],"name":"setRoleHolders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"roles","type":"bytes32[]"},{"internalType":"contract IRoleClient","name":"client","type":"address"}],"name":"syncClient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"roles","type":"bytes32[]"},{"internalType":"contract IRoleClient[][]","name":"clients","type":"address[][]"}],"name":"syncClients","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"},{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferRoleSetAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b506112018061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cf575f3560e01c806367a0b3461161007d57806379a05a311161005857806379a05a311461027f578063b7039e5b1461029f578063f6e5d9a1146102b2575f80fd5b806367a0b346146102245780636a7926661461023757806375d86e041461024a575f80fd5b8063466e7b64116100ad578063466e7b64146101a45780634f4270e4146101b7578063663e4335146101ca575f80fd5b80630e3f59ab146100d357806319c0f64a146100f95780633bb6a80d1461018f575b5f80fd5b6100e66100e1366004610e07565b6102c5565b6040519081526020015b60405180910390f35b610156610107366004610e07565b60016020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff8116907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526bffffffffffffffffffffffff9091166020830152016100f0565b6101a261019d366004610e66565b6103d5565b005b6101a26101b2366004610e07565b610537565b6101a26101c5366004610f2c565b610681565b6101ff6101d8366004610e07565b5f9081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f0565b6101a2610232366004610fb7565b61080f565b6101a261024536600461101e565b6108df565b6101ff610258366004610e07565b5f6020819052908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b610288610e1081565b60405165ffffffffffff90911681526020016100f0565b6101a26102ad366004611093565b61094b565b6101a26102c0366004610e07565b610a95565b604080513360208201529081018290525f90606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f8181529283905291205490915073ffffffffffffffffffffffffffffffffffffffff161561036b576040517fbbc10a2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8181526020819052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633908117909155905190919083907f034e23cd96df19e9244fa54cb2fe1a24a1f650c9943ef2f52c295f009483d4cf908390a4919050565b5f89815260208190526040902054899073ffffffffffffffffffffffffffffffffffffffff163314610433576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87861415806104425750878214155b8061044d5750878414155b15610484576040517f974beaf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8881101561052a576105228b8b8b848181106104a4576104a46110c1565b905060200201358a8a858181106104bd576104bd6110c1565b90506020020160208101906104d291906110ee565b8989868181106104e4576104e46110c1565b90506020020160208101906104f99190611110565b88888781811061050b5761050b6110c1565b905060200281019061051d9190611129565b610b3b565b600101610486565b5050505050505050505050565b5f8181526001602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116808452740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff1691830191909152829190331415806105bb575080602001516bffffffffffffffffffffffff1642105b156105f2576040517faaa0122e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f838152602081815260408083208054337fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092556001909352818420849055905173ffffffffffffffffffffffffffffffffffffffff909216929091839187917f034e23cd96df19e9244fa54cb2fe1a24a1f650c9943ef2f52c295f009483d4cf9190a450505050565b8281146106ba576040517f974beaf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f5b85811015610806578686828181106106d8576106d86110c1565b602090810292909201355f8181526002909352604083205490955073ffffffffffffffffffffffffffffffffffffffff16935036919050868684818110610721576107216110c1565b90506020028101906107339190611129565b915091505f5b818110156107f857828282818110610753576107536110c1565b905060200201602081019061076891906110ee565b6040517ffa5375fd0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff8781166024830152919091169063fa5375fd906044015f604051808303815f87803b1580156107d7575f80fd5b505af11580156107e9573d5f803e3d5ffd5b50505050806001019050610739565b5050508060010190506106be565b50505050505050565b5f805b838110156108d85784848281811061082c5761082c6110c1565b602090810292909201355f81815260029093526040928390205492517ffa5375fd0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff93841660248201529094509185169163fa5375fd91506044015f604051808303815f87803b1580156108b7575f80fd5b505af11580156108c9573d5f803e3d5ffd5b50505050806001019050610812565b5050505050565b5f86815260208190526040902054869073ffffffffffffffffffffffffffffffffffffffff16331461093d576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610806878787878787610b3b565b5f82815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146109a9576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83815260016020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8516179055610a00610e104261118d565b5f8581526001602090815260409182902080546bffffffffffffffffffffffff851674010000000000000000000000000000000000000000810273ffffffffffffffffffffffffffffffffffffffff9283161790925592519081529293509085169186917f54cf4bcf0b72e90c2ae64dcaec8e29da8d56b5e07ffbc6f33c5f1ffd7205995e910160405180910390a350505050565b5f81815260208190526040902054819073ffffffffffffffffffffffffffffffffffffffff163314610af3576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281526001602090815260408083208390555182815284917f54cf4bcf0b72e90c2ae64dcaec8e29da8d56b5e07ffbc6f33c5f1ffd7205995e910160405180910390a35050565b604080516020808201899052818301889052825180830384018152606090920183528151918101919091205f818152600290925291902080547501000000000000000000000000000000000000000000900460ff168015610bb0575073ffffffffffffffffffffffffffffffffffffffff8616155b15610be7576040517f07adbf5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805474010000000000000000000000000000000000000000900460ff1615610c69578054851515750100000000000000000000000000000000000000000090910460ff16151503610c64576040517f656ab3ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cc4565b805475010000000000000000000000000000000000000000008615027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff90911617740100000000000000000000000000000000000000001781555b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87169081178255604051861515815283907f5f0ecfd1ea5555d5b4b6140b49c92365beaf40d0a057dc34a9746990cd4ce8d49060200160405180910390a35f5b83811015610dfc57848482818110610d5757610d576110c1565b9050602002016020810190610d6c91906110ee565b6040517ffa5375fd0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8981166024830152919091169063fa5375fd906044015f604051808303815f87803b158015610ddb575f80fd5b505af1158015610ded573d5f803e3d5ffd5b50505050806001019050610d3d565b505050505050505050565b5f60208284031215610e17575f80fd5b5035919050565b5f8083601f840112610e2e575f80fd5b50813567ffffffffffffffff811115610e45575f80fd5b6020830191508360208260051b8501011115610e5f575f80fd5b9250929050565b5f805f805f805f805f60a08a8c031215610e7e575f80fd5b8935985060208a013567ffffffffffffffff80821115610e9c575f80fd5b610ea88d838e01610e1e565b909a50985060408c0135915080821115610ec0575f80fd5b610ecc8d838e01610e1e565b909850965060608c0135915080821115610ee4575f80fd5b610ef08d838e01610e1e565b909650945060808c0135915080821115610f08575f80fd5b50610f158c828d01610e1e565b915080935050809150509295985092959850929598565b5f805f8060408587031215610f3f575f80fd5b843567ffffffffffffffff80821115610f56575f80fd5b610f6288838901610e1e565b90965094506020870135915080821115610f7a575f80fd5b50610f8787828801610e1e565b95989497509550505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610fb4575f80fd5b50565b5f805f60408486031215610fc9575f80fd5b833567ffffffffffffffff811115610fdf575f80fd5b610feb86828701610e1e565b9094509250506020840135610fff81610f93565b809150509250925092565b80358015158114611019575f80fd5b919050565b5f805f805f8060a08789031215611033575f80fd5b8635955060208701359450604087013561104c81610f93565b935061105a6060880161100a565b9250608087013567ffffffffffffffff811115611075575f80fd5b61108189828a01610e1e565b979a9699509497509295939492505050565b5f80604083850312156110a4575f80fd5b8235915060208301356110b681610f93565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156110fe575f80fd5b813561110981610f93565b9392505050565b5f60208284031215611120575f80fd5b6111098261100a565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261115c575f80fd5b83018035915067ffffffffffffffff821115611176575f80fd5b6020019150600581901b3603821315610e5f575f80fd5b808201808211156111c5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9291505056fea2646970667358221220864c8a864c282642d346eda8815588193ae6f984c6e7dda2305b0e4f6ec481d064736f6c63430008180033
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106100cf575f3560e01c806367a0b3461161007d57806379a05a311161005857806379a05a311461027f578063b7039e5b1461029f578063f6e5d9a1146102b2575f80fd5b806367a0b346146102245780636a7926661461023757806375d86e041461024a575f80fd5b8063466e7b64116100ad578063466e7b64146101a45780634f4270e4146101b7578063663e4335146101ca575f80fd5b80630e3f59ab146100d357806319c0f64a146100f95780633bb6a80d1461018f575b5f80fd5b6100e66100e1366004610e07565b6102c5565b6040519081526020015b60405180910390f35b610156610107366004610e07565b60016020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff8116907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526bffffffffffffffffffffffff9091166020830152016100f0565b6101a261019d366004610e66565b6103d5565b005b6101a26101b2366004610e07565b610537565b6101a26101c5366004610f2c565b610681565b6101ff6101d8366004610e07565b5f9081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f0565b6101a2610232366004610fb7565b61080f565b6101a261024536600461101e565b6108df565b6101ff610258366004610e07565b5f6020819052908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b610288610e1081565b60405165ffffffffffff90911681526020016100f0565b6101a26102ad366004611093565b61094b565b6101a26102c0366004610e07565b610a95565b604080513360208201529081018290525f90606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f8181529283905291205490915073ffffffffffffffffffffffffffffffffffffffff161561036b576040517fbbc10a2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8181526020819052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633908117909155905190919083907f034e23cd96df19e9244fa54cb2fe1a24a1f650c9943ef2f52c295f009483d4cf908390a4919050565b5f89815260208190526040902054899073ffffffffffffffffffffffffffffffffffffffff163314610433576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87861415806104425750878214155b8061044d5750878414155b15610484576040517f974beaf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8881101561052a576105228b8b8b848181106104a4576104a46110c1565b905060200201358a8a858181106104bd576104bd6110c1565b90506020020160208101906104d291906110ee565b8989868181106104e4576104e46110c1565b90506020020160208101906104f99190611110565b88888781811061050b5761050b6110c1565b905060200281019061051d9190611129565b610b3b565b600101610486565b5050505050505050505050565b5f8181526001602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116808452740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff1691830191909152829190331415806105bb575080602001516bffffffffffffffffffffffff1642105b156105f2576040517faaa0122e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f838152602081815260408083208054337fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092556001909352818420849055905173ffffffffffffffffffffffffffffffffffffffff909216929091839187917f034e23cd96df19e9244fa54cb2fe1a24a1f650c9943ef2f52c295f009483d4cf9190a450505050565b8281146106ba576040517f974beaf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f5b85811015610806578686828181106106d8576106d86110c1565b602090810292909201355f8181526002909352604083205490955073ffffffffffffffffffffffffffffffffffffffff16935036919050868684818110610721576107216110c1565b90506020028101906107339190611129565b915091505f5b818110156107f857828282818110610753576107536110c1565b905060200201602081019061076891906110ee565b6040517ffa5375fd0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff8781166024830152919091169063fa5375fd906044015f604051808303815f87803b1580156107d7575f80fd5b505af11580156107e9573d5f803e3d5ffd5b50505050806001019050610739565b5050508060010190506106be565b50505050505050565b5f805b838110156108d85784848281811061082c5761082c6110c1565b602090810292909201355f81815260029093526040928390205492517ffa5375fd0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff93841660248201529094509185169163fa5375fd91506044015f604051808303815f87803b1580156108b7575f80fd5b505af11580156108c9573d5f803e3d5ffd5b50505050806001019050610812565b5050505050565b5f86815260208190526040902054869073ffffffffffffffffffffffffffffffffffffffff16331461093d576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610806878787878787610b3b565b5f82815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146109a9576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83815260016020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8516179055610a00610e104261118d565b5f8581526001602090815260409182902080546bffffffffffffffffffffffff851674010000000000000000000000000000000000000000810273ffffffffffffffffffffffffffffffffffffffff9283161790925592519081529293509085169186917f54cf4bcf0b72e90c2ae64dcaec8e29da8d56b5e07ffbc6f33c5f1ffd7205995e910160405180910390a350505050565b5f81815260208190526040902054819073ffffffffffffffffffffffffffffffffffffffff163314610af3576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281526001602090815260408083208390555182815284917f54cf4bcf0b72e90c2ae64dcaec8e29da8d56b5e07ffbc6f33c5f1ffd7205995e910160405180910390a35050565b604080516020808201899052818301889052825180830384018152606090920183528151918101919091205f818152600290925291902080547501000000000000000000000000000000000000000000900460ff168015610bb0575073ffffffffffffffffffffffffffffffffffffffff8616155b15610be7576040517f07adbf5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805474010000000000000000000000000000000000000000900460ff1615610c69578054851515750100000000000000000000000000000000000000000090910460ff16151503610c64576040517f656ab3ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cc4565b805475010000000000000000000000000000000000000000008615027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff90911617740100000000000000000000000000000000000000001781555b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87169081178255604051861515815283907f5f0ecfd1ea5555d5b4b6140b49c92365beaf40d0a057dc34a9746990cd4ce8d49060200160405180910390a35f5b83811015610dfc57848482818110610d5757610d576110c1565b9050602002016020810190610d6c91906110ee565b6040517ffa5375fd0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8981166024830152919091169063fa5375fd906044015f604051808303815f87803b158015610ddb575f80fd5b505af1158015610ded573d5f803e3d5ffd5b50505050806001019050610d3d565b505050505050505050565b5f60208284031215610e17575f80fd5b5035919050565b5f8083601f840112610e2e575f80fd5b50813567ffffffffffffffff811115610e45575f80fd5b6020830191508360208260051b8501011115610e5f575f80fd5b9250929050565b5f805f805f805f805f60a08a8c031215610e7e575f80fd5b8935985060208a013567ffffffffffffffff80821115610e9c575f80fd5b610ea88d838e01610e1e565b909a50985060408c0135915080821115610ec0575f80fd5b610ecc8d838e01610e1e565b909850965060608c0135915080821115610ee4575f80fd5b610ef08d838e01610e1e565b909650945060808c0135915080821115610f08575f80fd5b50610f158c828d01610e1e565b915080935050809150509295985092959850929598565b5f805f8060408587031215610f3f575f80fd5b843567ffffffffffffffff80821115610f56575f80fd5b610f6288838901610e1e565b90965094506020870135915080821115610f7a575f80fd5b50610f8787828801610e1e565b95989497509550505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610fb4575f80fd5b50565b5f805f60408486031215610fc9575f80fd5b833567ffffffffffffffff811115610fdf575f80fd5b610feb86828701610e1e565b9094509250506020840135610fff81610f93565b809150509250925092565b80358015158114611019575f80fd5b919050565b5f805f805f8060a08789031215611033575f80fd5b8635955060208701359450604087013561104c81610f93565b935061105a6060880161100a565b9250608087013567ffffffffffffffff811115611075575f80fd5b61108189828a01610e1e565b979a9699509497509295939492505050565b5f80604083850312156110a4575f80fd5b8235915060208301356110b681610f93565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156110fe575f80fd5b813561110981610f93565b9392505050565b5f60208284031215611120575f80fd5b6111098261100a565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261115c575f80fd5b83018035915067ffffffffffffffff821115611176575f80fd5b6020019150600581901b3603821315610e5f575f80fd5b808201808211156111c5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9291505056fea2646970667358221220864c8a864c282642d346eda8815588193ae6f984c6e7dda2305b0e4f6ec481d064736f6c63430008180033
Deployed Bytecode Sourcemap
436:12051:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3747:369;;;;;;:::i;:::-;;:::i;:::-;;;345:25:2;;;333:2;318:18;3747:369:1;;;;;;;;2392:97;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;583:42:2;571:55;;;553:74;;675:26;663:39;;;658:2;643:18;;636:67;526:18;2392:97:1;381:328:2;8689:656:1;;;;;;:::i;:::-;;:::i;:::-;;6301:301;;;;;;:::i;:::-;;:::i;10453:618::-;;;;;;:::i;:::-;;:::i;6792:139::-;;;;;;:::i;:::-;6852:18;6895;;;:12;:18;;;;;:29;;;;6792:139;;;;3603:42:2;3591:55;;;3573:74;;3561:2;3546:18;6792:139:1;3427:226:2;9737:273:1;;;;;;:::i;:::-;;:::i;7649:249::-;;;;;;:::i;:::-;;:::i;2228:69::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2622:53;;2668:7;2622:53;;;;;5589:14:2;5577:27;;;5559:46;;5547:2;5532:18;2622:53:1;5415:196:2;4695:437:1;;;;;;:::i;:::-;;:::i;5591:207::-;;;;;;:::i;:::-;;:::i;3747:369::-;3849:28;;;3860:10;3849:28;;;6123:74:2;6213:18;;;6206:34;;;3802:15:1;;6096:18:2;;3849:28:1;;;;;;;;;;;;;3839:39;;3849:28;3839:39;;;;3925:1;3892:21;;;;;;;;;;3839:39;;-1:-1:-1;3892:35:1;:21;:35;3888:111;;3950:38;;;;;;;;;;;;;;3888:111;4008:12;:21;;;;;;;;;;;:34;;;;4032:10;4008:34;;;;;;4057:52;;4032:10;;4008:12;4021:7;;4057:52;;4008:12;;4057:52;3747:369;;;:::o;8689:656::-;2739:12;:21;;;;;;;;;;;8928:7;;2739:35;:21;2764:10;2739:35;2735:107;;2797:34;;;;;;;;;;;;;;2735:107;8951:41;;::::1;;::::0;:92:::1;;-1:-1:-1::0;9009:34:1;;::::1;;8951:92;:145;;;-1:-1:-1::0;9060:36:1;;::::1;;8951:145;8947:228;;;9128:36;;;;;;;;;;;;;;8947:228;9190:9;9185:154;9205:20:::0;;::::1;9185:154;;;9246:82;9261:7;9270:9;;9280:1;9270:12;;;;;;;:::i;:::-;;;;;;;9284:14;;9299:1;9284:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9303:9;;9313:1;9303:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9317:7;;9325:1;9317:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;9246:14;:82::i;:::-;9227:3;;9185:154;;;;8689:656:::0;;;;;;;;;;:::o;6301:301::-;2925:48;2976:28;;;:19;:28;;;;;;;;;2925:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;2976:28;;2925:79;3068:10;3031:47;;;:127;;;3113:20;:45;;;3095:63;;:15;:63;3031:127;3014:224;;;3190:37;;;;;;;;;;;;;;3014:224;6398:17:::1;6418:21:::0;;;::::1;::::0;;;;;;;;;6473:10:::1;6449:34:::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;6500:28:1;;;;;;6493:35;;;6544:51;;6418:21:::1;::::0;;::::1;::::0;6473:10;;6418:21;;;;6544:51:::1;::::0;6398:17;6544:51:::1;6388:214;2915:340:::0;6301:301;;:::o;10453:618::-;10557:30;;;10553:104;;10610:36;;;;;;;;;;;;;;10553:104;10667:12;10689:18;10722:9;10717:348;10737:16;;;10717:348;;;10781:5;;10787:1;10781:8;;;;;;;:::i;:::-;;;;;;;;;;10816:18;;;;:12;:18;;;;;;:29;10781:8;;-1:-1:-1;10816:29:1;;;-1:-1:-1;10860:34:1;;10816:18;-1:-1:-1;10897:7:1;;10905:1;10897:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;10860:47;;;;10926:9;10921:134;10941:22;;;10921:134;;;10988:11;;11000:1;10988:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:52;;;;;;;;7972:25:2;;;10988:34:1;8033:55:2;;;8013:18;;;8006:83;10988:34:1;;;;;;;7945:18:2;;10988:52:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10965:3;;;;;10921:134;;;;10760:305;;10755:3;;;;;10717:348;;;;10543:528;;10453:618;;;;:::o;9737:273::-;9822:12;;9844:160;9864:16;;;9844:160;;;9908:5;;9914:1;9908:8;;;;;;;:::i;:::-;;;;;;;;;;9963:18;;;;:12;:18;;;;;;;;:29;9930:63;;;;;;;;7972:25:2;;;9930:26:1;9963:29;;;8013:18:2;;;8006:83;9908:8:1;;-1:-1:-1;9930:26:1;;;;;;-1:-1:-1;7945:18:2;;9930:63:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9882:3;;;;;9844:160;;;;9812:198;9737:273;;;:::o;7649:249::-;2739:12;:21;;;;;;;;;;;7804:7;;2739:35;:21;2764:10;2739:35;2735:107;;2797:34;;;;;;;;;;;;;;2735:107;7823:68:::1;7838:7;7847:8;7857:13;7872:9;7883:7;;7823:14;:68::i;4695:437::-:0;2739:12;:21;;;;;;;;;;;4786:7;;2739:35;:21;2764:10;2739:35;2735:107;;2797:34;;;;;;;;;;;;;;2735:107;4805:28:::1;::::0;;;:19:::1;:28;::::0;;;;:52;;;::::1;;::::0;::::1;;::::0;;4908:38:::1;2668:7;4908:15;:38;:::i;:::-;4957:28;::::0;;;:19:::1;:28;::::0;;;;;;;;:80;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;5053:72;;8528:58:2;;;4957:80:1;;-1:-1:-1;5053:72:1;;::::1;::::0;4957:28;;5053:72:::1;::::0;8501:18:2;5053:72:1::1;;;;;;;4795:337;4695:437:::0;;;:::o;5591:207::-;2739:12;:21;;;;;;;;;;;5670:7;;2739:35;:21;2764:10;2739:35;2735:107;;2797:34;;;;;;;;;;;;;;2735:107;5696:28:::1;::::0;;;:19:::1;:28;::::0;;;;;;;5689:35;;;5740:51;8528:58:2;;;5696:28:1;;5740:51:::1;::::0;8501:18:2;5740:51:1::1;;;;;;;5591:207:::0;;:::o;11552:933::-;11726:29;;;;;;;8993:25:2;;;9034:18;;;9027:34;;;11726:29:1;;;;;;;;;8966:18:2;;;;11726:29:1;;11716:40;;;;;;;;;-1:-1:-1;11800:18:1;;;:12;:18;;;;;;11832:23;;;;;;;:54;;;;-1:-1:-1;11859:27:1;;;;11832:54;11828:124;;;11909:32;;;;;;;;;;;;;;11828:124;11965:23;;;;;;;11961:280;;;12008:23;;:36;;;:23;;;;;;:36;;;12004:116;;12071:34;;;;;;;;;;;;;;12004:116;11961:280;;;12150:30;;12194:36;12220:10;;12194:36;;;;;;12150:30;12194:36;;;11961:280;12251:38;;;;;;;;;;;;12304:43;;9237:14:2;;9230:22;9212:41;;12316:4:1;;12304:43;;9200:2:2;9185:18;12304:43:1;;;;;;;12363:9;12358:121;12378:18;;;12358:121;;;12417:7;;12425:1;12417:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:51;;;;;;;;7972:25:2;;;12417:30:1;8033:55:2;;;8013:18;;;8006:83;12417:30:1;;;;;;;7945:18:2;;12417:51:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12398:3;;;;;12358:121;;;;11691:794;;11552:933;;;;;;:::o;14:180:2:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:2;;14:180;-1:-1:-1;14:180:2:o;714:367::-;777:8;787:6;841:3;834:4;826:6;822:17;818:27;808:55;;859:1;856;849:12;808:55;-1:-1:-1;882:20:2;;925:18;914:30;;911:50;;;957:1;954;947:12;911:50;994:4;986:6;982:17;970:29;;1054:3;1047:4;1037:6;1034:1;1030:14;1022:6;1018:27;1014:38;1011:47;1008:67;;;1071:1;1068;1061:12;1008:67;714:367;;;;;:::o;1086:1514::-;1330:6;1338;1346;1354;1362;1370;1378;1386;1394;1447:3;1435:9;1426:7;1422:23;1418:33;1415:53;;;1464:1;1461;1454:12;1415:53;1500:9;1487:23;1477:33;;1561:2;1550:9;1546:18;1533:32;1584:18;1625:2;1617:6;1614:14;1611:34;;;1641:1;1638;1631:12;1611:34;1680:70;1742:7;1733:6;1722:9;1718:22;1680:70;:::i;:::-;1769:8;;-1:-1:-1;1654:96:2;-1:-1:-1;1857:2:2;1842:18;;1829:32;;-1:-1:-1;1873:16:2;;;1870:36;;;1902:1;1899;1892:12;1870:36;1941:72;2005:7;1994:8;1983:9;1979:24;1941:72;:::i;:::-;2032:8;;-1:-1:-1;1915:98:2;-1:-1:-1;2120:2:2;2105:18;;2092:32;;-1:-1:-1;2136:16:2;;;2133:36;;;2165:1;2162;2155:12;2133:36;2204:72;2268:7;2257:8;2246:9;2242:24;2204:72;:::i;:::-;2295:8;;-1:-1:-1;2178:98:2;-1:-1:-1;2383:3:2;2368:19;;2355:33;;-1:-1:-1;2400:16:2;;;2397:36;;;2429:1;2426;2419:12;2397:36;;2468:72;2532:7;2521:8;2510:9;2506:24;2468:72;:::i;:::-;2442:98;;2559:8;2549:18;;;2586:8;2576:18;;;1086:1514;;;;;;;;;;;:::o;2605:817::-;2771:6;2779;2787;2795;2848:2;2836:9;2827:7;2823:23;2819:32;2816:52;;;2864:1;2861;2854:12;2816:52;2904:9;2891:23;2933:18;2974:2;2966:6;2963:14;2960:34;;;2990:1;2987;2980:12;2960:34;3029:70;3091:7;3082:6;3071:9;3067:22;3029:70;:::i;:::-;3118:8;;-1:-1:-1;3003:96:2;-1:-1:-1;3206:2:2;3191:18;;3178:32;;-1:-1:-1;3222:16:2;;;3219:36;;;3251:1;3248;3241:12;3219:36;;3290:72;3354:7;3343:8;3332:9;3328:24;3290:72;:::i;:::-;2605:817;;;;-1:-1:-1;3381:8:2;-1:-1:-1;;;;2605:817:2:o;3658:167::-;3757:42;3750:5;3746:54;3739:5;3736:65;3726:93;;3815:1;3812;3805:12;3726:93;3658:167;:::o;3830:602::-;3942:6;3950;3958;4011:2;3999:9;3990:7;3986:23;3982:32;3979:52;;;4027:1;4024;4017:12;3979:52;4067:9;4054:23;4100:18;4092:6;4089:30;4086:50;;;4132:1;4129;4122:12;4086:50;4171:70;4233:7;4224:6;4213:9;4209:22;4171:70;:::i;:::-;4260:8;;-1:-1:-1;4145:96:2;-1:-1:-1;;4345:2:2;4330:18;;4317:32;4358:44;4317:32;4358:44;:::i;:::-;4421:5;4411:15;;;3830:602;;;;;:::o;4437:160::-;4502:20;;4558:13;;4551:21;4541:32;;4531:60;;4587:1;4584;4577:12;4531:60;4437:160;;;:::o;4602:808::-;4738:6;4746;4754;4762;4770;4778;4831:3;4819:9;4810:7;4806:23;4802:33;4799:53;;;4848:1;4845;4838:12;4799:53;4884:9;4871:23;4861:33;;4941:2;4930:9;4926:18;4913:32;4903:42;;4995:2;4984:9;4980:18;4967:32;5008:44;5046:5;5008:44;:::i;:::-;5071:5;-1:-1:-1;5095:35:2;5126:2;5111:18;;5095:35;:::i;:::-;5085:45;;5181:3;5170:9;5166:19;5153:33;5209:18;5201:6;5198:30;5195:50;;;5241:1;5238;5231:12;5195:50;5280:70;5342:7;5333:6;5322:9;5318:22;5280:70;:::i;:::-;4602:808;;;;-1:-1:-1;4602:808:2;;-1:-1:-1;4602:808:2;;5369:8;;4602:808;-1:-1:-1;;;4602:808:2:o;5616:328::-;5684:6;5692;5745:2;5733:9;5724:7;5720:23;5716:32;5713:52;;;5761:1;5758;5751:12;5713:52;5797:9;5784:23;5774:33;;5857:2;5846:9;5842:18;5829:32;5870:44;5908:5;5870:44;:::i;:::-;5933:5;5923:15;;;5616:328;;;;;:::o;6251:184::-;6303:77;6300:1;6293:88;6400:4;6397:1;6390:15;6424:4;6421:1;6414:15;6440:260;6499:6;6552:2;6540:9;6531:7;6527:23;6523:32;6520:52;;;6568:1;6565;6558:12;6520:52;6607:9;6594:23;6626:44;6664:5;6626:44;:::i;:::-;6689:5;6440:260;-1:-1:-1;;;6440:260:2:o;6705:180::-;6761:6;6814:2;6802:9;6793:7;6789:23;6785:32;6782:52;;;6830:1;6827;6820:12;6782:52;6853:26;6869:9;6853:26;:::i;6890:621::-;7000:4;7006:6;7066:11;7053:25;7156:66;7145:8;7129:14;7125:29;7121:102;7101:18;7097:127;7087:155;;7238:1;7235;7228:12;7087:155;7265:33;;7317:20;;;-1:-1:-1;7360:18:2;7349:30;;7346:50;;;7392:1;7389;7382:12;7346:50;7425:4;7413:17;;-1:-1:-1;7476:1:2;7472:14;;;7456;7452:35;7442:46;;7439:66;;;7501:1;7498;7491:12;8100:279;8165:9;;;8186:10;;;8183:190;;;8229:77;8226:1;8219:88;8330:4;8327:1;8320:15;8358:4;8355:1;8348:15;8183:190;8100:279;;;;:::o
Swarm Source
ipfs://864c8a864c282642d346eda8815588193ae6f984c6e7dda2305b0e4f6ec481d0
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.