@credenza-web3/contracts
Version:
Credenza Contracts
755 lines • 66.6 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "DocumentApprovalContract",
"sourceName": "contracts/DocumentApprovalContract.sol",
"abi": [
{
"inputs": [
{
"internalType": "string",
"name": "name_",
"type": "string"
},
{
"internalType": "string",
"name": "version_",
"type": "string"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "InvalidShortString",
"type": "error"
},
{
"inputs": [
{
"internalType": "string",
"name": "str",
"type": "string"
}
],
"name": "StringTooLong",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "approver",
"type": "address"
}
],
"name": "ApproverAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "approver",
"type": "address"
}
],
"name": "ApproverRemoved",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "address[]",
"name": "approvers",
"type": "address[]"
}
],
"name": "ApproversPendingUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
}
],
"name": "Canceled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "prevDocHash",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "author",
"type": "address"
},
{
"indexed": false,
"internalType": "address[]",
"name": "approvers",
"type": "address[]"
},
{
"indexed": false,
"internalType": "address[]",
"name": "readers",
"type": "address[]"
}
],
"name": "DocumentRegistered",
"type": "event"
},
{
"anonymous": false,
"inputs": [],
"name": "EIP712DomainChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
}
],
"name": "Finalized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "reader",
"type": "address"
}
],
"name": "ReaderAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "reader",
"type": "address"
}
],
"name": "ReaderRemoved",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
},
{
"indexed": false,
"internalType": "address[]",
"name": "readers",
"type": "address[]"
}
],
"name": "ReadersUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "signer",
"type": "address"
},
{
"indexed": false,
"internalType": "string",
"name": "meta",
"type": "string"
},
{
"indexed": false,
"internalType": "uint256",
"name": "timestamp",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "totalSignatures",
"type": "uint256"
}
],
"name": "SignatureRegistered",
"type": "event"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "addOwner",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
}
],
"name": "cancel",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "clearOwners",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "eip712Domain",
"outputs": [
{
"internalType": "bytes1",
"name": "fields",
"type": "bytes1"
},
{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"internalType": "string",
"name": "version",
"type": "string"
},
{
"internalType": "uint256",
"name": "chainId",
"type": "uint256"
},
{
"internalType": "address",
"name": "verifyingContract",
"type": "address"
},
{
"internalType": "bytes32",
"name": "salt",
"type": "bytes32"
},
{
"internalType": "uint256[]",
"name": "extensions",
"type": "uint256[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
}
],
"name": "finalize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
}
],
"name": "getApprovers",
"outputs": [
{
"internalType": "address[]",
"name": "",
"type": "address[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getDescription",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
}
],
"name": "getDocumentOwner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "getDocuments",
"outputs": [
{
"internalType": "bytes32[]",
"name": "",
"type": "bytes32[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getOwners",
"outputs": [
{
"internalType": "address[]",
"name": "",
"type": "address[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
}
],
"name": "getPrevDocHash",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
}
],
"name": "getReaders",
"outputs": [
{
"internalType": "address[]",
"name": "",
"type": "address[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
}
],
"name": "getSignatures",
"outputs": [
{
"components": [
{
"internalType": "address",
"name": "signer",
"type": "address"
},
{
"internalType": "string",
"name": "meta",
"type": "string"
},
{
"internalType": "uint256",
"name": "timestamp",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"internalType": "struct DocumentApprovalContract.SignatureInfo[]",
"name": "",
"type": "tuple[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
}
],
"name": "getStatus",
"outputs": [
{
"internalType": "enum DocumentApprovalContract.Status",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getTrustedForwarder",
"outputs": [
{
"internalType": "address",
"name": "forwarder",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
},
{
"internalType": "address",
"name": "user",
"type": "address"
}
],
"name": "hasSigned",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
},
{
"internalType": "address",
"name": "user",
"type": "address"
}
],
"name": "isApprover",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "addr",
"type": "address"
}
],
"name": "isOwner",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "forwarder",
"type": "address"
}
],
"name": "isTrustedForwarder",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "prevDocHash",
"type": "bytes32"
},
{
"internalType": "address[]",
"name": "approversArr",
"type": "address[]"
},
{
"internalType": "address[]",
"name": "readersArr",
"type": "address[]"
}
],
"name": "registerDocument",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
},
{
"internalType": "string",
"name": "meta",
"type": "string"
},
{
"internalType": "bytes",
"name": "signature",
"type": "bytes"
}
],
"name": "registerSignature",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "removeOwner",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
},
{
"internalType": "address[]",
"name": "newApproversPending",
"type": "address[]"
}
],
"name": "setApproversPending",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "description",
"type": "string"
}
],
"name": "setDescription",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "docHash",
"type": "bytes32"
},
{
"internalType": "address[]",
"name": "readersArr",
"type": "address[]"
}
],
"name": "setReaders",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_forwarder",
"type": "address"
}
],
"name": "setTrustedForwarder",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x61016060405234801562000011575f80fd5b50604051620033b1380380620033b183398101604081905262000034916200023c565b818162000043826004620000f3565b6101205262000054816005620000f3565b61014052815160208084019190912060e052815190820120610100524660a052620000e160e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c052506200044e9050565b5f60208351101562000112576200010a836200012b565b905062000125565b816200011f84826200032e565b5060ff90505b92915050565b5f80829050601f8151111562000161578260405163305a27a960e01b8152600401620001589190620003f6565b60405180910390fd5b80516200016e826200042a565b179392505050565b634e487b7160e01b5f52604160045260245ffd5b5f5b83811015620001a65781810151838201526020016200018c565b50505f910152565b5f82601f830112620001be575f80fd5b81516001600160401b0380821115620001db57620001db62000176565b604051601f8301601f19908116603f0116810190828211818310171562000206576200020662000176565b816040528381528660208588010111156200021f575f80fd5b620002328460208301602089016200018a565b9695505050505050565b5f80604083850312156200024e575f80fd5b82516001600160401b038082111562000265575f80fd5b6200027386838701620001ae565b9350602085015191508082111562000289575f80fd5b506200029885828601620001ae565b9150509250929050565b600181811c90821680620002b757607f821691505b602082108103620002d657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000329575f81815260208120601f850160051c81016020861015620003045750805b601f850160051c820191505b81811015620003255782815560010162000310565b5050505b505050565b81516001600160401b038111156200034a576200034a62000176565b62000362816200035b8454620002a2565b84620002dc565b602080601f83116001811462000398575f8415620003805750858301515b5f19600386901b1c1916600185901b17855562000325565b5f85815260208120601f198616915b82811015620003c857888601518255948401946001909101908401620003a7565b5085821015620003e657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f8251806020840152620004168160408501602087016200018a565b601f01601f19169190910160400192915050565b80516020808301519190811015620002d6575f1960209190910360031b1b16919050565b60805160a05160c05160e051610100516101205161014051612f11620004a05f395f611a5101525f611a2601525f61233501525f61230d01525f61226801525f61229201525f6122bc0152612f115ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c80636f6dce3e116100d95780639bc5106811610093578063c4d252f51161006e578063c4d252f5146103bd578063ce1b815f146103d0578063d0bed85e146103e1578063da742228146103f4575f80fd5b80639bc510681461036a578063a0e67e2b1461038a578063a2428b7314610392575f80fd5b80636f6dce3e146102f05780637065cb4814610303578063794703091461031657806384b0196e1461032957806390c3f38f1461034457806392584d8014610357575f80fd5b80632fcbab22116101445780634faa2a1e1161011f5780634faa2a1e146102855780635260f5e6146102a6578063572b6c05146102ae5780635de28ae0146102d0575f80fd5b80632fcbab221461024c578063372e26631461025f57806349ec9dc514610272575f80fd5b80631291d0271461018b578063173825d9146101b45780631a092541146101c957806327f50a2d146101de57806329832c0f146101fe5780632f54bf6e14610221575b5f80fd5b61019e610199366004612664565b610407565b6040516101ab919061267b565b60405180910390f35b6101c76101c23660046126e2565b6104aa565b005b6101d161056f565b6040516101ab9190612745565b6101f16101ec3660046126e2565b6105ff565b6040516101ab9190612757565b61021161020c36600461278e565b610667565b60405190151581526020016101ab565b61021161022f3660046126e2565b6001600160a01b03165f9081526020819052604090205460ff1690565b6101c761025a3660046127f9565b6106c3565b6101c761026d3660046127f9565b610cca565b61019e610280366004612664565b611047565b610298610293366004612664565b6110df565b6040519081526020016101ab565b6101c7611121565b6102116102bc3660046126e2565b6003546001600160a01b0391821691161490565b6102e36102de366004612664565b6111c7565b6040516101ab9190612855565b6101c76102fe3660046128b9565b61120c565b6101c76103113660046126e2565b6115e0565b6101c761032436600461292d565b611692565b610331611a19565b6040516101ab97969594939291906129aa565b6101c7610352366004612a52565b611aa0565b6101c7610365366004612664565b611ae1565b61037d610378366004612664565b611c1d565b6040516101ab9190612afd565b61019e611df4565b6103a56103a0366004612664565b611e53565b6040516001600160a01b0390911681526020016101ab565b6101c76103cb366004612664565b611e9e565b6003546001600160a01b03166103a5565b6102116103ef36600461278e565b611f83565b6101c76104023660046126e2565b611fdf565b5f8181526008602052604090205460609060ff166104405760405162461bcd60e51b815260040161043790612ba2565b60405180910390fd5b5f828152600660209081526040918290206003018054835181840281018401909452808452909183018282801561049e57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610480575b50505050509050919050565b60015415806104bf57506104bf61022f61202e565b6104db5760405162461bcd60e51b815260040161043790612bc7565b6001600160a01b0381165f9081526020819052604090205460ff166105425760405162461bcd60e51b815260206004820152601e60248201527f5461726765742061646472657373206973206e6f7420616e206f776e657200006044820152606401610437565b6001600160a01b0381165f908152602081905260409020805460ff1916905561056c600182612061565b50565b60606002805461057e90612c09565b80601f01602080910402602001604051908101604052809291908181526020018280546105aa90612c09565b80156105f55780601f106105cc576101008083540402835291602001916105f5565b820191905f5260205f20905b8154815290600101906020018083116105d857829003601f168201915b5050505050905090565b6001600160a01b0381165f9081526007602090815260409182902080548351818402810184019094528084526060939283018282801561049e57602002820191905f5260205f20905b8154815260200190600101908083116106485750505050509050919050565b5f8281526008602052604081205460ff166106945760405162461bcd60e51b815260040161043790612ba2565b505f8281526006602081815260408084206001600160a01b0386168552909201905290205460ff165b92915050565b5f8381526008602052604090205460ff166106f05760405162461bcd60e51b815260040161043790612ba2565b5f83815260066020526040812090600482015460ff16600281111561071757610717612841565b146107345760405162461bcd60e51b815260040161043790612c41565b61073c61202e565b60088201546001600160a01b0390811691161461076b5760405162461bcd60e51b815260040161043790612c64565b60028101545f9061077d908490612c9b565b67ffffffffffffffff81111561079557610795612a3e565b6040519080825280602002602001820160405280156107be578160200160208202803683370190505b5090505f808360020180548060200260200160405190810160405280929190818152602001828054801561081957602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116107fb575b505050505090505f5b6002850154811015610904575f85600201828154811061084457610844612cae565b5f9182526020808320909101546001600160a01b03168083526006890190915260409091205490915060ff16156108cf5780858561088181612cc2565b96508151811061089357610893612cae565b6001600160a01b039283166020918202929092018101919091529082165f9081526005880190915260409020805460ff191660011790556108f1565b6001600160a01b0381165f9081526005870160205260409020805460ff191690555b50806108fc81612cc2565b915050610822565b505f5b85811015610a3d575f87878381811061092257610922612cae565b905060200201602081019061093791906126e2565b90506001600160a01b03811661097e5760405162461bcd60e51b815260206004820152600c60248201526b3130b21030b8383937bb32b960a11b6044820152606401610437565b6001600160a01b0381165f90815260058701602052604090205460ff161580156109c257506001600160a01b0381165f90815260068701602052604090205460ff16155b15610a2a576001600160a01b0381165f9081526005870160205260409020805460ff191660011790558085856109f781612cc2565b965081518110610a0957610a09612cae565b60200260200101906001600160a01b031690816001600160a01b0316815250505b5080610a3581612cc2565b915050610907565b505f5b8151811015610b24575f805b84811015610aba57858181518110610a6657610a66612cae565b60200260200101516001600160a01b0316848481518110610a8957610a89612cae565b60200260200101516001600160a01b031603610aa85760019150610aba565b80610ab281612cc2565b915050610a4c565b5080610b1157828281518110610ad257610ad2612cae565b60200260200101516001600160a01b0316897f7f201f5847ff80344f2160d69f03431dbf2f334e244854219fe830b617eee33560405160405180910390a35b5080610b1c81612cc2565b915050610a40565b505f5b82811015610c0b575f805b8351811015610ba157838181518110610b4d57610b4d612cae565b60200260200101516001600160a01b0316868481518110610b7057610b70612cae565b60200260200101516001600160a01b031603610b8f5760019150610ba1565b80610b9981612cc2565b915050610b32565b5080610bf857848281518110610bb957610bb9612cae565b60200260200101516001600160a01b0316897f9ab5e50a4822b412ea0ac8f2e22164edd8c888f2906f7ff72f4b87df5b7adf5a60405160405180910390a35b5080610c0381612cc2565b915050610b27565b50610c19600285015f612636565b5f5b82811015610c855784600201848281518110610c3957610c39612cae565b60209081029190910181015182546001810184555f938452919092200180546001600160a01b0319166001600160a01b0390921691909117905580610c7d81612cc2565b915050610c1b565b50867f533141dbac6d6b7a1101619a99dbcedf1351f7df56dae6705898a3ef389bddde85600201604051610cb99190612d1f565b60405180910390a250505050505050565b5f8381526008602052604090205460ff16610cf75760405162461bcd60e51b815260040161043790612ba2565b5f8381526006602052604090206001600482015460ff166002811115610d1f57610d1f612841565b14158015610d4657506002600482015460ff166002811115610d4357610d43612841565b14155b610d625760405162461bcd60e51b815260040161043790612c41565b610d6a61202e565b60088201546001600160a01b03908116911614610d995760405162461bcd60e51b815260040161043790612c64565b5f81600301805480602002602001604051908101604052809291908181526020018280548015610df057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610dd2575b505050505090505f5b8151811015610eea575f805b85811015610e8057868682818110610e1f57610e1f612cae565b9050602002016020810190610e3491906126e2565b6001600160a01b0316848481518110610e4f57610e4f612cae565b60200260200101516001600160a01b031603610e6e5760019150610e80565b80610e7881612cc2565b915050610e05565b5080610ed757828281518110610e9857610e98612cae565b60200260200101516001600160a01b0316877f313584d284613bfa3e0a0ccfc2869d831a73baef65e5530c10d09cd41f4c201160405160405180910390a35b5080610ee281612cc2565b915050610df9565b50610ef8600383015f612636565b5f5b83811015611004575f858583818110610f1557610f15612cae565b9050602002016020810190610f2a91906126e2565b6003850180546001810182555f918252602082200180546001600160a01b0319166001600160a01b038416179055909150805b8451811015610fb357826001600160a01b0316858281518110610f8257610f82612cae565b60200260200101516001600160a01b031603610fa15760019150610fb3565b80610fab81612cc2565b915050610f5d565b5080610fef576040516001600160a01b0383169089907f793453e9df407e5201a132f1e53a180f49637077b81f322d23171a983fcf919a905f90a35b50508080610ffc90612cc2565b915050610efa565b50847f639ab692b1f017dfa05014929b4aeded9ffefbca13718d5bb8b3fa404ea2882a836003016040516110389190612d1f565b60405180910390a25050505050565b5f8181526008602052604090205460609060ff166110775760405162461bcd60e51b815260040161043790612ba2565b5f828152600660209081526040918290206002018054835181840281018401909452808452909183018282801561049e57602002820191905f5260205f209081546001600160a01b031681526001909101906020018083116104805750505050509050919050565b5f8181526008602052604081205460ff1661110c5760405162461bcd60e51b815260040161043790612ba2565b505f9081526006602052604090206001015490565b6001541580611136575061113661022f61202e565b6111525760405162461bcd60e51b815260040161043790612bc7565b5f5b6001548110156111b9575f805f6001848154811061117457611174612cae565b5f918252602080832091909101546001600160a01b031683528201929092526040019020805460ff1916911515919091179055806111b181612cc2565b915050611154565b506111c560015f612636565b565b5f8181526008602052604081205460ff166111f45760405162461bcd60e51b815260040161043790612ba2565b505f9081526006602052604090206004015460ff1690565b5f8581526008602052604090205460ff166112395760405162461bcd60e51b815260040161043790612ba2565b5f85815260066020526040812090600482015460ff16600281111561126057611260612841565b146112ad5760405162461bcd60e51b815260206004820152601860248201527f4e6f7420616363657074696e67207369676e61747572657300000000000000006044820152606401610437565b5f7f279693642903c4da9fdc0254a326d23c275a1c81b201da98b6c2b00bf6f973d78787876040516112e0929190612d31565b6040519081900381206113089392916020019283526020830191909152604082015260600190565b6040516020818303038152906040528051906020012090505f61136861132d83612165565b86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061219192505050565b90506001600160a01b0381166113b45760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610437565b6001600160a01b0381165f90815260058401602052604090205460ff1661140f5760405162461bcd60e51b815260206004820152600f60248201526e2737ba1030b71030b8383937bb32b960891b6044820152606401610437565b6001600160a01b0381165f90815260068401602052604090205460ff161561146a5760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481cda59db995960921b6044820152606401610437565b6001600160a01b0381165f818152600685016020908152604091829020805460ff1916600117905581516080810183529283528151601f8a01829004820281018201909252888252600786019291828201918b908b90819084018382808284375f920191909152505050908252504260208083019190915260408051601f8a0183900483028101830182528981529201919089908990819084018382808284375f920182905250939094525050835460018082018655948252602091829020845160049092020180546001600160a01b0319166001600160a01b03909216919091178155908301519293909290830191506115659082612d8d565b5060408201516002820155606082015160038201906115849082612d8d565b505050806001600160a01b0316887f84625a31ed043b80292d42a0b1ab555d7b22ea1a0c4150bdab1c496849e39a3589894288600701805490506040516115ce9493929190612e49565b60405180910390a35050505050505050565b60015415806115f557506115f561022f61202e565b6116115760405162461bcd60e51b815260040161043790612bc7565b6001600160a01b0381165f9081526020819052604090205460ff1661056c576001600160a01b03165f818152602081905260408120805460ff191660019081179091558054808201825591527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319169091179055565b856116d25760405162461bcd60e51b815260206004820152601060248201526f191bd8d2185cda081c995c5d5a5c995960821b6044820152606401610437565b5f8681526008602052604090205460ff16156117305760405162461bcd60e51b815260206004820152601b60248201527f446f63756d656e7420616c7265616479207265676973746572656400000000006044820152606401610437565b826117755760405162461bcd60e51b815260206004820152601560248201527420ba103632b0b9ba1037b7329030b8383937bb32b960591b6044820152606401610437565b5f8681526006602052604090208681556001810186905560048101805460ff191690556117a061202e565b6008820180546001600160a01b0319166001600160a01b039290921691821790555f90815260076020908152604082208054600181018255908352908220018890555b84811015611902575f8686838181106117fe576117fe612cae565b905060200201602081019061181391906126e2565b90506001600160a01b03811661185a5760405162461bcd60e51b815260206004820152600c60248201526b3130b21030b8383937bb32b960a11b6044820152606401610437565b6001600160a01b0381165f90815260058401602052604090205460ff166118ef576001600160a01b0381165f8181526005850160209081526040808320805460ff191660019081179091556002880180549182018155845291832090910180546001600160a01b03191684179055518b917f9ab5e50a4822b412ea0ac8f2e22164edd8c888f2906f7ff72f4b87df5b7adf5a91a35b50806118fa81612cc2565b9150506117e3565b505f5b828110156119a5575f84848381811061192057611920612cae565b905060200201602081019061193591906126e2565b6003840180546001810182555f918252602082200180546001600160a01b0319166001600160a01b038416908117909155604051929350918b917f793453e9df407e5201a132f1e53a180f49637077b81f322d23171a983fcf919a91a3508061199d81612cc2565b915050611905565b505f878152600860205260409020805460ff191660011790556119c661202e565b6001600160a01b031686887f60782e06e9242a4a85bf87604715d903f0b02483afefdfe797f9f59a77e85bbf8460020185600301604051611a08929190612e87565b60405180910390a450505050505050565b5f60608082808083611a4c7f000000000000000000000000000000000000000000000000000000000000000060046121b3565b611a777f000000000000000000000000000000000000000000000000000000000000000060056121b3565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6001541580611ab55750611ab561022f61202e565b611ad15760405162461bcd60e51b815260040161043790612bc7565b6002611add8282612d8d565b5050565b5f8181526008602052604090205460ff16611b0e5760405162461bcd60e51b815260040161043790612ba2565b5f818152600660205260409020611b2361202e565b60088201546001600160a01b03908116911614611b525760405162461bcd60e51b815260040161043790612c64565b5f600482015460ff166002811115611b6c57611b6c612841565b14611b895760405162461bcd60e51b815260040161043790612c41565b6002810154600782015414611be05760405162461bcd60e51b815260206004820152601b60248201527f416c6c207369676e657273206d757374207369676e20666972737400000000006044820152606401610437565b60048101805460ff1916600117905560405182907fd5eaff5f7e00ea5a32e32c0121393190de285e9424ce5485cd0b0a51d6b77d62905f90a25050565b5f8181526008602052604090205460609060ff16611c4d5760405162461bcd60e51b815260040161043790612ba2565b5f82815260066020908152604080832060070180548251818502810185019093528083529193909284015b82821015611de9575f84815260209081902060408051608081019091526004850290910180546001600160a01b031682526001810180549293919291840191611cc090612c09565b80601f0160208091040260200160405190810160405280929190818152602001828054611cec90612c09565b8015611d375780601f10611d0e57610100808354040283529160200191611d37565b820191905f5260205f20905b815481529060010190602001808311611d1a57829003601f168201915b5050505050815260200160028201548152602001600382018054611d5a90612c09565b80601f0160208091040260200160405190810160405280929190818152602001828054611d8690612c09565b8015611dd15780601f10611da857610100808354040283529160200191611dd1565b820191905f5260205f20905b815481529060010190602001808311611db457829003601f168201915b50505050508152505081526020019060010190611c78565b505050509050919050565b606060018054806020026020016040519081016040528092919081815260200182805480156105f557602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611e2c575050505050905090565b5f8181526008602052604081205460ff16611e805760405162461bcd60e51b815260040161043790612ba2565b505f908152600660205260409020600801546001600160a01b031690565b5f8181526008602052604090205460ff16611ecb5760405162461bcd60e51b815260040161043790612ba2565b5f818152600660205260409020611ee061202e565b60088201546001600160a01b03908116911614611f0f5760405162461bcd60e51b815260040161043790612c64565b5f600482015460ff166002811115611f2957611f29612841565b14611f465760405162461bcd60e51b815260040161043790612c41565b60048101805460ff1916600217905560405182907f134fdd648feeaf30251f0157f9624ef8608ff9a042aad6d13e73f35d21d3f88d905f90a25050565b5f8281526008602052604081205460ff16611fb05760405162461bcd60e51b815260040161043790612ba2565b505f8281526006602090815260408083206001600160a01b038516845260050190915290205460ff1692915050565b6001541580611ff45750611ff461022f61202e565b6120105760405162461bcd60e51b815260040161043790612bc7565b600380546001600160a01b0319166001600160a01b03831617905550565b5f6014361080159061204a57506003546001600160a01b031633145b1561205c575060131936013560601c90565b503390565b5f5b825481101561216057816001600160a01b031683828154811061208857612088612cae565b5f918252602090912001546001600160a01b03160361214e57825483906120b190600190612eb4565b815481106120c1576120c1612cae565b905f5260205f20015f9054906101000a90046001600160a01b03168382815481106120ee576120ee612cae565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508280548061212957612129612ec7565b5f8281526020902081015f1990810180546001600160a01b0319169055019055505050565b8061215881612cc2565b915050612063565b505050565b5f6106bd61217161225c565b8360405161190160f01b8152600281019290925260228201526042902090565b5f805f61219e858561238a565b915091506121ab816123cc565b509392505050565b606060ff83146121cd576121c683612515565b90506106bd565b8180546121d990612c09565b80601f016020809104026020016040519081016040528092919081815260200182805461220590612c09565b80156122505780601f1061222757610100808354040283529160200191612250565b820191905f5260205f20905b81548152906001019060200180831161223357829003601f168201915b505050505090506106bd565b5f306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156122b457507f000000000000000000000000000000000000000000000000000000000000000046145b156122de57507f000000000000000000000000000000000000000000000000000000000000000090565b612385604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b905090565b5f8082516041036123be576020830151604084015160608501515f1a6123b287828585612552565b945094505050506123c5565b505f905060025b9250929050565b5f8160048111156123df576123df612841565b036123e75750565b60018160048111156123fb576123fb612841565b036124485760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610437565b600281600481111561245c5761245c612841565b036124a95760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610437565b60038160048111156124bd576124bd612841565b0361056c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610437565b60605f6125218361260f565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561258757505f90506003612606565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156125d8573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116612600575f60019250925050612606565b91505f90505b94509492505050565b5f60ff8216601f8111156106bd57604051632cd44ac360e21b815260040160405180910390fd5b5080545f8255905f5260205f209081019061056c91905b80821115612660575f815560010161264d565b5090565b5f60208284031215612674575f80fd5b5035919050565b602080825282518282018190525f9190848201906040850190845b818110156126bb5783516001600160a01b031683529284019291840191600101612696565b50909695505050505050565b80356001600160a01b03811681146126dd575f80fd5b919050565b5f602082840312156126f2575f80fd5b6126fb826126c7565b9392505050565b5f81518084525f5b818110156127265760208185018101518683018201520161270a565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6126fb6020830184612702565b602080825282518282018190525f9190848201906040850190845b818110156126bb57835183529284019291840191600101612772565b5f806040838503121561279f575f80fd5b823591506127af602084016126c7565b90509250929050565b5f8083601f8401126127c8575f80fd5b50813567ffffffffffffffff8111156127df575f80fd5b6020830191508360208260051b85010111156123c5575f80fd5b5f805f6040848603121561280b575f80fd5b83359250602084013567ffffffffffffffff811115612828575f80fd5b612834868287016127b8565b9497909650939450505050565b634e487b7160e01b5f52602160045260245ffd5b602081016003831061287557634e487b7160e01b5f52602160045260245ffd5b91905290565b5f8083601f84011261288b575f80fd5b50813567ffffffffffffffff8111156128a2575f80fd5b6020830191508360208285010111156123c5575f80fd5b5f805f805f606086880312156128cd575f80fd5b85359450602086013567ffffffffffffffff808211156128eb575f80fd5b6128f789838a0161287b565b9096509450604088013591508082111561290f575f80fd5b5061291c8882890161287b565b969995985093965092949392505050565b5f805f805f8060808789031215612942575f80fd5b8635955060208701359450604087013567ffffffffffffffff80821115612967575f80fd5b6129738a838b016127b8565b9096509450606089013591508082111561298b575f80fd5b5061299889828a016127b8565b979a9699509497509295939492505050565b60ff60f81b881681525f602060e0818401526129c960e084018a612702565b83810360408501526129db818a612702565b606085018990526001600160a01b038816608086015260a0850187905284810360c086015285518082528387019250908301905f5b81811015612a2c57835183529284019291840191600101612a10565b50909c9b505050505050505050505050565b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215612a62575f80fd5b813567ffffffffffffffff80821115612a79575f80fd5b818401915084601f830112612a8c575f80fd5b813581811115612a9e57612a9e612a3e565b604051601f8201601f19908116603f01168101908382118183101715612ac657612ac6612a3e565b81604052828152876020848701011115612ade575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f6020808301818452808551808352604092508286019150828160051b8701018488015f5b83811015612b9457888303603f19018552815180516001600160a01b0316845287810151608089860181905290612b5b82870182612702565b915050878201518886015260608083015192508582038187015250612b808183612702565b968901969450505090860190600101612b22565b509098975050505050505050565b6020808252600b908201526a556e6b6e6f776e20646f6360a81b604082015260600190565b60208082526022908201527f4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f604082015261371760f11b606082015260800190565b600181811c90821680612c1d57607f821691505b602082108103612c3b57634e487b7160e01b5f52602260045260245ffd5b50919050565b602080825260099082015268496d6d757461626c6560b81b604082015260600190565b6020808252600990820152682337b93134b23232b760b91b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156106bd576106bd612c87565b634e487b7160e01b5f52603260045260245ffd5b5f60018201612cd357612cd3612c87565b5060010190565b5f815480845260208085019450835f52805f205f5b83811015612d145781546001600160a01b031687529582019560019182019101612cef565b509495945050505050565b602081525f6126fb6020830184612cda565b818382375f9101908152919050565b601f821115612160575f81815260208120601f850160051c81016020861015612d665750805b601f850160051c820191505b81811015612d8557828155600101612d72565b505050505050565b815167ffffffffffffffff811115612da757612da7612a3e565b612dbb81612db58454612c09565b84612d40565b602080601f831160018114612dee575f8415612dd75750858301515b5f19600386901b1c1916600185901b178555612d85565b5f85815260208120601f198616915b82811015612e1c57888601518255948401946001909101908401612dfd565b5085821015612e3957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b60608152836060820152838560808301375f608085830101525f6080601f19601f870116830101905083602083015282604083015295945050505050565b604081525f612e996040830185612cda565b8281036020840152612eab8185612cda565b95945050505050565b818103818111156106bd576106bd612c87565b634e487b7160e01b5f52603160045260245ffdfea26469706673582212204e5d594e415c27922b8360967a732e2ea99abe854e381f39a064ff7c7869197464736f6c63430008140033",
"deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610187575f3560e01c80636f6dce3e116100d95780639bc5106811610093578063c4d252f51161006e578063c4d252f5146103bd578063ce1b815f146103d0578063d0bed85e146103e1578063da742228146103f4575f80fd5b80639bc510681461036a578063a0e67e2b1461038a578063a2428b7314610392575f80fd5b80636f6dce3e146102f05780637065cb4814610303578063794703091461031657806384b0196e1461032957806390c3f38f1461034457806392584d8014610357575f80fd5b80632fcbab22116101445780634faa2a1e1161011f5780634faa2a1e146102855780635260f5e6146102a6578063572b6c05146102ae5780635de28ae0146102d0575f80fd5b80632fcbab221461024c578063372e26631461025f57806349ec9dc514610272575f80fd5b80631291d0271461018b578063173825d9146101b45780631a092541146101c957806327f50a2d146101de57806329832c0f146101fe5780632f54bf6e14610221575b5f80fd5b61019e610199366004612664565b610407565b6040516101ab919061267b565b60405180910390f35b6101c76101c23660046126e2565b6104aa565b005b6101d161056f565b6040516101ab9190612745565b6101f16101ec3660046126e2565b6105ff565b6040516101ab9190612757565b61021161020c36600461278e565b610667565b60405190151581526020016101ab565b61021161022f3660046126e2565b6001600160a01b03165f9081526020819052604090205460ff1690565b6101c761025a3660046127f9565b6106c3565b6101c761026d3660046127f9565b610cca565b61019e610280366004612664565b611047565b610298610293366004612664565b6110df565b6040519081526020016101ab565b6101c7611121565b6102116102bc3660046126e2565b6003546001600160a01b0391821691161490565b6102e36102de366004612664565b6111c7565b6040516101ab9190612855565b6101c76102fe3660046128b9565b61120c565b6101c76103113660046126e2565b6115e0565b6101c761032436600461292d565b611692565b610331611a19565b6040516101ab97969594939291906129aa565b6101c7610352366004612a52565b611aa0565b6101c7610365366004612664565b611ae1565b61037d610378366004612664565b611c1d565b6040516101ab9190612afd565b61019e611df4565b6103a56103a0366004612664565b611e53565b6040516001600160a01b0390911681526020016101ab565b6101c76103cb366004612664565b611e9e565b6003546001600160a01b03166103a5565b6102116103ef36600461278e565b611f83565b6101c76104023660046126e2565b611fdf565b5f8181526008602052604090205460609060ff166104405760405162461bcd60e51b815260040161043790612ba2565b60405180910390fd5b5f828152600660209081526040918290206003018054835181840281018401909452808452909183018282801561049e57602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610480575b50505050509050919050565b60015415806104bf57506104bf61022f61202e565b6104db5760405162461bcd60e51b815260040161043790612bc7565b6001600160a01b0381165f9081526020819052604090205460ff166105425760405162461bcd60e51b815260206004820152601e60248201527f5461726765742061646472657373206973206e6f7420616e206f776e657200006044820152606401610437565b6001600160a01b0381165f908152602081905260409020805460ff1916905561056c600182612061565b50565b60606002805461057e90612c09565b80601f01602080910402602001604051908101604052809291908181526020018280546105aa90612c09565b80156105f55780601f106105cc576101008083540402835291602001916105f5565b820191905f5260205f20905b8154815290600101906020018083116105d857829003601f168201915b5050505050905090565b6001600160a01b0381165f9081526007602090815260409182902080548351818402810184019094528084526060939283018282801561049e57602002820191905f5260205f20905b8154815260200190600101908083116106485750505050509050919050565b5f8281526008602052604081205460ff166106945760405162461bcd60e51b815260040161043790612ba2565b505f8281526006602081815260408084206001600160a01b0386168552909201905290205460ff165b92915050565b5f8381526008602052604090205460ff166106f05760405162461bcd60e51b815260040161043790612ba2565b5f83815260066020526040812090600482015460ff16600281111561071757610717612841565b146107345760405162461bcd60e51b815260040161043790612c41565b61073c61202e565b60088201546001600160a01b0390811691161461076b5760405162461bcd60e51b815260040161043790612c64565b60028101545f9061077d908490612c9b565b67ffffffffffffffff81111561079557610795612a3e565b6040519080825280602002602001820160405280156107be578160200160208202803683370190505b5090505f808360020180548060200260200160405190810160405280929190818152602001828054801561081957602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116107fb575b505050505090505f5b6002850154811015610904575f85600201828154811061084457610844612cae565b5f9182526020808320909101546001600160a01b03168083526006890190915260409091205490915060ff16156108cf5780858561088181612cc2565b96508151811061089357610893612cae565b6001600160a01b039283166020918202929092018101919091529082165f9081526005880190915260409020805460ff191660011790556108f1565b6001600160a01b0381165f9081526005870160205260409020805460ff191690555b50806108fc81612cc2565b915050610822565b505f5b85811015610a3d575f87878381811061092257610922612cae565b905060200201602081019061093791906126e2565b90506001600160a01b03811661097e5760405162461bcd60e51b815260206004820152600c60248201526b3130b21030b8383937bb32b960a11b6044820152606401610437565b6001600160a01b0381165f90815260058701602052604090205460ff161580156109c257506001600160a01b0381165f90815260068701602052604090205460ff16155b15610a2a576001600160a01b0381165f9081526005870160205260409020805460ff191660011790558085856109f781612cc2565b965081518110610a0957610a09612cae565b60200260200101906001600160a01b031690816001600160a01b0316815250505b5080610a3581612cc2565b915050610907565b505f5b8151811015610b24575f805b84811015610aba57858181518110610a6657610a66612cae565b60200260200101516001600160a01b0316848481518110610a8957610a89612cae565b60200260200101516001600160a01b031603610aa85760019150610aba565b80610ab281612cc2565b915050610a4c565b5080610b1157828281518110610ad257610ad2612cae565b60200260200101516001600160a01b0316897f7f201f5847ff80344f2160d69f03431dbf2f334e244854219fe830b617eee33560405160405180910390a35b5080610b1c81612cc2565b915050610a40565b505f5b82811015610c0b575f805b8351811015610ba157838181518110610b4d57610b4d612cae565b60200260200101516001600160a01b0316868481518110610b7057610b70612cae565b60200260200101516001600160a01b031603610b8f5760019150610ba1565b80610b9981612cc2565b915050610b32565b5080610bf857848281518110610bb957610bb9612cae565b60200260200101516001600160a01b0316897f9ab5e50a4822b412ea0ac8f2e22164edd8c888f2906f7ff72f4b87df5b7adf5a60405160405180910390a35b5080610c0381612cc2565b915050610b27565b50610c19600285015f612636565b5f5b82811015610c855784600201848281518110610c3957610c39612cae565b60209081029190910181015182546001810184555f938452919092200180546001600160a01b0319166001600160a01b0390921691909117905580610c7d81612cc2565b915050610c1b565b50867f533141dbac6d6b7a1101619a99dbcedf1351f7df56dae6705898a3ef389bddde85600201604051610cb99190612d1f565b60405180910390a250505050505050565b5f8381526008602052604090205460ff16610cf75760405162461bcd60e51b815260040161043790612ba2565b5f8381526006602052604090206001600482015460ff166002811115610d1f57610d1f612841565b14158015610d4657506002600482015460ff166002811115610d4357610d43612841565b14155b610d625760405162461bcd60e51b815260040161043790612c41565b610d6a61202e565b60088201546001600160a01b03908116911614610d995760405162461bcd60e51b815260040161043790612c64565b5f81600301805480602002602001604051908101604052809291908181526020018280548015610df057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610dd2575b505050505090505f5b8151811015610eea575f805b85811015610e8057868682818110610e1f57610e1f612cae565b9050602002016020810190610e3491906126e2565b6001600160a01b0316848481518110610e4f57610e4f612cae565b60200260200101516001600160a01b031603610e6e5760019150610e80565b80610e7881612cc2565b915050610e05565b5080610ed757828281518110610e9857610e98612cae565b60200260200101516001600160a01b0316877f313584d284613bfa3e0a0