diff --git a/contracts-domain/contracts/verifiers/namecheap_transfer_verifier.sol b/contracts-domain/contracts/verifiers/namecheap_transfer_verifier.sol index 243072c38..afb9447dc 100644 --- a/contracts-domain/contracts/verifiers/namecheap_transfer_verifier.sol +++ b/contracts-domain/contracts/verifiers/namecheap_transfer_verifier.sol @@ -42,41 +42,41 @@ contract Groth16Verifier { uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; - - uint256 constant IC0x = 12140764414809439171579073747096628005611143888739021778142114438725209856911; - uint256 constant IC0y = 18380664008722994554410246598515713804368408809139402801410617352473294938101; - - uint256 constant IC1x = 16287270730688090110441256630912972881096977102957363147237538512209615075930; - uint256 constant IC1y = 2449016754858987854593324887044687327196932594716827949199487058237499016691; - - uint256 constant IC2x = 12290000746054008145532172012836689239677528072347882111559847558608807494030; - uint256 constant IC2y = 14308358318183304542626969831757608989020288980497492892592599563043422576641; - - uint256 constant IC3x = 17109205409157997740951972967816433882944148152574672952222919864324056429618; - uint256 constant IC3y = 9961558237149244928391169779496769511791942854258198694890294984589871243856; - - uint256 constant IC4x = 12885622983359679040345794541760667584938087103345731492334670493606961282700; - uint256 constant IC4y = 18397333374263242470546340955330845415543534978510188436756186606821028634481; - - uint256 constant IC5x = 8251971901226176941314060074725743834337466028961811325874949093602610929902; - uint256 constant IC5y = 16257777857146800480589260332284762827173712873310789777823130626151679328406; - - uint256 constant IC6x = 7755902890727928430969631143079950108469618570373249456222008624592630122217; - uint256 constant IC6y = 10757977250154075642155615103618917172698106635999924885067022788329148453826; - - uint256 constant IC7x = 9229565613389027758694089669374665969186485724568040364429447974425840672975; - uint256 constant IC7y = 8522685561456236376873601057738356653321521861001626828091657280469196217906; - - uint256 constant IC8x = 21276732369738095771663301979590133243106197446584260397744418605720907267683; - uint256 constant IC8y = 7293000518568388677473960035761983204180608786522452828815102825735261508468; - - uint256 constant IC9x = 9116173570523657214485637140779662063231707742648921986441734490858993965489; - uint256 constant IC9y = 20125316561678768525824986864877835211109013619593406972323904438419789772526; - - uint256 constant IC10x = 14220475398513461434883329515056365002533036699993990374428625877488131891870; - uint256 constant IC10y = 12173247053801606963174627761051371553685163525039542034195810636700588930659; - - + + uint256 constant IC0x = 12718791721466586474772975178991944367361898681403889293050590835735829974174; + uint256 constant IC0y = 6579614210328804738196110281777440845203538387714672921854127346802897741731; + + uint256 constant IC1x = 15050971342023334328313633330499885418161248915553086390701402242486225179368; + uint256 constant IC1y = 5024764877577619588829734526990256704181621131776349449360023481477820279987; + + uint256 constant IC2x = 7494265978725599958916265753653166549633529129800692658333846839504191651648; + uint256 constant IC2y = 6331829577874431053631060489192183034310045972687441697179743819760334117448; + + uint256 constant IC3x = 19001722242244131321371144536562173279385056519981716838131699446018662048085; + uint256 constant IC3y = 8148711952593941450664988855383229951630582602775661040234820121548658879338; + + uint256 constant IC4x = 3624352076627862068761560802183636400416483488844158805038644908873200708814; + uint256 constant IC4y = 20894074159790604892251457333772898092352374489464929653588484093719978460605; + + uint256 constant IC5x = 2098287694939727519558784139808406325855172668407809961967029546183317335265; + uint256 constant IC5y = 5659241113472526955215440521431168972841548603376846026887752206139550832697; + + uint256 constant IC6x = 17054571586962694690567468783102453574497782768524521043534058966826398455175; + uint256 constant IC6y = 4087439525418017845490176926142509334113265173570304433911881676407144081865; + + uint256 constant IC7x = 7441928267847731392209447389119131741297268634643246304512516729270550734194; + uint256 constant IC7y = 15714253901405577134617988311525363228461039013850912155558149694323922788327; + + uint256 constant IC8x = 11989172231499636764423272601594485978016807201316866170676011918612131765820; + uint256 constant IC8y = 15918479982497737545158513843427772249925445687882255296587424450200131669618; + + uint256 constant IC9x = 19827744545534206076315711984525184804508732918768894016552346430789516516368; + uint256 constant IC9y = 16361460611570894490152793347002588479282989223552655286979659973731335376509; + + uint256 constant IC10x = 10898965818757221383985300751768263931593441442012024286290119328446015154272; + uint256 constant IC10y = 6989418820395701171656324073128354251482680955655018162117108617053607002569; + + // Memory data uint16 constant pVk = 0; uint16 constant pPairing = 128; @@ -91,7 +91,7 @@ contract Groth16Verifier { return(0, 0x20) } } - + // G1 function to multiply a G1 value(x,y) to value in an address function g1_mulAccC(pR, x, y, s) { let success @@ -126,27 +126,27 @@ contract Groth16Verifier { mstore(add(_pVk, 32), IC0y) // Compute the linear combination vk_x - + g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) - + g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32))) - + g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64))) - + g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96))) - + g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128))) - + g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160))) - + g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192))) - + g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224))) - + g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256))) - + g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288))) - + // -A mstore(_pPairing, calldataload(pA)) @@ -199,29 +199,29 @@ contract Groth16Verifier { mstore(0x40, add(pMem, pLastMem)) // Validate that all evaluations ∈ F - + checkField(calldataload(add(_pubSignals, 0))) - + checkField(calldataload(add(_pubSignals, 32))) - + checkField(calldataload(add(_pubSignals, 64))) - + checkField(calldataload(add(_pubSignals, 96))) - + checkField(calldataload(add(_pubSignals, 128))) - + checkField(calldataload(add(_pubSignals, 160))) - + checkField(calldataload(add(_pubSignals, 192))) - + checkField(calldataload(add(_pubSignals, 224))) - + checkField(calldataload(add(_pubSignals, 256))) - + checkField(calldataload(add(_pubSignals, 288))) - + checkField(calldataload(add(_pubSignals, 320))) - + // Validate all evaluations let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) @@ -230,4 +230,4 @@ contract Groth16Verifier { return(0, 0x20) } } - } \ No newline at end of file + } diff --git a/contracts-domain/deployments/base/.chainId b/contracts-domain/deployments/base/.chainId new file mode 100644 index 000000000..2a0c26389 --- /dev/null +++ b/contracts-domain/deployments/base/.chainId @@ -0,0 +1 @@ +8453 \ No newline at end of file diff --git a/contracts-domain/deployments/base/ClaimVerifier.json b/contracts-domain/deployments/base/ClaimVerifier.json new file mode 100644 index 000000000..f8f13cb78 --- /dev/null +++ b/contracts-domain/deployments/base/ClaimVerifier.json @@ -0,0 +1,142 @@ +{ + "address": "0xBA4D6eA209c3C3A6B0B31fE136a5F0eFd9De2bd1", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "data", + "type": "string" + }, + { + "internalType": "uint8", + "name": "maxValues", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "extractProviderHash", + "type": "bool" + } + ], + "name": "extractAllFromContext", + "outputs": [ + { + "internalType": "string[]", + "name": "", + "type": "string[]" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "data", + "type": "string" + }, + { + "internalType": "string", + "name": "prefix", + "type": "string" + } + ], + "name": "extractFieldFromContext", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "data", + "type": "string" + }, + { + "internalType": "string", + "name": "target", + "type": "string" + } + ], + "name": "findSubstringEndIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "transactionHash": "0xa29d815c30056554ec350f161871f155852dc037938a23f34bdc0512ff81247d", + "receipt": { + "to": null, + "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", + "contractAddress": "0xBA4D6eA209c3C3A6B0B31fE136a5F0eFd9De2bd1", + "transactionIndex": 156, + "gasUsed": "925596", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x43d042dbcf4f32f39f82485636e51004504745ec16ca36a7f36c97561070eebe", + "transactionHash": "0xa29d815c30056554ec350f161871f155852dc037938a23f34bdc0512ff81247d", + "logs": [], + "blockNumber": 20166833, + "cumulativeGasUsed": "28338547", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "d865a6f49eab8c58036d78b72f5cb448", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"data\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"maxValues\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"extractProviderHash\",\"type\":\"bool\"}],\"name\":\"extractAllFromContext\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"data\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"prefix\",\"type\":\"string\"}],\"name\":\"extractFieldFromContext\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"data\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"target\",\"type\":\"string\"}],\"name\":\"findSubstringEndIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"extractAllFromContext(string,uint8,bool)\":{\"params\":{\"data\":\"Context string from which target value needs to be extracted\",\"extractProviderHash\":\"Extracts and returns providerHash if true\",\"maxValues\":\"Maximum number of values to be extracted from extractedParameters\"}},\"extractFieldFromContext(string,string)\":{\"params\":{\"data\":\"Context string from which target value needs to be extracted\",\"prefix\":\"Prefix of the target value that needs to be extracted \"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"extractAllFromContext(string,uint8,bool)\":{\"notice\":\"Extracts ALL values from context in a single pass. Context is stored as serialized JSON string with two keys: extractedParameters and providerHash. ExtractedParameters itself is a JSON string with key-value pairs. This function returns extracted individual values from extractedParameters along with providerHash (if extractProviderHash is true). Use maxValues to limit the number of expected values to be extracted from extractedParameters. In most cases, one would need to extract all values from extractedParameters and providerHash, hence use this function over calling extractFieldFromContext multiple times. \"},\"extractFieldFromContext(string,string)\":{\"notice\":\"Extracts given target field value from context in claims. Extracts only ONE value. Pass prefix formatted with quotes, for example '\\\"providerHash\\\\\\\":\\\\\\\"' Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\"},\"findSubstringEndIndex(string,string)\":{\"notice\":\"Find the end index of target string in the data string. Returns the end index + 1 if the target string in the data string if found. Returns type(uint256).max if: - Target is longer than data - Target is not found Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/external/ClaimVerifier.sol\":\"ClaimVerifier\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\")\\n mstore(0x1c, hash)\\n message := keccak256(0x00, 0x3c)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40)\\n mstore(ptr, \\\"\\\\x19\\\\x01\\\")\\n mstore(add(ptr, 0x02), domainSeparator)\\n mstore(add(ptr, 0x22), structHash)\\n data := keccak256(ptr, 0x42)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\\n * `validator` and `data` according to the version 0 of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x00\\\", validator, data));\\n }\\n}\\n\",\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"./StringUtils.sol\\\";\\n\\n/**\\n * Library to assist with requesting,\\n * serialising & verifying credentials\\n */\\nlibrary Claims {\\n\\t/** Data required to describe a claim */\\n\\tstruct CompleteClaimData {\\n\\t\\tbytes32 identifier;\\n\\t\\taddress owner;\\n\\t\\tuint32 timestampS;\\n\\t\\tuint32 epoch;\\n\\t}\\n\\n\\tstruct ClaimInfo {\\n\\t\\tstring provider;\\n\\t\\tstring parameters;\\n\\t\\tstring context;\\n\\t}\\n\\n\\t/** Claim with signatures & signer */\\n\\tstruct SignedClaim {\\n\\t\\tCompleteClaimData claim;\\n\\t\\tbytes[] signatures;\\n\\t}\\n\\n\\t/**\\n\\t * Asserts that the claim is signed by the expected witnesses\\n\\t */\\n\\tfunction assertValidSignedClaim(\\n\\t\\tSignedClaim memory self,\\n\\t\\taddress[] memory expectedWitnessAddresses\\n\\t) internal pure {\\n\\t\\trequire(self.signatures.length > 0, \\\"No signatures\\\");\\n\\t\\taddress[] memory signedWitnesses = recoverSignersOfSignedClaim(self);\\n\\t\\tfor (uint256 i = 0; i < expectedWitnessAddresses.length; i++) {\\n\\t\\t\\tbool found = false;\\n\\t\\t\\tfor (uint256 j = 0; j < signedWitnesses.length; j++) {\\n\\t\\t\\t\\tif (signedWitnesses[j] == expectedWitnessAddresses[i]) {\\n\\t\\t\\t\\t\\tfound = true;\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\trequire(found, \\\"Missing witness signature\\\");\\n\\t\\t}\\n\\t}\\n\\n\\t/**\\n\\t * @dev recovers the signer of the claim\\n\\t */\\n\\tfunction recoverSignersOfSignedClaim(\\n\\t\\tSignedClaim memory self\\n\\t) internal pure returns (address[] memory) {\\n\\t\\tbytes memory serialised = serialise(self.claim);\\n\\t\\taddress[] memory signers = new address[](self.signatures.length);\\n\\t\\tfor (uint256 i = 0; i < self.signatures.length; i++) {\\n\\t\\t\\tsigners[i] = verifySignature(serialised, self.signatures[i]);\\n\\t\\t}\\n\\n\\t\\treturn signers;\\n\\t}\\n\\n\\t/**\\n\\t * @dev serialises the credential into a string;\\n\\t * the string is used to verify the signature\\n\\t *\\n\\t * the serialisation is the same as done by the TS library\\n\\t */\\n\\tfunction serialise(\\n\\t\\tCompleteClaimData memory self\\n\\t) internal pure returns (bytes memory) {\\n\\t\\treturn\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\tStringUtils.bytes2str(abi.encodePacked(self.identifier)),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.address2str(self.owner),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.timestampS),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.epoch)\\n\\t\\t\\t);\\n\\t}\\n\\n\\t/**\\n\\t * @dev returns the address of the user that generated the signature\\n\\t */\\n\\tfunction verifySignature(\\n\\t\\tbytes memory content,\\n\\t\\tbytes memory signature\\n\\t) internal pure returns (address signer) {\\n\\t\\tbytes32 signedHash = keccak256(\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\t\\\"\\\\x19Ethereum Signed Message:\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(content.length),\\n\\t\\t\\t\\tcontent\\n\\t\\t\\t)\\n\\t\\t);\\n\\t\\treturn ECDSA.recover(signedHash, signature);\\n\\t}\\n\\n\\tfunction hashClaimInfo(ClaimInfo memory claimInfo) internal pure returns (bytes32) {\\n\\t\\tbytes memory serialised = abi.encodePacked(\\n\\t\\t\\tclaimInfo.provider,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.parameters,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.context\\n\\t\\t);\\n\\t\\treturn keccak256(serialised);\\n\\t}\\n}\\n\",\"keccak256\":\"0x87a41e75d358e86798456ad45e03446cde8f1519c8af17905f6c8b852a5f2da7\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/StringUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/**\\n * Utilities for string manipulation & conversion\\n */\\nlibrary StringUtils {\\n\\tfunction address2str(address x) internal pure returns (string memory) {\\n\\t\\tbytes memory s = new bytes(40);\\n\\t\\tfor (uint i = 0; i < 20; i++) {\\n\\t\\t\\tbytes1 b = bytes1(uint8(uint(uint160(x)) / (2 ** (8 * (19 - i)))));\\n\\t\\t\\tbytes1 hi = bytes1(uint8(b) / 16);\\n\\t\\t\\tbytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));\\n\\t\\t\\ts[2 * i] = getChar(hi);\\n\\t\\t\\ts[2 * i + 1] = getChar(lo);\\n\\t\\t}\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", s));\\n\\t}\\n\\n\\tfunction bytes2str(bytes memory buffer) internal pure returns (string memory) {\\n\\t\\t// Fixed buffer size for hexadecimal convertion\\n\\t\\tbytes memory converted = new bytes(buffer.length * 2);\\n\\t\\tbytes memory _base = \\\"0123456789abcdef\\\";\\n\\n\\t\\tfor (uint256 i = 0; i < buffer.length; i++) {\\n\\t\\t\\tconverted[i * 2] = _base[uint8(buffer[i]) / _base.length];\\n\\t\\t\\tconverted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length];\\n\\t\\t}\\n\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", converted));\\n\\t}\\n\\n\\tfunction getChar(bytes1 b) internal pure returns (bytes1 c) {\\n\\t\\tif (uint8(b) < 10) return bytes1(uint8(b) + 0x30);\\n\\t\\telse return bytes1(uint8(b) + 0x57);\\n\\t}\\n\\n\\tfunction bool2str(bool _b) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_b) {\\n\\t\\t\\treturn \\\"true\\\";\\n\\t\\t} else {\\n\\t\\t\\treturn \\\"false\\\";\\n\\t\\t}\\n\\t}\\n\\n\\tfunction uint2str(uint _i) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_i == 0) {\\n\\t\\t\\treturn \\\"0\\\";\\n\\t\\t}\\n\\t\\tuint j = _i;\\n\\t\\tuint len;\\n\\t\\twhile (j != 0) {\\n\\t\\t\\tlen++;\\n\\t\\t\\tj /= 10;\\n\\t\\t}\\n\\t\\tbytes memory bstr = new bytes(len);\\n\\t\\tuint k = len;\\n\\t\\twhile (_i != 0) {\\n\\t\\t\\tk = k - 1;\\n\\t\\t\\tuint8 temp = (48 + uint8(_i - (_i / 10) * 10));\\n\\t\\t\\tbytes1 b1 = bytes1(temp);\\n\\t\\t\\tbstr[k] = b1;\\n\\t\\t\\t_i /= 10;\\n\\t\\t}\\n\\t\\treturn string(bstr);\\n\\t}\\n\\n\\tfunction areEqual(\\n\\t\\tstring calldata _a,\\n\\t\\tstring storage _b\\n\\t) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction areEqual(string memory _a, string memory _b) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction toLower(string memory str) internal pure returns (string memory) {\\n\\t\\tbytes memory bStr = bytes(str);\\n\\t\\tbytes memory bLower = new bytes(bStr.length);\\n\\t\\tfor (uint i = 0; i < bStr.length; i++) {\\n\\t\\t\\t// Uppercase character...\\n\\t\\t\\tif ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {\\n\\t\\t\\t\\t// So we add 32 to make it lowercase\\n\\t\\t\\t\\tbLower[i] = bytes1(uint8(bStr[i]) + 32);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tbLower[i] = bStr[i];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn string(bLower);\\n\\t}\\n\\n\\tfunction substring(\\n\\t\\tstring memory str,\\n\\t\\tuint startIndex,\\n\\t\\tuint endIndex\\n\\t) internal pure returns (string memory) {\\n\\t\\tbytes memory strBytes = bytes(str);\\n\\t\\tbytes memory result = new bytes(endIndex - startIndex);\\n\\t\\tfor (uint i = startIndex; i < endIndex; i++) {\\n\\t\\t\\tresult[i - startIndex] = strBytes[i];\\n\\t\\t}\\n\\t\\treturn string(result);\\n\\t}\\n}\\n\",\"keccak256\":\"0x15feebafef16d4c74c043b39e652ddae0e121987ceca74b663f6a2d2d7ba8b4b\",\"license\":\"MIT\"},\"contracts/external/ClaimVerifier.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Claims } from \\\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\nlibrary ClaimVerifier {\\n\\n /**\\n * Find the end index of target string in the data string. Returns the end index + 1 if\\n * the target string in the data string if found. Returns type(uint256).max if:\\n * - Target is longer than data\\n * - Target is not found\\n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\\n */\\n function findSubstringEndIndex(\\n string memory data,\\n string memory target\\n ) public pure returns (uint256) {\\n bytes memory dataBytes = bytes(data);\\n bytes memory targetBytes = bytes(target);\\n\\n if (dataBytes.length < targetBytes.length) {\\n return type(uint256).max;\\n }\\n\\n // Find start of target\\n for (uint i = 0; i <= dataBytes.length - targetBytes.length; i++) {\\n bool isMatch = true;\\n\\n for (uint j = 0; j < targetBytes.length && isMatch; j++) {\\n if (dataBytes[i + j] != targetBytes[j]) {\\n isMatch = false;\\n break;\\n }\\n }\\n\\n if (isMatch) {\\n return i + targetBytes.length; // Return end index + 1\\n }\\n }\\n\\n return type(uint256).max;\\n }\\n\\n /**\\n * Extracts given target field value from context in claims. Extracts only ONE value.\\n * Pass prefix formatted with quotes, for example '\\\"providerHash\\\\\\\":\\\\\\\"'\\n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\\n *\\n * @param data Context string from which target value needs to be extracted\\n * @param prefix Prefix of the target value that needs to be extracted \\n */\\n function extractFieldFromContext(\\n string memory data,\\n string memory prefix\\n ) public pure returns (string memory) {\\n // Find end index of prefix; which is the start index of the value\\n uint256 start = findSubstringEndIndex(data, prefix);\\n\\n bytes memory dataBytes = bytes(data);\\n if (start == dataBytes.length) {\\n return \\\"\\\"; // Prefix not found. Malformed or missing message\\n }\\n \\n // Find the end of the VALUE, assuming it ends with a quote not preceded by a backslash\\n uint256 end = start;\\n while (\\n end < dataBytes.length &&\\n !(dataBytes[end] == '\\\"' && dataBytes[end - 1] != \\\"\\\\\\\\\\\")\\n ) {\\n end++;\\n }\\n if (end <= start) {\\n return \\\"\\\"; // Malformed or missing message\\n }\\n bytes memory contextMessage = new bytes(end - start);\\n for (uint i = start; i < end; i++) {\\n contextMessage[i - start] = dataBytes[i];\\n }\\n return string(contextMessage);\\n }\\n\\n\\n /**\\n * Extracts ALL values from context in a single pass. Context is stored as serialized JSON string with \\n * two keys: extractedParameters and providerHash. ExtractedParameters itself is a JSON string with \\n * key-value pairs. This function returns extracted individual values from extractedParameters along \\n * with providerHash (if extractProviderHash is true). Use maxValues to limit the number of expected values\\n * to be extracted from extractedParameters. In most cases, one would need to extract all values from\\n * extractedParameters and providerHash, hence use this function over calling extractFieldFromContext \\n * multiple times.\\n * \\n * @param data Context string from which target value needs to be extracted\\n * @param maxValues Maximum number of values to be extracted from extractedParameters\\n * @param extractProviderHash Extracts and returns providerHash if true\\n */\\n function extractAllFromContext(\\n string memory data,\\n uint8 maxValues,\\n bool extractProviderHash\\n ) public pure returns (string[] memory) {\\n \\n require(maxValues > 0, \\\"Max values must be greater than 0\\\");\\n\\n bytes memory dataBytes = bytes(data);\\n uint index = 0;\\n\\n bytes memory extractedParametersBytes = bytes('{\\\\\\\"extractedParameters\\\\\\\":{\\\\\\\"');\\n for (uint i = 0; i < extractedParametersBytes.length; i++) {\\n require(dataBytes[index + i] == extractedParametersBytes[i], \\\"Extraction failed. Malformed extractedParameters\\\");\\n }\\n index += extractedParametersBytes.length;\\n\\n bool isValue = false; // starts with a key right after '{\\\\\\\"extractedParameters\\\\\\\":{\\\\\\\"'\\n uint valuesFound = 0;\\n \\n uint[] memory valueIndices = new uint[](extractProviderHash ? 2 * (maxValues + 1): 2 * maxValues);\\n\\n while (\\n index < dataBytes.length\\n ) {\\n // Keep incrementing until '\\\"', escaped quotes are not considered\\n if (!(dataBytes[index] == '\\\"' && dataBytes[index - 1] != \\\"\\\\\\\\\\\")) {\\n index++;\\n continue;\\n }\\n\\n if (!isValue) {\\n // \\\\\\\":\\\\\\\" (3 chars)\\n require(dataBytes[index + 1] == \\\":\\\" && dataBytes[index + 2] == '\\\\\\\"', \\\"Extraction failed. Malformed data 1\\\");\\n index += 3; // move it after \\\\\\\"\\n isValue = true;\\n valueIndices[2 * valuesFound] = index; // start index\\n } else {\\n // \\\\\\\",\\\\\\\" (3 chars) or \\\\\\\"}, (3 chars)\\n // \\\\\\\"}} is not supported, there should always be a providerHash\\n require(\\n dataBytes[index + 1] == \\\",\\\" && dataBytes[index + 2] == '\\\\\\\"' || \\n dataBytes[index + 1] == '}' && dataBytes[index + 2] == \\\",\\\",\\n \\\"Extraction failed. Malformed data 2\\\"\\n );\\n valueIndices[2 * valuesFound + 1] = index; // end index\\n valuesFound++;\\n\\n if (dataBytes[index + 1] == \\\",\\\") {\\n // Revert if valuesFound == maxValues and next char is a comma as there will be more values\\n require(valuesFound != maxValues, \\\"Extraction failed. Exceeded max values\\\");\\n index += 3;\\n isValue = false;\\n } else { // index + 1 = \\\"}\\\"\\n index += 3;\\n break; // end of extractedParameters\\n }\\n }\\n }\\n\\n if (extractProviderHash) {\\n bytes memory providerHashParamBytes = bytes(\\\"\\\\\\\"providerHash\\\\\\\":\\\\\\\"\\\");\\n for (uint i = 0; i < providerHashParamBytes.length; i++) {\\n require(dataBytes[index + i] == providerHashParamBytes[i], \\\"Extraction failed. Malformed providerHash\\\");\\n }\\n index += providerHashParamBytes.length;\\n \\n // final indices tuple in valueIndices will be for star and end indices of provider hash\\n valueIndices[2 * valuesFound] = index;\\n // Keep incrementing until '\\\"'\\n while (\\n index < dataBytes.length && dataBytes[index] != '\\\"'\\n ) {\\n index++;\\n }\\n valueIndices[2 * valuesFound + 1] = index;\\n valuesFound++;\\n } \\n \\n string[] memory values = new string[](valuesFound);\\n \\n for (uint i = 0; i < valuesFound; i++) {\\n uint startIndex = valueIndices[2 * i];\\n uint endIndex = valueIndices[2 * i + 1];\\n bytes memory contextValue = new bytes(endIndex - startIndex);\\n for (uint j = startIndex; j < endIndex; j++) {\\n contextValue[j - startIndex] = dataBytes[j];\\n }\\n values[i] = string(contextValue);\\n }\\n\\n return values;\\n }\\n}\\n\",\"keccak256\":\"0xac6a8d456c3b2c5ab5a475279a2f0f103faff3cb2d6abb2ce2029cd4265b904e\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523461001e57604051610fc4610024823930815050610fc490f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c80633755667e146100425780634be6d4f81461003d57634da485c6036100f65761030c565b6102e9565b6101ca565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761007f57604052565b610047565b9061009861009160405190565b928361005d565b565b67ffffffffffffffff811161007f57602090601f01601f19160190565b0190565b90826000939282370152565b909291926100dc6100d78261009a565b610084565b938185526020850190828401116100f657610098926100bb565b600080fd5b9080601f830112156100f657816020610116933591016100c7565b90565b9190916040818403126100f657803567ffffffffffffffff81116100f657836101439183016100fb565b92602082013567ffffffffffffffff81116100f65761011692016100fb565b60005b8381106101755750506000910152565b8181015183820152602001610165565b6101a66101af6020936100b79361019a815190565b80835293849260200190565b95869101610162565b601f01601f191690565b602080825261011692910190610185565b6101ed6101e16101db366004610119565b9061054f565b604051918291826101b9565b0390f35b60ff81165b036100f657565b90503590610098826101f1565b8015156101f6565b905035906100988261020a565b90916060828403126100f657813567ffffffffffffffff81116100f65761024b846101169285016100fb565b9361025981602086016101fd565b93604001610212565b9061011691610185565b90610282610278835190565b8083529160200190565b90816102946020830284019460200190565b926000915b8383106102a857505050505090565b909192939460206102cb6102c483856001950387528951610262565b9760200190565b9301930191939290610299565b60208082526101169291019061026c565b6101ed6103006102fa36600461021f565b91610a12565b604051918291826102d8565b6101ed61032361031d366004610119565b906103bf565b6040519182918290815260200190565b6101166101166101169290565b634e487b7160e01b600052601160045260246000fd5b60001981146103655760010190565b610340565b9190610375565b9290565b820391821161036557565b9190820180921161036557565b634e487b7160e01b600052603260045260246000fd5b906103ac825190565b8110156103ba570160200190565b61038d565b6103d26103d6916103ce600090565b5090565b9190565b81516103e66103d2610116845190565b106104fb576000916103f783610333565b61040d610116610405845190565b85519061036a565b81116104f4576001808061042087610333565b905b61044b575b505061043b5761043690610356565b6103f7565b9151610116935090505b90610380565b61045c610116879894969395985190565b8110806104ed575b156104e25761048d61047f610479838a610380565b846103a3565b516001600160f81b03191690565b6104bb6104ad6104a061047f858b6103a3565b6001600160f81b03191690565b916001600160f81b03191690565b036104d4576104c990610356565b839194929693610422565b509250809491503880610427565b819492969350610427565b5084610464565b5050501990565b505060001990565b906105106100d78361009a565b918252565b6101166000610503565b610116610515565b369037565b9061009861054261053c84610503565b9361009a565b601f190160208401610527565b919061037161056791610560606090565b50846103bf565b90610573610116835190565b831461067f57825b610586610116845190565b811080610619575b156105a15761059c90610356565b61057b565b918383111561060d576105bc6105b7858561036a565b61052c565b91845b845b811015610601576105fa816105dc61047f6105c194876103a3565b6105f46105e98a8461036a565b9160001a91886103a3565b53610356565b90506105bf565b50935050610116915090565b5091505061011661051f565b5061062761047f82856103a3565b610634601160f91b6104ad565b1480610646575b1561058e565b61058e565b5061064161066961047f61066361065d6001610333565b8561036a565b866103a3565b610676601760fa1b6104ad565b1415905061063b565b91505061011661051f565b6106976101166101169290565b60ff1690565b156106a457565b60405162461bcd60e51b815260206004820152602160248201527f4d61782076616c756573206d7573742062652067726561746572207468616e206044820152600360fc1b6064820152608490fd5b6106fd6019610503565b7f7b22657874726163746564506172616d6574657273223a7b2200000000000000602082015290565b6101166106f3565b1561073557565b60405162461bcd60e51b815260206004820152603060248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642065787460448201526f726163746564506172616d657465727360801b6064820152608490fd5b6107a29060ff165b9160ff1690565b029060ff821691820361036557565b6107bd9060ff1661079b565b019060ff821161036557565b6101166101166101169260ff1690565b67ffffffffffffffff811161007f5760208091020190565b906105106100d7836107d9565b9061009861054261080e846107f1565b936107d9565b1561081b57565b60405162461bcd60e51b815260206004820152602360248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642064617460448201526230901960e91b6064820152608490fd5b8181029291811591840414171561036557565b90610888825190565b8110156103ba576020809102010190565b156108a057565b60405162461bcd60e51b815260206004820152602660248201527f45787472616374696f6e206661696c65642e204578636565646564206d61782060448201526576616c75657360d01b6064820152608490fd5b156108fb57565b60405162461bcd60e51b815260206004820152602360248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642064617460448201526261203160e81b6064820152608490fd5b6109566010610503565b6f11383937bb34b232b92430b9b4111d1160811b602082015290565b61011661094c565b1561098157565b60405162461bcd60e51b815260206004820152602960248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642070726f6044820152680ecd2c8cae490c2e6d60bb1b6064820152608490fd5b60005b8281106109e757505050565b6060828201526020016109db565b90610098610a0561080e846107f1565b601f1901602084016109d8565b90610a2f600092610116610a258561068a565b60ff85161161069d565b93610a3983610333565b91610a42610726565b93835b610a50610116875190565b811015610a975780610a8d610a7461047f610a6e610a92958a610380565b8c6103a3565b610a876104ad6104a061047f868d6103a3565b1461072e565b610356565b610a45565b5092610445610aa99295979693975190565b918093610ab582610333565b968315610f7a57610af2610aed610ae86002610ae3610add610ad7600161068a565b886107b1565b9161068a565b610793565b6107c9565b6107fe565b955b610aff610116895190565b861015610f6c57610b1361047f878a6103a3565b610b20601160f91b6104ad565b1480610f39575b155b610f2957610bd757610b7c600195610b5561047f610b4f610b498a610333565b84610380565b8b6103a3565b610b62601d60f91b6104ad565b1480610ba5575b610b72906108f4565b6104456003610333565b94610ba086610b9d610b978c610b926002610333565b61086c565b8a61087f565b52565b610af4565b50610b72610bc261047f610a6e610bbc6002610333565b85610380565b610bcf601160f91b6104ad565b149050610b69565b93610c42600198610bf661047f610b4f610bf08d610333565b86610380565b610c03600b60fa1b6104ad565b1480610f02575b8015610ea9575b610c1a90610814565b610a8d83610b9d610c3c8d610445610c3687610b926002610333565b91610333565b8b61087f565b610c5b61047f610c55610bbc849c610333565b8a6103a3565b610c68600b60fa1b6104ad565b03610c8f5790610b72610c8892610c816103d2866107c9565b1415610899565b9382610af4565b50610ca7915061044560039897969598949394610333565b905b610d9d575b50610cb8846109f5565b94610cc282610333565b855b811015610d95576002610cf182610b92610ceb610ce7610b9784610b9288610333565b5190565b93610333565b610d0c610ce7610d0660019361044585610333565b8861087f565b91610d1a6105b7828561036a565b9281835b610d57575b50505050610cc491610d35610d509290565b610d3f828b61087f565b52610d4a818a61087f565b50610356565b9050610cc2565b8982821015610d8f5781610d7261047f8794610d89946103a3565b6105f4610d7f878461036a565b918c1a91896103a3565b90610d1e565b50610d23565b509350505050565b91949093610da9610972565b94610db381610333565b610dbe610116885190565b811015610e035780610a8d88610df86104ad6104a061047f86610df261047f8f8f610dfe9c610dec91610380565b906103a3565b956103a3565b1461097a565b610db3565b509392610445610e1592969793975190565b9384610e33600296610b9d610e2d85610b928b610333565b8661087f565b610e3e610116855190565b811080610e87575b15610e5957610e5490610356565b610e33565b610a8d90610b9d610e2d610e7685610b92610e8098999a9b610333565b6104456001610333565b9238610cae565b50610e9561047f82866103a3565b610ea2601160f91b6104ad565b1415610e46565b50610ebc61047f610b4f610bf08d610333565b610ec9607d60f81b6104ad565b148015610c115750610c1a610eed61047f610a6e610ee76002610333565b87610380565b610efa600b60fa1b6104ad565b149050610c11565b50610f1661047f610b4f610bf06002610333565b610f23601160f91b6104ad565b14610c0a565b94610f3390610356565b94610af4565b50610b29610f5661047f610b4f610f506001610333565b8a61036a565b610f63601760fa1b6104ad565b14159050610b27565b509695949391929050610ca9565b610af2610aed610ae884610ae3600261068a56fea2646970667358221220df8afdb50247b87e32995ce364cdd9d06fd8e2da0fc4e9ccb71b755e2d49a76864736f6c63430008120033", + "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c80633755667e146100425780634be6d4f81461003d57634da485c6036100f65761030c565b6102e9565b6101ca565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761007f57604052565b610047565b9061009861009160405190565b928361005d565b565b67ffffffffffffffff811161007f57602090601f01601f19160190565b0190565b90826000939282370152565b909291926100dc6100d78261009a565b610084565b938185526020850190828401116100f657610098926100bb565b600080fd5b9080601f830112156100f657816020610116933591016100c7565b90565b9190916040818403126100f657803567ffffffffffffffff81116100f657836101439183016100fb565b92602082013567ffffffffffffffff81116100f65761011692016100fb565b60005b8381106101755750506000910152565b8181015183820152602001610165565b6101a66101af6020936100b79361019a815190565b80835293849260200190565b95869101610162565b601f01601f191690565b602080825261011692910190610185565b6101ed6101e16101db366004610119565b9061054f565b604051918291826101b9565b0390f35b60ff81165b036100f657565b90503590610098826101f1565b8015156101f6565b905035906100988261020a565b90916060828403126100f657813567ffffffffffffffff81116100f65761024b846101169285016100fb565b9361025981602086016101fd565b93604001610212565b9061011691610185565b90610282610278835190565b8083529160200190565b90816102946020830284019460200190565b926000915b8383106102a857505050505090565b909192939460206102cb6102c483856001950387528951610262565b9760200190565b9301930191939290610299565b60208082526101169291019061026c565b6101ed6103006102fa36600461021f565b91610a12565b604051918291826102d8565b6101ed61032361031d366004610119565b906103bf565b6040519182918290815260200190565b6101166101166101169290565b634e487b7160e01b600052601160045260246000fd5b60001981146103655760010190565b610340565b9190610375565b9290565b820391821161036557565b9190820180921161036557565b634e487b7160e01b600052603260045260246000fd5b906103ac825190565b8110156103ba570160200190565b61038d565b6103d26103d6916103ce600090565b5090565b9190565b81516103e66103d2610116845190565b106104fb576000916103f783610333565b61040d610116610405845190565b85519061036a565b81116104f4576001808061042087610333565b905b61044b575b505061043b5761043690610356565b6103f7565b9151610116935090505b90610380565b61045c610116879894969395985190565b8110806104ed575b156104e25761048d61047f610479838a610380565b846103a3565b516001600160f81b03191690565b6104bb6104ad6104a061047f858b6103a3565b6001600160f81b03191690565b916001600160f81b03191690565b036104d4576104c990610356565b839194929693610422565b509250809491503880610427565b819492969350610427565b5084610464565b5050501990565b505060001990565b906105106100d78361009a565b918252565b6101166000610503565b610116610515565b369037565b9061009861054261053c84610503565b9361009a565b601f190160208401610527565b919061037161056791610560606090565b50846103bf565b90610573610116835190565b831461067f57825b610586610116845190565b811080610619575b156105a15761059c90610356565b61057b565b918383111561060d576105bc6105b7858561036a565b61052c565b91845b845b811015610601576105fa816105dc61047f6105c194876103a3565b6105f46105e98a8461036a565b9160001a91886103a3565b53610356565b90506105bf565b50935050610116915090565b5091505061011661051f565b5061062761047f82856103a3565b610634601160f91b6104ad565b1480610646575b1561058e565b61058e565b5061064161066961047f61066361065d6001610333565b8561036a565b866103a3565b610676601760fa1b6104ad565b1415905061063b565b91505061011661051f565b6106976101166101169290565b60ff1690565b156106a457565b60405162461bcd60e51b815260206004820152602160248201527f4d61782076616c756573206d7573742062652067726561746572207468616e206044820152600360fc1b6064820152608490fd5b6106fd6019610503565b7f7b22657874726163746564506172616d6574657273223a7b2200000000000000602082015290565b6101166106f3565b1561073557565b60405162461bcd60e51b815260206004820152603060248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642065787460448201526f726163746564506172616d657465727360801b6064820152608490fd5b6107a29060ff165b9160ff1690565b029060ff821691820361036557565b6107bd9060ff1661079b565b019060ff821161036557565b6101166101166101169260ff1690565b67ffffffffffffffff811161007f5760208091020190565b906105106100d7836107d9565b9061009861054261080e846107f1565b936107d9565b1561081b57565b60405162461bcd60e51b815260206004820152602360248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642064617460448201526230901960e91b6064820152608490fd5b8181029291811591840414171561036557565b90610888825190565b8110156103ba576020809102010190565b156108a057565b60405162461bcd60e51b815260206004820152602660248201527f45787472616374696f6e206661696c65642e204578636565646564206d61782060448201526576616c75657360d01b6064820152608490fd5b156108fb57565b60405162461bcd60e51b815260206004820152602360248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642064617460448201526261203160e81b6064820152608490fd5b6109566010610503565b6f11383937bb34b232b92430b9b4111d1160811b602082015290565b61011661094c565b1561098157565b60405162461bcd60e51b815260206004820152602960248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642070726f6044820152680ecd2c8cae490c2e6d60bb1b6064820152608490fd5b60005b8281106109e757505050565b6060828201526020016109db565b90610098610a0561080e846107f1565b601f1901602084016109d8565b90610a2f600092610116610a258561068a565b60ff85161161069d565b93610a3983610333565b91610a42610726565b93835b610a50610116875190565b811015610a975780610a8d610a7461047f610a6e610a92958a610380565b8c6103a3565b610a876104ad6104a061047f868d6103a3565b1461072e565b610356565b610a45565b5092610445610aa99295979693975190565b918093610ab582610333565b968315610f7a57610af2610aed610ae86002610ae3610add610ad7600161068a565b886107b1565b9161068a565b610793565b6107c9565b6107fe565b955b610aff610116895190565b861015610f6c57610b1361047f878a6103a3565b610b20601160f91b6104ad565b1480610f39575b155b610f2957610bd757610b7c600195610b5561047f610b4f610b498a610333565b84610380565b8b6103a3565b610b62601d60f91b6104ad565b1480610ba5575b610b72906108f4565b6104456003610333565b94610ba086610b9d610b978c610b926002610333565b61086c565b8a61087f565b52565b610af4565b50610b72610bc261047f610a6e610bbc6002610333565b85610380565b610bcf601160f91b6104ad565b149050610b69565b93610c42600198610bf661047f610b4f610bf08d610333565b86610380565b610c03600b60fa1b6104ad565b1480610f02575b8015610ea9575b610c1a90610814565b610a8d83610b9d610c3c8d610445610c3687610b926002610333565b91610333565b8b61087f565b610c5b61047f610c55610bbc849c610333565b8a6103a3565b610c68600b60fa1b6104ad565b03610c8f5790610b72610c8892610c816103d2866107c9565b1415610899565b9382610af4565b50610ca7915061044560039897969598949394610333565b905b610d9d575b50610cb8846109f5565b94610cc282610333565b855b811015610d95576002610cf182610b92610ceb610ce7610b9784610b9288610333565b5190565b93610333565b610d0c610ce7610d0660019361044585610333565b8861087f565b91610d1a6105b7828561036a565b9281835b610d57575b50505050610cc491610d35610d509290565b610d3f828b61087f565b52610d4a818a61087f565b50610356565b9050610cc2565b8982821015610d8f5781610d7261047f8794610d89946103a3565b6105f4610d7f878461036a565b918c1a91896103a3565b90610d1e565b50610d23565b509350505050565b91949093610da9610972565b94610db381610333565b610dbe610116885190565b811015610e035780610a8d88610df86104ad6104a061047f86610df261047f8f8f610dfe9c610dec91610380565b906103a3565b956103a3565b1461097a565b610db3565b509392610445610e1592969793975190565b9384610e33600296610b9d610e2d85610b928b610333565b8661087f565b610e3e610116855190565b811080610e87575b15610e5957610e5490610356565b610e33565b610a8d90610b9d610e2d610e7685610b92610e8098999a9b610333565b6104456001610333565b9238610cae565b50610e9561047f82866103a3565b610ea2601160f91b6104ad565b1415610e46565b50610ebc61047f610b4f610bf08d610333565b610ec9607d60f81b6104ad565b148015610c115750610c1a610eed61047f610a6e610ee76002610333565b87610380565b610efa600b60fa1b6104ad565b149050610c11565b50610f1661047f610b4f610bf06002610333565b610f23601160f91b6104ad565b14610c0a565b94610f3390610356565b94610af4565b50610b29610f5661047f610b4f610f506001610333565b8a61036a565b610f63601760fa1b6104ad565b14159050610b27565b509695949391929050610ca9565b610af2610aed610ae884610ae3600261068a56fea2646970667358221220df8afdb50247b87e32995ce364cdd9d06fd8e2da0fc4e9ccb71b755e2d49a76864736f6c63430008120033", + "devdoc": { + "kind": "dev", + "methods": { + "extractAllFromContext(string,uint8,bool)": { + "params": { + "data": "Context string from which target value needs to be extracted", + "extractProviderHash": "Extracts and returns providerHash if true", + "maxValues": "Maximum number of values to be extracted from extractedParameters" + } + }, + "extractFieldFromContext(string,string)": { + "params": { + "data": "Context string from which target value needs to be extracted", + "prefix": "Prefix of the target value that needs to be extracted " + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "extractAllFromContext(string,uint8,bool)": { + "notice": "Extracts ALL values from context in a single pass. Context is stored as serialized JSON string with two keys: extractedParameters and providerHash. ExtractedParameters itself is a JSON string with key-value pairs. This function returns extracted individual values from extractedParameters along with providerHash (if extractProviderHash is true). Use maxValues to limit the number of expected values to be extracted from extractedParameters. In most cases, one would need to extract all values from extractedParameters and providerHash, hence use this function over calling extractFieldFromContext multiple times. " + }, + "extractFieldFromContext(string,string)": { + "notice": "Extracts given target field value from context in claims. Extracts only ONE value. Pass prefix formatted with quotes, for example '\"providerHash\\\":\\\"' Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code" + }, + "findSubstringEndIndex(string,string)": { + "notice": "Find the end index of target string in the data string. Returns the end index + 1 if the target string in the data string if found. Returns type(uint256).max if: - Target is longer than data - Target is not found Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code" + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} \ No newline at end of file diff --git a/contracts-domain/deployments/base/DomainExchange.json b/contracts-domain/deployments/base/DomainExchange.json new file mode 100644 index 000000000..ce17ebb5d --- /dev/null +++ b/contracts-domain/deployments/base/DomainExchange.json @@ -0,0 +1,2306 @@ +{ + "address": "0x054be4cFB6e951A7dE921A179FA323c5ea3fCf47", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "_feeRecipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_bidSettlementPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_bidRefundPeriod", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_allowedAddresses", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "allowedAddress", + "type": "address" + } + ], + "name": "AddressAddedToAllowlist", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "allowedAddress", + "type": "address" + } + ], + "name": "AddressRemovedFromAllowlist", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "AllowlistDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "AllowlistEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "BidCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newPrice", + "type": "uint256" + } + ], + "name": "BidPriceIncreased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newBidRefundPeriod", + "type": "uint256" + } + ], + "name": "BidRefundPeriodUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newBidSettlementPeriod", + "type": "uint256" + } + ], + "name": "BidSettlementPeriodUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BidWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newFeeRecipient", + "type": "address" + } + ], + "name": "FeeRecipientUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newFee", + "type": "uint256" + } + ], + "name": "FeeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "instantAccept", + "type": "bool" + } + ], + "name": "InstantAcceptUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "dkimKeyHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "askPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minBidPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "saleEthRecipient", + "type": "address" + } + ], + "name": "ListingCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "seller", + "type": "address" + } + ], + "name": "ListingDeleted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "name": "ListingDeletedByRegistry", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newAskPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "saleEthRecipient", + "type": "address" + } + ], + "name": "ListingUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IKeyHashAdapterV2", + "name": "newMailServerKeyHashAdapter", + "type": "address" + } + ], + "name": "MailServerKeyHashAdapterUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + } + ], + "name": "RefundInitiated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "priceNetFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "fees", + "type": "uint256" + } + ], + "name": "SaleFinalized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract ITransferDomainProcessor", + "name": "newTransferDomainProcessor", + "type": "address" + } + ], + "name": "TransferDomainProcessorUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_allowedAddresses", + "type": "address[]" + } + ], + "name": "addAddressesToAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "allowedAddresses", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bidCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bidRefundPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bidSettlementPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "bids", + "outputs": [ + { + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "encryptedBuyerId", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "buyerIdHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiryTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "refundInitiated", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_bidId", + "type": "uint256" + } + ], + "name": "buyerReleaseFunds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_listingId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "_buyerIdHash", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "_encryptedBuyerId", + "type": "string" + } + ], + "name": "createBid", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_askPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_minBidPrice", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "_saleEthRecipient", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_encryptionKey", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "_dkimKeyHash", + "type": "bytes32" + } + ], + "name": "createListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_listingId", + "type": "uint256" + } + ], + "name": "deleteListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableInstantAccept", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableInstantAccept", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "fee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "feeRecipient", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + }, + { + "internalType": "uint256[10]", + "name": "signals", + "type": "uint256[10]" + } + ], + "internalType": "struct ITransferDomainProcessor.TransferProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "finalizeSale", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getAllowedSellers", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_listingIds", + "type": "uint256[]" + } + ], + "name": "getListingBids", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "encryptedBuyerId", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "buyerIdHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiryTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "refundInitiated", + "type": "bool" + } + ], + "internalType": "struct DomainExchange.Bid", + "name": "bid", + "type": "tuple" + }, + { + "internalType": "bool", + "name": "buyerInstantAcceptEnabled", + "type": "bool" + } + ], + "internalType": "struct DomainExchange.BidDetailsWithId[][]", + "name": "bidInfo", + "type": "tuple[][]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_listingIds", + "type": "uint256[]" + } + ], + "name": "getListings", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "internalType": "address payable", + "name": "saleEthRecipient", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "dkimKeyHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "encryptionKey", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "askPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minBidPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "bids", + "type": "uint256[]" + } + ], + "internalType": "struct DomainExchange.Listing", + "name": "listing", + "type": "tuple" + } + ], + "internalType": "struct DomainExchange.ListingWithId[]", + "name": "listingInfo", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getUserBids", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "encryptedBuyerId", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "buyerIdHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiryTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "refundInitiated", + "type": "bool" + } + ], + "internalType": "struct DomainExchange.Bid", + "name": "bid", + "type": "tuple" + }, + { + "internalType": "bool", + "name": "buyerInstantAcceptEnabled", + "type": "bool" + } + ], + "internalType": "struct DomainExchange.BidDetailsWithId[]", + "name": "bidInfo", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getUserListings", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "internalType": "address payable", + "name": "saleEthRecipient", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "dkimKeyHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "encryptionKey", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "askPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minBidPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "bids", + "type": "uint256[]" + } + ], + "internalType": "struct DomainExchange.Listing", + "name": "listing", + "type": "tuple" + } + ], + "internalType": "struct DomainExchange.ListingWithId[]", + "name": "listingInfo", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_bidId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_newPrice", + "type": "uint256" + } + ], + "name": "increaseBidPrice", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransferDomainProcessor", + "name": "_transferDomainProcessor", + "type": "address" + }, + { + "internalType": "contract IVerifiedDomainRegistry", + "name": "_verifiedDomainRegistry", + "type": "address" + }, + { + "internalType": "contract IKeyHashAdapterV2", + "name": "_mailServerKeyHashAdapter", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_bidId", + "type": "uint256" + } + ], + "name": "initiateRefund", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "instantAcceptEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isAllowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isInitialized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "listingCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "listings", + "outputs": [ + { + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "internalType": "address payable", + "name": "saleEthRecipient", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "dkimKeyHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "encryptionKey", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "askPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minBidPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mailServerKeyHashAdapter", + "outputs": [ + { + "internalType": "contract IKeyHashAdapterV2", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pauseMarketplace", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_listingId", + "type": "uint256" + } + ], + "name": "registryRemoveListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_disallowedAddresses", + "type": "address[]" + } + ], + "name": "removeAddressesFromAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "transferDomainProcessor", + "outputs": [ + { + "internalType": "contract ITransferDomainProcessor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpauseMarketplace", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_newBidRefundPeriod", + "type": "uint256" + } + ], + "name": "updateBidRefundPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_newBidSettlementPeriod", + "type": "uint256" + } + ], + "name": "updateBidSettlementPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_newFee", + "type": "uint256" + } + ], + "name": "updateFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_newFeeRecipient", + "type": "address" + } + ], + "name": "updateFeeRecipient", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_listingId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_newAskPrice", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "_saleEthRecipient", + "type": "address" + } + ], + "name": "updateListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IKeyHashAdapterV2", + "name": "_mailServerKeyHashAdapter", + "type": "address" + } + ], + "name": "updateMailServerKeyHashAdapter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransferDomainProcessor", + "name": "_transferDomainProcessor", + "type": "address" + } + ], + "name": "updateTransferDomainProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "userBids", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "userListings", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "verifiedDomainRegistry", + "outputs": [ + { + "internalType": "contract IVerifiedDomainRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_bidId", + "type": "uint256" + } + ], + "name": "withdrawBid", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xc81076859575e189614ebfe3a69229523356c7b0de46c59cd74c7d6c63ad0fd4", + "receipt": { + "to": null, + "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", + "contractAddress": "0x054be4cFB6e951A7dE921A179FA323c5ea3fCf47", + "transactionIndex": 144, + "gasUsed": "4978167", + "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000100000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xa9e2be9efee8352b0f759e7d03862e742f88456b8fa423de05282825378584d1", + "transactionHash": "0xc81076859575e189614ebfe3a69229523356c7b0de46c59cd74c7d6c63ad0fd4", + "logs": [ + { + "transactionIndex": 144, + "blockNumber": 20166816, + "transactionHash": "0xc81076859575e189614ebfe3a69229523356c7b0de46c59cd74c7d6c63ad0fd4", + "address": "0x054be4cFB6e951A7dE921A179FA323c5ea3fCf47", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" + ], + "data": "0x", + "logIndex": 467, + "blockHash": "0xa9e2be9efee8352b0f759e7d03862e742f88456b8fa423de05282825378584d1" + }, + { + "transactionIndex": 144, + "blockNumber": 20166816, + "transactionHash": "0xc81076859575e189614ebfe3a69229523356c7b0de46c59cd74c7d6c63ad0fd4", + "address": "0x054be4cFB6e951A7dE921A179FA323c5ea3fCf47", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929", + "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" + ], + "data": "0x", + "logIndex": 468, + "blockHash": "0xa9e2be9efee8352b0f759e7d03862e742f88456b8fa423de05282825378584d1" + } + ], + "blockNumber": 20166816, + "cumulativeGasUsed": "29046575", + "status": 1, + "byzantium": true + }, + "args": [ + "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", + "25000000000000000", + "0x0bC26FF515411396DD588Abd6Ef6846E04470227", + "1800", + "1800", + [] + ], + "numDeployments": 1, + "solcInputHash": "d865a6f49eab8c58036d78b72f5cb448", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fee\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"_feeRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_bidSettlementPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_bidRefundPeriod\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_allowedAddresses\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allowedAddress\",\"type\":\"address\"}],\"name\":\"AddressAddedToAllowlist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allowedAddress\",\"type\":\"address\"}],\"name\":\"AddressRemovedFromAllowlist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"AllowlistDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"AllowlistEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"BidCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPrice\",\"type\":\"uint256\"}],\"name\":\"BidPriceIncreased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBidRefundPeriod\",\"type\":\"uint256\"}],\"name\":\"BidRefundPeriodUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBidSettlementPeriod\",\"type\":\"uint256\"}],\"name\":\"BidSettlementPeriodUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BidWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newFeeRecipient\",\"type\":\"address\"}],\"name\":\"FeeRecipientUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newFee\",\"type\":\"uint256\"}],\"name\":\"FeeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"instantAccept\",\"type\":\"bool\"}],\"name\":\"InstantAcceptUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"dkimKeyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"askPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minBidPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"saleEthRecipient\",\"type\":\"address\"}],\"name\":\"ListingCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"}],\"name\":\"ListingDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"}],\"name\":\"ListingDeletedByRegistry\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newAskPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"saleEthRecipient\",\"type\":\"address\"}],\"name\":\"ListingUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"newMailServerKeyHashAdapter\",\"type\":\"address\"}],\"name\":\"MailServerKeyHashAdapterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"}],\"name\":\"RefundInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"priceNetFees\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"SaleFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract ITransferDomainProcessor\",\"name\":\"newTransferDomainProcessor\",\"type\":\"address\"}],\"name\":\"TransferDomainProcessorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_allowedAddresses\",\"type\":\"address[]\"}],\"name\":\"addAddressesToAllowlist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"allowedAddresses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bidCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bidRefundPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bidSettlementPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"bids\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"encryptedBuyerId\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"buyerIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiryTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"refundInitiated\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bidId\",\"type\":\"uint256\"}],\"name\":\"buyerReleaseFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listingId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_buyerIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"_encryptedBuyerId\",\"type\":\"string\"}],\"name\":\"createBid\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_domainId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_askPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minBidPrice\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"_saleEthRecipient\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_encryptionKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_dkimKeyHash\",\"type\":\"bytes32\"}],\"name\":\"createListing\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listingId\",\"type\":\"uint256\"}],\"name\":\"deleteListing\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableAllowlist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableInstantAccept\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enableAllowlist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enableInstantAccept\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeRecipient\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"a\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"b\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"c\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[10]\",\"name\":\"signals\",\"type\":\"uint256[10]\"}],\"internalType\":\"struct ITransferDomainProcessor.TransferProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"finalizeSale\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowedSellers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_listingIds\",\"type\":\"uint256[]\"}],\"name\":\"getListingBids\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"encryptedBuyerId\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"buyerIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiryTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"refundInitiated\",\"type\":\"bool\"}],\"internalType\":\"struct DomainExchange.Bid\",\"name\":\"bid\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"buyerInstantAcceptEnabled\",\"type\":\"bool\"}],\"internalType\":\"struct DomainExchange.BidDetailsWithId[][]\",\"name\":\"bidInfo\",\"type\":\"tuple[][]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_listingIds\",\"type\":\"uint256[]\"}],\"name\":\"getListings\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"saleEthRecipient\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"dkimKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"encryptionKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"askPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minBidPrice\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256[]\",\"name\":\"bids\",\"type\":\"uint256[]\"}],\"internalType\":\"struct DomainExchange.Listing\",\"name\":\"listing\",\"type\":\"tuple\"}],\"internalType\":\"struct DomainExchange.ListingWithId[]\",\"name\":\"listingInfo\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getUserBids\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"encryptedBuyerId\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"buyerIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiryTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"refundInitiated\",\"type\":\"bool\"}],\"internalType\":\"struct DomainExchange.Bid\",\"name\":\"bid\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"buyerInstantAcceptEnabled\",\"type\":\"bool\"}],\"internalType\":\"struct DomainExchange.BidDetailsWithId[]\",\"name\":\"bidInfo\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getUserListings\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"saleEthRecipient\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"dkimKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"encryptionKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"askPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minBidPrice\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256[]\",\"name\":\"bids\",\"type\":\"uint256[]\"}],\"internalType\":\"struct DomainExchange.Listing\",\"name\":\"listing\",\"type\":\"tuple\"}],\"internalType\":\"struct DomainExchange.ListingWithId[]\",\"name\":\"listingInfo\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bidId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_newPrice\",\"type\":\"uint256\"}],\"name\":\"increaseBidPrice\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ITransferDomainProcessor\",\"name\":\"_transferDomainProcessor\",\"type\":\"address\"},{\"internalType\":\"contract IVerifiedDomainRegistry\",\"name\":\"_verifiedDomainRegistry\",\"type\":\"address\"},{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"_mailServerKeyHashAdapter\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bidId\",\"type\":\"uint256\"}],\"name\":\"initiateRefund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"instantAcceptEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isAllowed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"listingCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"listings\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"saleEthRecipient\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"dkimKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"encryptionKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"askPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minBidPrice\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mailServerKeyHashAdapter\",\"outputs\":[{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pauseMarketplace\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listingId\",\"type\":\"uint256\"}],\"name\":\"registryRemoveListing\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_disallowedAddresses\",\"type\":\"address[]\"}],\"name\":\"removeAddressesFromAllowlist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"transferDomainProcessor\",\"outputs\":[{\"internalType\":\"contract ITransferDomainProcessor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpauseMarketplace\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newBidRefundPeriod\",\"type\":\"uint256\"}],\"name\":\"updateBidRefundPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newBidSettlementPeriod\",\"type\":\"uint256\"}],\"name\":\"updateBidSettlementPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newFee\",\"type\":\"uint256\"}],\"name\":\"updateFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"_newFeeRecipient\",\"type\":\"address\"}],\"name\":\"updateFeeRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listingId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_newAskPrice\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"_saleEthRecipient\",\"type\":\"address\"}],\"name\":\"updateListing\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"_mailServerKeyHashAdapter\",\"type\":\"address\"}],\"name\":\"updateMailServerKeyHashAdapter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ITransferDomainProcessor\",\"name\":\"_transferDomainProcessor\",\"type\":\"address\"}],\"name\":\"updateTransferDomainProcessor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"userBids\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"userListings\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifiedDomainRegistry\",\"outputs\":[{\"internalType\":\"contract IVerifiedDomainRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bidId\",\"type\":\"uint256\"}],\"name\":\"withdrawBid\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"}},\"kind\":\"dev\",\"methods\":{\"addAddressesToAllowlist(address[])\":{\"params\":{\"_allowedAddresses\":\"List of addresses allowed to call allow listed functions\"}},\"buyerReleaseFunds(uint256)\":{\"params\":{\"_bidId\":\"The unique identifier of the bid to release funds for\"}},\"createBid(uint256,bytes32,string)\":{\"params\":{\"_buyerIdHash\":\"The hashed buyerId which is also output as part of the transfer proof later\",\"_encryptedBuyerId\":\"The encrypted buyerId. Should be the same as the buyerId hashed\",\"_listingId\":\"The unique identifier of the listing to bid on\"}},\"createListing(bytes32,uint256,uint256,address,bytes,bytes32)\":{\"params\":{\"_askPrice\":\"An asking price for the domain\",\"_dkimKeyHash\":\"The custom DKIM key hash. If empty, the managed DKIM key hash will be used\",\"_domainId\":\"The unique identifier of the domain\",\"_encryptionKey\":\"The encryption key for buyers to encrypt the buyerId to\",\"_minBidPrice\":\"The minimum bid price for the domain\",\"_saleEthRecipient\":\"The address to receive the ETH from the sale; must be a contract that can receive ETH or an EOA\"}},\"deleteListing(uint256)\":{\"params\":{\"_listingId\":\"The unique identifier of the listing to delete\"}},\"finalizeSale((uint256[2],uint256[2][2],uint256[2],uint256[10]))\":{\"params\":{\"_proof\":\"The zk-email proof of domain transfer\"}},\"getListingBids(uint256[])\":{\"params\":{\"_listingIds\":\"An array of listingIds to fetch bids for\"}},\"getListings(uint256[])\":{\"params\":{\"_listingIds\":\"An array of listingIds to fetch details for\"}},\"getUserBids(address)\":{\"params\":{\"_user\":\"The address of the user to fetch bids for\"}},\"getUserListings(address)\":{\"params\":{\"_user\":\"The address of the user to fetch listings for\"}},\"increaseBidPrice(uint256,uint256)\":{\"params\":{\"_bidId\":\"The unique identifier of the bid to increase the price for\",\"_newPrice\":\"The new price for the bid\"}},\"initialize(address,address,address)\":{\"params\":{\"_mailServerKeyHashAdapter\":\"The address of the mail server key hash adapter contract\",\"_transferDomainProcessor\":\"The address of the domain transfer processor contract\",\"_verifiedDomainRegistry\":\"The address of the verified domain registry contract\"}},\"initiateRefund(uint256)\":{\"params\":{\"_bidId\":\"The unique identifier of the bid to initiate refund for\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"registryRemoveListing(uint256)\":{\"params\":{\"_listingId\":\"Listing Id to remove\"}},\"removeAddressesFromAllowlist(address[])\":{\"params\":{\"_disallowedAddresses\":\"List of addresses being disallowed from calling allow listed functions\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateBidRefundPeriod(uint256)\":{\"params\":{\"_newBidRefundPeriod\":\"The new bid refund period in seconds\"}},\"updateBidSettlementPeriod(uint256)\":{\"params\":{\"_newBidSettlementPeriod\":\"The new bid settlement period in seconds\"}},\"updateFee(uint256)\":{\"params\":{\"_newFee\":\"The new fee percentage (in basis points)\"}},\"updateFeeRecipient(address)\":{\"params\":{\"_newFeeRecipient\":\"The new address to receive fees\"}},\"updateListing(uint256,uint256,address)\":{\"params\":{\"_listingId\":\"The unique identifier of the listing to update\",\"_newAskPrice\":\"The new asking price for the listing\",\"_saleEthRecipient\":\"The new address to receive the ETH from the sale; must be a contract that can receive ETH or an EOA\"}},\"updateMailServerKeyHashAdapter(address)\":{\"params\":{\"_mailServerKeyHashAdapter\":\"The new mail server key hash adapter\"}},\"updateTransferDomainProcessor(address)\":{\"params\":{\"_transferDomainProcessor\":\"The new transfer domain processor\"}},\"withdrawBid(uint256)\":{\"params\":{\"_bidId\":\"The unique identifier of the bid to withdraw\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addAddressesToAllowlist(address[])\":{\"notice\":\"Adds passed addresses to an allow list. Addresses on the allow list are able to call allow listed functions.\"},\"buyerReleaseFunds(uint256)\":{\"notice\":\"ONLY BUYER: Finalize a sale by releasing funds to the seller. Proof of transfer is not required because it is not in the buyer's interest to release funds unless they have received the domain. Note that the bid can be in ANY STATE when this function is called. Upon calling this function funds will be transferred to the seller and fees will be taken by the protocol. The listing and the bid will be deleted. The function will revert if: - The bid is not owned by the caller - The listing is not active (sold or withdrawn)\"},\"createBid(uint256,bytes32,string)\":{\"notice\":\"Creates a new bid for a listing. Transfers ETH from the buyer to the contract. Every buyer has a unique identifier, for Namecheap it's their username. The seller needs the raw buyerId to transfer the domain off-chain. To facilitate this, the buyer encrypts their buyerId using the seller's encryption key and sends it along with the bid. The seller then decrypts the buyerId using their private key to get the raw buyerId. DEV NOTE: We do not check that the encrypted buyerId is the same as the hashed buyerId. This must be done in the client! This does not affect the security of the protocol as the encrypted buyerId is only used for communication between the buyer and the seller while maintaining privacy.\"},\"createListing(bytes32,uint256,uint256,address,bytes,bytes32)\":{\"notice\":\"Creates listing for a domain. If ownership of domain changes offchain, the new owner will have to first register the domain on the domain registry contract. Then the new owner can create a listing for the domain. The old listing will be deleted from the old owner's listings and the old listing is marked as NOT active, which prevents any new bids from being created on it and makes the old bids immediately withdrawable. We also allow the seller to specify a custom DKIM key hash for Namecheap if they want to opt out of using the managed DKIM key hash set in the transferDomainProcessor contract. The managed DKIM key hash *can* be updated by us whenever Namecheap rotates their DKIM key. Function reverts if: - Caller is not domain owner on the domain registry contract - Ask price is less than min bid price - Sale ETH recipient is the zero address\"},\"deleteListing(uint256)\":{\"notice\":\"ONLY SELLER: Marks a listing as NOT active. Removes the listing from the seller's listings array and domain listing. If the listing has no bids, it is deleted from the exchange. Bids against the listing are left as is to allow the buyer to withdraw the bid.\"},\"disableAllowlist()\":{\"notice\":\"Disable the allow list. When the allow list is disabled, any address is allowed to call functions with onlyAllowed modifier.\"},\"disableInstantAccept()\":{\"notice\":\"Disables the instant accept flag for the buyer.\"},\"enableAllowlist()\":{\"notice\":\"Enable the allow list. When the allow list is enabled, only approved addresses are allowed to functions with onlyAllowed modifier.\"},\"enableInstantAccept()\":{\"notice\":\"Enables the instant accept flag for the buyer. This flag is used to indicate if the buyer has configured their Namecheap account to accept ownership of domains immediately upon transfer. DEV NOTE: We can not check that the buyer has actually enabled instant accept on Namecheap. It is only an indicative flag to help the seller know if they can finalize the sale immediately or not. The seller may get tricked by a malicious buyer to initiate a transfer to them assuming instant accept is on. But if the buyer does not have instant accept enabled, the seller will get immediate feedback and they can cancel the transfer immediately.\"},\"finalizeSale((uint256[2],uint256[2][2],uint256[2],uint256[10]))\":{\"notice\":\"ONLY SELLER: Finalizes a sale by verifying the domain transfer and unlocking bid funds to the listing owner. The seller can also finalize the sale with bids that have initiated a refund including the ones that have expired based on timestamp but not withdrawn yet.\"},\"getAllowedSellers()\":{\"notice\":\"Get all allowed sellers\"},\"getListingBids(uint256[])\":{\"notice\":\"Returns the bids for given listingIds\"},\"getListings(uint256[])\":{\"notice\":\"Get listing information with listingId for a list of listingIds\"},\"getUserBids(address)\":{\"notice\":\"Returns the bids created by a user\"},\"getUserListings(address)\":{\"notice\":\"Returns all listings created by a user\"},\"increaseBidPrice(uint256,uint256)\":{\"notice\":\"ONLY BUYER: Increases the price of an existing bid. The new price can ONLY be higher than the old price. The buyer must send the additional amount of ETH. The function reverts if - bid has initiated refund, caller is not bid owner or listing is not active - the new price is less than old price - msg.value is NOT STRICTLY EQUAL to than new price - old price\"},\"initialize(address,address,address)\":{\"notice\":\"Initializes the contract with domain verification and transfer processors. Can only be called once by the contract owner \"},\"initiateRefund(uint256)\":{\"notice\":\"ONLY BUYER: Initiates the refund process for a bid. Can only be called by the bid owner after the initial bid expiry period has passed.\"},\"pauseMarketplace()\":{\"notice\":\"ONLY OWNER: Pauses listing and proof submission functionality for the marketplace. Functionalites that are paused: - Listing creation and update - Bid creation and update - Sale finalization Functinonalites that remain unpaused to allow users to retrieve funds in contract: - Bid refund initiation and withdrawal - Listing deletion - Manual settlement between buyer and seller\"},\"registryRemoveListing(uint256)\":{\"notice\":\"ONLY EXCHANGE: Remove a listing for domain when ownership changes on the registry. \"},\"removeAddressesFromAllowlist(address[])\":{\"notice\":\"Removes passed addresses from an allow list. Addresses not on the allow list are unable to call allow listed functions.\"},\"unpauseMarketplace()\":{\"notice\":\"ONLY OWNER: Restarts paused functionality for the marketplace.\"},\"updateBidRefundPeriod(uint256)\":{\"notice\":\"ONLY OWNER: Updates the bid refund period\"},\"updateBidSettlementPeriod(uint256)\":{\"notice\":\"ONLY OWNER: Updates the minimum bid active period\"},\"updateFee(uint256)\":{\"notice\":\"ONLY OWNER: Updates the fee percentage for the marketplace\"},\"updateFeeRecipient(address)\":{\"notice\":\"ONLY OWNER: Updates the fee recipient address\"},\"updateListing(uint256,uint256,address)\":{\"notice\":\"ONLY SELLER: Updates the asking price of an existing listing. We don't update the existing bids against the listing because the newAskPrice is an indicative value. The new ask price must be greater than or equal to the existing min bid price. If seller wants to update the min bid price, they should delete the listing and create a new one with the new min bid price.\"},\"updateMailServerKeyHashAdapter(address)\":{\"notice\":\"ONLY OWNER: Update the managed mail server key hash adapter\"},\"updateTransferDomainProcessor(address)\":{\"notice\":\"ONLY OWNER: Update the transfer domain processor\"},\"withdrawBid(uint256)\":{\"notice\":\"ONLY BUYER: Withdraws a bid after the refund period has ended. Transfers ETH back to the buyer.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/DomainExchange.sol\":\"DomainExchange\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/security/Pausable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract Pausable is Context {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n constructor() {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n _requireNotPaused();\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n _requirePaused();\\n _;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Throws if the contract is paused.\\n */\\n function _requireNotPaused() internal view virtual {\\n require(!paused(), \\\"Pausable: paused\\\");\\n }\\n\\n /**\\n * @dev Throws if the contract is not paused.\\n */\\n function _requirePaused() internal view virtual {\\n require(paused(), \\\"Pausable: not paused\\\");\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n}\\n\",\"keccak256\":\"0x0849d93b16c9940beb286a7864ed02724b248b93e0d80ef6355af5ef15c64773\",\"license\":\"MIT\"},\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n * `nonReentrant` function in the call stack.\\n */\\n function _reentrancyGuardEntered() internal view returns (bool) {\\n return _status == _ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0xa535a5df777d44e945dd24aa43a11e44b024140fc340ad0dfe42acf4002aade1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\")\\n mstore(0x1c, hash)\\n message := keccak256(0x00, 0x3c)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40)\\n mstore(ptr, \\\"\\\\x19\\\\x01\\\")\\n mstore(add(ptr, 0x02), domainSeparator)\\n mstore(add(ptr, 0x22), structHash)\\n data := keccak256(ptr, 0x42)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\\n * `validator` and `data` according to the version 0 of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x00\\\", validator, data));\\n }\\n}\\n\",\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"./StringUtils.sol\\\";\\n\\n/**\\n * Library to assist with requesting,\\n * serialising & verifying credentials\\n */\\nlibrary Claims {\\n\\t/** Data required to describe a claim */\\n\\tstruct CompleteClaimData {\\n\\t\\tbytes32 identifier;\\n\\t\\taddress owner;\\n\\t\\tuint32 timestampS;\\n\\t\\tuint32 epoch;\\n\\t}\\n\\n\\tstruct ClaimInfo {\\n\\t\\tstring provider;\\n\\t\\tstring parameters;\\n\\t\\tstring context;\\n\\t}\\n\\n\\t/** Claim with signatures & signer */\\n\\tstruct SignedClaim {\\n\\t\\tCompleteClaimData claim;\\n\\t\\tbytes[] signatures;\\n\\t}\\n\\n\\t/**\\n\\t * Asserts that the claim is signed by the expected witnesses\\n\\t */\\n\\tfunction assertValidSignedClaim(\\n\\t\\tSignedClaim memory self,\\n\\t\\taddress[] memory expectedWitnessAddresses\\n\\t) internal pure {\\n\\t\\trequire(self.signatures.length > 0, \\\"No signatures\\\");\\n\\t\\taddress[] memory signedWitnesses = recoverSignersOfSignedClaim(self);\\n\\t\\tfor (uint256 i = 0; i < expectedWitnessAddresses.length; i++) {\\n\\t\\t\\tbool found = false;\\n\\t\\t\\tfor (uint256 j = 0; j < signedWitnesses.length; j++) {\\n\\t\\t\\t\\tif (signedWitnesses[j] == expectedWitnessAddresses[i]) {\\n\\t\\t\\t\\t\\tfound = true;\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\trequire(found, \\\"Missing witness signature\\\");\\n\\t\\t}\\n\\t}\\n\\n\\t/**\\n\\t * @dev recovers the signer of the claim\\n\\t */\\n\\tfunction recoverSignersOfSignedClaim(\\n\\t\\tSignedClaim memory self\\n\\t) internal pure returns (address[] memory) {\\n\\t\\tbytes memory serialised = serialise(self.claim);\\n\\t\\taddress[] memory signers = new address[](self.signatures.length);\\n\\t\\tfor (uint256 i = 0; i < self.signatures.length; i++) {\\n\\t\\t\\tsigners[i] = verifySignature(serialised, self.signatures[i]);\\n\\t\\t}\\n\\n\\t\\treturn signers;\\n\\t}\\n\\n\\t/**\\n\\t * @dev serialises the credential into a string;\\n\\t * the string is used to verify the signature\\n\\t *\\n\\t * the serialisation is the same as done by the TS library\\n\\t */\\n\\tfunction serialise(\\n\\t\\tCompleteClaimData memory self\\n\\t) internal pure returns (bytes memory) {\\n\\t\\treturn\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\tStringUtils.bytes2str(abi.encodePacked(self.identifier)),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.address2str(self.owner),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.timestampS),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.epoch)\\n\\t\\t\\t);\\n\\t}\\n\\n\\t/**\\n\\t * @dev returns the address of the user that generated the signature\\n\\t */\\n\\tfunction verifySignature(\\n\\t\\tbytes memory content,\\n\\t\\tbytes memory signature\\n\\t) internal pure returns (address signer) {\\n\\t\\tbytes32 signedHash = keccak256(\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\t\\\"\\\\x19Ethereum Signed Message:\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(content.length),\\n\\t\\t\\t\\tcontent\\n\\t\\t\\t)\\n\\t\\t);\\n\\t\\treturn ECDSA.recover(signedHash, signature);\\n\\t}\\n\\n\\tfunction hashClaimInfo(ClaimInfo memory claimInfo) internal pure returns (bytes32) {\\n\\t\\tbytes memory serialised = abi.encodePacked(\\n\\t\\t\\tclaimInfo.provider,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.parameters,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.context\\n\\t\\t);\\n\\t\\treturn keccak256(serialised);\\n\\t}\\n}\\n\",\"keccak256\":\"0x87a41e75d358e86798456ad45e03446cde8f1519c8af17905f6c8b852a5f2da7\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/StringUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/**\\n * Utilities for string manipulation & conversion\\n */\\nlibrary StringUtils {\\n\\tfunction address2str(address x) internal pure returns (string memory) {\\n\\t\\tbytes memory s = new bytes(40);\\n\\t\\tfor (uint i = 0; i < 20; i++) {\\n\\t\\t\\tbytes1 b = bytes1(uint8(uint(uint160(x)) / (2 ** (8 * (19 - i)))));\\n\\t\\t\\tbytes1 hi = bytes1(uint8(b) / 16);\\n\\t\\t\\tbytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));\\n\\t\\t\\ts[2 * i] = getChar(hi);\\n\\t\\t\\ts[2 * i + 1] = getChar(lo);\\n\\t\\t}\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", s));\\n\\t}\\n\\n\\tfunction bytes2str(bytes memory buffer) internal pure returns (string memory) {\\n\\t\\t// Fixed buffer size for hexadecimal convertion\\n\\t\\tbytes memory converted = new bytes(buffer.length * 2);\\n\\t\\tbytes memory _base = \\\"0123456789abcdef\\\";\\n\\n\\t\\tfor (uint256 i = 0; i < buffer.length; i++) {\\n\\t\\t\\tconverted[i * 2] = _base[uint8(buffer[i]) / _base.length];\\n\\t\\t\\tconverted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length];\\n\\t\\t}\\n\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", converted));\\n\\t}\\n\\n\\tfunction getChar(bytes1 b) internal pure returns (bytes1 c) {\\n\\t\\tif (uint8(b) < 10) return bytes1(uint8(b) + 0x30);\\n\\t\\telse return bytes1(uint8(b) + 0x57);\\n\\t}\\n\\n\\tfunction bool2str(bool _b) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_b) {\\n\\t\\t\\treturn \\\"true\\\";\\n\\t\\t} else {\\n\\t\\t\\treturn \\\"false\\\";\\n\\t\\t}\\n\\t}\\n\\n\\tfunction uint2str(uint _i) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_i == 0) {\\n\\t\\t\\treturn \\\"0\\\";\\n\\t\\t}\\n\\t\\tuint j = _i;\\n\\t\\tuint len;\\n\\t\\twhile (j != 0) {\\n\\t\\t\\tlen++;\\n\\t\\t\\tj /= 10;\\n\\t\\t}\\n\\t\\tbytes memory bstr = new bytes(len);\\n\\t\\tuint k = len;\\n\\t\\twhile (_i != 0) {\\n\\t\\t\\tk = k - 1;\\n\\t\\t\\tuint8 temp = (48 + uint8(_i - (_i / 10) * 10));\\n\\t\\t\\tbytes1 b1 = bytes1(temp);\\n\\t\\t\\tbstr[k] = b1;\\n\\t\\t\\t_i /= 10;\\n\\t\\t}\\n\\t\\treturn string(bstr);\\n\\t}\\n\\n\\tfunction areEqual(\\n\\t\\tstring calldata _a,\\n\\t\\tstring storage _b\\n\\t) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction areEqual(string memory _a, string memory _b) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction toLower(string memory str) internal pure returns (string memory) {\\n\\t\\tbytes memory bStr = bytes(str);\\n\\t\\tbytes memory bLower = new bytes(bStr.length);\\n\\t\\tfor (uint i = 0; i < bStr.length; i++) {\\n\\t\\t\\t// Uppercase character...\\n\\t\\t\\tif ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {\\n\\t\\t\\t\\t// So we add 32 to make it lowercase\\n\\t\\t\\t\\tbLower[i] = bytes1(uint8(bStr[i]) + 32);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tbLower[i] = bStr[i];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn string(bLower);\\n\\t}\\n\\n\\tfunction substring(\\n\\t\\tstring memory str,\\n\\t\\tuint startIndex,\\n\\t\\tuint endIndex\\n\\t) internal pure returns (string memory) {\\n\\t\\tbytes memory strBytes = bytes(str);\\n\\t\\tbytes memory result = new bytes(endIndex - startIndex);\\n\\t\\tfor (uint i = startIndex; i < endIndex; i++) {\\n\\t\\t\\tresult[i - startIndex] = strBytes[i];\\n\\t\\t}\\n\\t\\treturn string(result);\\n\\t}\\n}\\n\",\"keccak256\":\"0x15feebafef16d4c74c043b39e652ddae0e121987ceca74b663f6a2d2d7ba8b4b\",\"license\":\"MIT\"},\"contracts/DomainExchange.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\nimport { Address } from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport { ReentrancyGuard } from \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\nimport { Pausable } from \\\"@openzeppelin/contracts/security/Pausable.sol\\\";\\n\\nimport { AddressAllowList } from \\\"./external/AddressAllowList.sol\\\";\\nimport { Bytes32ArrayUtils } from \\\"./external/lib/Bytes32ArrayUtils.sol\\\";\\nimport { Uint256ArrayUtils } from \\\"./external/lib/Uint256ArrayUtils.sol\\\";\\nimport { IKeyHashAdapterV2 } from \\\"./external/interfaces/IKeyHashAdapterV2.sol\\\";\\n\\nimport { IDomainExchange } from \\\"./interfaces/IDomainExchange.sol\\\";\\nimport { ITransferDomainProcessor } from \\\"./interfaces/ITransferDomainProcessor.sol\\\";\\nimport { IVerifiedDomainRegistry } from \\\"./interfaces/IVerifiedDomainRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract DomainExchange is IDomainExchange, AddressAllowList, ReentrancyGuard, Pausable {\\n\\n using Address for address payable;\\n using Bytes32ArrayUtils for bytes32[];\\n using Uint256ArrayUtils for uint256[];\\n\\n /* ============ Events ============ */\\n \\n event ListingCreated(\\n uint256 indexed listingId, \\n address indexed seller, \\n bytes32 indexed domainId, \\n bytes32 dkimKeyHash,\\n uint256 askPrice,\\n uint256 minBidPrice,\\n address saleEthRecipient\\n );\\n event ListingUpdated(uint256 indexed listingId, address indexed seller, uint256 newAskPrice, address saleEthRecipient);\\n event ListingDeleted(uint256 indexed listingId, address indexed seller);\\n event ListingDeletedByRegistry(uint256 indexed listingId);\\n \\n event BidCreated(uint256 indexed bidId, uint256 indexed listingId, address indexed buyer, uint256 price);\\n event BidPriceIncreased(uint256 indexed bidId, address indexed buyer, uint256 newPrice);\\n event RefundInitiated(uint256 indexed bidId, address indexed buyer);\\n event BidWithdrawn(uint256 indexed bidId, address indexed buyer, uint256 amount);\\n \\n event SaleFinalized(uint256 indexed bidId, uint256 indexed listingId, uint256 priceNetFees, uint256 fees);\\n \\n event InstantAcceptUpdated(address indexed buyer, bool instantAccept);\\n\\n event FeeUpdated(uint256 newFee);\\n event FeeRecipientUpdated(address indexed newFeeRecipient);\\n event BidSettlementPeriodUpdated(uint256 newBidSettlementPeriod);\\n event BidRefundPeriodUpdated(uint256 newBidRefundPeriod);\\n event TransferDomainProcessorUpdated(ITransferDomainProcessor indexed newTransferDomainProcessor);\\n event MailServerKeyHashAdapterUpdated(IKeyHashAdapterV2 indexed newMailServerKeyHashAdapter);\\n\\n /* ============ Structs ============ */\\n struct Listing {\\n address seller;\\n address payable saleEthRecipient; // Must be a contract that can receive ETH or an EOA\\n bytes32 dkimKeyHash; // Allow for custom DKIM key hash\\n bytes encryptionKey;\\n bytes32 domainId;\\n uint256 createdAt;\\n uint256 askPrice;\\n uint256 minBidPrice;\\n bool isActive; // false by default, set to true when the listing is created\\n uint256[] bids;\\n }\\n\\n struct ListingWithId {\\n uint256 listingId;\\n Listing listing;\\n }\\n\\n struct Bid {\\n address buyer;\\n uint256 listingId;\\n string encryptedBuyerId;\\n bytes32 buyerIdHash;\\n uint256 createdAt;\\n uint256 expiryTimestamp;\\n uint256 price;\\n bool refundInitiated;\\n }\\n\\n struct BidDetailsWithId {\\n uint256 bidId;\\n Bid bid;\\n bool buyerInstantAcceptEnabled;\\n }\\n\\n /* ============ Modifiers ============ */\\n modifier onlyInitialized() {\\n require(isInitialized, \\\"Contract must be initialized\\\");\\n _;\\n }\\n\\n /* ============ Public Variables ============ */\\n\\n mapping(uint256 => Listing) public listings;\\n mapping(address => uint256[]) public userListings;\\n mapping(uint256 => Bid) public bids;\\n mapping(address => uint256[]) public userBids;\\n mapping(address => bool) public instantAcceptEnabled;\\n\\n uint256 public fee;\\n address payable public feeRecipient;\\n uint256 public bidCounter;\\n uint256 public listingCounter;\\n uint256 public bidSettlementPeriod;\\n uint256 public bidRefundPeriod;\\n \\n bool public isInitialized;\\n \\n ITransferDomainProcessor public transferDomainProcessor;\\n IVerifiedDomainRegistry public verifiedDomainRegistry;\\n IKeyHashAdapterV2 public mailServerKeyHashAdapter;\\n\\n /* ============ Constants ============ */\\n uint256 internal constant PRECISE_UNIT = 1e18;\\n\\n /* ============ Constructor ============ */\\n\\n constructor(\\n address _owner,\\n uint256 _fee,\\n address payable _feeRecipient,\\n uint256 _bidSettlementPeriod,\\n uint256 _bidRefundPeriod,\\n address[] memory _allowedAddresses\\n ) AddressAllowList(_allowedAddresses) {\\n fee = _fee;\\n feeRecipient = _feeRecipient;\\n bidSettlementPeriod = _bidSettlementPeriod;\\n bidRefundPeriod = _bidRefundPeriod;\\n \\n bidCounter = 1;\\n listingCounter = 1;\\n isInitialized = false;\\n \\n transferOwnership(_owner);\\n }\\n\\n /* ============ Public Functions ============ */\\n\\n /**\\n * @notice Creates listing for a domain. If ownership of domain changes offchain, the new owner\\n * will have to first register the domain on the domain registry contract. Then the new owner\\n * can create a listing for the domain. The old listing will be deleted from the old owner's \\n * listings and the old listing is marked as NOT active, which prevents any new bids from being\\n * created on it and makes the old bids immediately withdrawable. We also allow the seller to\\n * specify a custom DKIM key hash for Namecheap if they want to opt out of using the managed DKIM\\n * key hash set in the transferDomainProcessor contract. The managed DKIM key hash *can* be \\n * updated by us whenever Namecheap rotates their DKIM key.\\n *\\n * Function reverts if:\\n * - Caller is not domain owner on the domain registry contract\\n * - Ask price is less than min bid price\\n * - Sale ETH recipient is the zero address\\n *\\n * @param _domainId The unique identifier of the domain\\n * @param _askPrice An asking price for the domain\\n * @param _minBidPrice The minimum bid price for the domain\\n * @param _saleEthRecipient The address to receive the ETH from the sale; must be a contract that can\\n * receive ETH or an EOA\\n * @param _encryptionKey The encryption key for buyers to encrypt the buyerId to\\n * @param _dkimKeyHash The custom DKIM key hash. If empty, the managed DKIM key hash will be used\\n */\\n function createListing(\\n bytes32 _domainId, \\n uint256 _askPrice, \\n uint256 _minBidPrice, \\n address payable _saleEthRecipient, \\n bytes memory _encryptionKey,\\n bytes32 _dkimKeyHash\\n ) \\n external\\n onlyAllowed\\n onlyInitialized \\n whenNotPaused\\n {\\n _verifyCreateListing(_domainId, _minBidPrice, _askPrice, _saleEthRecipient);\\n\\n uint256 listingId = _updateCreateListingState(\\n _domainId, _askPrice, _minBidPrice, _saleEthRecipient, _encryptionKey, _dkimKeyHash\\n );\\n\\n verifiedDomainRegistry.setDomainListing(_domainId, listingId);\\n\\n emit ListingCreated(listingId, msg.sender, _domainId, _dkimKeyHash, _askPrice, _minBidPrice, _saleEthRecipient);\\n }\\n\\n /**\\n * @notice Creates a new bid for a listing. Transfers ETH from the buyer to the contract. Every buyer\\n * has a unique identifier, for Namecheap it's their username. The seller needs the raw buyerId\\n * to transfer the domain off-chain. To facilitate this, the buyer encrypts their buyerId using the \\n * seller's encryption key and sends it along with the bid. The seller then decrypts the buyerId \\n * using their private key to get the raw buyerId.\\n *\\n * DEV NOTE: We do not check that the encrypted buyerId is the same as the hashed buyerId. This must be\\n * done in the client! This does not affect the security of the protocol as the encrypted buyerId is only \\n * used for communication between the buyer and the seller while maintaining privacy.\\n *\\n * @param _listingId The unique identifier of the listing to bid on\\n * @param _buyerIdHash The hashed buyerId which is also output as part of the transfer proof later\\n * @param _encryptedBuyerId The encrypted buyerId. Should be the same as the buyerId hashed\\n */\\n function createBid(uint256 _listingId, bytes32 _buyerIdHash, string memory _encryptedBuyerId) \\n external \\n payable\\n nonReentrant\\n whenNotPaused\\n {\\n uint256 price = msg.value;\\n Listing storage listing = listings[_listingId];\\n\\n _validateCreateBid(listing, price, _buyerIdHash);\\n\\n uint256 bidId = _updateCreateBidState(listing, _listingId, price, _buyerIdHash, _encryptedBuyerId);\\n\\n emit BidCreated(bidId, _listingId, msg.sender, price);\\n }\\n\\n /**\\n * @notice ONLY SELLER: Finalizes a sale by verifying the domain transfer and unlocking bid funds to \\n * the listing owner. The seller can also finalize the sale with bids that have initiated a refund \\n * including the ones that have expired based on timestamp but not withdrawn yet.\\n *\\n * @param _proof The zk-email proof of domain transfer\\n */\\n function finalizeSale(ITransferDomainProcessor.TransferProof calldata _proof) \\n external\\n onlyInitialized\\n nonReentrant\\n whenNotPaused\\n {\\n // Check\\n (\\n bytes32 dkimKeyHash,\\n bytes32 hashedReceiverId, \\n string memory domainName, \\n uint256 bidId\\n ) = transferDomainProcessor.processProof(_proof);\\n\\n Bid storage bid = bids[bidId];\\n Listing storage listing = listings[bid.listingId];\\n \\n _validateFinalizeSale(bid, listing, dkimKeyHash, hashedReceiverId, domainName);\\n \\n // Effect\\n verifiedDomainRegistry.updateDomainOnSale(listing.domainId, bid.buyer);\\n\\n uint256 transferValue = bid.price;\\n address payable recipient = listing.saleEthRecipient;\\n uint256 listingId = bid.listingId;\\n _updateFinalizeSaleState(bid, bidId, listing);\\n\\n // Interaction\\n uint256 feeAmount = _settleSale(recipient, transferValue);\\n \\n emit SaleFinalized(bidId, listingId, transferValue - feeAmount, feeAmount);\\n }\\n\\n /**\\n * @notice ONLY BUYER: Finalize a sale by releasing funds to the seller. Proof of transfer is not required\\n * because it is not in the buyer's interest to release funds unless they have received the domain. Note that the\\n * bid can be in ANY STATE when this function is called. Upon calling this function funds will be transferred to\\n * the seller and fees will be taken by the protocol. The listing and the bid will be deleted. The function will\\n * revert if:\\n * - The bid is not owned by the caller\\n * - The listing is not active (sold or withdrawn)\\n *\\n * @param _bidId The unique identifier of the bid to release funds for\\n */\\n function buyerReleaseFunds(uint256 _bidId) \\n external\\n nonReentrant\\n {\\n // Check\\n Bid storage bid = bids[_bidId];\\n Listing storage listing = listings[bid.listingId];\\n\\n require(bid.buyer == msg.sender, \\\"Caller is not bid owner\\\");\\n require(listing.isActive, \\\"Listing not active\\\");\\n\\n // Effect\\n verifiedDomainRegistry.updateDomainOnSale(listing.domainId, bid.buyer);\\n\\n uint256 transferValue = bid.price;\\n address payable recipient = listing.saleEthRecipient;\\n uint256 listingId = bid.listingId;\\n \\n _updateFinalizeSaleState(bid, _bidId, listing);\\n\\n // Interaction\\n uint256 feeAmount = _settleSale(recipient, transferValue);\\n\\n emit SaleFinalized(_bidId, listingId, transferValue - feeAmount, feeAmount);\\n }\\n\\n /**\\n * @notice ONLY SELLER: Updates the asking price of an existing listing. We don't update\\n * the existing bids against the listing because the newAskPrice is an indicative value.\\n * The new ask price must be greater than or equal to the existing min bid price. If seller\\n * wants to update the min bid price, they should delete the listing and create a new one with\\n * the new min bid price.\\n *\\n * @param _listingId The unique identifier of the listing to update\\n * @param _newAskPrice The new asking price for the listing\\n * @param _saleEthRecipient The new address to receive the ETH from the sale; must be a contract that can\\n * receive ETH or an EOA\\n */\\n function updateListing(uint256 _listingId, uint256 _newAskPrice, address payable _saleEthRecipient) external whenNotPaused {\\n Listing storage listing = listings[_listingId];\\n \\n require(listing.seller == msg.sender, \\\"Caller is not listing owner\\\");\\n require(listing.isActive, \\\"Listing not active\\\");\\n require(_newAskPrice >= listing.minBidPrice, \\\"Ask price is less than min bid price\\\");\\n require(_saleEthRecipient != address(0), \\\"Invalid sale ETH recipient\\\");\\n \\n listing.askPrice = _newAskPrice;\\n listing.saleEthRecipient = _saleEthRecipient;\\n\\n emit ListingUpdated(_listingId, msg.sender, _newAskPrice, _saleEthRecipient);\\n }\\n\\n /**\\n * @notice ONLY SELLER: Marks a listing as NOT active. Removes the listing from the seller's listings array\\n * and domain listing. If the listing has no bids, it is deleted from the exchange. Bids against the listing\\n * are left as is to allow the buyer to withdraw the bid.\\n *\\n * @param _listingId The unique identifier of the listing to delete\\n */\\n function deleteListing(uint256 _listingId) external {\\n Listing storage listing = listings[_listingId];\\n \\n require(listing.seller == msg.sender, \\\"Caller is not listing owner\\\");\\n require(listing.isActive, \\\"Listing not active\\\");\\n \\n verifiedDomainRegistry.removeDomainListing(listing.domainId);\\n\\n _pruneListing(listing, _listingId);\\n\\n emit ListingDeleted(_listingId, msg.sender);\\n }\\n\\n /**\\n * @notice ONLY EXCHANGE: Remove a listing for domain when ownership changes on the registry.\\n * \\n * @param _listingId Listing Id to remove\\n */\\n function registryRemoveListing(uint256 _listingId) external override {\\n Listing storage listing = listings[_listingId];\\n\\n require(address(verifiedDomainRegistry) == msg.sender, \\\"Caller is not registry\\\");\\n // If listing is NOT active, this function will NOT be called because the listing status\\n // would have already been removed from the registry beforehand; so there is no need to \\n // check if listing is active\\n \\n _pruneListing(listing, _listingId);\\n\\n emit ListingDeletedByRegistry(_listingId);\\n }\\n\\n /**\\n * @notice ONLY BUYER: Increases the price of an existing bid. The new price can ONLY be higher \\n * than the old price. The buyer must send the additional amount of ETH. The function reverts if\\n * - bid has initiated refund, caller is not bid owner or listing is not active\\n * - the new price is less than old price\\n * - msg.value is NOT STRICTLY EQUAL to than new price - old price\\n *\\n * @param _bidId The unique identifier of the bid to increase the price for\\n * @param _newPrice The new price for the bid\\n */\\n function increaseBidPrice(uint256 _bidId, uint256 _newPrice)\\n external\\n payable\\n nonReentrant\\n whenNotPaused\\n {\\n Bid storage bid = bids[_bidId];\\n Listing storage listing = listings[bid.listingId];\\n\\n // Check\\n _validateIncreaseBidPrice(bid, listing, _newPrice);\\n \\n // Effect\\n bid.price = _newPrice;\\n\\n emit BidPriceIncreased(_bidId, msg.sender, _newPrice);\\n }\\n\\n /**\\n * @notice Enables the instant accept flag for the buyer. This flag is used to indicate if the buyer has \\n * configured their Namecheap account to accept ownership of domains immediately upon transfer.\\n * \\n * DEV NOTE: We can not check that the buyer has actually enabled instant accept on Namecheap. It is only \\n * an indicative flag to help the seller know if they can finalize the sale immediately or not. The seller\\n * may get tricked by a malicious buyer to initiate a transfer to them assuming instant accept is on. But\\n * if the buyer does not have instant accept enabled, the seller will get immediate feedback and they can \\n * cancel the transfer immediately.\\n */\\n function enableInstantAccept() external onlyInitialized {\\n require(!instantAcceptEnabled[msg.sender], \\\"Instant accept already enabled\\\");\\n \\n instantAcceptEnabled[msg.sender] = true; \\n emit InstantAcceptUpdated(msg.sender, true);\\n }\\n\\n /**\\n * @notice Disables the instant accept flag for the buyer.\\n */\\n function disableInstantAccept() external onlyInitialized {\\n require(instantAcceptEnabled[msg.sender], \\\"Instant accept already disabled\\\");\\n\\n instantAcceptEnabled[msg.sender] = false;\\n emit InstantAcceptUpdated(msg.sender, false);\\n }\\n\\n /**\\n * @notice ONLY BUYER: Initiates the refund process for a bid. Can only be called by the bid owner \\n * after the initial bid expiry period has passed.\\n *\\n * @param _bidId The unique identifier of the bid to initiate refund for\\n */\\n function initiateRefund(uint256 _bidId) external {\\n Bid storage bid = bids[_bidId];\\n Listing storage listing = listings[bid.listingId];\\n\\n _validateInitiateRefund(bid, listing);\\n\\n bid.expiryTimestamp = block.timestamp + bidRefundPeriod;\\n bid.refundInitiated = true;\\n\\n emit RefundInitiated(_bidId, bid.buyer);\\n }\\n\\n /**\\n * @notice ONLY BUYER: Withdraws a bid after the refund period has ended. Transfers ETH back to the buyer.\\n *\\n * @param _bidId The unique identifier of the bid to withdraw\\n */\\n function withdrawBid(uint256 _bidId) external nonReentrant {\\n Bid storage bid = bids[_bidId];\\n Listing storage listing = listings[bid.listingId];\\n\\n // Check\\n _validateWithdrawBid(bid, listing);\\n\\n // Effect\\n uint256 refundAmount = bid.price;\\n _pruneBid(bid, _bidId, listing);\\n \\n // Interaction\\n payable(msg.sender).sendValue(refundAmount);\\n\\n emit BidWithdrawn(_bidId, msg.sender, refundAmount);\\n }\\n\\n /* ============ Admin Functions ============ */\\n\\n /**\\n * @notice Initializes the contract with domain verification and transfer processors. Can \\n * only be called once by the contract owner\\n * \\n * @param _transferDomainProcessor The address of the domain transfer processor contract\\n * @param _verifiedDomainRegistry The address of the verified domain registry contract\\n * @param _mailServerKeyHashAdapter The address of the mail server key hash adapter contract\\n */\\n function initialize(\\n ITransferDomainProcessor _transferDomainProcessor,\\n IVerifiedDomainRegistry _verifiedDomainRegistry,\\n IKeyHashAdapterV2 _mailServerKeyHashAdapter\\n ) external onlyOwner {\\n require(!isInitialized, \\\"Already initialized\\\");\\n transferDomainProcessor = _transferDomainProcessor;\\n verifiedDomainRegistry = _verifiedDomainRegistry;\\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n isInitialized = true;\\n }\\n\\n /**\\n * @notice ONLY OWNER: Pauses listing and proof submission functionality for the marketplace. \\n * Functionalites that are paused:\\n * - Listing creation and update\\n * - Bid creation and update\\n * - Sale finalization\\n * \\n * Functinonalites that remain unpaused to allow users to retrieve funds in contract:\\n * - Bid refund initiation and withdrawal\\n * - Listing deletion\\n * - Manual settlement between buyer and seller\\n */\\n function pauseMarketplace() external onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * @notice ONLY OWNER: Restarts paused functionality for the marketplace.\\n */\\n function unpauseMarketplace() external onlyOwner {\\n _unpause();\\n }\\n\\n /**\\n * @notice ONLY OWNER: Update the transfer domain processor\\n *\\n * @param _transferDomainProcessor The new transfer domain processor\\n */\\n function updateTransferDomainProcessor(ITransferDomainProcessor _transferDomainProcessor) external onlyOwner {\\n require(address(_transferDomainProcessor) != address(0), \\\"Invalid address\\\");\\n \\n transferDomainProcessor = _transferDomainProcessor;\\n emit TransferDomainProcessorUpdated(_transferDomainProcessor);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Update the managed mail server key hash adapter\\n *\\n * @param _mailServerKeyHashAdapter The new mail server key hash adapter\\n */\\n function updateMailServerKeyHashAdapter(IKeyHashAdapterV2 _mailServerKeyHashAdapter) external onlyOwner {\\n require(address(_mailServerKeyHashAdapter) != address(0), \\\"Invalid address\\\");\\n \\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n emit MailServerKeyHashAdapterUpdated(_mailServerKeyHashAdapter);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Updates the fee percentage for the marketplace\\n *\\n * @param _newFee The new fee percentage (in basis points)\\n */\\n function updateFee(uint256 _newFee) external onlyOwner {\\n fee = _newFee;\\n emit FeeUpdated(_newFee);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Updates the fee recipient address\\n *\\n * @param _newFeeRecipient The new address to receive fees\\n */\\n function updateFeeRecipient(address payable _newFeeRecipient) external onlyOwner {\\n require(_newFeeRecipient != address(0), \\\"Invalid address\\\");\\n feeRecipient = _newFeeRecipient;\\n emit FeeRecipientUpdated(_newFeeRecipient);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Updates the minimum bid active period\\n *\\n * @param _newBidSettlementPeriod The new bid settlement period in seconds\\n */\\n function updateBidSettlementPeriod(uint256 _newBidSettlementPeriod) external onlyOwner {\\n require(_newBidSettlementPeriod > 0, \\\"Bid settlement period must be greater than 0\\\");\\n bidSettlementPeriod = _newBidSettlementPeriod;\\n emit BidSettlementPeriodUpdated(_newBidSettlementPeriod);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Updates the bid refund period\\n *\\n * @param _newBidRefundPeriod The new bid refund period in seconds\\n */\\n function updateBidRefundPeriod(uint256 _newBidRefundPeriod) external onlyOwner {\\n require(_newBidRefundPeriod > 0, \\\"Bid refund period must be greater than 0\\\");\\n bidRefundPeriod = _newBidRefundPeriod;\\n emit BidRefundPeriodUpdated(_newBidRefundPeriod);\\n }\\n\\n /* ============ View Functions ============ */ \\n\\n /**\\n * @notice Get listing information with listingId for a list of listingIds\\n * @param _listingIds An array of listingIds to fetch details for\\n */\\n function getListings(uint256[] memory _listingIds)\\n external \\n view \\n returns (ListingWithId[] memory listingInfo) \\n {\\n listingInfo = new ListingWithId[](_listingIds.length);\\n for (uint256 i = 0; i < _listingIds.length; i++) {\\n listingInfo[i] = ListingWithId({\\n listingId: _listingIds[i],\\n listing: listings[_listingIds[i]]\\n });\\n }\\n }\\n\\n /**\\n * @notice Returns all listings created by a user\\n * @param _user The address of the user to fetch listings for\\n */\\n function getUserListings(address _user) external view returns (ListingWithId[] memory listingInfo) {\\n uint256[] memory userListingIds = userListings[_user];\\n listingInfo = new ListingWithId[](userListingIds.length);\\n for (uint256 i = 0; i < userListingIds.length; i++) {\\n uint256 listingId = userListingIds[i];\\n listingInfo[i] = ListingWithId({\\n listingId: listingId,\\n listing: listings[listingId]\\n });\\n }\\n }\\n\\n /**\\n * @notice Returns the bids created by a user\\n * @param _user The address of the user to fetch bids for\\n */\\n function getUserBids(address _user) external view returns (BidDetailsWithId[] memory bidInfo) {\\n uint256[] memory userBidIds = userBids[_user];\\n bidInfo = new BidDetailsWithId[](userBidIds.length);\\n for (uint256 i = 0; i < userBidIds.length; i++) {\\n uint256 bidId = userBidIds[i];\\n bidInfo[i] = BidDetailsWithId({\\n bidId: bidId,\\n bid: bids[bidId],\\n buyerInstantAcceptEnabled: instantAcceptEnabled[_user]\\n });\\n }\\n }\\n\\n /**\\n * @notice Returns the bids for given listingIds\\n * @param _listingIds An array of listingIds to fetch bids for\\n */\\n function getListingBids(uint256[] memory _listingIds) external view returns (BidDetailsWithId[][] memory bidInfo) {\\n bidInfo = new BidDetailsWithId[][](_listingIds.length);\\n for (uint256 i = 0; i < _listingIds.length; i++) {\\n uint256 listingId = _listingIds[i];\\n uint256[] memory listingBidIds = listings[listingId].bids;\\n bidInfo[i] = new BidDetailsWithId[](listingBidIds.length);\\n for (uint256 j = 0; j < listingBidIds.length; j++) {\\n uint256 bidId = listingBidIds[j];\\n bidInfo[i][j] = BidDetailsWithId({\\n bidId: bidId,\\n bid: bids[bidId],\\n buyerInstantAcceptEnabled: instantAcceptEnabled[bids[bidId].buyer]\\n });\\n }\\n }\\n }\\n\\n /**\\n * @notice Get all allowed sellers\\n */\\n function getAllowedSellers() external view returns (address[] memory) {\\n return _getAllowedAddresses();\\n }\\n\\n\\n /* ============ Internal Functions ============ */\\n\\n function _verifyCreateListing(\\n bytes32 _domainId, \\n uint256 _minBidPrice, \\n uint256 _askPrice, \\n address _saleEthRecipient\\n ) internal view {\\n IVerifiedDomainRegistry.DomainWithId memory domainWithId = verifiedDomainRegistry.getDomain(_domainId);\\n require(domainWithId.domain.owner == msg.sender, \\\"Caller is not domain owner\\\");\\n require(domainWithId.domain.exchange == address(0), \\\"Domain already listed on registry\\\");\\n\\n require(_minBidPrice > 0, \\\"Minimum bid price is zero\\\");\\n require(_askPrice >= _minBidPrice, \\\"Ask price is less than min bid price\\\");\\n require(_saleEthRecipient != address(0), \\\"Invalid sale ETH recipient\\\");\\n }\\n\\n function _updateCreateListingState(\\n bytes32 _domainId, \\n uint256 _askPrice, \\n uint256 _minBidPrice,\\n address payable _saleEthRecipient,\\n bytes memory _encryptionKey,\\n bytes32 _dkimKeyHash\\n ) internal returns (uint256 listingId) {\\n \\n // New listing\\n listingId = listingCounter;\\n listings[listingId] = Listing({\\n seller: msg.sender,\\n saleEthRecipient: _saleEthRecipient,\\n encryptionKey: _encryptionKey,\\n dkimKeyHash: _dkimKeyHash,\\n askPrice: _askPrice,\\n minBidPrice: _minBidPrice,\\n domainId: _domainId,\\n createdAt: block.timestamp,\\n isActive: true,\\n bids: new uint256[](0)\\n });\\n userListings[msg.sender].push(listingId);\\n\\n // Increment listingCounter\\n listingCounter = listingCounter + 1;\\n }\\n\\n function _validateCreateBid(Listing storage _listing, uint256 _price, bytes32 _buyerIdHash) internal view {\\n require(_listing.seller != address(0), \\\"Listing does not exist\\\");\\n require(_listing.isActive, \\\"Listing not active\\\");\\n \\n // Validate inputs\\n require(_price >= _listing.minBidPrice, \\\"Bid price is less than min bid price\\\");\\n require(_buyerIdHash != bytes32(0), \\\"Buyer ID hash cannot be empty\\\");\\n }\\n\\n function _updateCreateBidState(\\n Listing storage _listing, \\n uint256 _listingId, \\n uint256 _price, \\n bytes32 _buyerIdHash, \\n string memory _encryptedBuyerId\\n ) internal returns (uint256 bidId) {\\n bidId = bidCounter;\\n bids[bidId] = Bid({\\n buyer: msg.sender,\\n listingId: _listingId,\\n encryptedBuyerId: _encryptedBuyerId,\\n buyerIdHash: _buyerIdHash,\\n createdAt: block.timestamp,\\n expiryTimestamp: type(uint256).max,\\n price: _price,\\n refundInitiated: false\\n });\\n userBids[msg.sender].push(bidId);\\n _listing.bids.push(bidId);\\n\\n // Increment bidCounter\\n bidCounter = bidCounter + 1;\\n }\\n\\n function _validateFinalizeSale(\\n Bid storage _bid, \\n Listing storage _listing,\\n bytes32 _dkimKeyHash,\\n bytes32 _hashedReceiverId, \\n string memory _transferredDomainName\\n ) internal view {\\n require(_bid.buyer != address(0), \\\"Bid does not exist\\\");\\n require(_listing.seller == msg.sender, \\\"Caller is not listing owner\\\");\\n require(_listing.isActive, \\\"Listing not active\\\");\\n\\n // Validate namecheap DKIM key\\n if (_listing.dkimKeyHash != bytes32(0)) {\\n require(_dkimKeyHash == _listing.dkimKeyHash, \\\"Invalid custom DKIM key hash\\\");\\n } else {\\n require(\\n mailServerKeyHashAdapter.isMailServerKeyHash(_dkimKeyHash), \\n \\\"Invalid managed DKIM key hash\\\"\\n );\\n }\\n\\n // Validate domain and receiver\\n bytes32 transferredDomainId = keccak256(abi.encodePacked(_transferredDomainName));\\n require(_bid.buyerIdHash == _hashedReceiverId, \\\"Invalid receiver\\\");\\n require(_listing.domainId == transferredDomainId, \\\"Invalid domain\\\");\\n }\\n\\n function _updateFinalizeSaleState(Bid storage _bid, uint256 _bidId, Listing storage _listing) internal {\\n uint256 listingId = _bid.listingId;\\n \\n _pruneBid(_bid, _bidId, _listing);\\n _pruneListing(_listing, listingId);\\n }\\n\\n function _validateIncreaseBidPrice(\\n Bid storage _bid, \\n Listing storage _listing, \\n uint256 _newPrice\\n ) internal view {\\n require(_bid.buyer == msg.sender, \\\"Caller is not bid owner\\\");\\n require(!_bid.refundInitiated, \\\"Refund already initiated\\\");\\n require(_listing.isActive, \\\"Listing not active\\\");\\n\\n // Validate new price\\n require(_newPrice > _bid.price, \\\"New price not greater than old price\\\");\\n require(msg.value == _newPrice - _bid.price, \\\"Incorrect amount of ETH sent\\\");\\n }\\n\\n function _validateInitiateRefund(Bid storage _bid, Listing storage _listing) internal view {\\n require(_bid.buyer == msg.sender, \\\"Caller is not bid owner\\\");\\n require(!_bid.refundInitiated, \\\"Refund already initiated\\\");\\n require(block.timestamp > bidSettlementPeriod + _bid.createdAt, \\\"Refund period not started\\\");\\n require(_listing.isActive, \\\"Listing expired. Bid can be withdrawn directly\\\");\\n }\\n\\n function _validateWithdrawBid(Bid storage _bid, Listing storage _listing) internal view {\\n require(_bid.buyer == msg.sender, \\\"Caller is not bid owner\\\");\\n if (_listing.isActive) {\\n require(_bid.refundInitiated, \\\"Refund not initiated\\\");\\n require(block.timestamp >= _bid.expiryTimestamp, \\\"Refund period not ended\\\");\\n }\\n }\\n\\n function _settleSale(address payable _recipient, uint256 _amount) internal returns (uint256 feeAmount) {\\n feeAmount = (_amount * fee) / PRECISE_UNIT;\\n _recipient.sendValue(_amount - feeAmount);\\n\\n if (feeAmount > 0) {\\n feeRecipient.sendValue(feeAmount);\\n }\\n }\\n\\n /**\\n * @notice Deletes a bid from the exchange. Removes the bid from the listing's bids array and the buyer's\\n * bids array. Deletes the listing if it is expired and has no bids.\\n */\\n function _pruneBid(Bid storage _bid, uint256 _bidId, Listing storage _listing) internal {\\n userBids[_bid.buyer].removeStorage(_bidId);\\n _listing.bids.removeStorage(_bidId);\\n if (!_listing.isActive && _listing.bids.length == 0) {\\n delete listings[_bid.listingId];\\n }\\n delete bids[_bidId];\\n }\\n\\n /**\\n * @notice Marks a listing as expired. Removes the listing from the seller's listings array and domain listing.\\n * If the listing has no bids, it is deleted from the exchange.\\n */\\n function _pruneListing(Listing storage _listing, uint256 _listingId) internal {\\n _listing.isActive = false;\\n userListings[_listing.seller].removeStorage(_listingId);\\n if (_listing.bids.length == 0) {\\n delete listings[_listingId];\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3470413dda117592e3d5ff6d73a50901e64eb77df61b0617974141ac0542b707\",\"license\":\"MIT\"},\"contracts/external/AddressAllowList.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { AddressArrayUtils } from \\\"./lib/AddressArrayUtils.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract AddressAllowList is Ownable {\\n\\n using AddressArrayUtils for address[];\\n\\n /* ============ Events ============ */\\n event AddressAddedToAllowlist(address indexed allowedAddress);\\n event AddressRemovedFromAllowlist(address indexed allowedAddress);\\n event AllowlistEnabled();\\n event AllowlistDisabled();\\n \\n /* ============ Modifier ============ */\\n modifier onlyAllowed() {\\n require(isEnabled ? isAllowed[msg.sender] : true, \\\"Address is not allowed\\\");\\n _;\\n }\\n \\n /* ============ State Variables ============ */\\n bool public isEnabled; // Boolean indicating if the allowlist is enabled\\n address[] public allowedAddresses; // Array of addresses that are allowed from taking depositors liquidity\\n mapping(address => bool) public isAllowed; // Mapping of address to boolean indicating if the user is allowed\\n\\n /* ============ Constructor ============ */\\n constructor(address[] memory _allowedAddresses) Ownable() {\\n for (uint256 i = 0; i < _allowedAddresses.length; i++) {\\n address allowedAddress = _allowedAddresses[i];\\n\\n require(!isAllowed[allowedAddress], \\\"Address is already allowed\\\");\\n isAllowed[allowedAddress] = true;\\n emit AddressAddedToAllowlist(allowedAddress);\\n }\\n allowedAddresses = _allowedAddresses;\\n isEnabled = true;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice Adds passed addresses to an allow list. Addresses on the allow list are able to call allow listed\\n * functions.\\n *\\n * @param _allowedAddresses List of addresses allowed to call allow listed functions\\n */\\n function addAddressesToAllowlist(address[] memory _allowedAddresses) external onlyOwner {\\n for(uint256 i = 0; i < _allowedAddresses.length; i++) {\\n address allowedAddress = _allowedAddresses[i];\\n\\n require(!isAllowed[allowedAddress], \\\"Address already on allowlist\\\");\\n\\n isAllowed[allowedAddress] = true;\\n allowedAddresses.push(allowedAddress);\\n\\n emit AddressAddedToAllowlist(allowedAddress);\\n }\\n }\\n\\n /**\\n * @notice Removes passed addresses from an allow list. Addresses not on the allow list are unable to call\\n * allow listed functions.\\n *\\n * @param _disallowedAddresses List of addresses being disallowed from calling allow listed functions\\n */\\n function removeAddressesFromAllowlist(address[] memory _disallowedAddresses) external onlyOwner {\\n for(uint256 i = 0; i < _disallowedAddresses.length; i++) {\\n address disallowedAddress = _disallowedAddresses[i];\\n\\n require(isAllowed[disallowedAddress], \\\"Address already disallowed\\\");\\n\\n isAllowed[disallowedAddress] = false;\\n allowedAddresses.removeStorage(disallowedAddress);\\n\\n emit AddressRemovedFromAllowlist(disallowedAddress);\\n }\\n }\\n\\n /**\\n * @notice Enable the allow list. When the allow list is enabled, only approved addresses are allowed to\\n * functions with onlyAllowed modifier.\\n */\\n function enableAllowlist() external onlyOwner {\\n require(!isEnabled, \\\"Allow list is already enabled\\\");\\n\\n isEnabled = true;\\n emit AllowlistEnabled();\\n }\\n\\n /**\\n * @notice Disable the allow list. When the allow list is disabled, any address is allowed to call functions\\n * with onlyAllowed modifier.\\n */\\n function disableAllowlist() external onlyOwner {\\n require(isEnabled, \\\"Allow list is already disabled\\\");\\n\\n isEnabled = false;\\n emit AllowlistDisabled();\\n }\\n\\n /* ============ View Functions ============ */\\n\\n function _getAllowedAddresses() internal view returns (address[] memory) {\\n return allowedAddresses;\\n }\\n}\\n\",\"keccak256\":\"0x5a681a88a6e27db23ff879a4cf35842d008b2ce58bdd3c0c8a03028071762593\",\"license\":\"MIT\"},\"contracts/external/interfaces/IKeyHashAdapterV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IKeyHashAdapterV2 {\\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function getMailServerKeyHashes() external view returns (bytes32[] memory);\\n function isMailServerKeyHash(bytes32 _mailserverKeyHash) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc849f2dc34e4463550b8e0a16541bde429cb1adf43776b2c4179e9d4e4e656a2\",\"license\":\"MIT\"},\"contracts/external/interfaces/IProxyBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Claims } from \\\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IProxyBaseProcessor {\\n \\n struct Proof {\\n Claims.ClaimInfo claimInfo;\\n Claims.SignedClaim signedClaim;\\n }\\n}\\n\",\"keccak256\":\"0x65aa00301110dfdf8333bd9bb71ebad241d66ea5840a2db3ac6d4f6037083cb8\",\"license\":\"MIT\"},\"contracts/external/lib/AddressArrayUtils.sol\":{\"content\":\"/*\\n Copyright 2020 Set Labs Inc.\\n\\n Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n you may not use this file except in compliance with the License.\\n You may obtain a copy of the License at\\n\\n http://www.apache.org/licenses/LICENSE-2.0\\n\\n Unless required by applicable law or agreed to in writing, software\\n distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n See the License for the specific language governing permissions and\\n limitations under the License.\\n\\n SPDX-License-Identifier: MIT\\n*/\\n\\npragma solidity ^0.8.17;\\n\\n/**\\n * @title AddressArrayUtils\\n * @author Set Protocol\\n *\\n * Utility functions to handle Address Arrays\\n *\\n * CHANGELOG:\\n * - 4/21/21: Added validatePairsWithArray methods\\n */\\nlibrary AddressArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(address[] memory A, address a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(address[] memory A, address a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns true if there are 2 elements that are the same in an array\\n * @param A The input array to search\\n * @return Returns boolean for the first occurrence of a duplicate\\n */\\n function hasDuplicate(address[] memory A) internal pure returns(bool) {\\n require(A.length > 0, \\\"A is empty\\\");\\n\\n for (uint256 i = 0; i < A.length - 1; i++) {\\n address current = A[i];\\n for (uint256 j = i + 1; j < A.length; j++) {\\n if (current == A[j]) {\\n return true;\\n }\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n * @return Returns the array with the object removed.\\n */\\n function remove(address[] memory A, address a)\\n internal\\n pure\\n returns (address[] memory)\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n (address[] memory _A,) = pop(A, index);\\n return _A;\\n }\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n */\\n function removeStorage(address[] storage A, address a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n\\n /**\\n * Removes specified index from array\\n * @param A The input array to search\\n * @param index The index to remove\\n * @return Returns the new array and the removed entry\\n */\\n function pop(address[] memory A, uint256 index)\\n internal\\n pure\\n returns (address[] memory, address)\\n {\\n uint256 length = A.length;\\n require(index < A.length, \\\"Index must be < A length\\\");\\n address[] memory newAddresses = new address[](length - 1);\\n for (uint256 i = 0; i < index; i++) {\\n newAddresses[i] = A[i];\\n }\\n for (uint256 j = index + 1; j < length; j++) {\\n newAddresses[j - 1] = A[j];\\n }\\n return (newAddresses, A[index]);\\n }\\n}\\n\",\"keccak256\":\"0x486f1a373f33aa167227600ac2d0bf95b37685413d98a3e745107188f00ae405\",\"license\":\"MIT\"},\"contracts/external/lib/Bytes32ArrayUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.17;\\n\\n/**\\n * @title Bytes32ArrayUtils\\n * @author ZKP2P\\n *\\n * Fork of Set Protocol's AddressArrayUtils library adapted for usage with bytes32 arrays.\\n */\\nlibrary Bytes32ArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(bytes32[] memory A, bytes32 a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(bytes32[] memory A, bytes32 a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns true if there are 2 elements that are the same in an array\\n * @param A The input array to search\\n * @return Returns boolean for the first occurrence of a duplicate\\n */\\n function hasDuplicate(bytes32[] memory A) internal pure returns(bool) {\\n require(A.length > 0, \\\"A is empty\\\");\\n\\n for (uint256 i = 0; i < A.length - 1; i++) {\\n bytes32 current = A[i];\\n for (uint256 j = i + 1; j < A.length; j++) {\\n if (current == A[j]) {\\n return true;\\n }\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The bytes32 to remove\\n * @return Returns the array with the object removed.\\n */\\n function remove(bytes32[] memory A, bytes32 a)\\n internal\\n pure\\n returns (bytes32[] memory)\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"bytes32 not in array.\\\");\\n } else {\\n (bytes32[] memory _A,) = pop(A, index);\\n return _A;\\n }\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The bytes32 to remove\\n */\\n function removeStorage(bytes32[] storage A, bytes32 a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"bytes32 not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n\\n /**\\n * Removes specified index from array\\n * @param A The input array to search\\n * @param index The index to remove\\n * @return Returns the new array and the removed entry\\n */\\n function pop(bytes32[] memory A, uint256 index)\\n internal\\n pure\\n returns (bytes32[] memory, bytes32)\\n {\\n uint256 length = A.length;\\n require(index < A.length, \\\"Index must be < A length\\\");\\n bytes32[] memory newBytes = new bytes32[](length - 1);\\n for (uint256 i = 0; i < index; i++) {\\n newBytes[i] = A[i];\\n }\\n for (uint256 j = index + 1; j < length; j++) {\\n newBytes[j - 1] = A[j];\\n }\\n return (newBytes, A[index]);\\n }\\n}\\n\",\"keccak256\":\"0x14d572deda126ff812eb5ab0eed33120e13cc568fd611a4a6bff652f3e8440a8\",\"license\":\"MIT\"},\"contracts/external/lib/Uint256ArrayUtils.sol\":{\"content\":\"/*\\n Copyright 2020 Set Labs Inc.\\n\\n Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n you may not use this file except in compliance with the License.\\n You may obtain a copy of the License at\\n\\n http://www.apache.org/licenses/LICENSE-2.0\\n\\n Unless required by applicable law or agreed to in writing, software\\n distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n See the License for the specific language governing permissions and\\n limitations under the License.\\n\\n SPDX-License-Identifier: Apache-2.0\\n*/\\n\\npragma solidity ^0.8.18;\\n\\n/**\\n * @title Uint256ArrayUtils\\n * @author Set Protocol\\n *\\n * Utility functions to handle Uint256 Arrays\\n */\\nlibrary Uint256ArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(uint256[] memory A, uint256 a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(uint256[] memory A, uint256 a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns the combination of the two arrays\\n * @param A The first array\\n * @param B The second array\\n * @return Returns A extended by B\\n */\\n function extend(uint256[] memory A, uint256[] memory B) internal pure returns (uint256[] memory) {\\n uint256 aLength = A.length;\\n uint256 bLength = B.length;\\n uint256[] memory newUints = new uint256[](aLength + bLength);\\n for (uint256 i = 0; i < aLength; i++) {\\n newUints[i] = A[i];\\n }\\n for (uint256 j = 0; j < bLength; j++) {\\n newUints[aLength + j] = B[j];\\n }\\n return newUints;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The bytes32 to remove\\n */\\n function removeStorage(uint256[] storage A, uint256 a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"uint256 not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbf9f00cb29fa144868141b708c11d55b219db79cd386db886a5d72e38bbadcb0\",\"license\":\"Apache-2.0\"},\"contracts/interfaces/IDomainExchange.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.18;\\n\\n\\ninterface IDomainExchange {\\n function registryRemoveListing(uint256 _listingId) external;\\n}\",\"keccak256\":\"0xe9deda400c359c1b42d10c518dc1f01605ea3a466e1be110f1f7c9be4af8253b\",\"license\":\"MIT\"},\"contracts/interfaces/ITransferDomainProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.18;\\n\\n\\ninterface ITransferDomainProcessor {\\n\\n struct TransferProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[10] signals;\\n }\\n\\n function processProof(\\n TransferProof calldata _proof\\n ) \\n external \\n returns (\\n bytes32 dkimKeyHash, \\n bytes32 hashedReceiverId, \\n string memory domainName, \\n uint256 bidId\\n );\\n}\",\"keccak256\":\"0x9cf5f1b070d7bad73d8ae57f7b20d449853f96fcbb5df1a443723df41c91339d\",\"license\":\"MIT\"},\"contracts/interfaces/IVerifiedDomainRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { IVerifyDomainProcessor } from \\\"./IVerifyDomainProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IVerifiedDomainRegistry {\\n\\n struct Domain {\\n address owner;\\n string name;\\n uint256 expiryTime;\\n address exchange;\\n uint256 listingId;\\n }\\n\\n struct DomainWithId {\\n bytes32 domainId;\\n Domain domain;\\n }\\n\\n function verifyDomains(IVerifyDomainProcessor.Proof[] memory _proofs) external;\\n \\n function getDomainId(string memory _domainName) external pure returns (bytes32);\\n function getDomainOwner(bytes32 _domainId) external view returns (address);\\n function getDomain(bytes32 _domainId) external view returns (DomainWithId memory);\\n function getDomains(bytes32[] memory _domainId) external view returns (DomainWithId[] memory);\\n \\n function setDomainListing(bytes32 _domainId, uint256 _listingId) external;\\n function removeDomainListing(bytes32 _domainId) external;\\n function updateDomainOnSale(bytes32 _domainId, address _newOwner) external;\\n}\\n\",\"keccak256\":\"0xcc45329e6720b7b9df3c67985b16f8d778528f756c045ba6c2196831b40afe92\",\"license\":\"MIT\"},\"contracts/interfaces/IVerifyDomainProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\nimport { IProxyBaseProcessor } from \\\"../external/interfaces/IProxyBaseProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IVerifyDomainProcessor is IProxyBaseProcessor {\\n \\n struct DomainRaw {\\n string name;\\n uint256 expiryTime;\\n }\\n\\n function verifyProofs(\\n Proof[] memory _proofs\\n ) \\n external \\n returns (DomainRaw[] memory domains);\\n}\",\"keccak256\":\"0xe66335a9d8fb3d03a9ee76bf44fbec775311aeed3f6666862f06124b6605a123\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523462000037576200002562000018620001e5565b94939093929192620002cd565b6040516154ee6200089382396154ee90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200007457604052565b6200003c565b90620000916200008960405190565b928362000052565b565b6001600160a01b031690565b90565b6001600160a01b0381165b036200003757565b905051906200009182620000a2565b80620000ad565b905051906200009182620000c4565b6001600160401b038111620000745760208091020190565b909291926200010b6200010582620000da565b6200007a565b93818552602080860192028301928184116200003757915b838310620001315750505050565b60208091620001418486620000b5565b81520192019162000123565b9080601f83011215620000375781516200009f92602001620000f2565b91909160c0818403126200003757620001848382620000b5565b92620001948160208401620000cb565b92604090620001a683838601620000b5565b93620001b68460608301620000cb565b93620001c68160808401620000cb565b9360018060a0850151921b03811162000037576200009f92016200014d565b6200020862005d8180380380620001fc816200007a565b9283398101906200016a565b909192939495565b90600019905b9181191691161790565b6200009f6200009f6200009f9290565b90620002446200009f6200024c9262000220565b825462000210565b9055565b906001600160a01b039062000216565b6200009f9062000093906001600160a01b031682565b6200009f9062000260565b6200009f9062000276565b90620002a06200009f6200024c9262000281565b825462000250565b9060ff9062000216565b90620002c56200009f6200024c92151590565b8254620002a8565b939192620003016200031194620002f96200030994620002f1620000919a6200034a565b600a62000230565b600b6200028c565b600e62000230565b600f62000230565b6200033662000321600162000220565b6200032e81600c62000230565b600d62000230565b6200034460006010620002b2565b6200077f565b62000355906200036f565b6200009160006004620002b2565b6200009f600162000220565b6200037a90620005c2565b620000916200038862000363565b600362000230565b634e487b7160e01b600052601160045260246000fd5b6000198114620003b65760010190565b62000390565b634e487b7160e01b600052603260045260246000fd5b90620003dc825190565b811015620003ee576020809102010190565b620003bc565b90620004009062000281565b600052602052604060002090565b156200041657565b60405162461bcd60e51b815260206004820152601a60248201527f4164647265737320697320616c726561647920616c6c6f7765640000000000006044820152606490fd5b0390fd5b9160001960089290920291821b911b62000216565b9190620004896200009f6200024c9362000220565b9083546200045f565b620000919160009162000474565b818110620004ac575050565b80620004bc600060019362000492565b01620004a0565b9091828110620004d257505050565b620000919290620004ea905b92600052602060002090565b9081019101620004a0565b906801000000000000000081116200007457816200051562000091935490565b90828155620004c3565b8151916001600160401b03831162000074576200054e620004de600192620005488686620004f5565b60200190565b92049160005b838110620005625750505050565b60019060206200057d6200009f86516001600160a01b031690565b940193818401550162000554565b9062000091916200051f565b9060ff60a01b9060a01b62000216565b90620005ba6200009f6200024c92151590565b825462000597565b620005cc620006b7565b600091620005da8362000220565b620005e76200009f845190565b8110156200069b57806200061162000604620006959386620003d2565b516001600160a01b031690565b620006546002620006406200063a620006366200062f8685620003f4565b5460ff1690565b1590565b6200040e565b6200064e83600192620003f4565b620002b2565b620006807f41f4a012571b6bf21f3c6557be5d1a28851ce415203203b84c14099b84fe97379162000281565b906200068b60405190565b600090a2620003a6565b620005da565b5091620006ae620000919260016200058b565b600190620005a7565b620000913362000830565b62000830565b6200009190620006d7620007dc565b62000754565b620000936200009f6200009f9290565b6200009f90620006dd565b156200070057565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6200009190620006c26200076d620000936000620006ed565b6001600160a01b0383161415620006f8565b6200009190620006c8565b156200079257565b60405162461bcd60e51b8152806200045b600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b62000091620007ea62000824565b62000806620007f93362000093565b916001600160a01b031690565b146200078a565b6200009f9062000093565b6200009f90546200080d565b6200009f600062000818565b6200083c600062000818565b906200084a8160006200028c565b620008816200087a7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09362000281565b9162000281565b916200088c60405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c80630373c0bf1461035257806303f693541461034d5780630d81539c146103485780630eaaf4c8146103435780630f2bc8b31461033e5780631756c30e146103395780631ce59f811461033457806321f67fbb1461032f5780632ac44f121461032a5780632f6db23814610325578063392e53cd146103205780633ec622791461031b5780634423c5f11461031657806346904840146103115780634f20fe5d1461030c5780635c975abb1461030757806364b55bed146103025780636759789f146102fd5780636aa633b6146102f85780636c2c9c7d146102f35780636caacbe7146102ee578063715018a6146102e95780637e064092146102e45780637e7a9c6c146102df5780637f17caa7146102da57806381c14314146102d557806386cfa7d3146102d057806387547367146102cb578063887f495a146102c65780638da5cb5b146102c15780639012c4a8146102bc578063944b8b2e146102b757806396ec50c3146102b25780639d8717a8146102ad578063a15ce280146102a8578063a8ef333f146102a3578063ad9287631461029e578063babcc53914610299578063bb46acd314610294578063bca0b9101461028f578063c0c53b8b1461028a578063c6a2aac814610285578063cf8e629a14610280578063ddca3f431461027b578063de74e57b14610276578063e38df96d14610271578063e6282c6e1461026c578063eb18a9d814610267578063f15851e614610262578063f160d3691461025d578063f2fde38b146102585763f6cda469036103c9576116f3565b6116db565b6116c3565b6116ab565b611690565b611678565b61165d565b61161a565b611474565b611450565b611438565b61141f565b6113dd565b6113b7565b611382565b611353565b611338565b611318565b6112b0565b6111c3565b61118e565b611151565b61112c565b611113565b6110cb565b6110af565b611012565b610ffa565b610fdf565b610fbb565b610fa3565b610f8b565b610ee3565b610ebc565b610e89565b610d31565b610cae565b610c87565b610bf9565b610b9e565b610963565b610935565b6108f7565b6108bb565b6108a3565b61088b565b610873565b610858565b610834565b6107fc565b6106da565b610682565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761038e57604052565b610357565b906103a76103a060405190565b928361036d565b565b6001600160401b03811161038e5760208091020190565b805b036103c957565b600080fd5b905035906103a7826103c0565b909291926103f06103eb826103a9565b610393565b93818552602080860192028301928184116103c957915b8383106104145750505050565b6020809161042284866103ce565b815201920191610407565b9080601f830112156103c957816020610448933591016103db565b90565b906020828203126103c95781356001600160401b0381116103c957610448920161042d565b9052565b6001600160a01b031690565b60005b8381106104935750506000910152565b8181015183820152602001610483565b6104c46104cd6020936104d7936104b8815190565b80835293849260200190565b95869101610480565b601f01601f191690565b0190565b906104fb6104f46104ea845190565b8084529260200190565b9260200190565b9060005b81811061050c5750505090565b9091926105296105226001928651815260200190565b9460200190565b9291016104ff565b80516001600160a01b031682526104489161012061058161014083016020858101516001600160a01b03169085015261056f60408601516040860152565b606085015184820360608601526104a3565b9261059160808201516080850152565b6105a060a082015160a0850152565b6105af60c082015160c0850152565b6105be60e082015160e0850152565b610100818101511515908401520151906101208184039101526104db565b8051825261044891604081019160200151906020818403910152610531565b90610448916105dc565b9061061b610611835190565b8083529160200190565b908161062d6020830284019460200190565b926000915b83831061064157505050505090565b9091929394602061066461065d838560019503875289516105fb565b9760200190565b9301930191939290610632565b602080825261044892910190610605565b346103c9576106a961069d61069836600461044b565b613266565b60405191829182610671565b0390f35b60009103126103c957565b610448916008021c81565b9061044891546106b8565b6104486000600c6106c3565b346103c9576106ea3660046106ad565b6106a96106f56106ce565b6040515b9182918290815260200190565b6001600160a01b0381166103c2565b905035906103a782610706565b6001600160401b03811161038e57602090601f01601f19160190565b90826000939282370152565b9092919261075a6103eb82610722565b938185526020850190828401116103c9576103a79261073e565b9080601f830112156103c9578160206104489335910161074a565b909160c0828403126103c9576107a583836103ce565b926107b381602085016103ce565b926107c182604083016103ce565b926107cf8360608401610715565b926080830135906001600160401b0382116103c9576107f381610448938601610774565b9360a0016103ce565b346103c95761081b61080f36600461078f565b94939093929192611b75565b604051005b906020828203126103c957610448916103ce565b346103c95761081b610847366004610820565b612961565b6104486000600f6106c3565b346103c9576108683660046106ad565b6106a96106f561084c565b346103c95761081b610886366004610820565b61258d565b346103c95761089b3660046106ad565b61081b61281a565b346103c9576108b33660046106ad565b61081b612be6565b346103c95761081b6108ce366004610820565b61282f565b90816102409103126103c95790565b90610240828203126103c957610448916108d3565b346103c95761081b61090a3660046108e2565b612106565b610448916008021c5b60ff1690565b90610448915461090f565b6104486000601061091e565b346103c9576109453660046106ad565b6106a9610950610929565b6040515b91829182901515815260200190565b346103c9576109733660046106ad565b61081b612b78565b6104486104486104489290565b906109929061097b565b600052602052604060002090565b6104489081565b61044890546109a0565b634e487b7160e01b600052602260045260246000fd5b90600160028304921680156109e7575b60208310146109e257565b6109b1565b91607f16916109d7565b80546000939291610a0e610a04836109c7565b8085529360200190565b9160018116908115610a605750600114610a2757505050565b610a3a9192939450600052602060002090565b916000925b818410610a4c5750500190565b805484840152602090930192600101610a3f565b92949550505060ff1916825215156020020190565b90610448916109f1565b906103a7610a9992610a9060405190565b93848092610a75565b038361036d565b61044890610918565b6104489054610aa0565b610abe906007610988565b90610ad082546001600160a01b031690565b91610add600182016109a7565b91610aea60028301610a7f565b91610af7600382016109a7565b91610b04600483016109a7565b91610b11600582016109a7565b916104486007610b23600685016109a7565b9301610aa9565b93989795610b8860e096610b81610b7988610b9698610b6c6103a79e99610b65610b8f9a600061010087019601906001600160a01b03169052565b60208d0152565b8a820360408c01526104a3565b9c6060890152565b6080870152565b60a0850152565b60c0830152565b019015159052565b346103c9576106a9610bb9610bb4366004610820565b610ab3565b94610bcc98969894919493929360405190565b98899889610b2a565b610448916008021c610474565b906104489154610bd5565b6104486000600b610be2565b346103c957610c093660046106ad565b6106a9610c14610bed565b6040515b918291826001600160a01b03909116815260200190565b90610c3e6104f46104ea845190565b9060005b818110610c4f5750505090565b909192610c6e61052260019286516001600160a01b0316815260200190565b929101610c42565b602080825261044892910190610c2f565b346103c957610c973660046106ad565b6106a9610ca26136f8565b60405191829182610c76565b346103c957610cbe3660046106ad565b6106a96109506118fa565b634e487b7160e01b600052603260045260246000fd5b8054821015610d0257610cf9600191600052602060002090565b91020190600090565b610cc9565b60016000610d13825490565b831015610d2e575061044891610d2891610cdf565b90610be2565b80fd5b346103c9576106a9610c14610d47366004610820565b610d07565b906020828203126103c95761044891610715565b80516001600160a01b03168252906104489060e080610d9e6101008401610d8c60208801516020870152565b604087015185820360408701526104a3565b94610dae60608201516060860152565b610dbd60808201516080860152565b610dcc60a082015160a0860152565b610ddb60c082015160c0860152565b01511515910152565b805182529061044890604080610e096060840160208701518582036020870152610d60565b9401511515910152565b9061044891610de4565b90610e29610611835190565b9081610e3b6020830284019460200190565b926000915b838310610e4f57505050505090565b90919293946020610e6b61065d83856001950387528951610e13565b9301930191939290610e40565b602080825261044892910190610e1d565b346103c9576106a9610ea4610e9f366004610d4c565b6134df565b60405191829182610e78565b6104486014600061091e565b346103c957610ecc3660046106ad565b6106a9610950610eb0565b6104486000600d6106c3565b346103c957610ef33660046106ad565b6106a96106f5610ed7565b90929192610f0e6103eb826103a9565b93818552602080860192028301928184116103c957915b838310610f325750505050565b60208091610f408486610715565b815201920191610f25565b9080601f830112156103c95781602061044893359101610efe565b906020828203126103c95781356001600160401b0381116103c9576104489201610f4b565b346103c95761081b610f9e366004610f66565b614f6c565b346103c957610fb33660046106ad565b61081b611743565b346103c95761081b610fce366004610820565b612f05565b6104486000600e6106c3565b346103c957610fef3660046106ad565b6106a96106f5610fd3565b346103c95761081b61100d366004610f66565b614e73565b346103c9576110223660046106ad565b61081b612788565b91906040838203126103c957610448906110448185610715565b936020016103ce565b61044890610474906001600160a01b031682565b6104489061104d565b61044890611061565b906109929061106a565b61108b600691600092611073565b90611094825490565b831015610d2e5750610448916110a991610cdf565b906106c3565b346103c9576106a96106f56110c536600461102a565b9061107d565b346103c95761081b6110de366004610d4c565b612d36565b90916060828403126103c9576104486110fc84846103ce565b9361110a81602086016103ce565b93604001610715565b346103c95761081b6111263660046110e3565b91612449565b346103c95761113c3660046106ad565b6106a9610c146000546001600160a01b031690565b346103c95761081b611164366004610820565b612dda565b61044860006011610be2565b6104709061106a565b6020810192916103a79190611175565b346103c95761119e3660046106ad565b6106a96111a9611169565b6040519182918261117e565b61108b600891600092611073565b346103c9576106a96106f56111d936600461102a565b906111b5565b906111eb610611835190565b90816111fd6020830284019460200190565b926000915b83831061121157505050505090565b9091929394602061122d61065d83856001950387528951610e13565b9301930191939290611202565b90610448916111df565b90611250610611835190565b90816112626020830284019460200190565b926000915b83831061127657505050505090565b9091929394602061129261065d8385600195038752895161123a565b9301930191939290611267565b602080825261044892910190611244565b346103c9576106a96112cb6112c636600461044b565b6135ce565b6040519182918261129f565b916060838303126103c9576112ec82846103ce565b926112fa83602083016103ce565b9260408201356001600160401b0381116103c9576104489201610774565b61081b6113263660046112d7565b91611c76565b61044860006012610be2565b346103c9576113483660046106ad565b6106a96111a961132c565b346103c95761081b611366366004610820565b612fc9565b6104489061137d600291600092611073565b61091e565b346103c9576106a9610950611398366004610d4c565b61136b565b91906040838203126103c9576104489061104481856103ce565b61081b6113c536600461139d565b90612695565b6104489061137d600991600092611073565b346103c9576106a96109506113f3366004610d4c565b6113cb565b90916060828403126103c9576104486114118484610715565b9361110a8160208601610715565b346103c95761081b6114323660046113f8565b91612b5a565b346103c9576114483660046106ad565b61081b615049565b346103c9576114603660046106ad565b61081b6150f4565b6104486000600a6106c3565b346103c9576114843660046106ad565b6106a96106f5611468565b805460009392916114a2610a04836109c7565b9160018116908115610a6057506001146114bb57505050565b6114ce9192939450600052602060002090565b916000925b8184106114e05750500190565b8054848401526020909301926001016114d3565b906104489161148f565b906103a7610a999261150f60405190565b938480926114f4565b611523906005610988565b80546001600160a01b03169161154360018301546001600160a01b031690565b91611550600282016109a7565b9161155d600383016114fe565b9161156a600482016109a7565b91611577600583016109a7565b91611584600682016109a7565b916104486008610b23600785016109a7565b9499989690610100966116056115fd61160c93610b96986115f06103a79e996115e96116139a60208f6115da61012082019860008301906001600160a01b03169052565b01906001600160a01b03169052565b60408d0152565b8a820360608c01526104a3565b9c6080890152565b60a0870152565b60c0850152565b60e0830152565b346103c9576106a9611635611630366004610820565b611518565b9561164899979995919594929460405190565b998a998a611596565b61044860016010610be2565b346103c95761166d3660046106ad565b6106a96111a9611651565b346103c95761081b61168b366004610820565b612454565b346103c9576106a961069d6116a6366004610d4c565b613312565b346103c95761081b6116be366004610820565b612243565b346103c95761081b6116d6366004610d4c565b612e3d565b346103c95761081b6116ee366004610d4c565b611864565b346103c95761081b611706366004610d4c565b612d8c565b61171361179f565b6103a7611731565b6104746104486104489290565b6104489061171b565b6103a761173e6000611728565b61189d565b6103a761170b565b1561175257565b60405162461bcd60e51b81528061179b600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6103a76117b46000546001600160a01b031690565b6117cd6117c033610474565b916001600160a01b031690565b1461174b565b6103a7906117df61179f565b61183f565b156117eb57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6103a79061173e6118536104746000611728565b6001600160a01b03831614156117e4565b6103a7906117d3565b906001600160a01b03905b9181191691161790565b906118926104486118999261106a565b825461186d565b9055565b6000546001600160a01b0316906118b5816000611882565b6118e86118e27f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09361106a565b9161106a565b916118f260405190565b80805b0390a3565b6104486004610aa9565b6104489060a01c610918565b6104489054611904565b1561192157565b60405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc81a5cc81b9bdd08185b1b1bddd95960521b6044820152606490fd5b906103a795949392916119726000611910565b156119975761199261198d611988336002611073565b610aa9565b61191a565b6119ed565b611992600161191a565b156119a857565b60405162461bcd60e51b815260206004820152601c60248201527f436f6e7472616374206d75737420626520696e697469616c697a6564000000006044820152606490fd5b906103a79594939291611a08611a036010610aa9565b6119a1565b906103a79594939291611a19611bc2565b611a71565b9081526040810192916103a79160200152565b6040513d6000823e3d90fd5b611a6a6103a794611a63606094989795611a5c608086019a6000870152565b6020850152565b6040830152565b0190611175565b9385611a9791969396611a8e611a868761106a565b858a8a6138e9565b85888589613dc3565b91611ab2611aad6011546001600160a01b031690565b61106a565b6327d335a890803b156103c957611ad891600091611acf60405190565b93849260e01b90565b8252818381611aeb8a8d60048401611a1e565b03925af18015611b7057611b52575b50611b4d3394611b3a611b36611b307f77a8be0890be6d79729c684636469d83d455e267a0bf0c9bc2463d8db867a5419761097b565b9761106a565b9790565b97611b4460405190565b94859485611a3d565b0390a4565b611b6a906000611b62818361036d565b8101906106ad565b38611afa565b611a31565b906103a7959493929161195f565b15611b8a57565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fd5b6103a7611bd4611bd06118fa565b1590565b611b83565b90611bec9291611be7611cf8565b611bf4565b6103a7611d34565b906103a79291611c02611bc2565b9091611c2a9034938484611c1a610448826005610988565b611c25848483613f91565b61414e565b903391611b4d611c6c611c66611c607f6d2b783673dbbf046f2e5a1f3c92ce62c29a0f5385f2b1f0eaf19019ef28cb559461097b565b9461097b565b9461106a565b946106f960405190565b906103a79291611bd9565b610448600261097b565b15611c9257565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b9060001990611878565b90611cf16104486118999261097b565b8254611cd7565b6103a7611d0560036109a7565b611d23611d10611c81565b918290611d1c565b9190565b1415611c8b565b6003611ce1565b610448600161097b565b6103a7611d23611d2a565b6103a790611d50611a036010610aa9565b611bec90611d5c611cf8565b6103a790611d68611bc2565b611f2e565b6104489060081c610474565b6104489054611d6d565b905051906103a7826103c0565b90929192611da06103eb82610722565b938185526020850190828401116103c9576103a792610480565b9080601f830112156103c957815161044892602001611d90565b6080818303126103c957611de88282611d83565b92611df68360208401611d83565b926040830151906001600160401b0382116103c957611e1a81610448938601611dba565b93606001611d83565b9037565b6103a791604091611e23565b906104d781604093611e27565b611e4c611d1860029390565b806000925b848410611e5f575050505050565b611e7b611e74600192611e6f8690565b611e33565b9360400190565b93019291611e51565b6103a79161014091611e23565b6103a7919061010090611ecf90611ea88482611e27565b611eb9604082016040860190611e40565b611eca60c0820160c0860190611e27565b820190565b910190611e84565b610240810192916103a79190611e91565b9081526040810192916103a7916020906115da565b634e487b7160e01b600052601160045260246000fd5b9190611f1e565b9290565b8203918211611f2957565b611efd565b6000611f6b91611f41611aad6010611d79565b611f60836365cd296c611f5360405190565b9687958694859360e01b90565b835260048301611ed7565b03925af18015611b70576000918291829182916120dd575b50611fbb611f95610448846007610988565b93600595611fb36104486001880198611fad8a6109a7565b90610988565b9384876143af565b611fd0611aad6011546001600160a01b031690565b90632b8a8002611fe2600483016109a7565b85546001600160a01b03165b93803b156103c9576120166000809461202161200960405190565b9889968795869460e01b90565b845260048401611ee8565b03925af1908115611b70576120719561207d93612076936120c7575b5061204a600687016109a7565b96828661206b61206560018c9701546001600160a01b031690565b946109a7565b98614557565b6148fd565b8094611f13565b926120b16120ab7f3247261fffac93019b3a34aa6692df18a5ddea75a12bf8ec4539903a608a6e4c9361097b565b9361097b565b936118f56120be60405190565b92839283611a1e565b6120d7906000611b62818361036d565b3861203d565b925090506120fd92503d8091833e6120f5818361036d565b810190611dd4565b90919238611f83565b6103a790611d3f565b611bec9061211b611cf8565b6121ad565b1561212757565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420626964206f776e65720000000000000000006044820152606490fd5b1561217357565b60405162461bcd60e51b81526020600482015260126024820152714c697374696e67206e6f742061637469766560701b6044820152606490fd5b6121bb610448826007610988565b60018101916121d16104486005611fad866109a7565b82906121f66121e783546001600160a01b031690565b6121f0336117c0565b14612120565b61220a61220560088301610aa9565b61216c565b61221f611aad6011546001600160a01b031690565b91632b8a800290611fee612235600485016109a7565b91546001600160a01b031690565b6103a79061210f565b906103a7929161225a611bc2565b612364565b1561226657565b60405162461bcd60e51b815260206004820152601b60248201527f43616c6c6572206973206e6f74206c697374696e67206f776e657200000000006044820152606490fd5b156122b257565b60405162461bcd60e51b8152602060048201526024808201527f41736b207072696365206973206c657373207468616e206d696e2062696420706044820152637269636560e01b6064820152608490fd5b1561230a57565b60405162461bcd60e51b815260206004820152601a60248201527f496e76616c69642073616c652045544820726563697069656e740000000000006044820152606490fd5b9081526040810192916103a791602090611a6a565b919091612375610448826005610988565b9161240081600161238d86546001600160a01b031690565b3396906123a39061239d896117c0565b1461225f565b6123b261220560088301610aa9565b6123cd6123c4610448600784016109a7565b895b10156122ab565b6123ed6123dd6104746000611728565b6123e68561106a565b1415612303565b6123fa8860068301611ce1565b01611882565b61243361242d7f6df0cec5e0539cca31fe823df048a8d5834ba5dc079fa1d38e5157f00f9d085b9361097b565b9361106a565b936118f561244060405190565b9283928361234f565b906103a7929161224c565b612462610448826005610988565b80546001600160a01b031633919061247d9061239d846117c0565b61248c61220560088301610aa9565b6124a1611aad6011546001600160a01b031690565b90636e74da686124b3600483016109a7565b833b156103c9576124e9936124db600080946124ce60405190565b9788958694859360e01b90565b835260048301526024820190565b03925af1908115611b7057612505928592612532575b50614ca6565b6118e86118e27f5832f888aea12cc23bd891f2d9fd4bd01b8ce0e22898b6e7cee1519f5bd469549361097b565b612542906000611b62818361036d565b386124ff565b1561254f57565b60405162461bcd60e51b815260206004820152601660248201527543616c6c6572206973206e6f7420726567697374727960501b6044820152606490fd5b6125cb8161259f610448826005610988565b6125c66125b7611aad6011546001600160a01b031690565b6125c0336117c0565b14612548565b614ca6565b6125f57ff7504a55c42715ea3e852b679d6453ecfe02acbddb4d0652aa251d4458b7cc219161097b565b906125ff60405190565b80805b0390a2565b90611bec91612614611cf8565b906103a791612621611bc2565b612659826006612635610448856007610988565b6126538361264d6104486005611fad600187016109a7565b8361465d565b01611ce1565b33906118f561268b61242d7f8283dd04c4a2b6691bd80232f254e0ad876b8bb149938d3e7ced5c6e8a35b6149361097b565b936106f960405190565b906103a791612607565b6126ac611a036010610aa9565b6103a7612720565b156126bb57565b60405162461bcd60e51b815260206004820152601e60248201527f496e7374616e742061636365707420616c726561647920656e61626c656400006044820152606490fd5b9060ff90611878565b9061271961044861189992151590565b8254612700565b3380612751600961273f61273a611bd06119888685611073565b6126b4565b61274c6001948592611073565b612709565b61260261277e7f2e259e0564e75f0e10ce0e012a5ce2528ae513b0188b619bcc581b8ba8db70329261106a565b9261095460405190565b6103a761269f565b61279d611a036010610aa9565b6103a76127f1565b156127ac57565b60405162461bcd60e51b815260206004820152601f60248201527f496e7374616e742061636365707420616c72656164792064697361626c6564006044820152606490fd5b3380612751600961280d6128086119888584611073565b6127a5565b61274c6000948592611073565b6103a7612790565b91908201809211611f2957565b6128a1600060076128936128466104488684610988565b91612889600561286d612867610448612861600189016109a7565b84610988565b86614781565b6128814261287b600f6109a7565b90612822565b908501611ce1565b6001908301612709565b01546001600160a01b031690565b6118e86118e27f9da9db6af7fcfa5edbaa006b61a744d33fe4651a4c594cddd3e9a7e757ecd8d59361097b565b611bec906128da611cf8565b6128e8610448826007610988565b9061291d6129006104486005611fad600187016109a7565b61290a8185614872565b82612917600686016109a7565b94614c0b565b33906129318361292c8461106a565b612a59565b6118f561268b61242d7f8f8619524e8d462cead34604bd2247ede24175801481e4d0b8059ac8aa41c3019361097b565b6103a7906128ce565b1561297157565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606490fd5b906129c36103eb83610722565b918252565b3d156129e2576129d73d6129b6565b903d6000602084013e565b606090565b156129ee57565b60405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608490fd5b60006103a792612a7a8293611aad612a703061106a565b849031101561296a565b90612a8460405190565b90818003925af1612a936129c8565b506129e7565b906103a79291612aa761179f565b612b18565b15612ab357565b60405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b90610100600160a81b039060081b611878565b90612b116104486118999261106a565b8254612aee565b612b4e9291612b40612b4792612b39612b34611bd06010610aa9565b612aac565b6010612b01565b6011611882565b6012611882565b6103a760016010612709565b906103a79291612a99565b612b6d61179f565b6103a76103a7612bcb565b6103a7612b65565b612b88611bc2565b6103a7612b9760016004612709565b33612bc67f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610c1860405190565b0390a1565b6103a7612b80565b612bdb61179f565b6103a76103a7612c34565b6103a7612bd3565b612bf6612c7f565b6103a7612c0560006004612709565b33612bc67f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91610c1860405190565b6103a7612bee565b15612c4357565b60405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606490fd5b6103a7612c8a6118fa565b612c3c565b6103a790612c9b61179f565b612cde565b15612ca757565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b612d01612cea8261106a565b612cfa6117c06104746000611728565b1415612ca0565b612d0c816010612b01565b6125f57f9106eb309cc633a951e77bd36af34646a9df8e6ade485938c34e3844a37b79da9161106a565b6103a790612c8f565b6103a790612d4b61179f565b612d57612cea8261106a565b612d62816012611882565b6125f57f9d3407c7200ba4f49e97f3d3f8250ec01c24b0ada6fa31053d71850793b739539161106a565b6103a790612d3f565b6103a790612da161179f565b612dac81600a611ce1565b612bc67f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c76916106f960405190565b6103a790612d95565b6103a790612def61179f565b612e08612dff6104746000611728565b612cfa8361106a565b612e1381600b611882565b6125f57f7a7b5a0a132f9e0581eb8527f66eae9ee89c2a3e79d4ac7e41a1f1f4d48a7fc29161106a565b6103a790612de3565b6103a790612e5261179f565b612eb8565b15612e5e57565b60405162461bcd60e51b815260206004820152602c60248201527f42696420736574746c656d656e7420706572696f64206d75737420626520677260448201526b06561746572207468616e20360a41b6064820152608490fd5b612ecc612ec5600061097b565b8211612e57565b612ed781600e611ce1565b612bc67f09a165ff77cf0f319f9ece89bc6dbe2a469a0da2640c9e6b501132846843daf5916106f960405190565b6103a790612e46565b6103a790612f1a61179f565b612f7c565b15612f2657565b60405162461bcd60e51b815260206004820152602860248201527f42696420726566756e6420706572696f64206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608490fd5b612f90612f89600061097b565b8211612f1f565b612f9b81600f611ce1565b612bc67f90e0312fddcd5cbec358d5c7d63976e5c97d71dfb8d6cd5f2c53b0a1a043ccf0916106f960405190565b6103a790612f0e565b906129c36103eb836103a9565b6104486040610393565b610448610140610393565b612ffc612fe9565b906000825260208080808080808080808b01600081520160008152016060815201600081520160008152016000815201600081520160008152016060905250565b905250565b610448612ff4565b613052612fdf565b9060008252602080830161303d613042565b61044861304a565b60005b82811061307b57505050565b602090613086613064565b818401520161306f565b906103a76130a66130a084612fd2565b936103a9565b601f19016020840161306c565b6000198114611f295760010190565b906130cb825190565b811015610d02576020809102010190565b906130f76130eb6104ea845490565b92600052602060002090565b9060005b8181106131085750505090565b90919261312c61312560019261311d876109a7565b815260200190565b9460010190565b9291016130fb565b90610448916130dc565b906103a7610a999261314f60405190565b93848092613134565b906103a76132556009613169612fe9565b9461318b61317e82546001600160a01b031690565b6001600160a01b03168752565b6131b26131a260018301546001600160a01b031690565b6001600160a01b03166020880152565b6131c86131c1600283016109a7565b6040880152565b6131de6131d7600383016114fe565b6060880152565b6131f46131ed600483016109a7565b6080880152565b61320a613203600583016109a7565b60a0880152565b613220613219600683016109a7565b60c0880152565b61323661322f600783016109a7565b60e0880152565b61324f61324560088301610aa9565b1515610100880152565b0161313e565b610120840152565b61044890613158565b90613277613272835190565b613090565b91600090836132858361097b565b613290610448845190565b81101561330257806132ac6132a86132fd93866130c2565b5190565b6132e26132db6132c46005611fad6132a8878b6130c2565b6132d66132cf612fdf565b948a860152565b61325d565b6020830152565b6132ec82896130c2565b526132f781886130c2565b506130b3565b613285565b5093505050565b6104489061313e565b61332961332e91613321606090565b506006611073565b613309565b9061333a613272835190565b91600090836133488361097b565b613353610448845190565b811015613302578061336b6132a861337c93866130c2565b6132e26132db6132c4836005610988565b613348565b6104486060610393565b610448610100610393565b61339e61338b565b906000825260208080808080808089016000815201606081520160008152016000815201600081520160005b8152016000905250565b610448613396565b6133e4613381565b90600082526020808084016133ca6133d4565b6104486133dc565b60005b82811061340e57505050565b6020906134196133f7565b8184015201613402565b906103a76134336130a084612fd2565b601f1901602084016133ff565b906103a76134cd600761345161338b565b9461346661317e82546001600160a01b031690565b61347c613475600183016109a7565b6020880152565b61348b6131c160028301610a7f565b61349a6131d7600383016109a7565b6134a96131ed600483016109a7565b6134b8613203600583016109a7565b6134c7613219600683016109a7565b01610aa9565b151560e0840152565b61044890613440565b906134ee613329836008611073565b6134fe6134f9825190565b613423565b926000918461350c8461097b565b613517610448845190565b81101561358c578061352f6132a861358793866130c2565b61357261353d826007610988565b613569611a5c6135516119888b6009611073565b9261356461355d613381565b968d880152565b6134d6565b15156040830152565b61357c828a6130c2565b526132f781896130c2565b61350c565b509450505050565b60005b8281106135a357505050565b606082820152602001613597565b906103a76135c16130a084612fd2565b601f190160208401613594565b6135de6135d9825190565b6135b1565b806000916135eb8361097b565b945b6135f8610448865190565b8610156136f057613621600961361b6136146132a88a8a6130c2565b6005610988565b01613309565b9461362d6134f9875190565b61363788866130c2565b5261364287856130c2565b5061364c8561097b565b613657610448885190565b8110156136d957806132f781886136b86136776132a86136d4978e6130c2565b613569611a5c60076135646136a96119886136928785610988565b936136a38a6128938a600994610988565b90611073565b946136b2613381565b97880152565b6136c28c8a6130c2565b51906136ce83836130c2565b526130c2565b61364c565b50929450946136e7906130b3565b949391936135ed565b935093505050565b61044861517f565b905051906103a782610706565b91909160a0818403126103c95761372460a0610393565b9260006137318284613700565b908501526020820151906001600160401b0382116103c9576137588161378b938501611dba565b6020860152604061376b82828601611d83565b90860152606061377d82828601613700565b908601526080809301611d83565b90830152565b9190916040818403126103c9576137a86040610393565b9260006137b58284611d83565b9085015260208201516001600160401b0381116103c9576132db920161370d565b906020828203126103c95781516001600160401b0381116103c9576104489201613791565b1561380257565b60405162461bcd60e51b815260206004820152601a60248201527f43616c6c6572206973206e6f7420646f6d61696e206f776e65720000000000006044820152606490fd5b1561384e57565b60405162461bcd60e51b815260206004820152602160248201527f446f6d61696e20616c7265616479206c6973746564206f6e20726567697374726044820152607960f81b6064820152608490fd5b156138a457565b60405162461bcd60e51b815260206004820152601960248201527f4d696e696d756d20626964207072696365206973207a65726f000000000000006044820152606490fd5b60006139269194939294613908611aad6011546001600160a01b031690565b6124db631a24254761391960405190565b9586948593849360e01b90565b03915afa938415611b70576104746123e6936123c6611d18613985606060206103a79b6117c0996000916139bf575b5001805151613976906001600160a01b0316613970336117c0565b146137fb565b5101516001600160a01b031690565b946104486139b860006139b361399a82611728565b996139ad6001600160a01b038c166117c0565b14613847565b61097b565b821161389d565b6139da913d8091833e6139d2818361036d565b8101906137d6565b38613955565b369037565b906103a76139f56130a084612fd2565b601f1901602084016139e0565b634e487b7160e01b600052600060045260246000fd5b90611cf16104486118999290565b9160001960089290920291821b911b611878565b9190613a4b6104486118999361097b565b908354613a26565b6103a791600091613a3a565b818110613a6a575050565b80613a786000600193613a53565b01613a5f565b9190601f8111613a8d57505050565b613a9f6103a793600052602060002090565b906020601f840181900483019310613ac2575b6020601f909101045b0190613a5f565b9091508190613ab2565b600019600883021c1916906002021790565b90613ae7815190565b906001600160401b03821161038e57613b0a82613b0485546109c7565b85613a7e565b602090601f8311600114613b3857611899929160009183613b2d575b5050613acc565b015190503880613b26565b601f19831691613b4d85600052602060002090565b9260005b818110613b8b57509160029391856001969410613b72575b50505002019055565b01516000196008601f8516021c19169055388080613b69565b91936020600181928787015181550195019201613b51565b906103a791613ade565b81810292918115918404141715611f2957565b818110613bcb575050565b80613bd96000600193613a53565b01613bc0565b90613bf290600019906020036008021c90565b8154169055565b9091828110613c0757505050565b6103a79290613c15906130eb565b9081019101613bc0565b90600160401b811161038e5781613c376103a7935490565b90828155613bf9565b8151916001600160401b03831161038e57613c6a6130eb600192613c648686613c1f565b60200190565b92049160005b838110613c7d5750505050565b6001906020613c8d610448865190565b9401938184015501613c70565b906103a791613c40565b6103a79190613d8a9061012090600990613ccf81613cc987516001600160a01b031690565b90611882565b613cea60018201613cc960208801516001600160a01b031690565b613d0260028201613cfc604088015190565b90613a18565b613d1a60038201613d14606088015190565b90613ba3565b613d2c60048201613cfc608088015190565b613d4460058201613d3e60a088015190565b90611ce1565b613d5660068201613d3e60c088015190565b613d6860078201613d3e60e088015190565b613d8360088201613d7d610100880151151590565b90612709565b0192015190565b90613c9a565b906103a791613ca4565b90815491600160401b83101561038e5782613dbd9160016103a795018155610cdf565b90613a3a565b919295949095613dd1600090565b50613ddc600d6109a7565b93849733944290600198600096613df28861097b565b613dfb906139e5565b9689613e05612fe9565b998a0190613e1b91906001600160a01b03169052565b6001600160a01b0316602089015260408801526060870152608086015260a085015260c084015260e0830152841515610100830152610120820152613e61836005610988565b90613e6b91613d90565b613e76906006611073565b90613e8091613d9a565b613e8a600d6109a7565b90613e949061097b565b613e9d91612822565b6103a790600d611ce1565b15613eaf57565b60405162461bcd60e51b8152602060048201526016602482015275131a5cdd1a5b99c8191bd95cc81b9bdd08195e1a5cdd60521b6044820152606490fd5b15613ef457565b60405162461bcd60e51b8152602060048201526024808201527f426964207072696365206973206c657373207468616e206d696e2062696420706044820152637269636560e01b6064820152608490fd5b15613f4c57565b60405162461bcd60e51b815260206004820152601d60248201527f427579657220494420686173682063616e6e6f7420626520656d7074790000006044820152606490fd5b611d18610448613ffb926139b36103a79695613ff4611d186104486007613fc260008801546001600160a01b031690565b96613fdf600098613fd86117c06104748c611728565b1415613ea8565b613fee61220560088301610aa9565b016109a7565b1015613eed565b1415613f45565b9061400b815190565b906001600160401b03821161038e5761402882613b0485546109c7565b602090601f831160011461404a57611899929160009183613b2d575050613acc565b601f1983169161405f85600052602060002090565b9260005b81811061408357509160029391856001969410613b725750505002019055565b91936020600181928787015181550195019201614063565b906103a791614002565b6103a79190613d7d9060e0906007906140c981613cc987516001600160a01b031690565b6140db60018201613d3e602088015190565b6140f3600282016140ed604088015190565b9061409b565b61410560038201613cfc606088015190565b61411760048201613d3e608088015190565b61412960058201613d3e60a088015190565b61413b60068201613d3e60c088015190565b01920151151590565b906103a7916140a5565b919493909261415d600c6109a7565b93849283973393426000199160009461417461338b565b6001600160a01b0389168782015296602088015260408701526060860152608085015260a084015260c0830152151560e08201526141b3836007610988565b906141bd91614144565b6141c8906008611073565b906141d291613d9a565b600901906141df91613d9a565b6141e9600c6109a7565b6141f3600161097b565b6141fc91612822565b6103a790600c611ce1565b1561420e57565b60405162461bcd60e51b8152602060048201526012602482015271109a5908191bd95cc81b9bdd08195e1a5cdd60721b6044820152606490fd5b8015156103c2565b905051906103a782614248565b906020828203126103c95761044891614250565b1561427857565b60405162461bcd60e51b815260206004820152601d60248201527f496e76616c6964206d616e6167656420444b494d206b657920686173680000006044820152606490fd5b156142c457565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c696420637573746f6d20444b494d206b65792068617368000000006044820152606490fd5b6104d76143219260209261431b815190565b94859290565b93849101610480565b61044891614309565b1561433a57565b60405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103932b1b2b4bb32b960811b6044820152606490fd5b1561437957565b60405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103237b6b0b4b760911b6044820152606490fd5b80549294909391926001600160a01b03166143dc6000916143d56117c061047485611728565b1415614207565b6143fb6143f2828601546001600160a01b031690565b61239d336117c0565b61440a61220560088601610aa9565b6002840190614421611d186104486120ab856109a7565b146144ac576144a693613fee611d18946144a0611d18611f1a6003611f1a9861445e6103a79e614458611d1861044860049d6109a7565b146142bd565b61448661446a60405190565b809261447a60208301918261432a565b9081038252038261036d565b614498614491825190565b9160200190565b209b016109a7565b14614333565b14614372565b5060206144e793956144c9611aad6012546001600160a01b031690565b6124db6319d091526144da60405190565b9788948593849360e01b90565b03915afa908115611b70576103a795613fee611d18946144a0611d18611f1a6003600497614524611f1a9a6144a69d600091614529575b50614271565b61445e565b61454a915060203d8111614550575b614542818361036d565b81019061425d565b3861451e565b503d614538565b90916125c6816103a794612917600186016109a7565b1561457457565b60405162461bcd60e51b815260206004820152601860248201527f526566756e6420616c726561647920696e6974696174656400000000000000006044820152606490fd5b156145c057565b60405162461bcd60e51b8152602060048201526024808201527f4e6577207072696365206e6f742067726561746572207468616e206f6c6420706044820152637269636560e01b6064820152608490fd5b1561461857565b60405162461bcd60e51b815260206004820152601c60248201527f496e636f727265637420616d6f756e74206f66204554482073656e74000000006044820152606490fd5b611d1861044860066146cc936146a461220560086103a7999861468d6121e760008701546001600160a01b031690565b6134c761469f611bd060078801610aa9565b61456d565b01936146bc6146b5610448876109a7565b82116145b9565b6146c634956109a7565b90611f13565b14614611565b156146d957565b60405162461bcd60e51b815260206004820152601960248201527f526566756e6420706572696f64206e6f742073746172746564000000000000006044820152606490fd5b1561472557565b60405162461bcd60e51b815260206004820152602e60248201527f4c697374696e6720657870697265642e204269642063616e206265207769746860448201526d647261776e206469726563746c7960901b6064820152608490fd5b60086103a7926134c76147de936147a56121e760008301546001600160a01b031690565b6147b761469f611bd060078401610aa9565b6147d8611d18610448429361287b60046147d1600e6109a7565b92016109a7565b116146d2565b61471e565b156147ea57565b60405162461bcd60e51b81526020600482015260146024820152731499599d5b99081b9bdd081a5b9a5d1a585d195960621b6044820152606490fd5b1561482d57565b60405162461bcd60e51b815260206004820152601760248201527f526566756e6420706572696f64206e6f7420656e6465640000000000000000006044820152606490fd5b9061488e906008906134c76121e785546001600160a01b031690565b6148955750565b806148ad6148a860076103a79401610aa9565b6147e3565b6148c0611d1861044860054294016109a7565b1015614826565b610448670de0b6b3a764000061097b565b634e487b7160e01b600052601260045260246000fd5b81156148f8570490565b6148d8565b909190614939614927614919614913600a6109a7565b86613bad565b6149216148c7565b906148ee565b91614933838096611f13565b90612a59565b614943600061097b565b811161494c5750565b6103a79061292c600b546001600160a01b031690565b9190613a4b6104486118999390565b6103a791600091614962565b9060009161499b61499382600052602060002090565b928354613acc565b905555565b91929060208210156149f857601f84116001146149c257611899929350613acc565b50906149f36103a79360016149ea6149df85600052602060002090565b92601f602091010490565b82019101613a5f565b61497d565b50614a318293614a0f600194600052602060002090565b613abb6020601f860104820192601f861680614a39575b50601f602091010490565b600202179055565b614a4590888603613bdf565b38614a26565b929091600160401b821161038e5760201115614a92576020811015614a735761189991613acc565b60019160ff1916614a8984600052602060002090565b55600202019055565b60019150600202019055565b908154614aaa816109c7565b90818311614ad3575b818310614ac1575b50505050565b614aca936149a0565b38808080614abb565b614adf83838387614a4b565b614ab3565b60006103a791614a9e565b90600003614b00576103a790614ae4565b613a02565b60006103a791613c1f565b90600003614b00576103a790614b05565b600060096103a7928280820155826001820155614b418360028301614971565b614b4e8360038301614aef565b614b5b8360048301614971565b614b688360058301613a53565b614b758360068301613a53565b614b828360078301613a53565b82600882015501614b10565b90600003614b00576103a790614b21565b600080825590600790614bb58360018301613a53565b614bc28360028301614aef565b614bcf8360038301614971565b614bdc8360048301613a53565b614be98360058301613a53565b614bf68360068301613a53565b0155565b90600003614b00576103a790614b9f565b600091614c6a916103a794614c55611bd06008614c4686614c41610448614c3b8c8a01546001600160a01b031690565b85611073565b6153e9565b60098401936134c787866153e9565b9081614c90575b50614c6f575b506007610988565b614bfa565b83614c85614c8a92611fad6001600592016109a7565b614b8e565b38614c62565b549050614c9f611d188661097b565b1438614c5c565b614cdf6009600092614cbb8460088301612709565b614cda85614c4161044860066136a3898701546001600160a01b031690565b015490565b614ceb611d188361097b565b14614cf4575050565b614c856103a7926005610988565b6103a790614d0e61179f565b614dba565b15614d1a57565b60405162461bcd60e51b815260206004820152601c60248201527f4164647265737320616c7265616479206f6e20616c6c6f776c697374000000006044820152606490fd5b916001600160a01b0360089290920291821b911b611878565b9190614d896104486118999361106a565b908354614d5f565b90815491600160401b83101561038e5782614db49160016103a795018155610cdf565b90614d78565b90614dc5600061097b565b614dd0610448845190565b811015614e6e5780614df5614de8614e6993866130c2565b516001600160a01b031690565b614e2c81614e27816104486002614e1a614e15611bd06119888685611073565b614d13565b61274c6001938492611073565b614d91565b614e567f41f4a012571b6bf21f3c6557be5d1a28851ce415203203b84c14099b84fe97379161106a565b90614e6060405190565b600090a26130b3565b614dc5565b509050565b6103a790614d02565b6103a790614e8861179f565b614ed9565b15614e9457565b60405162461bcd60e51b815260206004820152601a60248201527f4164647265737320616c726561647920646973616c6c6f7765640000000000006044820152606490fd5b906000614ee58161097b565b614ef0610448855190565b811015614f665780614f08614de8614f6193876130c2565b614f2c8461274c836002614f27614f226119888484611073565b614e8d565b611073565b614f37816001615245565b614e567ff27dccb929dd3f4dba2d3ffc29a7c74e35995e051a268a7c466f9ddabdf81eac9161106a565b614ee5565b50509050565b6103a790614e7c565b614f7d61179f565b6103a7614ff7565b15614f8c57565b60405162461bcd60e51b815260206004820152601d60248201527f416c6c6f77206c69737420697320616c726561647920656e61626c65640000006044820152606490fd5b9060ff60a01b9060a01b611878565b90614ff061044861189992151590565b8254614fd1565b61500c615007611bd06000611910565b614f85565b61501860016000614fe0565b7f8a943acd5f4e6d3df7565a4a08a93f6b04cc31bb6c01ca4aef7abd6baf455ec361504260405190565b8080612bc6565b6103a7614f75565b61505961179f565b6103a76150ad565b1561506857565b60405162461bcd60e51b815260206004820152601e60248201527f416c6c6f77206c69737420697320616c72656164792064697361626c656400006044820152606490fd5b6150bf6150ba6000611910565b615061565b6150ca600080614fe0565b7f2d35c8d348a345fd7b3b03b7cfcf7ad0b60c2d46742d5ca536342e4185becb0761504260405190565b6103a7615051565b9061510b6130eb6104ea845490565b9060005b81811061511c5750505090565b90919261514a61312560019261513987546001600160a01b031690565b6001600160a01b0316815260200190565b92910161510f565b90610448916150fc565b906103a7610a999261516d60405190565b93848092615152565b6104489061515c565b6104486001615176565b906151986130eb6104ea845490565b9060005b8181106151a95750505090565b9091926151c661312560019261513987546001600160a01b031690565b92910161519c565b9061044891615189565b906103a7610a99926151e960405190565b938480926151ce565b610448906151d8565b634e487b7160e01b600052603160045260246000fd5b6103a791600091614d78565b8054801561524057600019019061523d6152378383610cdf565b90615211565b55565b6151fb565b61525a61526192615255836151f2565b6152f8565b9092901590565b156152a35760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b6103a7916152bc6152b2835490565b6146c6600161097b565b908181036152cc575b505061521d565b614db46152df610d286152e69486610cdf565b9184610cdf565b38806152c5565b61044860001961097b565b919082519260006153088161097b565b855b8110156153525761531e614de882856130c2565b6153306001600160a01b0386166117c0565b146153485761534161530a916130b3565b9050615308565b9450505050600190565b5093505050611d186152ed565b9061536e6130eb6104ea845490565b9060005b81811061537f5750505090565b90919261539461312560019261311d876109a7565b929101615372565b906104489161535f565b906103a7610a99926153b760405190565b9384809261539c565b610448906153a6565b8054801561524057600019019061523d6153e38383610cdf565b90613a53565b61525a6153fe926153f9836153c0565b615479565b156154405760405162461bcd60e51b81526020600482015260156024820152743ab4b73a191a9b103737ba1034b71030b93930bc9760591b6044820152606490fd5b6103a79161544f6152b2835490565b9081810361545f575b50506153c9565b613dbd6152df6110a96154729486610cdf565b3880615458565b919082519260006154898161097b565b855b8110156153525761549f6132a882856130c2565b8414615348576154b161548b916130b3565b905061548956fea264697066735822122003aeb335a6d381b0a582f93c9d1aab7b6e89b54509710141d9511d69f98051bd64736f6c63430008120033", + "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c80630373c0bf1461035257806303f693541461034d5780630d81539c146103485780630eaaf4c8146103435780630f2bc8b31461033e5780631756c30e146103395780631ce59f811461033457806321f67fbb1461032f5780632ac44f121461032a5780632f6db23814610325578063392e53cd146103205780633ec622791461031b5780634423c5f11461031657806346904840146103115780634f20fe5d1461030c5780635c975abb1461030757806364b55bed146103025780636759789f146102fd5780636aa633b6146102f85780636c2c9c7d146102f35780636caacbe7146102ee578063715018a6146102e95780637e064092146102e45780637e7a9c6c146102df5780637f17caa7146102da57806381c14314146102d557806386cfa7d3146102d057806387547367146102cb578063887f495a146102c65780638da5cb5b146102c15780639012c4a8146102bc578063944b8b2e146102b757806396ec50c3146102b25780639d8717a8146102ad578063a15ce280146102a8578063a8ef333f146102a3578063ad9287631461029e578063babcc53914610299578063bb46acd314610294578063bca0b9101461028f578063c0c53b8b1461028a578063c6a2aac814610285578063cf8e629a14610280578063ddca3f431461027b578063de74e57b14610276578063e38df96d14610271578063e6282c6e1461026c578063eb18a9d814610267578063f15851e614610262578063f160d3691461025d578063f2fde38b146102585763f6cda469036103c9576116f3565b6116db565b6116c3565b6116ab565b611690565b611678565b61165d565b61161a565b611474565b611450565b611438565b61141f565b6113dd565b6113b7565b611382565b611353565b611338565b611318565b6112b0565b6111c3565b61118e565b611151565b61112c565b611113565b6110cb565b6110af565b611012565b610ffa565b610fdf565b610fbb565b610fa3565b610f8b565b610ee3565b610ebc565b610e89565b610d31565b610cae565b610c87565b610bf9565b610b9e565b610963565b610935565b6108f7565b6108bb565b6108a3565b61088b565b610873565b610858565b610834565b6107fc565b6106da565b610682565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761038e57604052565b610357565b906103a76103a060405190565b928361036d565b565b6001600160401b03811161038e5760208091020190565b805b036103c957565b600080fd5b905035906103a7826103c0565b909291926103f06103eb826103a9565b610393565b93818552602080860192028301928184116103c957915b8383106104145750505050565b6020809161042284866103ce565b815201920191610407565b9080601f830112156103c957816020610448933591016103db565b90565b906020828203126103c95781356001600160401b0381116103c957610448920161042d565b9052565b6001600160a01b031690565b60005b8381106104935750506000910152565b8181015183820152602001610483565b6104c46104cd6020936104d7936104b8815190565b80835293849260200190565b95869101610480565b601f01601f191690565b0190565b906104fb6104f46104ea845190565b8084529260200190565b9260200190565b9060005b81811061050c5750505090565b9091926105296105226001928651815260200190565b9460200190565b9291016104ff565b80516001600160a01b031682526104489161012061058161014083016020858101516001600160a01b03169085015261056f60408601516040860152565b606085015184820360608601526104a3565b9261059160808201516080850152565b6105a060a082015160a0850152565b6105af60c082015160c0850152565b6105be60e082015160e0850152565b610100818101511515908401520151906101208184039101526104db565b8051825261044891604081019160200151906020818403910152610531565b90610448916105dc565b9061061b610611835190565b8083529160200190565b908161062d6020830284019460200190565b926000915b83831061064157505050505090565b9091929394602061066461065d838560019503875289516105fb565b9760200190565b9301930191939290610632565b602080825261044892910190610605565b346103c9576106a961069d61069836600461044b565b613266565b60405191829182610671565b0390f35b60009103126103c957565b610448916008021c81565b9061044891546106b8565b6104486000600c6106c3565b346103c9576106ea3660046106ad565b6106a96106f56106ce565b6040515b9182918290815260200190565b6001600160a01b0381166103c2565b905035906103a782610706565b6001600160401b03811161038e57602090601f01601f19160190565b90826000939282370152565b9092919261075a6103eb82610722565b938185526020850190828401116103c9576103a79261073e565b9080601f830112156103c9578160206104489335910161074a565b909160c0828403126103c9576107a583836103ce565b926107b381602085016103ce565b926107c182604083016103ce565b926107cf8360608401610715565b926080830135906001600160401b0382116103c9576107f381610448938601610774565b9360a0016103ce565b346103c95761081b61080f36600461078f565b94939093929192611b75565b604051005b906020828203126103c957610448916103ce565b346103c95761081b610847366004610820565b612961565b6104486000600f6106c3565b346103c9576108683660046106ad565b6106a96106f561084c565b346103c95761081b610886366004610820565b61258d565b346103c95761089b3660046106ad565b61081b61281a565b346103c9576108b33660046106ad565b61081b612be6565b346103c95761081b6108ce366004610820565b61282f565b90816102409103126103c95790565b90610240828203126103c957610448916108d3565b346103c95761081b61090a3660046108e2565b612106565b610448916008021c5b60ff1690565b90610448915461090f565b6104486000601061091e565b346103c9576109453660046106ad565b6106a9610950610929565b6040515b91829182901515815260200190565b346103c9576109733660046106ad565b61081b612b78565b6104486104486104489290565b906109929061097b565b600052602052604060002090565b6104489081565b61044890546109a0565b634e487b7160e01b600052602260045260246000fd5b90600160028304921680156109e7575b60208310146109e257565b6109b1565b91607f16916109d7565b80546000939291610a0e610a04836109c7565b8085529360200190565b9160018116908115610a605750600114610a2757505050565b610a3a9192939450600052602060002090565b916000925b818410610a4c5750500190565b805484840152602090930192600101610a3f565b92949550505060ff1916825215156020020190565b90610448916109f1565b906103a7610a9992610a9060405190565b93848092610a75565b038361036d565b61044890610918565b6104489054610aa0565b610abe906007610988565b90610ad082546001600160a01b031690565b91610add600182016109a7565b91610aea60028301610a7f565b91610af7600382016109a7565b91610b04600483016109a7565b91610b11600582016109a7565b916104486007610b23600685016109a7565b9301610aa9565b93989795610b8860e096610b81610b7988610b9698610b6c6103a79e99610b65610b8f9a600061010087019601906001600160a01b03169052565b60208d0152565b8a820360408c01526104a3565b9c6060890152565b6080870152565b60a0850152565b60c0830152565b019015159052565b346103c9576106a9610bb9610bb4366004610820565b610ab3565b94610bcc98969894919493929360405190565b98899889610b2a565b610448916008021c610474565b906104489154610bd5565b6104486000600b610be2565b346103c957610c093660046106ad565b6106a9610c14610bed565b6040515b918291826001600160a01b03909116815260200190565b90610c3e6104f46104ea845190565b9060005b818110610c4f5750505090565b909192610c6e61052260019286516001600160a01b0316815260200190565b929101610c42565b602080825261044892910190610c2f565b346103c957610c973660046106ad565b6106a9610ca26136f8565b60405191829182610c76565b346103c957610cbe3660046106ad565b6106a96109506118fa565b634e487b7160e01b600052603260045260246000fd5b8054821015610d0257610cf9600191600052602060002090565b91020190600090565b610cc9565b60016000610d13825490565b831015610d2e575061044891610d2891610cdf565b90610be2565b80fd5b346103c9576106a9610c14610d47366004610820565b610d07565b906020828203126103c95761044891610715565b80516001600160a01b03168252906104489060e080610d9e6101008401610d8c60208801516020870152565b604087015185820360408701526104a3565b94610dae60608201516060860152565b610dbd60808201516080860152565b610dcc60a082015160a0860152565b610ddb60c082015160c0860152565b01511515910152565b805182529061044890604080610e096060840160208701518582036020870152610d60565b9401511515910152565b9061044891610de4565b90610e29610611835190565b9081610e3b6020830284019460200190565b926000915b838310610e4f57505050505090565b90919293946020610e6b61065d83856001950387528951610e13565b9301930191939290610e40565b602080825261044892910190610e1d565b346103c9576106a9610ea4610e9f366004610d4c565b6134df565b60405191829182610e78565b6104486014600061091e565b346103c957610ecc3660046106ad565b6106a9610950610eb0565b6104486000600d6106c3565b346103c957610ef33660046106ad565b6106a96106f5610ed7565b90929192610f0e6103eb826103a9565b93818552602080860192028301928184116103c957915b838310610f325750505050565b60208091610f408486610715565b815201920191610f25565b9080601f830112156103c95781602061044893359101610efe565b906020828203126103c95781356001600160401b0381116103c9576104489201610f4b565b346103c95761081b610f9e366004610f66565b614f6c565b346103c957610fb33660046106ad565b61081b611743565b346103c95761081b610fce366004610820565b612f05565b6104486000600e6106c3565b346103c957610fef3660046106ad565b6106a96106f5610fd3565b346103c95761081b61100d366004610f66565b614e73565b346103c9576110223660046106ad565b61081b612788565b91906040838203126103c957610448906110448185610715565b936020016103ce565b61044890610474906001600160a01b031682565b6104489061104d565b61044890611061565b906109929061106a565b61108b600691600092611073565b90611094825490565b831015610d2e5750610448916110a991610cdf565b906106c3565b346103c9576106a96106f56110c536600461102a565b9061107d565b346103c95761081b6110de366004610d4c565b612d36565b90916060828403126103c9576104486110fc84846103ce565b9361110a81602086016103ce565b93604001610715565b346103c95761081b6111263660046110e3565b91612449565b346103c95761113c3660046106ad565b6106a9610c146000546001600160a01b031690565b346103c95761081b611164366004610820565b612dda565b61044860006011610be2565b6104709061106a565b6020810192916103a79190611175565b346103c95761119e3660046106ad565b6106a96111a9611169565b6040519182918261117e565b61108b600891600092611073565b346103c9576106a96106f56111d936600461102a565b906111b5565b906111eb610611835190565b90816111fd6020830284019460200190565b926000915b83831061121157505050505090565b9091929394602061122d61065d83856001950387528951610e13565b9301930191939290611202565b90610448916111df565b90611250610611835190565b90816112626020830284019460200190565b926000915b83831061127657505050505090565b9091929394602061129261065d8385600195038752895161123a565b9301930191939290611267565b602080825261044892910190611244565b346103c9576106a96112cb6112c636600461044b565b6135ce565b6040519182918261129f565b916060838303126103c9576112ec82846103ce565b926112fa83602083016103ce565b9260408201356001600160401b0381116103c9576104489201610774565b61081b6113263660046112d7565b91611c76565b61044860006012610be2565b346103c9576113483660046106ad565b6106a96111a961132c565b346103c95761081b611366366004610820565b612fc9565b6104489061137d600291600092611073565b61091e565b346103c9576106a9610950611398366004610d4c565b61136b565b91906040838203126103c9576104489061104481856103ce565b61081b6113c536600461139d565b90612695565b6104489061137d600991600092611073565b346103c9576106a96109506113f3366004610d4c565b6113cb565b90916060828403126103c9576104486114118484610715565b9361110a8160208601610715565b346103c95761081b6114323660046113f8565b91612b5a565b346103c9576114483660046106ad565b61081b615049565b346103c9576114603660046106ad565b61081b6150f4565b6104486000600a6106c3565b346103c9576114843660046106ad565b6106a96106f5611468565b805460009392916114a2610a04836109c7565b9160018116908115610a6057506001146114bb57505050565b6114ce9192939450600052602060002090565b916000925b8184106114e05750500190565b8054848401526020909301926001016114d3565b906104489161148f565b906103a7610a999261150f60405190565b938480926114f4565b611523906005610988565b80546001600160a01b03169161154360018301546001600160a01b031690565b91611550600282016109a7565b9161155d600383016114fe565b9161156a600482016109a7565b91611577600583016109a7565b91611584600682016109a7565b916104486008610b23600785016109a7565b9499989690610100966116056115fd61160c93610b96986115f06103a79e996115e96116139a60208f6115da61012082019860008301906001600160a01b03169052565b01906001600160a01b03169052565b60408d0152565b8a820360608c01526104a3565b9c6080890152565b60a0870152565b60c0850152565b60e0830152565b346103c9576106a9611635611630366004610820565b611518565b9561164899979995919594929460405190565b998a998a611596565b61044860016010610be2565b346103c95761166d3660046106ad565b6106a96111a9611651565b346103c95761081b61168b366004610820565b612454565b346103c9576106a961069d6116a6366004610d4c565b613312565b346103c95761081b6116be366004610820565b612243565b346103c95761081b6116d6366004610d4c565b612e3d565b346103c95761081b6116ee366004610d4c565b611864565b346103c95761081b611706366004610d4c565b612d8c565b61171361179f565b6103a7611731565b6104746104486104489290565b6104489061171b565b6103a761173e6000611728565b61189d565b6103a761170b565b1561175257565b60405162461bcd60e51b81528061179b600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6103a76117b46000546001600160a01b031690565b6117cd6117c033610474565b916001600160a01b031690565b1461174b565b6103a7906117df61179f565b61183f565b156117eb57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6103a79061173e6118536104746000611728565b6001600160a01b03831614156117e4565b6103a7906117d3565b906001600160a01b03905b9181191691161790565b906118926104486118999261106a565b825461186d565b9055565b6000546001600160a01b0316906118b5816000611882565b6118e86118e27f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09361106a565b9161106a565b916118f260405190565b80805b0390a3565b6104486004610aa9565b6104489060a01c610918565b6104489054611904565b1561192157565b60405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc81a5cc81b9bdd08185b1b1bddd95960521b6044820152606490fd5b906103a795949392916119726000611910565b156119975761199261198d611988336002611073565b610aa9565b61191a565b6119ed565b611992600161191a565b156119a857565b60405162461bcd60e51b815260206004820152601c60248201527f436f6e7472616374206d75737420626520696e697469616c697a6564000000006044820152606490fd5b906103a79594939291611a08611a036010610aa9565b6119a1565b906103a79594939291611a19611bc2565b611a71565b9081526040810192916103a79160200152565b6040513d6000823e3d90fd5b611a6a6103a794611a63606094989795611a5c608086019a6000870152565b6020850152565b6040830152565b0190611175565b9385611a9791969396611a8e611a868761106a565b858a8a6138e9565b85888589613dc3565b91611ab2611aad6011546001600160a01b031690565b61106a565b6327d335a890803b156103c957611ad891600091611acf60405190565b93849260e01b90565b8252818381611aeb8a8d60048401611a1e565b03925af18015611b7057611b52575b50611b4d3394611b3a611b36611b307f77a8be0890be6d79729c684636469d83d455e267a0bf0c9bc2463d8db867a5419761097b565b9761106a565b9790565b97611b4460405190565b94859485611a3d565b0390a4565b611b6a906000611b62818361036d565b8101906106ad565b38611afa565b611a31565b906103a7959493929161195f565b15611b8a57565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fd5b6103a7611bd4611bd06118fa565b1590565b611b83565b90611bec9291611be7611cf8565b611bf4565b6103a7611d34565b906103a79291611c02611bc2565b9091611c2a9034938484611c1a610448826005610988565b611c25848483613f91565b61414e565b903391611b4d611c6c611c66611c607f6d2b783673dbbf046f2e5a1f3c92ce62c29a0f5385f2b1f0eaf19019ef28cb559461097b565b9461097b565b9461106a565b946106f960405190565b906103a79291611bd9565b610448600261097b565b15611c9257565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b9060001990611878565b90611cf16104486118999261097b565b8254611cd7565b6103a7611d0560036109a7565b611d23611d10611c81565b918290611d1c565b9190565b1415611c8b565b6003611ce1565b610448600161097b565b6103a7611d23611d2a565b6103a790611d50611a036010610aa9565b611bec90611d5c611cf8565b6103a790611d68611bc2565b611f2e565b6104489060081c610474565b6104489054611d6d565b905051906103a7826103c0565b90929192611da06103eb82610722565b938185526020850190828401116103c9576103a792610480565b9080601f830112156103c957815161044892602001611d90565b6080818303126103c957611de88282611d83565b92611df68360208401611d83565b926040830151906001600160401b0382116103c957611e1a81610448938601611dba565b93606001611d83565b9037565b6103a791604091611e23565b906104d781604093611e27565b611e4c611d1860029390565b806000925b848410611e5f575050505050565b611e7b611e74600192611e6f8690565b611e33565b9360400190565b93019291611e51565b6103a79161014091611e23565b6103a7919061010090611ecf90611ea88482611e27565b611eb9604082016040860190611e40565b611eca60c0820160c0860190611e27565b820190565b910190611e84565b610240810192916103a79190611e91565b9081526040810192916103a7916020906115da565b634e487b7160e01b600052601160045260246000fd5b9190611f1e565b9290565b8203918211611f2957565b611efd565b6000611f6b91611f41611aad6010611d79565b611f60836365cd296c611f5360405190565b9687958694859360e01b90565b835260048301611ed7565b03925af18015611b70576000918291829182916120dd575b50611fbb611f95610448846007610988565b93600595611fb36104486001880198611fad8a6109a7565b90610988565b9384876143af565b611fd0611aad6011546001600160a01b031690565b90632b8a8002611fe2600483016109a7565b85546001600160a01b03165b93803b156103c9576120166000809461202161200960405190565b9889968795869460e01b90565b845260048401611ee8565b03925af1908115611b70576120719561207d93612076936120c7575b5061204a600687016109a7565b96828661206b61206560018c9701546001600160a01b031690565b946109a7565b98614557565b6148fd565b8094611f13565b926120b16120ab7f3247261fffac93019b3a34aa6692df18a5ddea75a12bf8ec4539903a608a6e4c9361097b565b9361097b565b936118f56120be60405190565b92839283611a1e565b6120d7906000611b62818361036d565b3861203d565b925090506120fd92503d8091833e6120f5818361036d565b810190611dd4565b90919238611f83565b6103a790611d3f565b611bec9061211b611cf8565b6121ad565b1561212757565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420626964206f776e65720000000000000000006044820152606490fd5b1561217357565b60405162461bcd60e51b81526020600482015260126024820152714c697374696e67206e6f742061637469766560701b6044820152606490fd5b6121bb610448826007610988565b60018101916121d16104486005611fad866109a7565b82906121f66121e783546001600160a01b031690565b6121f0336117c0565b14612120565b61220a61220560088301610aa9565b61216c565b61221f611aad6011546001600160a01b031690565b91632b8a800290611fee612235600485016109a7565b91546001600160a01b031690565b6103a79061210f565b906103a7929161225a611bc2565b612364565b1561226657565b60405162461bcd60e51b815260206004820152601b60248201527f43616c6c6572206973206e6f74206c697374696e67206f776e657200000000006044820152606490fd5b156122b257565b60405162461bcd60e51b8152602060048201526024808201527f41736b207072696365206973206c657373207468616e206d696e2062696420706044820152637269636560e01b6064820152608490fd5b1561230a57565b60405162461bcd60e51b815260206004820152601a60248201527f496e76616c69642073616c652045544820726563697069656e740000000000006044820152606490fd5b9081526040810192916103a791602090611a6a565b919091612375610448826005610988565b9161240081600161238d86546001600160a01b031690565b3396906123a39061239d896117c0565b1461225f565b6123b261220560088301610aa9565b6123cd6123c4610448600784016109a7565b895b10156122ab565b6123ed6123dd6104746000611728565b6123e68561106a565b1415612303565b6123fa8860068301611ce1565b01611882565b61243361242d7f6df0cec5e0539cca31fe823df048a8d5834ba5dc079fa1d38e5157f00f9d085b9361097b565b9361106a565b936118f561244060405190565b9283928361234f565b906103a7929161224c565b612462610448826005610988565b80546001600160a01b031633919061247d9061239d846117c0565b61248c61220560088301610aa9565b6124a1611aad6011546001600160a01b031690565b90636e74da686124b3600483016109a7565b833b156103c9576124e9936124db600080946124ce60405190565b9788958694859360e01b90565b835260048301526024820190565b03925af1908115611b7057612505928592612532575b50614ca6565b6118e86118e27f5832f888aea12cc23bd891f2d9fd4bd01b8ce0e22898b6e7cee1519f5bd469549361097b565b612542906000611b62818361036d565b386124ff565b1561254f57565b60405162461bcd60e51b815260206004820152601660248201527543616c6c6572206973206e6f7420726567697374727960501b6044820152606490fd5b6125cb8161259f610448826005610988565b6125c66125b7611aad6011546001600160a01b031690565b6125c0336117c0565b14612548565b614ca6565b6125f57ff7504a55c42715ea3e852b679d6453ecfe02acbddb4d0652aa251d4458b7cc219161097b565b906125ff60405190565b80805b0390a2565b90611bec91612614611cf8565b906103a791612621611bc2565b612659826006612635610448856007610988565b6126538361264d6104486005611fad600187016109a7565b8361465d565b01611ce1565b33906118f561268b61242d7f8283dd04c4a2b6691bd80232f254e0ad876b8bb149938d3e7ced5c6e8a35b6149361097b565b936106f960405190565b906103a791612607565b6126ac611a036010610aa9565b6103a7612720565b156126bb57565b60405162461bcd60e51b815260206004820152601e60248201527f496e7374616e742061636365707420616c726561647920656e61626c656400006044820152606490fd5b9060ff90611878565b9061271961044861189992151590565b8254612700565b3380612751600961273f61273a611bd06119888685611073565b6126b4565b61274c6001948592611073565b612709565b61260261277e7f2e259e0564e75f0e10ce0e012a5ce2528ae513b0188b619bcc581b8ba8db70329261106a565b9261095460405190565b6103a761269f565b61279d611a036010610aa9565b6103a76127f1565b156127ac57565b60405162461bcd60e51b815260206004820152601f60248201527f496e7374616e742061636365707420616c72656164792064697361626c6564006044820152606490fd5b3380612751600961280d6128086119888584611073565b6127a5565b61274c6000948592611073565b6103a7612790565b91908201809211611f2957565b6128a1600060076128936128466104488684610988565b91612889600561286d612867610448612861600189016109a7565b84610988565b86614781565b6128814261287b600f6109a7565b90612822565b908501611ce1565b6001908301612709565b01546001600160a01b031690565b6118e86118e27f9da9db6af7fcfa5edbaa006b61a744d33fe4651a4c594cddd3e9a7e757ecd8d59361097b565b611bec906128da611cf8565b6128e8610448826007610988565b9061291d6129006104486005611fad600187016109a7565b61290a8185614872565b82612917600686016109a7565b94614c0b565b33906129318361292c8461106a565b612a59565b6118f561268b61242d7f8f8619524e8d462cead34604bd2247ede24175801481e4d0b8059ac8aa41c3019361097b565b6103a7906128ce565b1561297157565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606490fd5b906129c36103eb83610722565b918252565b3d156129e2576129d73d6129b6565b903d6000602084013e565b606090565b156129ee57565b60405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608490fd5b60006103a792612a7a8293611aad612a703061106a565b849031101561296a565b90612a8460405190565b90818003925af1612a936129c8565b506129e7565b906103a79291612aa761179f565b612b18565b15612ab357565b60405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b90610100600160a81b039060081b611878565b90612b116104486118999261106a565b8254612aee565b612b4e9291612b40612b4792612b39612b34611bd06010610aa9565b612aac565b6010612b01565b6011611882565b6012611882565b6103a760016010612709565b906103a79291612a99565b612b6d61179f565b6103a76103a7612bcb565b6103a7612b65565b612b88611bc2565b6103a7612b9760016004612709565b33612bc67f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610c1860405190565b0390a1565b6103a7612b80565b612bdb61179f565b6103a76103a7612c34565b6103a7612bd3565b612bf6612c7f565b6103a7612c0560006004612709565b33612bc67f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91610c1860405190565b6103a7612bee565b15612c4357565b60405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606490fd5b6103a7612c8a6118fa565b612c3c565b6103a790612c9b61179f565b612cde565b15612ca757565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b612d01612cea8261106a565b612cfa6117c06104746000611728565b1415612ca0565b612d0c816010612b01565b6125f57f9106eb309cc633a951e77bd36af34646a9df8e6ade485938c34e3844a37b79da9161106a565b6103a790612c8f565b6103a790612d4b61179f565b612d57612cea8261106a565b612d62816012611882565b6125f57f9d3407c7200ba4f49e97f3d3f8250ec01c24b0ada6fa31053d71850793b739539161106a565b6103a790612d3f565b6103a790612da161179f565b612dac81600a611ce1565b612bc67f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c76916106f960405190565b6103a790612d95565b6103a790612def61179f565b612e08612dff6104746000611728565b612cfa8361106a565b612e1381600b611882565b6125f57f7a7b5a0a132f9e0581eb8527f66eae9ee89c2a3e79d4ac7e41a1f1f4d48a7fc29161106a565b6103a790612de3565b6103a790612e5261179f565b612eb8565b15612e5e57565b60405162461bcd60e51b815260206004820152602c60248201527f42696420736574746c656d656e7420706572696f64206d75737420626520677260448201526b06561746572207468616e20360a41b6064820152608490fd5b612ecc612ec5600061097b565b8211612e57565b612ed781600e611ce1565b612bc67f09a165ff77cf0f319f9ece89bc6dbe2a469a0da2640c9e6b501132846843daf5916106f960405190565b6103a790612e46565b6103a790612f1a61179f565b612f7c565b15612f2657565b60405162461bcd60e51b815260206004820152602860248201527f42696420726566756e6420706572696f64206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608490fd5b612f90612f89600061097b565b8211612f1f565b612f9b81600f611ce1565b612bc67f90e0312fddcd5cbec358d5c7d63976e5c97d71dfb8d6cd5f2c53b0a1a043ccf0916106f960405190565b6103a790612f0e565b906129c36103eb836103a9565b6104486040610393565b610448610140610393565b612ffc612fe9565b906000825260208080808080808080808b01600081520160008152016060815201600081520160008152016000815201600081520160008152016060905250565b905250565b610448612ff4565b613052612fdf565b9060008252602080830161303d613042565b61044861304a565b60005b82811061307b57505050565b602090613086613064565b818401520161306f565b906103a76130a66130a084612fd2565b936103a9565b601f19016020840161306c565b6000198114611f295760010190565b906130cb825190565b811015610d02576020809102010190565b906130f76130eb6104ea845490565b92600052602060002090565b9060005b8181106131085750505090565b90919261312c61312560019261311d876109a7565b815260200190565b9460010190565b9291016130fb565b90610448916130dc565b906103a7610a999261314f60405190565b93848092613134565b906103a76132556009613169612fe9565b9461318b61317e82546001600160a01b031690565b6001600160a01b03168752565b6131b26131a260018301546001600160a01b031690565b6001600160a01b03166020880152565b6131c86131c1600283016109a7565b6040880152565b6131de6131d7600383016114fe565b6060880152565b6131f46131ed600483016109a7565b6080880152565b61320a613203600583016109a7565b60a0880152565b613220613219600683016109a7565b60c0880152565b61323661322f600783016109a7565b60e0880152565b61324f61324560088301610aa9565b1515610100880152565b0161313e565b610120840152565b61044890613158565b90613277613272835190565b613090565b91600090836132858361097b565b613290610448845190565b81101561330257806132ac6132a86132fd93866130c2565b5190565b6132e26132db6132c46005611fad6132a8878b6130c2565b6132d66132cf612fdf565b948a860152565b61325d565b6020830152565b6132ec82896130c2565b526132f781886130c2565b506130b3565b613285565b5093505050565b6104489061313e565b61332961332e91613321606090565b506006611073565b613309565b9061333a613272835190565b91600090836133488361097b565b613353610448845190565b811015613302578061336b6132a861337c93866130c2565b6132e26132db6132c4836005610988565b613348565b6104486060610393565b610448610100610393565b61339e61338b565b906000825260208080808080808089016000815201606081520160008152016000815201600081520160005b8152016000905250565b610448613396565b6133e4613381565b90600082526020808084016133ca6133d4565b6104486133dc565b60005b82811061340e57505050565b6020906134196133f7565b8184015201613402565b906103a76134336130a084612fd2565b601f1901602084016133ff565b906103a76134cd600761345161338b565b9461346661317e82546001600160a01b031690565b61347c613475600183016109a7565b6020880152565b61348b6131c160028301610a7f565b61349a6131d7600383016109a7565b6134a96131ed600483016109a7565b6134b8613203600583016109a7565b6134c7613219600683016109a7565b01610aa9565b151560e0840152565b61044890613440565b906134ee613329836008611073565b6134fe6134f9825190565b613423565b926000918461350c8461097b565b613517610448845190565b81101561358c578061352f6132a861358793866130c2565b61357261353d826007610988565b613569611a5c6135516119888b6009611073565b9261356461355d613381565b968d880152565b6134d6565b15156040830152565b61357c828a6130c2565b526132f781896130c2565b61350c565b509450505050565b60005b8281106135a357505050565b606082820152602001613597565b906103a76135c16130a084612fd2565b601f190160208401613594565b6135de6135d9825190565b6135b1565b806000916135eb8361097b565b945b6135f8610448865190565b8610156136f057613621600961361b6136146132a88a8a6130c2565b6005610988565b01613309565b9461362d6134f9875190565b61363788866130c2565b5261364287856130c2565b5061364c8561097b565b613657610448885190565b8110156136d957806132f781886136b86136776132a86136d4978e6130c2565b613569611a5c60076135646136a96119886136928785610988565b936136a38a6128938a600994610988565b90611073565b946136b2613381565b97880152565b6136c28c8a6130c2565b51906136ce83836130c2565b526130c2565b61364c565b50929450946136e7906130b3565b949391936135ed565b935093505050565b61044861517f565b905051906103a782610706565b91909160a0818403126103c95761372460a0610393565b9260006137318284613700565b908501526020820151906001600160401b0382116103c9576137588161378b938501611dba565b6020860152604061376b82828601611d83565b90860152606061377d82828601613700565b908601526080809301611d83565b90830152565b9190916040818403126103c9576137a86040610393565b9260006137b58284611d83565b9085015260208201516001600160401b0381116103c9576132db920161370d565b906020828203126103c95781516001600160401b0381116103c9576104489201613791565b1561380257565b60405162461bcd60e51b815260206004820152601a60248201527f43616c6c6572206973206e6f7420646f6d61696e206f776e65720000000000006044820152606490fd5b1561384e57565b60405162461bcd60e51b815260206004820152602160248201527f446f6d61696e20616c7265616479206c6973746564206f6e20726567697374726044820152607960f81b6064820152608490fd5b156138a457565b60405162461bcd60e51b815260206004820152601960248201527f4d696e696d756d20626964207072696365206973207a65726f000000000000006044820152606490fd5b60006139269194939294613908611aad6011546001600160a01b031690565b6124db631a24254761391960405190565b9586948593849360e01b90565b03915afa938415611b70576104746123e6936123c6611d18613985606060206103a79b6117c0996000916139bf575b5001805151613976906001600160a01b0316613970336117c0565b146137fb565b5101516001600160a01b031690565b946104486139b860006139b361399a82611728565b996139ad6001600160a01b038c166117c0565b14613847565b61097b565b821161389d565b6139da913d8091833e6139d2818361036d565b8101906137d6565b38613955565b369037565b906103a76139f56130a084612fd2565b601f1901602084016139e0565b634e487b7160e01b600052600060045260246000fd5b90611cf16104486118999290565b9160001960089290920291821b911b611878565b9190613a4b6104486118999361097b565b908354613a26565b6103a791600091613a3a565b818110613a6a575050565b80613a786000600193613a53565b01613a5f565b9190601f8111613a8d57505050565b613a9f6103a793600052602060002090565b906020601f840181900483019310613ac2575b6020601f909101045b0190613a5f565b9091508190613ab2565b600019600883021c1916906002021790565b90613ae7815190565b906001600160401b03821161038e57613b0a82613b0485546109c7565b85613a7e565b602090601f8311600114613b3857611899929160009183613b2d575b5050613acc565b015190503880613b26565b601f19831691613b4d85600052602060002090565b9260005b818110613b8b57509160029391856001969410613b72575b50505002019055565b01516000196008601f8516021c19169055388080613b69565b91936020600181928787015181550195019201613b51565b906103a791613ade565b81810292918115918404141715611f2957565b818110613bcb575050565b80613bd96000600193613a53565b01613bc0565b90613bf290600019906020036008021c90565b8154169055565b9091828110613c0757505050565b6103a79290613c15906130eb565b9081019101613bc0565b90600160401b811161038e5781613c376103a7935490565b90828155613bf9565b8151916001600160401b03831161038e57613c6a6130eb600192613c648686613c1f565b60200190565b92049160005b838110613c7d5750505050565b6001906020613c8d610448865190565b9401938184015501613c70565b906103a791613c40565b6103a79190613d8a9061012090600990613ccf81613cc987516001600160a01b031690565b90611882565b613cea60018201613cc960208801516001600160a01b031690565b613d0260028201613cfc604088015190565b90613a18565b613d1a60038201613d14606088015190565b90613ba3565b613d2c60048201613cfc608088015190565b613d4460058201613d3e60a088015190565b90611ce1565b613d5660068201613d3e60c088015190565b613d6860078201613d3e60e088015190565b613d8360088201613d7d610100880151151590565b90612709565b0192015190565b90613c9a565b906103a791613ca4565b90815491600160401b83101561038e5782613dbd9160016103a795018155610cdf565b90613a3a565b919295949095613dd1600090565b50613ddc600d6109a7565b93849733944290600198600096613df28861097b565b613dfb906139e5565b9689613e05612fe9565b998a0190613e1b91906001600160a01b03169052565b6001600160a01b0316602089015260408801526060870152608086015260a085015260c084015260e0830152841515610100830152610120820152613e61836005610988565b90613e6b91613d90565b613e76906006611073565b90613e8091613d9a565b613e8a600d6109a7565b90613e949061097b565b613e9d91612822565b6103a790600d611ce1565b15613eaf57565b60405162461bcd60e51b8152602060048201526016602482015275131a5cdd1a5b99c8191bd95cc81b9bdd08195e1a5cdd60521b6044820152606490fd5b15613ef457565b60405162461bcd60e51b8152602060048201526024808201527f426964207072696365206973206c657373207468616e206d696e2062696420706044820152637269636560e01b6064820152608490fd5b15613f4c57565b60405162461bcd60e51b815260206004820152601d60248201527f427579657220494420686173682063616e6e6f7420626520656d7074790000006044820152606490fd5b611d18610448613ffb926139b36103a79695613ff4611d186104486007613fc260008801546001600160a01b031690565b96613fdf600098613fd86117c06104748c611728565b1415613ea8565b613fee61220560088301610aa9565b016109a7565b1015613eed565b1415613f45565b9061400b815190565b906001600160401b03821161038e5761402882613b0485546109c7565b602090601f831160011461404a57611899929160009183613b2d575050613acc565b601f1983169161405f85600052602060002090565b9260005b81811061408357509160029391856001969410613b725750505002019055565b91936020600181928787015181550195019201614063565b906103a791614002565b6103a79190613d7d9060e0906007906140c981613cc987516001600160a01b031690565b6140db60018201613d3e602088015190565b6140f3600282016140ed604088015190565b9061409b565b61410560038201613cfc606088015190565b61411760048201613d3e608088015190565b61412960058201613d3e60a088015190565b61413b60068201613d3e60c088015190565b01920151151590565b906103a7916140a5565b919493909261415d600c6109a7565b93849283973393426000199160009461417461338b565b6001600160a01b0389168782015296602088015260408701526060860152608085015260a084015260c0830152151560e08201526141b3836007610988565b906141bd91614144565b6141c8906008611073565b906141d291613d9a565b600901906141df91613d9a565b6141e9600c6109a7565b6141f3600161097b565b6141fc91612822565b6103a790600c611ce1565b1561420e57565b60405162461bcd60e51b8152602060048201526012602482015271109a5908191bd95cc81b9bdd08195e1a5cdd60721b6044820152606490fd5b8015156103c2565b905051906103a782614248565b906020828203126103c95761044891614250565b1561427857565b60405162461bcd60e51b815260206004820152601d60248201527f496e76616c6964206d616e6167656420444b494d206b657920686173680000006044820152606490fd5b156142c457565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c696420637573746f6d20444b494d206b65792068617368000000006044820152606490fd5b6104d76143219260209261431b815190565b94859290565b93849101610480565b61044891614309565b1561433a57565b60405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103932b1b2b4bb32b960811b6044820152606490fd5b1561437957565b60405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103237b6b0b4b760911b6044820152606490fd5b80549294909391926001600160a01b03166143dc6000916143d56117c061047485611728565b1415614207565b6143fb6143f2828601546001600160a01b031690565b61239d336117c0565b61440a61220560088601610aa9565b6002840190614421611d186104486120ab856109a7565b146144ac576144a693613fee611d18946144a0611d18611f1a6003611f1a9861445e6103a79e614458611d1861044860049d6109a7565b146142bd565b61448661446a60405190565b809261447a60208301918261432a565b9081038252038261036d565b614498614491825190565b9160200190565b209b016109a7565b14614333565b14614372565b5060206144e793956144c9611aad6012546001600160a01b031690565b6124db6319d091526144da60405190565b9788948593849360e01b90565b03915afa908115611b70576103a795613fee611d18946144a0611d18611f1a6003600497614524611f1a9a6144a69d600091614529575b50614271565b61445e565b61454a915060203d8111614550575b614542818361036d565b81019061425d565b3861451e565b503d614538565b90916125c6816103a794612917600186016109a7565b1561457457565b60405162461bcd60e51b815260206004820152601860248201527f526566756e6420616c726561647920696e6974696174656400000000000000006044820152606490fd5b156145c057565b60405162461bcd60e51b8152602060048201526024808201527f4e6577207072696365206e6f742067726561746572207468616e206f6c6420706044820152637269636560e01b6064820152608490fd5b1561461857565b60405162461bcd60e51b815260206004820152601c60248201527f496e636f727265637420616d6f756e74206f66204554482073656e74000000006044820152606490fd5b611d1861044860066146cc936146a461220560086103a7999861468d6121e760008701546001600160a01b031690565b6134c761469f611bd060078801610aa9565b61456d565b01936146bc6146b5610448876109a7565b82116145b9565b6146c634956109a7565b90611f13565b14614611565b156146d957565b60405162461bcd60e51b815260206004820152601960248201527f526566756e6420706572696f64206e6f742073746172746564000000000000006044820152606490fd5b1561472557565b60405162461bcd60e51b815260206004820152602e60248201527f4c697374696e6720657870697265642e204269642063616e206265207769746860448201526d647261776e206469726563746c7960901b6064820152608490fd5b60086103a7926134c76147de936147a56121e760008301546001600160a01b031690565b6147b761469f611bd060078401610aa9565b6147d8611d18610448429361287b60046147d1600e6109a7565b92016109a7565b116146d2565b61471e565b156147ea57565b60405162461bcd60e51b81526020600482015260146024820152731499599d5b99081b9bdd081a5b9a5d1a585d195960621b6044820152606490fd5b1561482d57565b60405162461bcd60e51b815260206004820152601760248201527f526566756e6420706572696f64206e6f7420656e6465640000000000000000006044820152606490fd5b9061488e906008906134c76121e785546001600160a01b031690565b6148955750565b806148ad6148a860076103a79401610aa9565b6147e3565b6148c0611d1861044860054294016109a7565b1015614826565b610448670de0b6b3a764000061097b565b634e487b7160e01b600052601260045260246000fd5b81156148f8570490565b6148d8565b909190614939614927614919614913600a6109a7565b86613bad565b6149216148c7565b906148ee565b91614933838096611f13565b90612a59565b614943600061097b565b811161494c5750565b6103a79061292c600b546001600160a01b031690565b9190613a4b6104486118999390565b6103a791600091614962565b9060009161499b61499382600052602060002090565b928354613acc565b905555565b91929060208210156149f857601f84116001146149c257611899929350613acc565b50906149f36103a79360016149ea6149df85600052602060002090565b92601f602091010490565b82019101613a5f565b61497d565b50614a318293614a0f600194600052602060002090565b613abb6020601f860104820192601f861680614a39575b50601f602091010490565b600202179055565b614a4590888603613bdf565b38614a26565b929091600160401b821161038e5760201115614a92576020811015614a735761189991613acc565b60019160ff1916614a8984600052602060002090565b55600202019055565b60019150600202019055565b908154614aaa816109c7565b90818311614ad3575b818310614ac1575b50505050565b614aca936149a0565b38808080614abb565b614adf83838387614a4b565b614ab3565b60006103a791614a9e565b90600003614b00576103a790614ae4565b613a02565b60006103a791613c1f565b90600003614b00576103a790614b05565b600060096103a7928280820155826001820155614b418360028301614971565b614b4e8360038301614aef565b614b5b8360048301614971565b614b688360058301613a53565b614b758360068301613a53565b614b828360078301613a53565b82600882015501614b10565b90600003614b00576103a790614b21565b600080825590600790614bb58360018301613a53565b614bc28360028301614aef565b614bcf8360038301614971565b614bdc8360048301613a53565b614be98360058301613a53565b614bf68360068301613a53565b0155565b90600003614b00576103a790614b9f565b600091614c6a916103a794614c55611bd06008614c4686614c41610448614c3b8c8a01546001600160a01b031690565b85611073565b6153e9565b60098401936134c787866153e9565b9081614c90575b50614c6f575b506007610988565b614bfa565b83614c85614c8a92611fad6001600592016109a7565b614b8e565b38614c62565b549050614c9f611d188661097b565b1438614c5c565b614cdf6009600092614cbb8460088301612709565b614cda85614c4161044860066136a3898701546001600160a01b031690565b015490565b614ceb611d188361097b565b14614cf4575050565b614c856103a7926005610988565b6103a790614d0e61179f565b614dba565b15614d1a57565b60405162461bcd60e51b815260206004820152601c60248201527f4164647265737320616c7265616479206f6e20616c6c6f776c697374000000006044820152606490fd5b916001600160a01b0360089290920291821b911b611878565b9190614d896104486118999361106a565b908354614d5f565b90815491600160401b83101561038e5782614db49160016103a795018155610cdf565b90614d78565b90614dc5600061097b565b614dd0610448845190565b811015614e6e5780614df5614de8614e6993866130c2565b516001600160a01b031690565b614e2c81614e27816104486002614e1a614e15611bd06119888685611073565b614d13565b61274c6001938492611073565b614d91565b614e567f41f4a012571b6bf21f3c6557be5d1a28851ce415203203b84c14099b84fe97379161106a565b90614e6060405190565b600090a26130b3565b614dc5565b509050565b6103a790614d02565b6103a790614e8861179f565b614ed9565b15614e9457565b60405162461bcd60e51b815260206004820152601a60248201527f4164647265737320616c726561647920646973616c6c6f7765640000000000006044820152606490fd5b906000614ee58161097b565b614ef0610448855190565b811015614f665780614f08614de8614f6193876130c2565b614f2c8461274c836002614f27614f226119888484611073565b614e8d565b611073565b614f37816001615245565b614e567ff27dccb929dd3f4dba2d3ffc29a7c74e35995e051a268a7c466f9ddabdf81eac9161106a565b614ee5565b50509050565b6103a790614e7c565b614f7d61179f565b6103a7614ff7565b15614f8c57565b60405162461bcd60e51b815260206004820152601d60248201527f416c6c6f77206c69737420697320616c726561647920656e61626c65640000006044820152606490fd5b9060ff60a01b9060a01b611878565b90614ff061044861189992151590565b8254614fd1565b61500c615007611bd06000611910565b614f85565b61501860016000614fe0565b7f8a943acd5f4e6d3df7565a4a08a93f6b04cc31bb6c01ca4aef7abd6baf455ec361504260405190565b8080612bc6565b6103a7614f75565b61505961179f565b6103a76150ad565b1561506857565b60405162461bcd60e51b815260206004820152601e60248201527f416c6c6f77206c69737420697320616c72656164792064697361626c656400006044820152606490fd5b6150bf6150ba6000611910565b615061565b6150ca600080614fe0565b7f2d35c8d348a345fd7b3b03b7cfcf7ad0b60c2d46742d5ca536342e4185becb0761504260405190565b6103a7615051565b9061510b6130eb6104ea845490565b9060005b81811061511c5750505090565b90919261514a61312560019261513987546001600160a01b031690565b6001600160a01b0316815260200190565b92910161510f565b90610448916150fc565b906103a7610a999261516d60405190565b93848092615152565b6104489061515c565b6104486001615176565b906151986130eb6104ea845490565b9060005b8181106151a95750505090565b9091926151c661312560019261513987546001600160a01b031690565b92910161519c565b9061044891615189565b906103a7610a99926151e960405190565b938480926151ce565b610448906151d8565b634e487b7160e01b600052603160045260246000fd5b6103a791600091614d78565b8054801561524057600019019061523d6152378383610cdf565b90615211565b55565b6151fb565b61525a61526192615255836151f2565b6152f8565b9092901590565b156152a35760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b6103a7916152bc6152b2835490565b6146c6600161097b565b908181036152cc575b505061521d565b614db46152df610d286152e69486610cdf565b9184610cdf565b38806152c5565b61044860001961097b565b919082519260006153088161097b565b855b8110156153525761531e614de882856130c2565b6153306001600160a01b0386166117c0565b146153485761534161530a916130b3565b9050615308565b9450505050600190565b5093505050611d186152ed565b9061536e6130eb6104ea845490565b9060005b81811061537f5750505090565b90919261539461312560019261311d876109a7565b929101615372565b906104489161535f565b906103a7610a99926153b760405190565b9384809261539c565b610448906153a6565b8054801561524057600019019061523d6153e38383610cdf565b90613a53565b61525a6153fe926153f9836153c0565b615479565b156154405760405162461bcd60e51b81526020600482015260156024820152743ab4b73a191a9b103737ba1034b71030b93930bc9760591b6044820152606490fd5b6103a79161544f6152b2835490565b9081810361545f575b50506153c9565b613dbd6152df6110a96154729486610cdf565b3880615458565b919082519260006154898161097b565b855b8110156153525761549f6132a882856130c2565b8414615348576154b161548b916130b3565b905061548956fea264697066735822122003aeb335a6d381b0a582f93c9d1aab7b6e89b54509710141d9511d69f98051bd64736f6c63430008120033", + "devdoc": { + "events": { + "Paused(address)": { + "details": "Emitted when the pause is triggered by `account`." + }, + "Unpaused(address)": { + "details": "Emitted when the pause is lifted by `account`." + } + }, + "kind": "dev", + "methods": { + "addAddressesToAllowlist(address[])": { + "params": { + "_allowedAddresses": "List of addresses allowed to call allow listed functions" + } + }, + "buyerReleaseFunds(uint256)": { + "params": { + "_bidId": "The unique identifier of the bid to release funds for" + } + }, + "createBid(uint256,bytes32,string)": { + "params": { + "_buyerIdHash": "The hashed buyerId which is also output as part of the transfer proof later", + "_encryptedBuyerId": "The encrypted buyerId. Should be the same as the buyerId hashed", + "_listingId": "The unique identifier of the listing to bid on" + } + }, + "createListing(bytes32,uint256,uint256,address,bytes,bytes32)": { + "params": { + "_askPrice": "An asking price for the domain", + "_dkimKeyHash": "The custom DKIM key hash. If empty, the managed DKIM key hash will be used", + "_domainId": "The unique identifier of the domain", + "_encryptionKey": "The encryption key for buyers to encrypt the buyerId to", + "_minBidPrice": "The minimum bid price for the domain", + "_saleEthRecipient": "The address to receive the ETH from the sale; must be a contract that can receive ETH or an EOA" + } + }, + "deleteListing(uint256)": { + "params": { + "_listingId": "The unique identifier of the listing to delete" + } + }, + "finalizeSale((uint256[2],uint256[2][2],uint256[2],uint256[10]))": { + "params": { + "_proof": "The zk-email proof of domain transfer" + } + }, + "getListingBids(uint256[])": { + "params": { + "_listingIds": "An array of listingIds to fetch bids for" + } + }, + "getListings(uint256[])": { + "params": { + "_listingIds": "An array of listingIds to fetch details for" + } + }, + "getUserBids(address)": { + "params": { + "_user": "The address of the user to fetch bids for" + } + }, + "getUserListings(address)": { + "params": { + "_user": "The address of the user to fetch listings for" + } + }, + "increaseBidPrice(uint256,uint256)": { + "params": { + "_bidId": "The unique identifier of the bid to increase the price for", + "_newPrice": "The new price for the bid" + } + }, + "initialize(address,address,address)": { + "params": { + "_mailServerKeyHashAdapter": "The address of the mail server key hash adapter contract", + "_transferDomainProcessor": "The address of the domain transfer processor contract", + "_verifiedDomainRegistry": "The address of the verified domain registry contract" + } + }, + "initiateRefund(uint256)": { + "params": { + "_bidId": "The unique identifier of the bid to initiate refund for" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "paused()": { + "details": "Returns true if the contract is paused, and false otherwise." + }, + "registryRemoveListing(uint256)": { + "params": { + "_listingId": "Listing Id to remove" + } + }, + "removeAddressesFromAllowlist(address[])": { + "params": { + "_disallowedAddresses": "List of addresses being disallowed from calling allow listed functions" + } + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "updateBidRefundPeriod(uint256)": { + "params": { + "_newBidRefundPeriod": "The new bid refund period in seconds" + } + }, + "updateBidSettlementPeriod(uint256)": { + "params": { + "_newBidSettlementPeriod": "The new bid settlement period in seconds" + } + }, + "updateFee(uint256)": { + "params": { + "_newFee": "The new fee percentage (in basis points)" + } + }, + "updateFeeRecipient(address)": { + "params": { + "_newFeeRecipient": "The new address to receive fees" + } + }, + "updateListing(uint256,uint256,address)": { + "params": { + "_listingId": "The unique identifier of the listing to update", + "_newAskPrice": "The new asking price for the listing", + "_saleEthRecipient": "The new address to receive the ETH from the sale; must be a contract that can receive ETH or an EOA" + } + }, + "updateMailServerKeyHashAdapter(address)": { + "params": { + "_mailServerKeyHashAdapter": "The new mail server key hash adapter" + } + }, + "updateTransferDomainProcessor(address)": { + "params": { + "_transferDomainProcessor": "The new transfer domain processor" + } + }, + "withdrawBid(uint256)": { + "params": { + "_bidId": "The unique identifier of the bid to withdraw" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "addAddressesToAllowlist(address[])": { + "notice": "Adds passed addresses to an allow list. Addresses on the allow list are able to call allow listed functions." + }, + "buyerReleaseFunds(uint256)": { + "notice": "ONLY BUYER: Finalize a sale by releasing funds to the seller. Proof of transfer is not required because it is not in the buyer's interest to release funds unless they have received the domain. Note that the bid can be in ANY STATE when this function is called. Upon calling this function funds will be transferred to the seller and fees will be taken by the protocol. The listing and the bid will be deleted. The function will revert if: - The bid is not owned by the caller - The listing is not active (sold or withdrawn)" + }, + "createBid(uint256,bytes32,string)": { + "notice": "Creates a new bid for a listing. Transfers ETH from the buyer to the contract. Every buyer has a unique identifier, for Namecheap it's their username. The seller needs the raw buyerId to transfer the domain off-chain. To facilitate this, the buyer encrypts their buyerId using the seller's encryption key and sends it along with the bid. The seller then decrypts the buyerId using their private key to get the raw buyerId. DEV NOTE: We do not check that the encrypted buyerId is the same as the hashed buyerId. This must be done in the client! This does not affect the security of the protocol as the encrypted buyerId is only used for communication between the buyer and the seller while maintaining privacy." + }, + "createListing(bytes32,uint256,uint256,address,bytes,bytes32)": { + "notice": "Creates listing for a domain. If ownership of domain changes offchain, the new owner will have to first register the domain on the domain registry contract. Then the new owner can create a listing for the domain. The old listing will be deleted from the old owner's listings and the old listing is marked as NOT active, which prevents any new bids from being created on it and makes the old bids immediately withdrawable. We also allow the seller to specify a custom DKIM key hash for Namecheap if they want to opt out of using the managed DKIM key hash set in the transferDomainProcessor contract. The managed DKIM key hash *can* be updated by us whenever Namecheap rotates their DKIM key. Function reverts if: - Caller is not domain owner on the domain registry contract - Ask price is less than min bid price - Sale ETH recipient is the zero address" + }, + "deleteListing(uint256)": { + "notice": "ONLY SELLER: Marks a listing as NOT active. Removes the listing from the seller's listings array and domain listing. If the listing has no bids, it is deleted from the exchange. Bids against the listing are left as is to allow the buyer to withdraw the bid." + }, + "disableAllowlist()": { + "notice": "Disable the allow list. When the allow list is disabled, any address is allowed to call functions with onlyAllowed modifier." + }, + "disableInstantAccept()": { + "notice": "Disables the instant accept flag for the buyer." + }, + "enableAllowlist()": { + "notice": "Enable the allow list. When the allow list is enabled, only approved addresses are allowed to functions with onlyAllowed modifier." + }, + "enableInstantAccept()": { + "notice": "Enables the instant accept flag for the buyer. This flag is used to indicate if the buyer has configured their Namecheap account to accept ownership of domains immediately upon transfer. DEV NOTE: We can not check that the buyer has actually enabled instant accept on Namecheap. It is only an indicative flag to help the seller know if they can finalize the sale immediately or not. The seller may get tricked by a malicious buyer to initiate a transfer to them assuming instant accept is on. But if the buyer does not have instant accept enabled, the seller will get immediate feedback and they can cancel the transfer immediately." + }, + "finalizeSale((uint256[2],uint256[2][2],uint256[2],uint256[10]))": { + "notice": "ONLY SELLER: Finalizes a sale by verifying the domain transfer and unlocking bid funds to the listing owner. The seller can also finalize the sale with bids that have initiated a refund including the ones that have expired based on timestamp but not withdrawn yet." + }, + "getAllowedSellers()": { + "notice": "Get all allowed sellers" + }, + "getListingBids(uint256[])": { + "notice": "Returns the bids for given listingIds" + }, + "getListings(uint256[])": { + "notice": "Get listing information with listingId for a list of listingIds" + }, + "getUserBids(address)": { + "notice": "Returns the bids created by a user" + }, + "getUserListings(address)": { + "notice": "Returns all listings created by a user" + }, + "increaseBidPrice(uint256,uint256)": { + "notice": "ONLY BUYER: Increases the price of an existing bid. The new price can ONLY be higher than the old price. The buyer must send the additional amount of ETH. The function reverts if - bid has initiated refund, caller is not bid owner or listing is not active - the new price is less than old price - msg.value is NOT STRICTLY EQUAL to than new price - old price" + }, + "initialize(address,address,address)": { + "notice": "Initializes the contract with domain verification and transfer processors. Can only be called once by the contract owner " + }, + "initiateRefund(uint256)": { + "notice": "ONLY BUYER: Initiates the refund process for a bid. Can only be called by the bid owner after the initial bid expiry period has passed." + }, + "pauseMarketplace()": { + "notice": "ONLY OWNER: Pauses listing and proof submission functionality for the marketplace. Functionalites that are paused: - Listing creation and update - Bid creation and update - Sale finalization Functinonalites that remain unpaused to allow users to retrieve funds in contract: - Bid refund initiation and withdrawal - Listing deletion - Manual settlement between buyer and seller" + }, + "registryRemoveListing(uint256)": { + "notice": "ONLY EXCHANGE: Remove a listing for domain when ownership changes on the registry. " + }, + "removeAddressesFromAllowlist(address[])": { + "notice": "Removes passed addresses from an allow list. Addresses not on the allow list are unable to call allow listed functions." + }, + "unpauseMarketplace()": { + "notice": "ONLY OWNER: Restarts paused functionality for the marketplace." + }, + "updateBidRefundPeriod(uint256)": { + "notice": "ONLY OWNER: Updates the bid refund period" + }, + "updateBidSettlementPeriod(uint256)": { + "notice": "ONLY OWNER: Updates the minimum bid active period" + }, + "updateFee(uint256)": { + "notice": "ONLY OWNER: Updates the fee percentage for the marketplace" + }, + "updateFeeRecipient(address)": { + "notice": "ONLY OWNER: Updates the fee recipient address" + }, + "updateListing(uint256,uint256,address)": { + "notice": "ONLY SELLER: Updates the asking price of an existing listing. We don't update the existing bids against the listing because the newAskPrice is an indicative value. The new ask price must be greater than or equal to the existing min bid price. If seller wants to update the min bid price, they should delete the listing and create a new one with the new min bid price." + }, + "updateMailServerKeyHashAdapter(address)": { + "notice": "ONLY OWNER: Update the managed mail server key hash adapter" + }, + "updateTransferDomainProcessor(address)": { + "notice": "ONLY OWNER: Update the transfer domain processor" + }, + "withdrawBid(uint256)": { + "notice": "ONLY BUYER: Withdraws a bid after the refund period has ended. Transfers ETH back to the buyer." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 8064, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "isEnabled", + "offset": 20, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 8067, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "allowedAddresses", + "offset": 0, + "slot": "1", + "type": "t_array(t_address)dyn_storage" + }, + { + "astId": 8071, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "isAllowed", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 231, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "_status", + "offset": 0, + "slot": "3", + "type": "t_uint256" + }, + { + "astId": 130, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "_paused", + "offset": 0, + "slot": "4", + "type": "t_bool" + }, + { + "astId": 4981, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "listings", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_uint256,t_struct(Listing)4936_storage)" + }, + { + "astId": 4986, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "userListings", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_address,t_array(t_uint256)dyn_storage)" + }, + { + "astId": 4991, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "bids", + "offset": 0, + "slot": "7", + "type": "t_mapping(t_uint256,t_struct(Bid)4959_storage)" + }, + { + "astId": 4996, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "userBids", + "offset": 0, + "slot": "8", + "type": "t_mapping(t_address,t_array(t_uint256)dyn_storage)" + }, + { + "astId": 5000, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "instantAcceptEnabled", + "offset": 0, + "slot": "9", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 5002, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "fee", + "offset": 0, + "slot": "10", + "type": "t_uint256" + }, + { + "astId": 5004, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "feeRecipient", + "offset": 0, + "slot": "11", + "type": "t_address_payable" + }, + { + "astId": 5006, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "bidCounter", + "offset": 0, + "slot": "12", + "type": "t_uint256" + }, + { + "astId": 5008, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "listingCounter", + "offset": 0, + "slot": "13", + "type": "t_uint256" + }, + { + "astId": 5010, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "bidSettlementPeriod", + "offset": 0, + "slot": "14", + "type": "t_uint256" + }, + { + "astId": 5012, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "bidRefundPeriod", + "offset": 0, + "slot": "15", + "type": "t_uint256" + }, + { + "astId": 5014, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "isInitialized", + "offset": 0, + "slot": "16", + "type": "t_bool" + }, + { + "astId": 5017, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "transferDomainProcessor", + "offset": 1, + "slot": "16", + "type": "t_contract(ITransferDomainProcessor)11791" + }, + { + "astId": 5020, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "verifiedDomainRegistry", + "offset": 0, + "slot": "17", + "type": "t_contract(IVerifiedDomainRegistry)11871" + }, + { + "astId": 5023, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "mailServerKeyHashAdapter", + "offset": 0, + "slot": "18", + "type": "t_contract(IKeyHashAdapterV2)9595" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_address_payable": { + "encoding": "inplace", + "label": "address payable", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "base": "t_address", + "encoding": "dynamic_array", + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)dyn_storage": { + "base": "t_uint256", + "encoding": "dynamic_array", + "label": "uint256[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_bytes_storage": { + "encoding": "bytes", + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(IKeyHashAdapterV2)9595": { + "encoding": "inplace", + "label": "contract IKeyHashAdapterV2", + "numberOfBytes": "20" + }, + "t_contract(ITransferDomainProcessor)11791": { + "encoding": "inplace", + "label": "contract ITransferDomainProcessor", + "numberOfBytes": "20" + }, + "t_contract(IVerifiedDomainRegistry)11871": { + "encoding": "inplace", + "label": "contract IVerifiedDomainRegistry", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_array(t_uint256)dyn_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256[])", + "numberOfBytes": "32", + "value": "t_array(t_uint256)dyn_storage" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_uint256,t_struct(Bid)4959_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct DomainExchange.Bid)", + "numberOfBytes": "32", + "value": "t_struct(Bid)4959_storage" + }, + "t_mapping(t_uint256,t_struct(Listing)4936_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct DomainExchange.Listing)", + "numberOfBytes": "32", + "value": "t_struct(Listing)4936_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Bid)4959_storage": { + "encoding": "inplace", + "label": "struct DomainExchange.Bid", + "members": [ + { + "astId": 4944, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "buyer", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 4946, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "listingId", + "offset": 0, + "slot": "1", + "type": "t_uint256" + }, + { + "astId": 4948, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "encryptedBuyerId", + "offset": 0, + "slot": "2", + "type": "t_string_storage" + }, + { + "astId": 4950, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "buyerIdHash", + "offset": 0, + "slot": "3", + "type": "t_bytes32" + }, + { + "astId": 4952, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "createdAt", + "offset": 0, + "slot": "4", + "type": "t_uint256" + }, + { + "astId": 4954, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "expiryTimestamp", + "offset": 0, + "slot": "5", + "type": "t_uint256" + }, + { + "astId": 4956, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "price", + "offset": 0, + "slot": "6", + "type": "t_uint256" + }, + { + "astId": 4958, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "refundInitiated", + "offset": 0, + "slot": "7", + "type": "t_bool" + } + ], + "numberOfBytes": "256" + }, + "t_struct(Listing)4936_storage": { + "encoding": "inplace", + "label": "struct DomainExchange.Listing", + "members": [ + { + "astId": 4916, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "seller", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 4918, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "saleEthRecipient", + "offset": 0, + "slot": "1", + "type": "t_address_payable" + }, + { + "astId": 4920, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "dkimKeyHash", + "offset": 0, + "slot": "2", + "type": "t_bytes32" + }, + { + "astId": 4922, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "encryptionKey", + "offset": 0, + "slot": "3", + "type": "t_bytes_storage" + }, + { + "astId": 4924, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "domainId", + "offset": 0, + "slot": "4", + "type": "t_bytes32" + }, + { + "astId": 4926, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "createdAt", + "offset": 0, + "slot": "5", + "type": "t_uint256" + }, + { + "astId": 4928, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "askPrice", + "offset": 0, + "slot": "6", + "type": "t_uint256" + }, + { + "astId": 4930, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "minBidPrice", + "offset": 0, + "slot": "7", + "type": "t_uint256" + }, + { + "astId": 4932, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "isActive", + "offset": 0, + "slot": "8", + "type": "t_bool" + }, + { + "astId": 4935, + "contract": "contracts/DomainExchange.sol:DomainExchange", + "label": "bids", + "offset": 0, + "slot": "9", + "type": "t_array(t_uint256)dyn_storage" + } + ], + "numberOfBytes": "320" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/contracts-domain/deployments/base/NamecheapManagedKeyHashAdapter.json b/contracts-domain/deployments/base/NamecheapManagedKeyHashAdapter.json new file mode 100644 index 000000000..87a404ed1 --- /dev/null +++ b/contracts-domain/deployments/base/NamecheapManagedKeyHashAdapter.json @@ -0,0 +1,290 @@ +{ + "address": "0x6d00beaA1F921f22f10bAda079f2fb1bf0342e38", + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_mailServerKeyHashes", + "type": "bytes32[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "mailserverKeyHash", + "type": "bytes32" + } + ], + "name": "MailServerKeyHashAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "mailserverKeyHash", + "type": "bytes32" + } + ], + "name": "MailServerKeyHashRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_mailserverKeyHash", + "type": "bytes32" + } + ], + "name": "addMailServerKeyHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getMailServerKeyHashes", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "isMailServerKeyHash", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "mailServerKeyHashes", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_mailserverKeyHash", + "type": "bytes32" + } + ], + "name": "removeMailServerKeyHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xbbdb618ac153708022c44991521a78efe7a37c452ad4e96432566a4becb6eee3", + "receipt": { + "to": null, + "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", + "contractAddress": "0x6d00beaA1F921f22f10bAda079f2fb1bf0342e38", + "transactionIndex": 92, + "gasUsed": "766431", + "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000000000000000000000200000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000004000000", + "blockHash": "0x2642856bef1171d00f41f86275b847b85308e985981c0a46fcec0dc144d7cf92", + "transactionHash": "0xbbdb618ac153708022c44991521a78efe7a37c452ad4e96432566a4becb6eee3", + "logs": [ + { + "transactionIndex": 92, + "blockNumber": 20166820, + "transactionHash": "0xbbdb618ac153708022c44991521a78efe7a37c452ad4e96432566a4becb6eee3", + "address": "0x6d00beaA1F921f22f10bAda079f2fb1bf0342e38", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" + ], + "data": "0x", + "logIndex": 234, + "blockHash": "0x2642856bef1171d00f41f86275b847b85308e985981c0a46fcec0dc144d7cf92" + } + ], + "blockNumber": 20166820, + "cumulativeGasUsed": "13751578", + "status": 1, + "byzantium": true + }, + "args": [ + [ + "0x0db7730bdd90c823601ed32395c8b2f3307fd4adc477ca22bf3ed406c1b3ae4a" + ] + ], + "numDeployments": 1, + "solcInputHash": "d865a6f49eab8c58036d78b72f5cb448", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_mailServerKeyHashes\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"mailserverKeyHash\",\"type\":\"bytes32\"}],\"name\":\"MailServerKeyHashAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"mailserverKeyHash\",\"type\":\"bytes32\"}],\"name\":\"MailServerKeyHashRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_mailserverKeyHash\",\"type\":\"bytes32\"}],\"name\":\"addMailServerKeyHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMailServerKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"isMailServerKeyHash\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"mailServerKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_mailserverKeyHash\",\"type\":\"bytes32\"}],\"name\":\"removeMailServerKeyHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/external/ManagedKeyHashAdapterV2.sol\":\"ManagedKeyHashAdapterV2\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"contracts/external/ManagedKeyHashAdapterV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"./interfaces/IKeyHashAdapterV2.sol\\\";\\nimport { Bytes32ArrayUtils } from \\\"./lib/Bytes32ArrayUtils.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract ManagedKeyHashAdapterV2 is Ownable, IKeyHashAdapterV2 {\\n \\n using Bytes32ArrayUtils for bytes32[];\\n\\n /* ============ Events ============ */\\n event MailServerKeyHashAdded(bytes32 mailserverKeyHash);\\n event MailServerKeyHashRemoved(bytes32 mailserverKeyHash);\\n\\n /* ============ State Variables ============ */\\n\\n mapping(bytes32 => bool) public isMailServerKeyHash;\\n bytes32[] public mailServerKeyHashes;\\n\\n /* ============ Constructor ============ */\\n\\n constructor(\\n bytes32[] memory _mailServerKeyHashes\\n )\\n Ownable()\\n {\\n for (uint256 i = 0; i < _mailServerKeyHashes.length; i++) {\\n bytes32 mailserverKeyHash = _mailServerKeyHashes[i];\\n require(!isMailServerKeyHash[mailserverKeyHash], \\\"Key hash already added\\\");\\n \\n isMailServerKeyHash[mailserverKeyHash] = true;\\n mailServerKeyHashes.push(mailserverKeyHash);\\n }\\n }\\n\\n /* ============ External Functions ============ */\\n\\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external onlyOwner {\\n require(!isMailServerKeyHash[_mailserverKeyHash], \\\"Key hash already added\\\");\\n\\n isMailServerKeyHash[_mailserverKeyHash] = true;\\n mailServerKeyHashes.push(_mailserverKeyHash);\\n\\n emit MailServerKeyHashAdded(_mailserverKeyHash);\\n }\\n\\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external onlyOwner {\\n require(isMailServerKeyHash[_mailserverKeyHash], \\\"Key hash not added\\\");\\n\\n isMailServerKeyHash[_mailserverKeyHash] = false;\\n mailServerKeyHashes.removeStorage(_mailserverKeyHash);\\n\\n emit MailServerKeyHashRemoved(_mailserverKeyHash);\\n }\\n\\n /* ============ External Getter Functions ============ */\\n\\n function getMailServerKeyHashes() external view override returns (bytes32[] memory) {\\n return mailServerKeyHashes;\\n }\\n}\\n\",\"keccak256\":\"0x13d60704c96e0d88380cc2db7367cf17848b03fcd410fade3ba7161046cabeac\",\"license\":\"MIT\"},\"contracts/external/interfaces/IKeyHashAdapterV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IKeyHashAdapterV2 {\\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function getMailServerKeyHashes() external view returns (bytes32[] memory);\\n function isMailServerKeyHash(bytes32 _mailserverKeyHash) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc849f2dc34e4463550b8e0a16541bde429cb1adf43776b2c4179e9d4e4e656a2\",\"license\":\"MIT\"},\"contracts/external/lib/Bytes32ArrayUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.17;\\n\\n/**\\n * @title Bytes32ArrayUtils\\n * @author ZKP2P\\n *\\n * Fork of Set Protocol's AddressArrayUtils library adapted for usage with bytes32 arrays.\\n */\\nlibrary Bytes32ArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(bytes32[] memory A, bytes32 a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(bytes32[] memory A, bytes32 a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns true if there are 2 elements that are the same in an array\\n * @param A The input array to search\\n * @return Returns boolean for the first occurrence of a duplicate\\n */\\n function hasDuplicate(bytes32[] memory A) internal pure returns(bool) {\\n require(A.length > 0, \\\"A is empty\\\");\\n\\n for (uint256 i = 0; i < A.length - 1; i++) {\\n bytes32 current = A[i];\\n for (uint256 j = i + 1; j < A.length; j++) {\\n if (current == A[j]) {\\n return true;\\n }\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The bytes32 to remove\\n * @return Returns the array with the object removed.\\n */\\n function remove(bytes32[] memory A, bytes32 a)\\n internal\\n pure\\n returns (bytes32[] memory)\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"bytes32 not in array.\\\");\\n } else {\\n (bytes32[] memory _A,) = pop(A, index);\\n return _A;\\n }\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The bytes32 to remove\\n */\\n function removeStorage(bytes32[] storage A, bytes32 a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"bytes32 not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n\\n /**\\n * Removes specified index from array\\n * @param A The input array to search\\n * @param index The index to remove\\n * @return Returns the new array and the removed entry\\n */\\n function pop(bytes32[] memory A, uint256 index)\\n internal\\n pure\\n returns (bytes32[] memory, bytes32)\\n {\\n uint256 length = A.length;\\n require(index < A.length, \\\"Index must be < A length\\\");\\n bytes32[] memory newBytes = new bytes32[](length - 1);\\n for (uint256 i = 0; i < index; i++) {\\n newBytes[i] = A[i];\\n }\\n for (uint256 j = index + 1; j < length; j++) {\\n newBytes[j - 1] = A[j];\\n }\\n return (newBytes, A[index]);\\n }\\n}\\n\",\"keccak256\":\"0x14d572deda126ff812eb5ab0eed33120e13cc568fd611a4a6bff652f3e8440a8\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523462000030576200001e620000186200013d565b620002d7565b604051610aed620004718239610aed90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200006d57604052565b62000035565b906200008a6200008260405190565b92836200004b565b565b6001600160401b0381116200006d5760208091020190565b90929192620000bd620000b7826200008c565b62000073565b93818552602080860192028301928184116200003057915b838310620000e35750505050565b8251815260209283019201620000d5565b9080601f83011215620000305781516200011192602001620000a4565b90565b90602082820312620000305781516001600160401b0381116200003057620001119201620000f4565b6200011162000f5e80380380620001548162000073565b92833981019062000114565b6200011162000111620001119290565b634e487b7160e01b600052601160045260246000fd5b6000198114620001965760010190565b62000170565b634e487b7160e01b600052603260045260246000fd5b90620001bc825190565b811015620001ce576020809102010190565b6200019c565b15620001dc57565b60405162461bcd60e51b815260206004820152601660248201527f4b6579206861736820616c7265616479206164646564000000000000000000006044820152606490fd5b9060ff905b9181191691161790565b9062000243620001116200024b92151590565b825462000221565b9055565b8054821015620001ce576200026b600191600052602060002090565b91020190600090565b9160001960089290920291821b911b62000226565b91906200029b620001116200024b9390565b90835462000274565b90815491680100000000000000008310156200006d5782620002d09160016200008a950181556200024f565b9062000289565b90620002e26200038c565b620002ee600062000160565b620002fb62000111845190565b8110156200038757806200037b620003206200031c620003819487620001b2565b5190565b62000373600162000358620003526200034e62000347868590600052602052604060002090565b5460ff1690565b1590565b620001d4565b6200036d838290600052602052604060002090565b62000230565b6002620002a4565b62000186565b620002ee565b509050565b6200008a80336200040e565b62000111905b6001600160a01b031690565b62000111905462000398565b906001600160a01b039062000226565b62000111906200039e906001600160a01b031682565b6200011190620003c6565b6200011190620003dc565b9062000406620001116200024b92620003e7565b8254620003b6565b6200041a6000620003aa565b9062000428816000620003f2565b6200045f620004587f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093620003e7565b91620003e7565b916200046a60405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c806319d091521461009257806361ba662a1461008d578063687bc0ab14610088578063715018a6146100835780638da5cb5b1461007e578063a26c04ee14610079578063b86e2d72146100745763f2fde38b036100a057610339565b6102dd565b610247565b610208565b6101e4565b6101bd565b61012e565b6100fd565b805b036100a057565b600080fd5b905035906100b282610097565b565b906020828203126100a0576100c8916100a5565b90565b6100c8916008021c5b60ff1690565b906100c891546100cb565b60009081526001602052604081206100c891906100da565b346100a05761012a6101186101133660046100b4565b6100e5565b60405191829182901515815260200190565b0390f35b346100a0576101466101413660046100b4565b6106e8565b604051005b60009103126100a057565b9061017661016f610165845190565b8084529260200190565b9260200190565b9060005b8181106101875750505090565b9091926101a461019d6001928651815260200190565b9460200190565b92910161017a565b60208082526100c892910190610156565b346100a0576101cd36600461014b565b61012a6101d861087e565b604051918291826101ac565b346100a0576101f436600461014b565b610146610389565b6001600160a01b031690565b346100a05761021836600461014b565b61012a61022d6000546001600160a01b031690565b604051918291826001600160a01b03909116815260200190565b346100a05761014661025a3660046100b4565b6107b6565b634e487b7160e01b600052603260045260246000fd5b80548210156102985761028f600191600052602060002090565b91020190600090565b61025f565b6100c8916008021c81565b906100c8915461029d565b600260006102bf825490565b8310156102da57506100c8916102d491610275565b906102a8565b80fd5b346100a05761012a6102f86102f33660046100b4565b6102b3565b6040515b9182918290815260200190565b6001600160a01b038116610099565b905035906100b282610309565b906020828203126100a0576100c891610318565b346100a05761014661034c366004610325565b6104aa565b6103596103e5565b6100b2610377565b6101fc6100c86100c89290565b6100c890610361565b6100b2610384600061036e565b610509565b6100b2610351565b1561039857565b60405162461bcd60e51b8152806103e1600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6100b26103fa6000546001600160a01b031690565b610413610406336101fc565b916001600160a01b031690565b14610391565b6100b2906104256103e5565b610485565b1561043157565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6100b2906103846104996101fc600061036e565b6001600160a01b038316141561042a565b6100b290610419565b906001600160a01b03905b9181191691161790565b6100c8906101fc906001600160a01b031682565b6100c8906104c8565b6100c8906104dc565b906104fe6100c8610505926104e5565b82546104b3565b9055565b6000546001600160a01b0316906105218160006104ee565b61055461054e7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936104e5565b916104e5565b9161055e60405190565b600090a3565b6100b2906105706103e5565b610661565b6100c8906100d4565b6100c89054610575565b1561058f57565b60405162461bcd60e51b815260206004820152601660248201527512d95e481a185cda08185b1c9958591e48185919195960521b6044820152606490fd5b9060ff906104be565b906105e66100c861050592151590565b82546105cd565b634e487b7160e01b600052604160045260246000fd5b9160001960089290920291821b911b6104be565b91906106266100c86105059390565b908354610603565b908154916801000000000000000083101561065c57826106569160016100b295018155610275565b90610617565b6105ed565b6106aa600161069161068c610688610683868590600052602052604060002090565b61057e565b1590565b610588565b6106a5838290600052602052604060002090565b6105d6565b6106b581600261062e565b6106e37fc1674d5f4b3c1397f7aad948ab8fb7adfb24a8f170f8c07349d880c342da030b916102fc60405190565b0390a1565b6100b290610564565b6100b2906106fd6103e5565b610743565b1561070957565b60405162461bcd60e51b815260206004820152601260248201527112d95e481a185cda081b9bdd08185919195960721b6044820152606490fd5b61077d6001610767610762610683858490600052602052604060002090565b610702565b6106a58360009290600052602052604060002090565b610788816002610971565b6106e37f57f03401c03965ea5770efca656f696bdaa598efbaa2c899de9c70749634fabd916102fc60405190565b6100b2906106f1565b6100c89081565b6100c890546107bf565b906107eb6107df610165845490565b92600052602060002090565b9060005b8181106107fc5750505090565b909192610820610819600192610811876107c6565b815260200190565b9460010190565b9291016107ef565b906100c8916107d0565b90601f01601f1916810190811067ffffffffffffffff82111761065c57604052565b906100b261086e9261086560405190565b93848092610828565b0383610832565b6100c890610854565b6100c86002610875565b906108976107df610165845490565b9060005b8181106108a85750505090565b9091926108bd610819600192610811876107c6565b92910161089b565b906100c891610888565b906100b261086e926108e060405190565b938480926108c5565b6100c8906108cf565b6100c86100c86100c89290565b634e487b7160e01b600052601160045260246000fd5b9190820391821161092257565b6108ff565b634e487b7160e01b600052603160045260246000fd5b6100b291600091610617565b8054801561096c5760001901906109696109638383610275565b9061093d565b55565b610927565b61098661098d92610981836108e9565b610a53565b9092901590565b156109cf5760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b6044820152606490fd5b6100b2916109ee6109de835490565b6109e860016108f2565b90610915565b908181036109fe575b5050610949565b610656610a116102d4610a189486610275565b9184610275565b38806109f7565b60001981146109225760010190565b90610a37825190565b811015610298576020809102010190565b6100c86000196108f2565b91908251926000610a63816108f2565b855b811015610aaa57610a7d610a798285610a2e565b5190565b8490610a88565b9190565b14610aa057610a99610a6591610a1f565b9050610a63565b9450505050600190565b5093505050610a84610a4856fea2646970667358221220cea7059c06059b0cdd2bc4094fb91f900abb58ad31de2b8f44a6d19c080e596264736f6c63430008120033", + "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806319d091521461009257806361ba662a1461008d578063687bc0ab14610088578063715018a6146100835780638da5cb5b1461007e578063a26c04ee14610079578063b86e2d72146100745763f2fde38b036100a057610339565b6102dd565b610247565b610208565b6101e4565b6101bd565b61012e565b6100fd565b805b036100a057565b600080fd5b905035906100b282610097565b565b906020828203126100a0576100c8916100a5565b90565b6100c8916008021c5b60ff1690565b906100c891546100cb565b60009081526001602052604081206100c891906100da565b346100a05761012a6101186101133660046100b4565b6100e5565b60405191829182901515815260200190565b0390f35b346100a0576101466101413660046100b4565b6106e8565b604051005b60009103126100a057565b9061017661016f610165845190565b8084529260200190565b9260200190565b9060005b8181106101875750505090565b9091926101a461019d6001928651815260200190565b9460200190565b92910161017a565b60208082526100c892910190610156565b346100a0576101cd36600461014b565b61012a6101d861087e565b604051918291826101ac565b346100a0576101f436600461014b565b610146610389565b6001600160a01b031690565b346100a05761021836600461014b565b61012a61022d6000546001600160a01b031690565b604051918291826001600160a01b03909116815260200190565b346100a05761014661025a3660046100b4565b6107b6565b634e487b7160e01b600052603260045260246000fd5b80548210156102985761028f600191600052602060002090565b91020190600090565b61025f565b6100c8916008021c81565b906100c8915461029d565b600260006102bf825490565b8310156102da57506100c8916102d491610275565b906102a8565b80fd5b346100a05761012a6102f86102f33660046100b4565b6102b3565b6040515b9182918290815260200190565b6001600160a01b038116610099565b905035906100b282610309565b906020828203126100a0576100c891610318565b346100a05761014661034c366004610325565b6104aa565b6103596103e5565b6100b2610377565b6101fc6100c86100c89290565b6100c890610361565b6100b2610384600061036e565b610509565b6100b2610351565b1561039857565b60405162461bcd60e51b8152806103e1600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6100b26103fa6000546001600160a01b031690565b610413610406336101fc565b916001600160a01b031690565b14610391565b6100b2906104256103e5565b610485565b1561043157565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6100b2906103846104996101fc600061036e565b6001600160a01b038316141561042a565b6100b290610419565b906001600160a01b03905b9181191691161790565b6100c8906101fc906001600160a01b031682565b6100c8906104c8565b6100c8906104dc565b906104fe6100c8610505926104e5565b82546104b3565b9055565b6000546001600160a01b0316906105218160006104ee565b61055461054e7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936104e5565b916104e5565b9161055e60405190565b600090a3565b6100b2906105706103e5565b610661565b6100c8906100d4565b6100c89054610575565b1561058f57565b60405162461bcd60e51b815260206004820152601660248201527512d95e481a185cda08185b1c9958591e48185919195960521b6044820152606490fd5b9060ff906104be565b906105e66100c861050592151590565b82546105cd565b634e487b7160e01b600052604160045260246000fd5b9160001960089290920291821b911b6104be565b91906106266100c86105059390565b908354610603565b908154916801000000000000000083101561065c57826106569160016100b295018155610275565b90610617565b6105ed565b6106aa600161069161068c610688610683868590600052602052604060002090565b61057e565b1590565b610588565b6106a5838290600052602052604060002090565b6105d6565b6106b581600261062e565b6106e37fc1674d5f4b3c1397f7aad948ab8fb7adfb24a8f170f8c07349d880c342da030b916102fc60405190565b0390a1565b6100b290610564565b6100b2906106fd6103e5565b610743565b1561070957565b60405162461bcd60e51b815260206004820152601260248201527112d95e481a185cda081b9bdd08185919195960721b6044820152606490fd5b61077d6001610767610762610683858490600052602052604060002090565b610702565b6106a58360009290600052602052604060002090565b610788816002610971565b6106e37f57f03401c03965ea5770efca656f696bdaa598efbaa2c899de9c70749634fabd916102fc60405190565b6100b2906106f1565b6100c89081565b6100c890546107bf565b906107eb6107df610165845490565b92600052602060002090565b9060005b8181106107fc5750505090565b909192610820610819600192610811876107c6565b815260200190565b9460010190565b9291016107ef565b906100c8916107d0565b90601f01601f1916810190811067ffffffffffffffff82111761065c57604052565b906100b261086e9261086560405190565b93848092610828565b0383610832565b6100c890610854565b6100c86002610875565b906108976107df610165845490565b9060005b8181106108a85750505090565b9091926108bd610819600192610811876107c6565b92910161089b565b906100c891610888565b906100b261086e926108e060405190565b938480926108c5565b6100c8906108cf565b6100c86100c86100c89290565b634e487b7160e01b600052601160045260246000fd5b9190820391821161092257565b6108ff565b634e487b7160e01b600052603160045260246000fd5b6100b291600091610617565b8054801561096c5760001901906109696109638383610275565b9061093d565b55565b610927565b61098661098d92610981836108e9565b610a53565b9092901590565b156109cf5760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b6044820152606490fd5b6100b2916109ee6109de835490565b6109e860016108f2565b90610915565b908181036109fe575b5050610949565b610656610a116102d4610a189486610275565b9184610275565b38806109f7565b60001981146109225760010190565b90610a37825190565b811015610298576020809102010190565b6100c86000196108f2565b91908251926000610a63816108f2565b855b811015610aaa57610a7d610a798285610a2e565b5190565b8490610a88565b9190565b14610aa057610a99610a6591610a1f565b9050610a63565b9450505050600190565b5093505050610a84610a4856fea2646970667358221220cea7059c06059b0cdd2bc4094fb91f900abb58ad31de2b8f44a6d19c080e596264736f6c63430008120033", + "devdoc": { + "kind": "dev", + "methods": { + "owner()": { + "details": "Returns the address of the current owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/external/ManagedKeyHashAdapterV2.sol:ManagedKeyHashAdapterV2", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 8924, + "contract": "contracts/external/ManagedKeyHashAdapterV2.sol:ManagedKeyHashAdapterV2", + "label": "isMailServerKeyHash", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_bool)" + }, + { + "astId": 8927, + "contract": "contracts/external/ManagedKeyHashAdapterV2.sol:ManagedKeyHashAdapterV2", + "label": "mailServerKeyHashes", + "offset": 0, + "slot": "2", + "type": "t_array(t_bytes32)dyn_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_bytes32)dyn_storage": { + "base": "t_bytes32", + "encoding": "dynamic_array", + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_bytes32,t_bool)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32", + "value": "t_bool" + } + } + } +} \ No newline at end of file diff --git a/contracts-domain/deployments/base/NullifierRegistry.json b/contracts-domain/deployments/base/NullifierRegistry.json new file mode 100644 index 000000000..6dec224af --- /dev/null +++ b/contracts-domain/deployments/base/NullifierRegistry.json @@ -0,0 +1,371 @@ +{ + "address": "0xcE4d0DE6589bF2b439d08dc9addD56428D76eC25", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "nullifier", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "writer", + "type": "address" + } + ], + "name": "NullifierAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "writer", + "type": "address" + } + ], + "name": "WriterAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "writer", + "type": "address" + } + ], + "name": "WriterRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_nullifier", + "type": "bytes32" + } + ], + "name": "addNullifier", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newWriter", + "type": "address" + } + ], + "name": "addWritePermission", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getWriters", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "isNullified", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isWriter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_removedWriter", + "type": "address" + } + ], + "name": "removeWritePermission", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "writers", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x02df2778eb6e733417ff174a913a9668c58fe186ebd459f843a524968028f490", + "receipt": { + "to": null, + "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", + "contractAddress": "0xcE4d0DE6589bF2b439d08dc9addD56428D76eC25", + "transactionIndex": 62, + "gasUsed": "782784", + "logsBloom": "0x00040000000000000000000000000000000000000000004004800000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xa30de9210af6bf7c48e0dbb6de1b9fb7ae4d12957d7c5c411a0e14290657a3cf", + "transactionHash": "0x02df2778eb6e733417ff174a913a9668c58fe186ebd459f843a524968028f490", + "logs": [ + { + "transactionIndex": 62, + "blockNumber": 20166825, + "transactionHash": "0x02df2778eb6e733417ff174a913a9668c58fe186ebd459f843a524968028f490", + "address": "0xcE4d0DE6589bF2b439d08dc9addD56428D76eC25", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" + ], + "data": "0x", + "logIndex": 208, + "blockHash": "0xa30de9210af6bf7c48e0dbb6de1b9fb7ae4d12957d7c5c411a0e14290657a3cf" + } + ], + "blockNumber": 20166825, + "cumulativeGasUsed": "9578995", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "d865a6f49eab8c58036d78b72f5cb448", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"nullifier\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"writer\",\"type\":\"address\"}],\"name\":\"NullifierAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"writer\",\"type\":\"address\"}],\"name\":\"WriterAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"writer\",\"type\":\"address\"}],\"name\":\"WriterRemoved\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_nullifier\",\"type\":\"bytes32\"}],\"name\":\"addNullifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newWriter\",\"type\":\"address\"}],\"name\":\"addWritePermission\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWriters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"isNullified\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isWriter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_removedWriter\",\"type\":\"address\"}],\"name\":\"removeWritePermission\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"writers\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addNullifier(bytes32)\":{\"params\":{\"_nullifier\":\"The nullifier to store\"}},\"addWritePermission(address)\":{\"params\":{\"_newWriter\":\"The nullifier to store\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"removeWritePermission(address)\":{\"params\":{\"_removedWriter\":\"The nullifier to store\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addNullifier(bytes32)\":{\"notice\":\"ONLY WRITER: Only addresses with permission to write to this contract can call. Stores a nullifier for an email.\"},\"addWritePermission(address)\":{\"notice\":\"ONLY OWNER: Add address that has write permissions to the registry. Writer must not have been previously added.\"},\"removeWritePermission(address)\":{\"notice\":\"ONLY OWNER: Remove address that has write permissions to the registry. Writer must have been previously added.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/external/NullifierRegistry.sol\":\"NullifierRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"contracts/external/NullifierRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { AddressArrayUtils } from \\\"./lib/AddressArrayUtils.sol\\\";\\nimport { INullifierRegistry } from \\\"./interfaces/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract NullifierRegistry is Ownable, INullifierRegistry {\\n\\n using AddressArrayUtils for address[];\\n \\n /* ============ Events ============ */\\n event NullifierAdded(bytes32 nullifier, address indexed writer);\\n event WriterAdded(address writer);\\n event WriterRemoved(address writer);\\n\\n /* ============ Modifiers ============ */\\n modifier onlyWriter() {\\n require(isWriter[msg.sender], \\\"Only addresses with write permissions can call\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n mapping(bytes32 => bool) public isNullified;\\n mapping(address => bool) public isWriter;\\n address[] public writers;\\n\\n /* ============ Constructor ============ */\\n constructor() Ownable() {}\\n \\n /* ============ External Functions ============ */\\n\\n /**\\n * ONLY WRITER: Only addresses with permission to write to this contract can call. Stores a nullifier for an email.\\n *\\n * @param _nullifier The nullifier to store\\n */\\n function addNullifier(bytes32 _nullifier) external onlyWriter {\\n require(!isNullified[_nullifier], \\\"Nullifier already exists\\\");\\n\\n isNullified[_nullifier] = true;\\n\\n emit NullifierAdded(_nullifier, msg.sender);\\n }\\n\\n /* ============ Admin Functions ============ */\\n\\n /**\\n * ONLY OWNER: Add address that has write permissions to the registry. Writer must not have been previously added.\\n *\\n * @param _newWriter The nullifier to store\\n */\\n function addWritePermission(address _newWriter) external onlyOwner {\\n require(!isWriter[_newWriter], \\\"Address is already a writer\\\");\\n\\n isWriter[_newWriter] = true;\\n writers.push(_newWriter);\\n\\n emit WriterAdded(_newWriter);\\n }\\n\\n /**\\n * ONLY OWNER: Remove address that has write permissions to the registry. Writer must have been previously added.\\n *\\n * @param _removedWriter The nullifier to store\\n */\\n function removeWritePermission(address _removedWriter) external onlyOwner {\\n require(isWriter[_removedWriter], \\\"Address is not a writer\\\");\\n\\n isWriter[_removedWriter] = false;\\n writers.removeStorage(_removedWriter);\\n\\n emit WriterRemoved(_removedWriter);\\n }\\n\\n /* ============ External View Functions ============ */\\n\\n function getWriters() external view returns(address[] memory) {\\n return writers;\\n }\\n}\\n\",\"keccak256\":\"0x2c461bc3e7074c455f0e7cce2edceb6db47d158ce38f8562ba3c02d41fd4ea77\",\"license\":\"MIT\"},\"contracts/external/interfaces/INullifierRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface INullifierRegistry {\\n function addNullifier(bytes32 _nullifier) external;\\n function isNullified(bytes32 _nullifier) external view returns(bool);\\n}\\n\",\"keccak256\":\"0x107164bc9a320938b513305878163b7fa884da4cdae58d0c8e81bfbb00c97c5e\",\"license\":\"MIT\"},\"contracts/external/lib/AddressArrayUtils.sol\":{\"content\":\"/*\\n Copyright 2020 Set Labs Inc.\\n\\n Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n you may not use this file except in compliance with the License.\\n You may obtain a copy of the License at\\n\\n http://www.apache.org/licenses/LICENSE-2.0\\n\\n Unless required by applicable law or agreed to in writing, software\\n distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n See the License for the specific language governing permissions and\\n limitations under the License.\\n\\n SPDX-License-Identifier: MIT\\n*/\\n\\npragma solidity ^0.8.17;\\n\\n/**\\n * @title AddressArrayUtils\\n * @author Set Protocol\\n *\\n * Utility functions to handle Address Arrays\\n *\\n * CHANGELOG:\\n * - 4/21/21: Added validatePairsWithArray methods\\n */\\nlibrary AddressArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(address[] memory A, address a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(address[] memory A, address a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns true if there are 2 elements that are the same in an array\\n * @param A The input array to search\\n * @return Returns boolean for the first occurrence of a duplicate\\n */\\n function hasDuplicate(address[] memory A) internal pure returns(bool) {\\n require(A.length > 0, \\\"A is empty\\\");\\n\\n for (uint256 i = 0; i < A.length - 1; i++) {\\n address current = A[i];\\n for (uint256 j = i + 1; j < A.length; j++) {\\n if (current == A[j]) {\\n return true;\\n }\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n * @return Returns the array with the object removed.\\n */\\n function remove(address[] memory A, address a)\\n internal\\n pure\\n returns (address[] memory)\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n (address[] memory _A,) = pop(A, index);\\n return _A;\\n }\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n */\\n function removeStorage(address[] storage A, address a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n\\n /**\\n * Removes specified index from array\\n * @param A The input array to search\\n * @param index The index to remove\\n * @return Returns the new array and the removed entry\\n */\\n function pop(address[] memory A, uint256 index)\\n internal\\n pure\\n returns (address[] memory, address)\\n {\\n uint256 length = A.length;\\n require(index < A.length, \\\"Index must be < A length\\\");\\n address[] memory newAddresses = new address[](length - 1);\\n for (uint256 i = 0; i < index; i++) {\\n newAddresses[i] = A[i];\\n }\\n for (uint256 j = index + 1; j < length; j++) {\\n newAddresses[j - 1] = A[j];\\n }\\n return (newAddresses, A[index]);\\n }\\n}\\n\",\"keccak256\":\"0x486f1a373f33aa167227600ac2d0bf95b37685413d98a3e745107188f00ae405\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6080604052346200002657620000146200002b565b604051610cb3620001278239610cb390f35b600080fd5b6200003562000037565b565b620000358033620000c4565b62000055905b6001600160a01b031690565b90565b62000055905462000043565b620000559062000049906001600160a01b031682565b620000559062000064565b62000055906200007a565b90620000a462000055620000c09262000085565b82546001600160a01b0319166001600160a01b03919091161790565b9055565b620000d0600062000058565b90620000de81600062000090565b620001156200010e7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09362000085565b9162000085565b916200012060405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c8063169394bb146100b2578063286f9201146100ad5780632b29ba23146100a85780635bd4df32146100a357806366a526721461009e578063715018a6146100995780638da5cb5b14610094578063cb01316c1461008f578063d6da03261461008a5763f2fde38b036100c0576103ce565b6103b6565b61038f565b610304565b6102ec565b6102ab565b610213565b6101f8565b610199565b61012c565b805b036100c057565b600080fd5b905035906100d2826100b7565b565b906020828203126100c0576100e8916100c5565b90565b905b600052602052604060002090565b6100e8916008021c5b60ff1690565b906100e891546100fb565b6100e8906101276001916000926100eb565b61010a565b346100c0576101596101476101423660046100d4565b610115565b60405191829182901515815260200190565b0390f35b6001600160a01b031690565b6001600160a01b0381166100b9565b905035906100d282610169565b906020828203126100c0576100e891610178565b346100c0576101b16101ac366004610185565b610970565b604051005b6100e89061015d906001600160a01b031682565b6100e8906101b6565b6100e8906101ca565b906100ed906101d3565b6100e8906101276002916000926101dc565b346100c05761015961014761020e366004610185565b6101e6565b346100c0576101b16102263660046100d4565b610763565b634e487b7160e01b600052603260045260246000fd5b80548210156102645761025b600191600052602060002090565b91020190600090565b61022b565b6100e8916008021c61015d565b906100e89154610269565b6003600061028d825490565b8310156102a857506100e8916102a291610241565b90610276565b80fd5b346100c0576101596102c66102c13660046100d4565b610281565b6040515b918291826001600160a01b03909116815260200190565b60009103126100c057565b346100c0576102fc3660046102e1565b6101b161043b565b346100c0576103143660046102e1565b6101596102c66103f9565b9061033f61033861032e845190565b8084529260200190565b9260200190565b9060005b8181106103505750505090565b90919261037661036f60019286516001600160a01b0316815260200190565b9460200190565b929101610343565b60208082526100e89291019061031f565b346100c05761039f3660046102e1565b6101596103aa610a30565b6040519182918261037e565b346100c0576101b16103c9366004610185565b6108ab565b346100c0576101b16103e1366004610185565b610552565b6100e89061015d565b6100e890546103e6565b6100e860006103ef565b61040b610497565b6100d2610429565b61015d6100e86100e89290565b6100e890610413565b6100d26104366000610420565b61058b565b6100d2610403565b1561044a57565b60405162461bcd60e51b815280610493600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6100d26104a26103f9565b6104bb6104ae3361015d565b916001600160a01b031690565b14610443565b6100d2906104cd610497565b61052d565b156104d957565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6100d29061043661054161015d6000610420565b6001600160a01b03831614156104d2565b6100d2906104c1565b906001600160a01b03905b9181191691161790565b906105806100e8610587926101d3565b825461055b565b9055565b61059560006103ef565b906105a1816000610570565b6105d46105ce7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936101d3565b916101d3565b916105de60405190565b600090a3565b6100e890610104565b6100e890546105e4565b156105fe57565b60405162461bcd60e51b815260206004820152602e60248201527f4f6e6c79206164647265737365732077697468207772697465207065726d697360448201526d1cda5bdb9cc818d85b8818d85b1b60921b6064820152608490fd5b6100d29061067961067461066f3360026101dc565b6105ed565b6105f7565b6106ea565b1561068557565b60405162461bcd60e51b815260206004820152601860248201527f4e756c6c696669657220616c72656164792065786973747300000000000000006044820152606490fd5b9060ff90610566565b906106e36100e861058792151590565b82546106ca565b61071a600161070b61070661070261066f86856100eb565b1590565b61067e565b61071583826100eb565b6106d3565b7f57d64412939564693aa1e17d56c93933396b3a990f47c84dfc16a201fc2f3f8361075e610747336101d3565b9261075160405190565b9182918290815260200190565b0390a2565b6100d29061065a565b6100d290610778610497565b610844565b1561078457565b60405162461bcd60e51b815260206004820152601b60248201527f4164647265737320697320616c726561647920612077726974657200000000006044820152606490fd5b634e487b7160e01b600052604160045260246000fd5b916001600160a01b0360089290920291821b911b610566565b91906108096100e8610587936101d3565b9083546107df565b908154916801000000000000000083101561083f57826108399160016100d295018155610241565b906107f8565b6107c9565b61086d600261086161085c61070261066f86856101dc565b61077d565b610715836001926101dc565b610878816003610811565b6108a67f6ff3aa2ea7b53070f6d9d07a445d338d89e8edef44250ffa8be19f53910d4a2e916102ca60405190565b0390a1565b6100d29061076c565b6100d2906108c0610497565b610911565b156108cc57565b60405162461bcd60e51b815260206004820152601760248201527f41646472657373206973206e6f742061207772697465720000000000000000006044820152606490fd5b610937600261092b61092661066f85846101dc565b6108c5565b610715836000926101dc565b610942816003610b23565b6108a67f86e5bbceda94081c32220d685f37cc4e3ea7bb0be2dfbf0cb703579505a5390e916102ca60405190565b6100d2906108b4565b9061099461098861032e845490565b92600052602060002090565b9060005b8181106109a55750505090565b9091926109d26109cb6001926109ba876103ef565b6001600160a01b0316815260200190565b9460010190565b929101610998565b906100e891610979565b90601f01601f1916810190811067ffffffffffffffff82111761083f57604052565b906100d2610a2092610a1760405190565b938480926109da565b03836109e4565b6100e890610a06565b6100e86003610a27565b90610a4961098861032e845490565b9060005b818110610a5a5750505090565b909192610a6f6109cb6001926109ba876103ef565b929101610a4d565b906100e891610a3a565b906100d2610a2092610a9260405190565b93848092610a77565b6100e890610a81565b6100e86100e86100e89290565b634e487b7160e01b600052601160045260246000fd5b91908203918211610ad457565b610ab1565b634e487b7160e01b600052603160045260246000fd5b6100d2916000916107f8565b80548015610b1e576000190190610b1b610b158383610241565b90610aef565b55565b610ad9565b610b38610b3f92610b3383610a9b565b610c05565b9092901590565b15610b815760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b6100d291610ba0610b90835490565b610b9a6001610aa4565b90610ac7565b90818103610bb0575b5050610afb565b610839610bc36102a2610bca9486610241565b9184610241565b3880610ba9565b6000198114610ad45760010190565b90610be9825190565b811015610264576020809102010190565b6100e8600019610aa4565b91908251926000610c1581610aa4565b855b811015610c6c57610c38610c2b8285610be0565b516001600160a01b031690565b610c4a6001600160a01b0386166104ae565b14610c6257610c5b610c1791610bd1565b9050610c15565b9450505050600190565b5093505050610c79610bfa565b919056fea2646970667358221220ac3610fa2c1635ee2b87dd0e289f617051e7537c7f88c7217955bec887e7c00964736f6c63430008120033", + "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c8063169394bb146100b2578063286f9201146100ad5780632b29ba23146100a85780635bd4df32146100a357806366a526721461009e578063715018a6146100995780638da5cb5b14610094578063cb01316c1461008f578063d6da03261461008a5763f2fde38b036100c0576103ce565b6103b6565b61038f565b610304565b6102ec565b6102ab565b610213565b6101f8565b610199565b61012c565b805b036100c057565b600080fd5b905035906100d2826100b7565b565b906020828203126100c0576100e8916100c5565b90565b905b600052602052604060002090565b6100e8916008021c5b60ff1690565b906100e891546100fb565b6100e8906101276001916000926100eb565b61010a565b346100c0576101596101476101423660046100d4565b610115565b60405191829182901515815260200190565b0390f35b6001600160a01b031690565b6001600160a01b0381166100b9565b905035906100d282610169565b906020828203126100c0576100e891610178565b346100c0576101b16101ac366004610185565b610970565b604051005b6100e89061015d906001600160a01b031682565b6100e8906101b6565b6100e8906101ca565b906100ed906101d3565b6100e8906101276002916000926101dc565b346100c05761015961014761020e366004610185565b6101e6565b346100c0576101b16102263660046100d4565b610763565b634e487b7160e01b600052603260045260246000fd5b80548210156102645761025b600191600052602060002090565b91020190600090565b61022b565b6100e8916008021c61015d565b906100e89154610269565b6003600061028d825490565b8310156102a857506100e8916102a291610241565b90610276565b80fd5b346100c0576101596102c66102c13660046100d4565b610281565b6040515b918291826001600160a01b03909116815260200190565b60009103126100c057565b346100c0576102fc3660046102e1565b6101b161043b565b346100c0576103143660046102e1565b6101596102c66103f9565b9061033f61033861032e845190565b8084529260200190565b9260200190565b9060005b8181106103505750505090565b90919261037661036f60019286516001600160a01b0316815260200190565b9460200190565b929101610343565b60208082526100e89291019061031f565b346100c05761039f3660046102e1565b6101596103aa610a30565b6040519182918261037e565b346100c0576101b16103c9366004610185565b6108ab565b346100c0576101b16103e1366004610185565b610552565b6100e89061015d565b6100e890546103e6565b6100e860006103ef565b61040b610497565b6100d2610429565b61015d6100e86100e89290565b6100e890610413565b6100d26104366000610420565b61058b565b6100d2610403565b1561044a57565b60405162461bcd60e51b815280610493600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6100d26104a26103f9565b6104bb6104ae3361015d565b916001600160a01b031690565b14610443565b6100d2906104cd610497565b61052d565b156104d957565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6100d29061043661054161015d6000610420565b6001600160a01b03831614156104d2565b6100d2906104c1565b906001600160a01b03905b9181191691161790565b906105806100e8610587926101d3565b825461055b565b9055565b61059560006103ef565b906105a1816000610570565b6105d46105ce7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936101d3565b916101d3565b916105de60405190565b600090a3565b6100e890610104565b6100e890546105e4565b156105fe57565b60405162461bcd60e51b815260206004820152602e60248201527f4f6e6c79206164647265737365732077697468207772697465207065726d697360448201526d1cda5bdb9cc818d85b8818d85b1b60921b6064820152608490fd5b6100d29061067961067461066f3360026101dc565b6105ed565b6105f7565b6106ea565b1561068557565b60405162461bcd60e51b815260206004820152601860248201527f4e756c6c696669657220616c72656164792065786973747300000000000000006044820152606490fd5b9060ff90610566565b906106e36100e861058792151590565b82546106ca565b61071a600161070b61070661070261066f86856100eb565b1590565b61067e565b61071583826100eb565b6106d3565b7f57d64412939564693aa1e17d56c93933396b3a990f47c84dfc16a201fc2f3f8361075e610747336101d3565b9261075160405190565b9182918290815260200190565b0390a2565b6100d29061065a565b6100d290610778610497565b610844565b1561078457565b60405162461bcd60e51b815260206004820152601b60248201527f4164647265737320697320616c726561647920612077726974657200000000006044820152606490fd5b634e487b7160e01b600052604160045260246000fd5b916001600160a01b0360089290920291821b911b610566565b91906108096100e8610587936101d3565b9083546107df565b908154916801000000000000000083101561083f57826108399160016100d295018155610241565b906107f8565b6107c9565b61086d600261086161085c61070261066f86856101dc565b61077d565b610715836001926101dc565b610878816003610811565b6108a67f6ff3aa2ea7b53070f6d9d07a445d338d89e8edef44250ffa8be19f53910d4a2e916102ca60405190565b0390a1565b6100d29061076c565b6100d2906108c0610497565b610911565b156108cc57565b60405162461bcd60e51b815260206004820152601760248201527f41646472657373206973206e6f742061207772697465720000000000000000006044820152606490fd5b610937600261092b61092661066f85846101dc565b6108c5565b610715836000926101dc565b610942816003610b23565b6108a67f86e5bbceda94081c32220d685f37cc4e3ea7bb0be2dfbf0cb703579505a5390e916102ca60405190565b6100d2906108b4565b9061099461098861032e845490565b92600052602060002090565b9060005b8181106109a55750505090565b9091926109d26109cb6001926109ba876103ef565b6001600160a01b0316815260200190565b9460010190565b929101610998565b906100e891610979565b90601f01601f1916810190811067ffffffffffffffff82111761083f57604052565b906100d2610a2092610a1760405190565b938480926109da565b03836109e4565b6100e890610a06565b6100e86003610a27565b90610a4961098861032e845490565b9060005b818110610a5a5750505090565b909192610a6f6109cb6001926109ba876103ef565b929101610a4d565b906100e891610a3a565b906100d2610a2092610a9260405190565b93848092610a77565b6100e890610a81565b6100e86100e86100e89290565b634e487b7160e01b600052601160045260246000fd5b91908203918211610ad457565b610ab1565b634e487b7160e01b600052603160045260246000fd5b6100d2916000916107f8565b80548015610b1e576000190190610b1b610b158383610241565b90610aef565b55565b610ad9565b610b38610b3f92610b3383610a9b565b610c05565b9092901590565b15610b815760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b6100d291610ba0610b90835490565b610b9a6001610aa4565b90610ac7565b90818103610bb0575b5050610afb565b610839610bc36102a2610bca9486610241565b9184610241565b3880610ba9565b6000198114610ad45760010190565b90610be9825190565b811015610264576020809102010190565b6100e8600019610aa4565b91908251926000610c1581610aa4565b855b811015610c6c57610c38610c2b8285610be0565b516001600160a01b031690565b610c4a6001600160a01b0386166104ae565b14610c6257610c5b610c1791610bd1565b9050610c15565b9450505050600190565b5093505050610c79610bfa565b919056fea2646970667358221220ac3610fa2c1635ee2b87dd0e289f617051e7537c7f88c7217955bec887e7c00964736f6c63430008120033", + "devdoc": { + "kind": "dev", + "methods": { + "addNullifier(bytes32)": { + "params": { + "_nullifier": "The nullifier to store" + } + }, + "addWritePermission(address)": { + "params": { + "_newWriter": "The nullifier to store" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "removeWritePermission(address)": { + "params": { + "_removedWriter": "The nullifier to store" + } + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "addNullifier(bytes32)": { + "notice": "ONLY WRITER: Only addresses with permission to write to this contract can call. Stores a nullifier for an email." + }, + "addWritePermission(address)": { + "notice": "ONLY OWNER: Add address that has write permissions to the registry. Writer must not have been previously added." + }, + "removeWritePermission(address)": { + "notice": "ONLY OWNER: Remove address that has write permissions to the registry. Writer must have been previously added." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/external/NullifierRegistry.sol:NullifierRegistry", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 9095, + "contract": "contracts/external/NullifierRegistry.sol:NullifierRegistry", + "label": "isNullified", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_bytes32,t_bool)" + }, + { + "astId": 9099, + "contract": "contracts/external/NullifierRegistry.sol:NullifierRegistry", + "label": "isWriter", + "offset": 0, + "slot": "2", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 9102, + "contract": "contracts/external/NullifierRegistry.sol:NullifierRegistry", + "label": "writers", + "offset": 0, + "slot": "3", + "type": "t_array(t_address)dyn_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "base": "t_address", + "encoding": "dynamic_array", + "label": "address[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_bytes32,t_bool)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32", + "value": "t_bool" + } + } + } +} \ No newline at end of file diff --git a/contracts-domain/deployments/base/TransferDomainProcessor.json b/contracts-domain/deployments/base/TransferDomainProcessor.json new file mode 100644 index 000000000..42ea8220c --- /dev/null +++ b/contracts-domain/deployments/base/TransferDomainProcessor.json @@ -0,0 +1,401 @@ +{ + "address": "0x57C3C3880ca40a17d800FF9c42b5C0e2c026F45B", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_exchange", + "type": "address" + }, + { + "internalType": "contract INullifierRegistry", + "name": "_nullifierRegistry", + "type": "address" + }, + { + "internalType": "string", + "name": "_emailFromAddress", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_timestampBuffer", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "emailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "exchange", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getEmailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nullifierRegistry", + "outputs": [ + { + "internalType": "contract INullifierRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + }, + { + "internalType": "uint256[10]", + "name": "signals", + "type": "uint256[10]" + } + ], + "internalType": "struct ITransferDomainProcessor.TransferProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "processProof", + "outputs": [ + { + "internalType": "bytes32", + "name": "dkimKeyHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "hashedReceiverId", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "domainName", + "type": "string" + }, + { + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_emailFromAddress", + "type": "string" + } + ], + "name": "setEmailFromAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_timestampBuffer", + "type": "uint256" + } + ], + "name": "setTimestampBuffer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "timestampBuffer", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[2]", + "name": "_pA", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "_pB", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "_pC", + "type": "uint256[2]" + }, + { + "internalType": "uint256[10]", + "name": "_pubSignals", + "type": "uint256[10]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xdd0da9fa55715536c1380ecd14ae93a4a6b988d4b6336b38cebd81d96907589c", + "receipt": { + "to": null, + "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", + "contractAddress": "0x57C3C3880ca40a17d800FF9c42b5C0e2c026F45B", + "transactionIndex": 88, + "gasUsed": "1844254", + "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000008000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000201000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x4d4f44d826d2bac2b3beeb4ee271204509c34651a25c6ca8102d4761aa98637e", + "transactionHash": "0xdd0da9fa55715536c1380ecd14ae93a4a6b988d4b6336b38cebd81d96907589c", + "logs": [ + { + "transactionIndex": 88, + "blockNumber": 20166829, + "transactionHash": "0xdd0da9fa55715536c1380ecd14ae93a4a6b988d4b6336b38cebd81d96907589c", + "address": "0x57C3C3880ca40a17d800FF9c42b5C0e2c026F45B", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" + ], + "data": "0x", + "logIndex": 302, + "blockHash": "0x4d4f44d826d2bac2b3beeb4ee271204509c34651a25c6ca8102d4761aa98637e" + } + ], + "blockNumber": 20166829, + "cumulativeGasUsed": "18138147", + "status": 1, + "byzantium": true + }, + "args": [ + "0x054be4cFB6e951A7dE921A179FA323c5ea3fCf47", + "0xcE4d0DE6589bF2b439d08dc9addD56428D76eC25", + "support@namecheap.com", + "0" + ], + "numDeployments": 1, + "solcInputHash": "a43d75c8fa53cbd70612f5013c5d17a2", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_exchange\",\"type\":\"address\"},{\"internalType\":\"contract INullifierRegistry\",\"name\":\"_nullifierRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_emailFromAddress\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_timestampBuffer\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"emailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"exchange\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEmailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nullifierRegistry\",\"outputs\":[{\"internalType\":\"contract INullifierRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"a\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"b\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"c\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[10]\",\"name\":\"signals\",\"type\":\"uint256[10]\"}],\"internalType\":\"struct ITransferDomainProcessor.TransferProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"processProof\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"dkimKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"hashedReceiverId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"domainName\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_emailFromAddress\",\"type\":\"string\"}],\"name\":\"setEmailFromAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_timestampBuffer\",\"type\":\"uint256\"}],\"name\":\"setTimestampBuffer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timestampBuffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"_pA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"_pB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"_pC\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[10]\",\"name\":\"_pubSignals\",\"type\":\"uint256[10]\"}],\"name\":\"verifyProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setEmailFromAddress(string)\":{\"params\":{\"_emailFromAddress\":\"The from email address for validated emails, MUST BE PROPERLY PADDED\"}},\"setTimestampBuffer(uint256)\":{\"params\":{\"_timestampBuffer\":\"The timestamp buffer for validated emails\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"setEmailFromAddress(string)\":{\"notice\":\"ONLY OWNER: Sets the from email address for validated emails. Check that email address is properly padded (if necessary). Padding will be dependent on if unpacking functions cut trailing 0s or not.\"},\"setTimestampBuffer(uint256)\":{\"notice\":\"ONLY OWNER: Sets the timestamp buffer for validated emails. This is the amount of time in seconds that the timestamp can be off by and still be considered valid. Necessary to build in flexibility with L2 timestamps.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TransferDomainProcessor.sol\":\"TransferDomainProcessor\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@zk-email/contracts/utils/StringUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.7.6;\\n\\n// https://github.com/nalinbhardwaj/ethdosnumber/blob/main/ethdos-contracts/src/HexStrings.sol\\nlibrary StringUtils {\\n bytes16 internal constant ALPHABET = \\\"0123456789abcdef\\\";\\n uint256 internal constant DEFAULT_PACK_SIZE = 31;\\n\\n /// @notice Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n /// @dev Credit to Open Zeppelin under MIT license https://github.com/OpenZeppelin/openzeppelin-contracts/blob/243adff49ce1700e0ecb99fe522fb16cff1d1ddc/contracts/utils/Strings.sol#L55\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = ALPHABET[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n function toHexStringNoPrefix(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length);\\n for (uint256 i = buffer.length; i > 0; i--) {\\n buffer[i - 1] = ALPHABET[value & 0xf];\\n value >>= 4;\\n }\\n return string(buffer);\\n }\\n\\n function toString(uint256 value) internal pure returns (string memory) {\\n return toString(abi.encodePacked(value));\\n }\\n\\n function toString(bytes32 value) internal pure returns (string memory) {\\n return toString(abi.encodePacked(value));\\n }\\n\\n function toString(address account) internal pure returns (string memory) {\\n return toString(abi.encodePacked(account));\\n }\\n\\n function stringEq(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));\\n }\\n\\n function toString(bytes memory data) internal pure returns (string memory) {\\n bytes memory alphabet = \\\"0123456789abcdef\\\";\\n\\n bytes memory str = new bytes(2 + data.length * 2);\\n str[0] = \\\"0\\\";\\n str[1] = \\\"x\\\";\\n for (uint256 i = 0; i < data.length; i++) {\\n str[2 + i * 2] = alphabet[uint256(uint8(data[i] >> 4))];\\n str[3 + i * 2] = alphabet[uint256(uint8(data[i] & 0x0f))];\\n }\\n return string(str);\\n }\\n\\n // 1 packed byte = packSize (usually 31) normal bytes, all in one 255/256-bit value\\n // Note that this is not 32 due to the field modulus of circom\\n function convertPackedByteToString(uint256 packedByte, uint256 packSize)\\n internal\\n pure\\n returns (string memory extractedString)\\n {\\n uint256[] memory packedBytes = new uint256[](1);\\n packedBytes[0] = packedByte;\\n return convertPackedBytesToString(packedBytes, packSize, packSize);\\n }\\n\\n // Note: This convenience function removes the max string length check, which may cause misalignment with the circom\\n // If using this, then the circom needs to rangecheck packed length in the circuit itself\\n // This defaults to 31 bytes per packed byte\\n function convertPackedBytesToString(uint256[] memory packedBytes) \\n internal\\n pure\\n returns (string memory extractedString)\\n {\\n return convertPackedBytesToString(packedBytes, packedBytes.length * DEFAULT_PACK_SIZE, DEFAULT_PACK_SIZE);\\n }\\n\\n // Unpacks uint256s into bytes and then extracts the non-zero characters\\n // Only extracts contiguous non-zero characters and ensures theres only 1 such state\\n // Note that unpackedLen may be more than packedBytes.length * 8 since there may be 0s\\n // signals is the total number of signals (i.e. bytes) packed into the packedBytes. it defaults to packedBytes.length * packSize\\n function convertPackedBytesToString(uint256[] memory packedBytes, uint256 signals, uint256 packSize)\\n internal\\n pure\\n returns (string memory extractedString)\\n {\\n uint8 state = 0;\\n // bytes: 0 0 0 0 y u s h _ g 0 0 0\\n // state: 0 0 0 0 1 1 1 1 1 1 2 2 2\\n bytes memory nonzeroBytesArray = new bytes(packedBytes.length * packSize);\\n uint256 nonzeroBytesArrayIndex = 0;\\n for (uint16 i = 0; i < packedBytes.length; i++) {\\n uint256 packedByte = packedBytes[i];\\n uint8[] memory unpackedBytes = new uint8[](packSize);\\n for (uint256 j = 0; j < packSize; j++) {\\n unpackedBytes[j] = uint8(packedByte >> (j * 8));\\n }\\n for (uint256 j = 0; j < packSize; j++) {\\n uint256 unpackedByte = unpackedBytes[j]; //unpackedBytes[j];\\n if (unpackedByte != 0) {\\n nonzeroBytesArray[nonzeroBytesArrayIndex] = bytes1(uint8(unpackedByte));\\n nonzeroBytesArrayIndex++;\\n if (state % 2 == 0) {\\n state += 1;\\n }\\n } else {\\n if (state % 2 == 1) {\\n state += 1;\\n }\\n }\\n packedByte = packedByte >> 8;\\n }\\n }\\n // TODO: You might want to assert that the state is exactly 1 or 2\\n // If not, that means empty bytse have been removed from the middle and things have been concatenated.\\n // We removed due to some tests failing, but this is not ideal and the require should be uncommented as soon as tests pass with it.\\n\\n // require(state == 1 || state == 2, \\\"Invalid final state of packed bytes in email; more than two non-zero regions found!\\\");\\n require(state >= 1, \\\"No packed bytes found! Invalid final state of packed bytes in email; value is likely 0!\\\");\\n require(nonzeroBytesArrayIndex <= signals, \\\"Packed bytes more than allowed max number of signals!\\\");\\n string memory returnValue = removeTrailingZeros(string(nonzeroBytesArray));\\n return returnValue;\\n // Have to end at the end of the email -- state cannot be 1 since there should be an email footer\\n }\\n\\n function bytes32ToString(bytes32 input) internal pure returns (string memory) {\\n uint256 i;\\n for (i = 0; i < 32 && input[i] != 0; i++) {}\\n bytes memory resultBytes = new bytes(i);\\n for (i = 0; i < 32 && input[i] != 0; i++) {\\n resultBytes[i] = input[i];\\n }\\n return string(resultBytes);\\n }\\n\\n // sliceArray is used to slice an array of uint256s from start-end into a new array of uint256s\\n function sliceArray(uint256[] memory input, uint256 start, uint256 end) internal pure returns (uint256[] memory) {\\n require(start <= end && end <= input.length, \\\"Invalid slice indices\\\");\\n uint256[] memory result = new uint256[](end - start);\\n for (uint256 i = start; i < end; i++) {\\n result[i - start] = input[i];\\n }\\n return result;\\n }\\n\\n // stringToUint is used to convert a string like \\\"45\\\" to a uint256 4\\n function stringToUint(string memory s) internal pure returns (uint256) {\\n bytes memory b = bytes(s);\\n uint256 result = 0;\\n for (uint256 i = 0; i < b.length; i++) {\\n if (b[i] >= 0x30 && b[i] <= 0x39) {\\n result = result * 10 + (uint256(uint8(b[i])) - 48);\\n }\\n\\n // TODO: Currently truncates decimals\\n if (b[i] == 0x2E) {\\n return result;\\n }\\n }\\n return result;\\n }\\n\\n // getDomainFromEmail is used to extract the domain from an email i.e. the part after the @\\n function getDomainFromEmail(string memory fromEmail) internal pure returns (string memory) {\\n bytes memory emailBytes = bytes(fromEmail);\\n uint256 atIndex;\\n for (uint256 i = 0; i < emailBytes.length; i++) {\\n if (emailBytes[i] == \\\"@\\\") {\\n atIndex = i;\\n break;\\n }\\n }\\n\\n bytes memory domainBytes = new bytes(emailBytes.length - atIndex - 1);\\n for (uint256 j = 0; j < domainBytes.length; j++) {\\n domainBytes[j] = emailBytes[atIndex + 1 + j];\\n }\\n return bytes32ToString(bytes32(bytes(domainBytes)));\\n }\\n\\n function removeTrailingZeros(string memory input) public pure returns (string memory) {\\n bytes memory inputBytes = bytes(input);\\n uint256 endIndex = inputBytes.length;\\n\\n for (uint256 i = 0; i < inputBytes.length; i++) {\\n if (inputBytes[i] == 0) {\\n endIndex = i;\\n break;\\n }\\n }\\n\\n bytes memory resultBytes = new bytes(endIndex);\\n for (uint256 i = 0; i < endIndex; i++) {\\n resultBytes[i] = inputBytes[i];\\n }\\n\\n return string(resultBytes);\\n }\\n\\n // Upper/lower string utils from https://github.com/willitscale/solidity-util/blob/master/lib/Strings.sol\\n /**\\n * Upper\\n *\\n * Converts all the values of a string to their corresponding upper case\\n * value.\\n *\\n * @param _base When being used for a data type this is the extended object\\n * otherwise this is the string base to convert to upper case\\n * @return string\\n */\\n function upper(string memory _base) public pure returns (string memory) {\\n bytes memory _baseBytes = bytes(_base);\\n for (uint256 i = 0; i < _baseBytes.length; i++) {\\n _baseBytes[i] = _upper(_baseBytes[i]);\\n }\\n return string(_baseBytes);\\n }\\n\\n /**\\n * Lower\\n *\\n * Converts all the values of a string to their corresponding lower case\\n * value.\\n *\\n * @param _base When being used for a data type this is the extended object\\n * otherwise this is the string base to convert to lower case\\n * @return string\\n */\\n function lower(string memory _base) public pure returns (string memory) {\\n bytes memory _baseBytes = bytes(_base);\\n for (uint256 i = 0; i < _baseBytes.length; i++) {\\n _baseBytes[i] = _lower(_baseBytes[i]);\\n }\\n return string(_baseBytes);\\n }\\n\\n /**\\n * Upper\\n *\\n * Convert an alphabetic character to upper case and return the original\\n * value when not alphabetic\\n *\\n * @param _b1 The byte to be converted to upper case\\n * @return bytes1 The converted value if the passed value was alphabetic\\n * and in a lower case otherwise returns the original value\\n */\\n function _upper(bytes1 _b1) private pure returns (bytes1) {\\n if (_b1 >= 0x61 && _b1 <= 0x7A) {\\n return bytes1(uint8(_b1) - 32);\\n }\\n\\n return _b1;\\n }\\n\\n /**\\n * Lower\\n *\\n * Convert an alphabetic character to lower case and return the original\\n * value when not alphabetic\\n *\\n * @param _b1 The byte to be converted to lower case\\n * @return bytes1 The converted value if the passed value was alphabetic\\n * and in a upper case otherwise returns the original value\\n */\\n function _lower(bytes1 _b1) private pure returns (bytes1) {\\n if (_b1 >= 0x41 && _b1 <= 0x5A) {\\n return bytes1(uint8(_b1) + 32);\\n }\\n\\n return _b1;\\n }\\n}\\n\",\"keccak256\":\"0x8c5b56494116a0c056c63e28fe892eea9bee5b056b09efa6aba1c9a82dc26c18\",\"license\":\"MIT\"},\"contracts/TransferDomainProcessor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\nimport { StringUtils } from \\\"@zk-email/contracts/utils/StringUtils.sol\\\";\\n\\nimport { EmailBaseProcessor } from \\\"./external/processors/EmailBaseProcessor.sol\\\";\\nimport { INullifierRegistry } from \\\"./external/interfaces/INullifierRegistry.sol\\\";\\nimport { StringConversionUtils } from \\\"./external/lib/StringConversionUtils.sol\\\";\\n\\nimport { Groth16Verifier } from \\\"./verifiers/namecheap_transfer_verifier.sol\\\";\\nimport { ITransferDomainProcessor } from \\\"./interfaces/ITransferDomainProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract TransferDomainProcessor is Groth16Verifier, ITransferDomainProcessor, EmailBaseProcessor {\\n \\n using StringUtils for uint256[];\\n using StringConversionUtils for string;\\n\\n /* ============ Constants ============ */\\n uint256 constant PACK_SIZE = 31;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _exchange,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Groth16Verifier()\\n EmailBaseProcessor(\\n _exchange,\\n _nullifierRegistry,\\n _emailFromAddress,\\n _timestampBuffer\\n )\\n {}\\n \\n /* ============ External Functions ============ */\\n\\n function processProof(\\n TransferProof calldata _proof\\n )\\n external\\n override\\n onlyExchange\\n returns (\\n bytes32 dkimKeyHash,\\n bytes32 hashedReceiverId,\\n string memory domainName, \\n uint256 bidId\\n )\\n {\\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \\\"Invalid Proof\\\");\\n\\n // Signal [0] is the DKIM key hash\\n dkimKeyHash = bytes32(_proof.signals[0]);\\n\\n // Signals [1:2] are the packed from email address\\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 2);\\n require(\\n keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \\n \\\"Invalid email from address\\\"\\n );\\n \\n // Signals [2:7] are packed domain name\\n domainName = _parseSignalArray(_proof.signals, 2, 7);\\n\\n // Signal [7] is packed hashed namecheap id to which domain was transferred\\n hashedReceiverId = bytes32(_proof.signals[7]);\\n\\n // Check if email has been used previously, if not nullify it so it can't be used again\\n _validateAndAddNullifier(bytes32(_proof.signals[8]));\\n\\n // Signal [9] is bidId\\n bidId = _proof.signals[9];\\n }\\n \\n /* ============ Internal Functions ============ */\\n\\n function _parseSignalArray(uint256[10] calldata _signals, uint8 _from, uint8 _to) \\n internal \\n pure \\n returns (string memory) \\n {\\n uint256[] memory signalArray = new uint256[](_to - _from);\\n for (uint256 i = _from; i < _to; i++) {\\n signalArray[i - _from] = _signals[i];\\n }\\n\\n return signalArray.convertPackedBytesToString(signalArray.length * PACK_SIZE, PACK_SIZE);\\n }\\n}\\n\",\"keccak256\":\"0x27e7d34dbe222f5a865d0b34f276eac82f3888f00e9816c398ee5fe9cf18bb2c\",\"license\":\"MIT\"},\"contracts/external/interfaces/IKeyHashAdapterV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IKeyHashAdapterV2 {\\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function getMailServerKeyHashes() external view returns (bytes32[] memory);\\n function isMailServerKeyHash(bytes32 _mailserverKeyHash) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc849f2dc34e4463550b8e0a16541bde429cb1adf43776b2c4179e9d4e4e656a2\",\"license\":\"MIT\"},\"contracts/external/interfaces/INullifierRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface INullifierRegistry {\\n function addNullifier(bytes32 _nullifier) external;\\n function isNullified(bytes32 _nullifier) external view returns(bool);\\n}\\n\",\"keccak256\":\"0x107164bc9a320938b513305878163b7fa884da4cdae58d0c8e81bfbb00c97c5e\",\"license\":\"MIT\"},\"contracts/external/lib/StringConversionUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\n// Building on zk-email's StringUtils library we add the ability to handle decimals when\\n// converting from string to Uint\\nlibrary StringConversionUtils {\\n \\n /**\\n * @notice Function that parses numbers returned as strings including floating point numbers. Returned floating point\\n * numbers are to have the desired amount of decimal specified. If the stringified version of the floating point\\n * number has more decimal places than desired then the function will revert in order to be maximally safe. If\\n * the returned number has multiple floating points then the function will revert.\\n *\\n * Examples: _s = \\\"12.34\\\", _expectedDecimals = 6 => 12340000\\n * _s = \\\"12.34\\\", _expectedDecimals = 2 => 1234\\n * _s = \\\"12.34\\\", _expectedDecimals = 1 => REVERT (we never want loss of precision only addition)\\n * _s = \\\"12.34.56\\\", _expectedDecimals = 6 => REVERT (Invalid number)\\n *\\n * @param _s String being processed\\n * @param _desiredDecimals Desired amount of decimal places\\n */\\n function stringToUint(string memory _s, uint256 _desiredDecimals) internal pure returns (uint256) {\\n return stringToUint(_s, 0x2E, _desiredDecimals);\\n }\\n\\n function stringToUint(\\n string memory _s,\\n bytes1 _decimalCharacter,\\n uint256 _desiredDecimals\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n bytes memory b = bytes(_s);\\n\\n uint256 result = 0;\\n uint256 decimalPlaces = 0;\\n\\n bool decimals = false;\\n for (uint256 i = 0; i < b.length; i++) {\\n if (b[i] >= 0x30 && b[i] <= 0x39) {\\n result = result * 10 + (uint256(uint8(b[i])) - 48);\\n }\\n\\n if (decimals) {\\n decimalPlaces++;\\n }\\n\\n if (b[i] == _decimalCharacter) {\\n require(decimals == false, \\\"String has multiple decimals\\\");\\n decimals = true;\\n }\\n }\\n\\n require(decimalPlaces <= _desiredDecimals, \\\"String has too many decimal places\\\");\\n return result * (10 ** (_desiredDecimals - decimalPlaces));\\n }\\n\\n /**\\n * @notice Function that returns a substring from _startIndex to _endIndex (non-inclusive).\\n *\\n * @param _str String being processed\\n * @param _startIndex Index to start parsing from\\n * @param _endIndex Index to stop parsing at (index not included in result)\\n */\\n function substring(string memory _str, uint _startIndex, uint _endIndex) internal pure returns (string memory ) {\\n bytes memory strBytes = bytes(_str);\\n bytes memory result = new bytes(_endIndex-_startIndex);\\n for(uint i = _startIndex; i < _endIndex; i++) {\\n result[i-_startIndex] = strBytes[i];\\n }\\n return string(result);\\n }\\n\\n function replaceString(\\n string memory _str,\\n string memory _lookupValue,\\n string memory _replaceValue\\n )\\n internal\\n pure\\n returns (string memory)\\n {\\n bytes memory strBytes = bytes(_str);\\n bytes memory lookupBytes = bytes(_lookupValue);\\n\\n uint256 lookupIndex = indexOf(_str, _lookupValue);\\n if (lookupIndex == type(uint256).max) {\\n return _str;\\n }\\n\\n // Split the original string into two parts: before and after the keyword\\n string memory beforeKeyword = substring(_str, 0, lookupIndex);\\n string memory afterKeyword = substring(_str, lookupIndex + lookupBytes.length, strBytes.length);\\n \\n return string.concat(beforeKeyword, _replaceValue, afterKeyword);\\n }\\n\\n function indexOf(string memory str, string memory substr) internal pure returns (uint) {\\n bytes memory strBytes = bytes(str);\\n bytes memory substrBytes = bytes(substr);\\n \\n if (strBytes.length < substrBytes.length) return type(uint256).max;\\n \\n for (uint i = 0; i <= strBytes.length - substrBytes.length; i++) {\\n bool found = true;\\n for (uint j = 0; j < substrBytes.length; j++) {\\n if (strBytes[i + j] != substrBytes[j]) {\\n found = false;\\n break;\\n }\\n }\\n if (found) return i;\\n }\\n \\n return type(uint256).max;\\n }\\n\\n function stringComparison(string memory _a, string memory _b) internal pure returns (bool) {\\n return (keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b)));\\n }\\n}\\n\",\"keccak256\":\"0xfcdfb3c2c8d5a6b7f480f827049782a70fb98f8b3838dcad0e0bb95237b94a0c\",\"license\":\"MIT\"},\"contracts/external/processors/EmailBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"../interfaces/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"../interfaces/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract EmailBaseProcessor is Ownable {\\n\\n /* ============ Modifiers ============ */\\n modifier onlyExchange() {\\n require(msg.sender == exchange, \\\"Only exchange can call this function\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n address public immutable exchange;\\n INullifierRegistry public nullifierRegistry;\\n bytes public emailFromAddress;\\n uint256 public timestampBuffer;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _exchange,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Ownable()\\n {\\n exchange = _exchange;\\n nullifierRegistry = _nullifierRegistry;\\n emailFromAddress = bytes(_emailFromAddress);\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice ONLY OWNER: Sets the from email address for validated emails. Check that email address is properly\\n * padded (if necessary). Padding will be dependent on if unpacking functions cut trailing 0s or not.\\n *\\n * @param _emailFromAddress The from email address for validated emails, MUST BE PROPERLY PADDED\\n */\\n function setEmailFromAddress(string memory _emailFromAddress) external onlyOwner {\\n emailFromAddress = bytes(_emailFromAddress);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Sets the timestamp buffer for validated emails. This is the amount of time in seconds\\n * that the timestamp can be off by and still be considered valid. Necessary to build in flexibility with L2\\n * timestamps.\\n *\\n * @param _timestampBuffer The timestamp buffer for validated emails\\n */\\n function setTimestampBuffer(uint256 _timestampBuffer) external onlyOwner {\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Getters ============ */\\n\\n function getEmailFromAddress() external view returns (bytes memory) {\\n return emailFromAddress;\\n }\\n\\n\\n /* ============ Internal Functions ============ */\\n\\n function _validateAndAddNullifier(bytes32 _nullifier) internal {\\n require(!nullifierRegistry.isNullified(_nullifier), \\\"Nullifier has already been used\\\");\\n nullifierRegistry.addNullifier(_nullifier);\\n }\\n}\\n\",\"keccak256\":\"0xe210c8e937a457c2d2aff798f3696f04ce1d011470294f02fb1169006a385f07\",\"license\":\"MIT\"},\"contracts/interfaces/ITransferDomainProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.18;\\n\\n\\ninterface ITransferDomainProcessor {\\n\\n struct TransferProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[10] signals;\\n }\\n\\n function processProof(\\n TransferProof calldata _proof\\n ) \\n external \\n returns (\\n bytes32 dkimKeyHash, \\n bytes32 hashedReceiverId, \\n string memory domainName, \\n uint256 bidId\\n );\\n}\",\"keccak256\":\"0x9cf5f1b070d7bad73d8ae57f7b20d449853f96fcbb5df1a443723df41c91339d\",\"license\":\"MIT\"},\"contracts/verifiers/namecheap_transfer_verifier.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n/*\\n Copyright 2021 0KIMS association.\\n\\n This file is generated with [snarkJS](https://github.com/iden3/snarkjs).\\n\\n snarkJS is a free software: you can redistribute it and/or modify it\\n under the terms of the GNU General Public License as published by\\n the Free Software Foundation, either version 3 of the License, or\\n (at your option) any later version.\\n\\n snarkJS is distributed in the hope that it will be useful, but WITHOUT\\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\\n License for more details.\\n\\n You should have received a copy of the GNU General Public License\\n along with snarkJS. If not, see .\\n*/\\n\\npragma solidity >=0.7.0 <0.9.0;\\n\\ncontract Groth16Verifier {\\n // Scalar field size\\n uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n // Base field size\\n uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\\n\\n // Verification Key data\\n uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042;\\n uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958;\\n uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132;\\n uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731;\\n uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679;\\n uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856;\\n uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n\\n \\n uint256 constant IC0x = 12718791721466586474772975178991944367361898681403889293050590835735829974174;\\n uint256 constant IC0y = 6579614210328804738196110281777440845203538387714672921854127346802897741731;\\n \\n uint256 constant IC1x = 15050971342023334328313633330499885418161248915553086390701402242486225179368;\\n uint256 constant IC1y = 5024764877577619588829734526990256704181621131776349449360023481477820279987;\\n \\n uint256 constant IC2x = 7494265978725599958916265753653166549633529129800692658333846839504191651648;\\n uint256 constant IC2y = 6331829577874431053631060489192183034310045972687441697179743819760334117448;\\n \\n uint256 constant IC3x = 19001722242244131321371144536562173279385056519981716838131699446018662048085;\\n uint256 constant IC3y = 8148711952593941450664988855383229951630582602775661040234820121548658879338;\\n \\n uint256 constant IC4x = 3624352076627862068761560802183636400416483488844158805038644908873200708814;\\n uint256 constant IC4y = 20894074159790604892251457333772898092352374489464929653588484093719978460605;\\n \\n uint256 constant IC5x = 2098287694939727519558784139808406325855172668407809961967029546183317335265;\\n uint256 constant IC5y = 5659241113472526955215440521431168972841548603376846026887752206139550832697;\\n \\n uint256 constant IC6x = 17054571586962694690567468783102453574497782768524521043534058966826398455175;\\n uint256 constant IC6y = 4087439525418017845490176926142509334113265173570304433911881676407144081865;\\n \\n uint256 constant IC7x = 7441928267847731392209447389119131741297268634643246304512516729270550734194;\\n uint256 constant IC7y = 15714253901405577134617988311525363228461039013850912155558149694323922788327;\\n \\n uint256 constant IC8x = 11989172231499636764423272601594485978016807201316866170676011918612131765820;\\n uint256 constant IC8y = 15918479982497737545158513843427772249925445687882255296587424450200131669618;\\n \\n uint256 constant IC9x = 19827744545534206076315711984525184804508732918768894016552346430789516516368;\\n uint256 constant IC9y = 16361460611570894490152793347002588479282989223552655286979659973731335376509;\\n \\n uint256 constant IC10x = 10898965818757221383985300751768263931593441442012024286290119328446015154272;\\n uint256 constant IC10y = 6989418820395701171656324073128354251482680955655018162117108617053607002569;\\n \\n \\n // Memory data\\n uint16 constant pVk = 0;\\n uint16 constant pPairing = 128;\\n\\n uint16 constant pLastMem = 896;\\n\\n function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[10] calldata _pubSignals) public view returns (bool) {\\n assembly {\\n function checkField(v) {\\n if iszero(lt(v, r)) {\\n mstore(0, 0)\\n return(0, 0x20)\\n }\\n }\\n \\n // G1 function to multiply a G1 value(x,y) to value in an address\\n function g1_mulAccC(pR, x, y, s) {\\n let success\\n let mIn := mload(0x40)\\n mstore(mIn, x)\\n mstore(add(mIn, 32), y)\\n mstore(add(mIn, 64), s)\\n\\n success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)\\n\\n if iszero(success) {\\n mstore(0, 0)\\n return(0, 0x20)\\n }\\n\\n mstore(add(mIn, 64), mload(pR))\\n mstore(add(mIn, 96), mload(add(pR, 32)))\\n\\n success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)\\n\\n if iszero(success) {\\n mstore(0, 0)\\n return(0, 0x20)\\n }\\n }\\n\\n function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {\\n let _pPairing := add(pMem, pPairing)\\n let _pVk := add(pMem, pVk)\\n\\n mstore(_pVk, IC0x)\\n mstore(add(_pVk, 32), IC0y)\\n\\n // Compute the linear combination vk_x\\n \\n g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))\\n \\n g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))\\n \\n g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))\\n \\n g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))\\n \\n g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))\\n \\n g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)))\\n \\n g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)))\\n \\n g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)))\\n \\n g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)))\\n \\n g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288)))\\n \\n\\n // -A\\n mstore(_pPairing, calldataload(pA))\\n mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q))\\n\\n // B\\n mstore(add(_pPairing, 64), calldataload(pB))\\n mstore(add(_pPairing, 96), calldataload(add(pB, 32)))\\n mstore(add(_pPairing, 128), calldataload(add(pB, 64)))\\n mstore(add(_pPairing, 160), calldataload(add(pB, 96)))\\n\\n // alpha1\\n mstore(add(_pPairing, 192), alphax)\\n mstore(add(_pPairing, 224), alphay)\\n\\n // beta2\\n mstore(add(_pPairing, 256), betax1)\\n mstore(add(_pPairing, 288), betax2)\\n mstore(add(_pPairing, 320), betay1)\\n mstore(add(_pPairing, 352), betay2)\\n\\n // vk_x\\n mstore(add(_pPairing, 384), mload(add(pMem, pVk)))\\n mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))\\n\\n\\n // gamma2\\n mstore(add(_pPairing, 448), gammax1)\\n mstore(add(_pPairing, 480), gammax2)\\n mstore(add(_pPairing, 512), gammay1)\\n mstore(add(_pPairing, 544), gammay2)\\n\\n // C\\n mstore(add(_pPairing, 576), calldataload(pC))\\n mstore(add(_pPairing, 608), calldataload(add(pC, 32)))\\n\\n // delta2\\n mstore(add(_pPairing, 640), deltax1)\\n mstore(add(_pPairing, 672), deltax2)\\n mstore(add(_pPairing, 704), deltay1)\\n mstore(add(_pPairing, 736), deltay2)\\n\\n\\n let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20)\\n\\n isOk := and(success, mload(_pPairing))\\n }\\n\\n let pMem := mload(0x40)\\n mstore(0x40, add(pMem, pLastMem))\\n\\n // Validate that all evaluations \\u2208 F\\n \\n checkField(calldataload(add(_pubSignals, 0)))\\n \\n checkField(calldataload(add(_pubSignals, 32)))\\n \\n checkField(calldataload(add(_pubSignals, 64)))\\n \\n checkField(calldataload(add(_pubSignals, 96)))\\n \\n checkField(calldataload(add(_pubSignals, 128)))\\n \\n checkField(calldataload(add(_pubSignals, 160)))\\n \\n checkField(calldataload(add(_pubSignals, 192)))\\n \\n checkField(calldataload(add(_pubSignals, 224)))\\n \\n checkField(calldataload(add(_pubSignals, 256)))\\n \\n checkField(calldataload(add(_pubSignals, 288)))\\n \\n checkField(calldataload(add(_pubSignals, 320)))\\n \\n\\n // Validate all evaluations\\n let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)\\n\\n mstore(0, isValid)\\n return(0, 0x20)\\n }\\n }\\n }\\n\",\"keccak256\":\"0x8217154b5c54e3ae008197fcd5f09c15c539d7026ac0fcb2d80e19810edeee7e\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60a06040523462000044576200002262000018620001f4565b929190916200021d565b604051611eb66200054c82396080518181816104da01526109460152611eb690f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200008157604052565b62000049565b906200009e6200009660405190565b92836200005f565b565b6001600160a01b031690565b90565b6001600160a01b0381165b036200004457565b905051906200009e82620000af565b6001600160a01b038116620000ba565b905051906200009e82620000d1565b6001600160401b0381116200008157602090601f01601f19160190565b60005b838110620001215750506000910152565b818101518382015260200162000110565b909291926200014b6200014582620000f0565b62000087565b9381855260208501908284011162000044576200009e926200010d565b9080601f8301121562000044578151620000ac9260200162000132565b80620000ba565b905051906200009e8262000185565b6080818303126200004457620001b28282620000c2565b92620001c28360208401620000e1565b604083015190936001600160401b0382116200004457620001ea81620000ac93860162000168565b936060016200018c565b6200021762002402803803806200020b8162000087565b9283398101906200019b565b90919293565b906200009e939291620004ab565b906001600160a01b03905b9181191691161790565b620000ac90620000a0906001600160a01b031682565b620000ac9062000240565b620000ac9062000256565b9062000280620000ac620002889262000261565b82546200022b565b9055565b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015620002c5575b6020831014620002bf57565b6200028c565b91607f1691620002b3565b9160001960089290920291821b911b62000236565b620000ac620000ac620000ac9290565b91906200030a620000ac6200028893620002e5565b908354620002d0565b6200009e91600091620002f5565b8181106200032d575050565b806200033d600060019362000313565b0162000321565b9190601f81116200035457505050565b620003686200009e93600052602060002090565b906020601f8401819004830193106200038c575b6020601f90910104019062000321565b90915081906200037c565b90620003a1815190565b906001600160401b0382116200008157620003c982620003c28554620002a2565b8562000344565b602090601f8311600114620004085762000288929160009183620003fc575b5050600019600883021c1916906002021790565b015190503880620003e8565b601f198316916200041e85600052602060002090565b9260005b8181106200045f5750916002939185600196941062000445575b50505002019055565b01516000196008601f8516021c191690553880806200043c565b9193602060018192878701518155019501920162000422565b906200009e9162000397565b906000199062000236565b90620004a3620000ac6200028892620002e5565b825462000484565b6200009e9392620000ac620004dc93620004d493620004c9620004e4565b60805260016200026c565b600262000478565b60036200048f565b6200009e336000546001600160a01b031690620005038160006200026c565b6200053a620005337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09362000261565b9162000261565b916200054560405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c806365cd296c146100d2578063715018a6146100cd5780638da5cb5b146100c8578063b2a3fda4146100c3578063b870676c146100be578063c0d05fed146100b9578063ced1e978146100b4578063d2f7265a146100af578063dbac5821146100aa578063f2fde38b146100a5578063f3bb70f6146100a05763f6c7226b036100e6576106bf565b6105f9565b61057b565b610520565b6104c5565b6104aa565b610483565b6102e7565b610265565b610206565b6101dd565b61019d565b90816102409103126100e65790565b600080fd5b90610240828203126100e657610100916100d7565b90565b9052565b60005b83811061011a5750506000910152565b818101518382015260200161010a565b61014b61015460209361015e9361013f815190565b80835293849260200190565b95869101610107565b601f01601f191690565b0190565b94939160609161019b946101896101969361018260808b019460008c0152565b60208a0152565b878203604089015261012a565b940152565b565b346100e6576101ce6101b86101b33660046100eb565b610d21565b906101c594929460405190565b94859485610162565b0390f35b60009103126100e657565b346100e6576101ed3660046101d2565b6101f561072c565b604051005b6001600160a01b031690565b346100e6576102163660046101d2565b6101ce6102216106ea565b604051918291826001600160a01b03909116815260200190565b805b036100e657565b9050359061019b8261023b565b906020828203126100e65761010091610244565b346100e6576101f5610278366004610251565b6115da565b610100916008021c6001600160a01b031690565b90610100915461027d565b61010060006001610291565b610100906101fa906001600160a01b031682565b610100906102a8565b610100906102bc565b610103906102c5565b60208101929161019b91906102ce565b346100e6576102f73660046101d2565b6101ce61030261029c565b604051918291826102d7565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561035a575b602083101461035557565b610324565b91607f169161034a565b805460009392916103816103778361033a565b8085529360200190565b91600181169081156103d3575060011461039a57505050565b6103ad9192939450600052602060002090565b916000925b8184106103bf5750500190565b8054848401526020909301926001016103b2565b92949550505060ff1916825215156020020190565b9061010091610364565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761042a57604052565b6103f2565b9061019b6104499261044060405190565b938480926103e8565b0383610408565b90600010610461576101009061042f565b61030e565b61010060006002610450565b60208082526101009291019061012a565b346100e6576104933660046101d2565b6101ce61049e610466565b60405191829182610472565b346100e6576104ba3660046101d2565b6101ce61049e6115e3565b346100e6576104d53660046101d2565b6101ce7f0000000000000000000000000000000000000000000000000000000000000000610221565b610100916008021c81565b9061010091546104fe565b61010060006003610509565b346100e6576105303660046101d2565b6101ce61053b610514565b6040519182918290815260200190565b6001600160a01b03811661023d565b9050359061019b8261054b565b906020828203126100e6576101009161055a565b346100e6576101f561058e366004610567565b610843565b919060408301116100e657565b919060808301116100e657565b91906101408301116100e657565b610240818303126100e6576105d08282610593565b926101006105e184604085016105a0565b936105ef8160c08601610593565b93610100016105ad565b346100e6576106093660046105bb565b92919091611dc5565b9061019b61061f60405190565b9283610408565b67ffffffffffffffff811161042a57602090601f01601f19160190565b90826000939282370152565b9092919261066461065f82610626565b610612565b938185526020850190828401116100e65761019b92610643565b9080601f830112156100e6578160206101009335910161064f565b906020828203126100e657813567ffffffffffffffff81116100e657610100920161067e565b346100e6576101f56106d2366004610699565b611594565b610100906101fa565b61010090546106d7565b61010060006106e0565b6106fc610788565b61019b61071a565b6101fa6101006101009290565b61010090610704565b61019b6107276000610711565b61087c565b61019b6106f4565b1561073b57565b60405162461bcd60e51b815280610784600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b61019b6107936106ea565b6107ac61079f336101fa565b916001600160a01b031690565b14610734565b61019b906107be610788565b61081e565b156107ca57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61019b906107276108326101fa6000610711565b6001600160a01b03831614156107c3565b61019b906107b2565b906001600160a01b03905b9181191691161790565b90610871610100610878926102c5565b825461084c565b9055565b61088660006106e0565b90610892816000610861565b6108c56108bf7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936102c5565b916102c5565b916108cf60405190565b600090a3565b156108dc57565b60405162461bcd60e51b8152602060048201526024808201527f4f6e6c792065786368616e67652063616e2063616c6c20746869732066756e636044820152633a34b7b760e11b6064820152608490fd5b61097694939291906109713361096b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661079f565b146108d5565b610b73565b90919293565b80151561023d565b9050519061019b8261097c565b906020828203126100e65761010091610984565b9037565b61019b916040916109a5565b9061015e816040936109a9565b6109d26109ce60029390565b9190565b806000925b8484106109e5575050505050565b610a016109fa6001926109f58690565b6109b5565b9360400190565b930192916109d7565b61019b91610140916109a5565b610a4f61019b94610a4561010094989795610a3b61024086019a60008701906109a9565b60408501906109c2565b60c08301906109a9565b0190610a0a565b6040513d6000823e3d90fd5b15610a6957565b60405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606490fd5b634e487b7160e01b600052603260045260246000fd5b90600a811015610ac5576020020190565b610a9e565b6101006101006101009290565b356101008161023b565b610aee6101006101009290565b60ff1690565b61015e610b0c92602092610b06815190565b94859290565b93849101610107565b61010091610af4565b6101009061042f565b15610b2e57565b60405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606490fd5b50505050610b80306102c5565b602063f3bb70f6916000840190610bb96040860194610bc461010060c0890198018098610bac60405190565b9889978896879660e01b90565b865260048601610a17565b03915afa8015610d1c57610be091600091610cee575b50610a62565b610c03610bfe610bf9610bf36000610aca565b84610ab4565b610ad7565b610aca565b91600290610c88610c146001610ae1565b92610c826109ce610c73610c32610c2a85610ae1565b80988a610e1c565b610c5a610c3e60405190565b8092610c4e602083019182610b15565b90810382520382610408565b610c6c610c65825190565b9160200190565b2093610b1e565b610c7e610c65825190565b2090565b14610b27565b610100610bf9610cbc610bfe610bf9610cb6610cb0600798610ca98a610ae1565b908b610e1c565b97610aca565b88610ab4565b94610cde610cd9610bfe610bf9610cd36008610aca565b85610ab4565b611639565b610ce86009610aca565b90610ab4565b610d0f915060203d8111610d15575b610d078183610408565b810190610991565b38610bda565b503d610cfd565b610a56565b6109769060006060818061092d565b634e487b7160e01b600052601160045260246000fd5b610d559060ff165b9160ff1690565b90039060ff8211610d6257565b610d30565b6101006101006101009260ff1690565b67ffffffffffffffff811161042a5760208091020190565b90610d9c61065f83610d77565b918252565b369037565b9061019b610dbc610db684610d8f565b93610d77565b601f190160208401610da1565b6000198114610d625760010190565b91908203918211610d6257565b90610dee825190565b811015610ac5576020809102010190565b610100601f610aca565b81810292918115918404141715610d6257565b909290610e39610e34610e2f8686610d46565b610d67565b610da6565b91610e4385610d67565b610e4c85610d67565b811015610e9457610e8d81610e88610e6a610bf9610e4c9588610ab4565b610e85610e7f610e798c610d67565b85610dd8565b89610de5565b52565b610dc9565b9050610e43565b509350506101009150610ea5815190565b90610eb8610eb1610dff565b8093610e09565b906110c9565b90610d9c61065f83610626565b9061019b610dbc610edb84610ebe565b93610626565b610eee6101006101009290565b61ffff1690565b61ffff1661ffff8114610d625760010190565b6101006101006101009261ffff1690565b61010090610f2a6109ce6101009490565b901c90565b634e487b7160e01b600052601260045260246000fd5b610f519060ff16610d4e565b908115610f5c570690565b610f2f565b610f6d9060ff16610d4e565b019060ff8211610d6257565b610f8f610f896101009260ff1690565b60f81b90565b6001600160f81b03191690565b90610fa5825190565b811015610ac5570160200190565b61010090610f2a6109ce6101009460ff1690565b15610fce57565b60405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a490fd5b1561106657565b60405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608490fd5b926000926110d684610ae1565b6110ef6110ea836110e5895190565b610e09565b610ecb565b946110f981610aca565b9561110382610ee1565b965b6111106101008a5190565b61111989610f08565b10156112e75761113861113461112e8a610f08565b8b610de5565b5190565b98899661114487610da6565b9861114e86610aca565b8881101561119b5780610e888c8f6111969461118861118361118e9361117d6111776008610aca565b85610e09565b90610f19565b610ae1565b92610de5565b9060ff169052565b61114e565b5091909a50989295989793969194976111b388610aca565b955b8a8710156112c6576111d4610e2f6111cd8989610de5565b5160ff1690565b6111dd8a610aca565b811461127957906111f86111f361120a93610ae1565b610f79565b8a1a611204828b610f9c565b53610dc9565b9261121e6112186002610ae1565b8b610f45565b61122a610d4e8b610ae1565b14611255575b61124861124e915b6112426008610ae1565b90610fb3565b96610dc9565b95926111b5565b9861124861127061124e9261126a6001610ae1565b90610f61565b9a915050611230565b50926112886112186002610ae1565b600190611297610d4e83610ae1565b146112aa575b5061124861124e91611238565b6112be61124e929b61126a61124893610ae1565b9a915061129d565b989550935097949598916112da9150610ef5565b9695979197949094611105565b926109ce919598506101009750610100945061131a92509561010061132197611313610d4e6001610ae1565b1015610fc7565b111561105f565b611333565b610f8f610f896101009290565b80519060009261134284610aca565b61134d610100845190565b8110156113ef5761136f6113618285610f9c565b516001600160f81b03191690565b61138961137b87611326565b916001600160f81b03191690565b1461139c5761139790610dc9565b611342565b9250905b6113a983610ecb565b916113b385610aca565b845b8110156113e3576113dc816113d06113616113b59487610f9c565b881a6112048288610f9c565b90506113b3565b50935050610100915090565b50906113a0565b61019b90611402610788565b611589565b9160001960089290920291821b911b610857565b919061142c61010061087893610aca565b908354611407565b61019b9160009161141b565b81811061144b575050565b806114596000600193611434565b01611440565b9190601f811161146e57505050565b61148061019b93600052602060002090565b906020601f8401819004830193106114a2575b6020601f909101040190611440565b9091508190611493565b906114b5815190565b9067ffffffffffffffff821161042a576114d9826114d3855461033a565b8561145f565b602090601f831160011461151457610878929160009183611509575b5050600019600883021c1916906002021790565b0151905038806114f5565b601f1983169161152985600052602060002090565b9260005b8181106115675750916002939185600196941061154e575b50505002019055565b01516000196008601f8516021c19169055388080611545565b9193602060018192878701518155019501920161152d565b9061019b916114ac565b61019b90600261157f565b61019b906113f6565b61019b906115a9610788565b6115cf565b9060001990610857565b906115c861010061087892610aca565b82546115ae565b61019b9060036115b8565b61019b9061159d565b6101006002610b1e565b156115f457565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b611668602061165061164b60016106e0565b6102c5565b63169394bb9061165f60405190565b93849260e01b90565b82526004820185905260249082905afa908115610d1c57611698916116939160009161170b57501590565b6115ed565b6116a561164b60016106e0565b90635bd4df3290823b156100e6576116e2926116d4600080946116c760405190565b9687958694859360e01b90565b835260048301526024820190565b03925af18015610d1c576116f35750565b61019b9060006117038183610408565b8101906101d2565b611723915060203d8111610d1557610d078183610408565b1590565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561175057565b6000805260206000f35b919290926040519384526020840152604083015260408260608160076107d05a03fa156117505760806040928251848201526020830151606082015260066107d05a03fa1561175057565b93909260606020947f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47866080860198611b4061012060008901977f1c1e94bcd36515d96e435f61ee4fa0dc859f4090dcd5430374ced5e4ba688c9e89527f0e8bedfefb241a5448eac861c9f80086b6607f3082ace30b718ad164db3867a3858a015261187760008201357f0b1bea87e58d7f9b1df1b6e6530258dc6bf8354ee1e0287efbcde5faf0876cb37f21468c42c1abfe13be4583929db42dc4b6f1a3feb44d8e1336bbd6337b9992e88c61175a565b6118c6858201357f0dffb044274ff4d10fbf5545d248655f5203dca9161a6fd6ad5308d4ad2d9a487f10919aaea1bb570dabdefb8f9328f924ab0d33a21482584e6dbe5cc23d707f408c61175a565b61191660408201357f120401ecf289d3509044f33e1aab31e9cc9242ca08b56fe495beb5bf63dcab6a7f2a0297fa255705f360180d052e0f129394b63fedbf85496d1f61e4c335d5a1558c61175a565b611965888201357f2e31a07bdd388f34a6d84d0472485df1348189472b2f0119f41660d3c22045bd7f08034f82261ae61a6d5991ff892682a8d3117745585fea2279e9baf22f982cce8c61175a565b6119b560808201357f0c8304577691476e7b57b48d30630acc74c9b52baf12c6ef8bc1e28cc78798397f04a396b83d64f44cb37262119ef21df828153f3e5b22833520b2892c83752ce18c61175a565b611a0560a08201357f090968a6484d95f390fc636cfe1613f6ee8dac2b288485a2cf277886982669c97f25b48ba246ea1a991339587df4a62b88be3279d0b3b1d326cf9521a33d7b15878c61175a565b611a5560c08201357f22bdf3d83eddebc573238bb59aabc778011e095a196740f3ac64f69991275fe77f1073fb6d0a6ed98484e814d7d7cc0382850f5e66ff79e3215e470ccdbc3925728c61175a565b611aa560e08201357f23318a569b541a09f38bb1b3d2dec411fd8c6650abe56326b4abc7cdf5fd0e727f1a81a189d3c977a50f37f8fb6442804d25dced44e296159c9d9a1a313ea45e3c8c61175a565b611af66101008201357f242c422f58c0818ce1bc402140ef550d2ce6f537f7b97990b6c853d772818e7d7f2bd61b1039bd486ebd25c9866b7a34429b9d05f3ada0d35090b2b5a04c03dc108c61175a565b01357f0f73def0c88e50c35c62db1ac618eceec4f44d1d0666468a9c28cd8c8cbf81c97f1818989682bac795f6357e1a3d405e82b9a3bdbc86f5eb980be62287b25d28608961175a565b80358a5201358103068688015280356040880152858101358288015260408101356080880152013560a08601527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08601527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08601527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008601527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208601527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408601527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160860152516101808501528260000101516101a08401527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08401527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08401527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008401527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220840152803561024084015201356102608201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26102808201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6102a08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102c08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa6102e08201526020816103008160086107d05a03fa90511690565b91611e779391611dd3600090565b50604051936103808501604052611ded6000850135611727565b611dfa6020850135611727565b611e076040850135611727565b611e146060850135611727565b611e216080850135611727565b611e2e60a0850135611727565b611e3b60c0850135611727565b611e4860e0850135611727565b611e56610100850135611727565b611e64610120850135611727565b611e72610140850135611727565b6117a5565b60005260206000f3fea2646970667358221220b070e387d647569a745b0f851caaf898e12804e32149ebe4dcfc527f1e24f21e64736f6c63430008120033", + "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806365cd296c146100d2578063715018a6146100cd5780638da5cb5b146100c8578063b2a3fda4146100c3578063b870676c146100be578063c0d05fed146100b9578063ced1e978146100b4578063d2f7265a146100af578063dbac5821146100aa578063f2fde38b146100a5578063f3bb70f6146100a05763f6c7226b036100e6576106bf565b6105f9565b61057b565b610520565b6104c5565b6104aa565b610483565b6102e7565b610265565b610206565b6101dd565b61019d565b90816102409103126100e65790565b600080fd5b90610240828203126100e657610100916100d7565b90565b9052565b60005b83811061011a5750506000910152565b818101518382015260200161010a565b61014b61015460209361015e9361013f815190565b80835293849260200190565b95869101610107565b601f01601f191690565b0190565b94939160609161019b946101896101969361018260808b019460008c0152565b60208a0152565b878203604089015261012a565b940152565b565b346100e6576101ce6101b86101b33660046100eb565b610d21565b906101c594929460405190565b94859485610162565b0390f35b60009103126100e657565b346100e6576101ed3660046101d2565b6101f561072c565b604051005b6001600160a01b031690565b346100e6576102163660046101d2565b6101ce6102216106ea565b604051918291826001600160a01b03909116815260200190565b805b036100e657565b9050359061019b8261023b565b906020828203126100e65761010091610244565b346100e6576101f5610278366004610251565b6115da565b610100916008021c6001600160a01b031690565b90610100915461027d565b61010060006001610291565b610100906101fa906001600160a01b031682565b610100906102a8565b610100906102bc565b610103906102c5565b60208101929161019b91906102ce565b346100e6576102f73660046101d2565b6101ce61030261029c565b604051918291826102d7565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561035a575b602083101461035557565b610324565b91607f169161034a565b805460009392916103816103778361033a565b8085529360200190565b91600181169081156103d3575060011461039a57505050565b6103ad9192939450600052602060002090565b916000925b8184106103bf5750500190565b8054848401526020909301926001016103b2565b92949550505060ff1916825215156020020190565b9061010091610364565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761042a57604052565b6103f2565b9061019b6104499261044060405190565b938480926103e8565b0383610408565b90600010610461576101009061042f565b61030e565b61010060006002610450565b60208082526101009291019061012a565b346100e6576104933660046101d2565b6101ce61049e610466565b60405191829182610472565b346100e6576104ba3660046101d2565b6101ce61049e6115e3565b346100e6576104d53660046101d2565b6101ce7f0000000000000000000000000000000000000000000000000000000000000000610221565b610100916008021c81565b9061010091546104fe565b61010060006003610509565b346100e6576105303660046101d2565b6101ce61053b610514565b6040519182918290815260200190565b6001600160a01b03811661023d565b9050359061019b8261054b565b906020828203126100e6576101009161055a565b346100e6576101f561058e366004610567565b610843565b919060408301116100e657565b919060808301116100e657565b91906101408301116100e657565b610240818303126100e6576105d08282610593565b926101006105e184604085016105a0565b936105ef8160c08601610593565b93610100016105ad565b346100e6576106093660046105bb565b92919091611dc5565b9061019b61061f60405190565b9283610408565b67ffffffffffffffff811161042a57602090601f01601f19160190565b90826000939282370152565b9092919261066461065f82610626565b610612565b938185526020850190828401116100e65761019b92610643565b9080601f830112156100e6578160206101009335910161064f565b906020828203126100e657813567ffffffffffffffff81116100e657610100920161067e565b346100e6576101f56106d2366004610699565b611594565b610100906101fa565b61010090546106d7565b61010060006106e0565b6106fc610788565b61019b61071a565b6101fa6101006101009290565b61010090610704565b61019b6107276000610711565b61087c565b61019b6106f4565b1561073b57565b60405162461bcd60e51b815280610784600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b61019b6107936106ea565b6107ac61079f336101fa565b916001600160a01b031690565b14610734565b61019b906107be610788565b61081e565b156107ca57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61019b906107276108326101fa6000610711565b6001600160a01b03831614156107c3565b61019b906107b2565b906001600160a01b03905b9181191691161790565b90610871610100610878926102c5565b825461084c565b9055565b61088660006106e0565b90610892816000610861565b6108c56108bf7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936102c5565b916102c5565b916108cf60405190565b600090a3565b156108dc57565b60405162461bcd60e51b8152602060048201526024808201527f4f6e6c792065786368616e67652063616e2063616c6c20746869732066756e636044820152633a34b7b760e11b6064820152608490fd5b61097694939291906109713361096b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661079f565b146108d5565b610b73565b90919293565b80151561023d565b9050519061019b8261097c565b906020828203126100e65761010091610984565b9037565b61019b916040916109a5565b9061015e816040936109a9565b6109d26109ce60029390565b9190565b806000925b8484106109e5575050505050565b610a016109fa6001926109f58690565b6109b5565b9360400190565b930192916109d7565b61019b91610140916109a5565b610a4f61019b94610a4561010094989795610a3b61024086019a60008701906109a9565b60408501906109c2565b60c08301906109a9565b0190610a0a565b6040513d6000823e3d90fd5b15610a6957565b60405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606490fd5b634e487b7160e01b600052603260045260246000fd5b90600a811015610ac5576020020190565b610a9e565b6101006101006101009290565b356101008161023b565b610aee6101006101009290565b60ff1690565b61015e610b0c92602092610b06815190565b94859290565b93849101610107565b61010091610af4565b6101009061042f565b15610b2e57565b60405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606490fd5b50505050610b80306102c5565b602063f3bb70f6916000840190610bb96040860194610bc461010060c0890198018098610bac60405190565b9889978896879660e01b90565b865260048601610a17565b03915afa8015610d1c57610be091600091610cee575b50610a62565b610c03610bfe610bf9610bf36000610aca565b84610ab4565b610ad7565b610aca565b91600290610c88610c146001610ae1565b92610c826109ce610c73610c32610c2a85610ae1565b80988a610e1c565b610c5a610c3e60405190565b8092610c4e602083019182610b15565b90810382520382610408565b610c6c610c65825190565b9160200190565b2093610b1e565b610c7e610c65825190565b2090565b14610b27565b610100610bf9610cbc610bfe610bf9610cb6610cb0600798610ca98a610ae1565b908b610e1c565b97610aca565b88610ab4565b94610cde610cd9610bfe610bf9610cd36008610aca565b85610ab4565b611639565b610ce86009610aca565b90610ab4565b610d0f915060203d8111610d15575b610d078183610408565b810190610991565b38610bda565b503d610cfd565b610a56565b6109769060006060818061092d565b634e487b7160e01b600052601160045260246000fd5b610d559060ff165b9160ff1690565b90039060ff8211610d6257565b610d30565b6101006101006101009260ff1690565b67ffffffffffffffff811161042a5760208091020190565b90610d9c61065f83610d77565b918252565b369037565b9061019b610dbc610db684610d8f565b93610d77565b601f190160208401610da1565b6000198114610d625760010190565b91908203918211610d6257565b90610dee825190565b811015610ac5576020809102010190565b610100601f610aca565b81810292918115918404141715610d6257565b909290610e39610e34610e2f8686610d46565b610d67565b610da6565b91610e4385610d67565b610e4c85610d67565b811015610e9457610e8d81610e88610e6a610bf9610e4c9588610ab4565b610e85610e7f610e798c610d67565b85610dd8565b89610de5565b52565b610dc9565b9050610e43565b509350506101009150610ea5815190565b90610eb8610eb1610dff565b8093610e09565b906110c9565b90610d9c61065f83610626565b9061019b610dbc610edb84610ebe565b93610626565b610eee6101006101009290565b61ffff1690565b61ffff1661ffff8114610d625760010190565b6101006101006101009261ffff1690565b61010090610f2a6109ce6101009490565b901c90565b634e487b7160e01b600052601260045260246000fd5b610f519060ff16610d4e565b908115610f5c570690565b610f2f565b610f6d9060ff16610d4e565b019060ff8211610d6257565b610f8f610f896101009260ff1690565b60f81b90565b6001600160f81b03191690565b90610fa5825190565b811015610ac5570160200190565b61010090610f2a6109ce6101009460ff1690565b15610fce57565b60405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a490fd5b1561106657565b60405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608490fd5b926000926110d684610ae1565b6110ef6110ea836110e5895190565b610e09565b610ecb565b946110f981610aca565b9561110382610ee1565b965b6111106101008a5190565b61111989610f08565b10156112e75761113861113461112e8a610f08565b8b610de5565b5190565b98899661114487610da6565b9861114e86610aca565b8881101561119b5780610e888c8f6111969461118861118361118e9361117d6111776008610aca565b85610e09565b90610f19565b610ae1565b92610de5565b9060ff169052565b61114e565b5091909a50989295989793969194976111b388610aca565b955b8a8710156112c6576111d4610e2f6111cd8989610de5565b5160ff1690565b6111dd8a610aca565b811461127957906111f86111f361120a93610ae1565b610f79565b8a1a611204828b610f9c565b53610dc9565b9261121e6112186002610ae1565b8b610f45565b61122a610d4e8b610ae1565b14611255575b61124861124e915b6112426008610ae1565b90610fb3565b96610dc9565b95926111b5565b9861124861127061124e9261126a6001610ae1565b90610f61565b9a915050611230565b50926112886112186002610ae1565b600190611297610d4e83610ae1565b146112aa575b5061124861124e91611238565b6112be61124e929b61126a61124893610ae1565b9a915061129d565b989550935097949598916112da9150610ef5565b9695979197949094611105565b926109ce919598506101009750610100945061131a92509561010061132197611313610d4e6001610ae1565b1015610fc7565b111561105f565b611333565b610f8f610f896101009290565b80519060009261134284610aca565b61134d610100845190565b8110156113ef5761136f6113618285610f9c565b516001600160f81b03191690565b61138961137b87611326565b916001600160f81b03191690565b1461139c5761139790610dc9565b611342565b9250905b6113a983610ecb565b916113b385610aca565b845b8110156113e3576113dc816113d06113616113b59487610f9c565b881a6112048288610f9c565b90506113b3565b50935050610100915090565b50906113a0565b61019b90611402610788565b611589565b9160001960089290920291821b911b610857565b919061142c61010061087893610aca565b908354611407565b61019b9160009161141b565b81811061144b575050565b806114596000600193611434565b01611440565b9190601f811161146e57505050565b61148061019b93600052602060002090565b906020601f8401819004830193106114a2575b6020601f909101040190611440565b9091508190611493565b906114b5815190565b9067ffffffffffffffff821161042a576114d9826114d3855461033a565b8561145f565b602090601f831160011461151457610878929160009183611509575b5050600019600883021c1916906002021790565b0151905038806114f5565b601f1983169161152985600052602060002090565b9260005b8181106115675750916002939185600196941061154e575b50505002019055565b01516000196008601f8516021c19169055388080611545565b9193602060018192878701518155019501920161152d565b9061019b916114ac565b61019b90600261157f565b61019b906113f6565b61019b906115a9610788565b6115cf565b9060001990610857565b906115c861010061087892610aca565b82546115ae565b61019b9060036115b8565b61019b9061159d565b6101006002610b1e565b156115f457565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b611668602061165061164b60016106e0565b6102c5565b63169394bb9061165f60405190565b93849260e01b90565b82526004820185905260249082905afa908115610d1c57611698916116939160009161170b57501590565b6115ed565b6116a561164b60016106e0565b90635bd4df3290823b156100e6576116e2926116d4600080946116c760405190565b9687958694859360e01b90565b835260048301526024820190565b03925af18015610d1c576116f35750565b61019b9060006117038183610408565b8101906101d2565b611723915060203d8111610d1557610d078183610408565b1590565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561175057565b6000805260206000f35b919290926040519384526020840152604083015260408260608160076107d05a03fa156117505760806040928251848201526020830151606082015260066107d05a03fa1561175057565b93909260606020947f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47866080860198611b4061012060008901977f1c1e94bcd36515d96e435f61ee4fa0dc859f4090dcd5430374ced5e4ba688c9e89527f0e8bedfefb241a5448eac861c9f80086b6607f3082ace30b718ad164db3867a3858a015261187760008201357f0b1bea87e58d7f9b1df1b6e6530258dc6bf8354ee1e0287efbcde5faf0876cb37f21468c42c1abfe13be4583929db42dc4b6f1a3feb44d8e1336bbd6337b9992e88c61175a565b6118c6858201357f0dffb044274ff4d10fbf5545d248655f5203dca9161a6fd6ad5308d4ad2d9a487f10919aaea1bb570dabdefb8f9328f924ab0d33a21482584e6dbe5cc23d707f408c61175a565b61191660408201357f120401ecf289d3509044f33e1aab31e9cc9242ca08b56fe495beb5bf63dcab6a7f2a0297fa255705f360180d052e0f129394b63fedbf85496d1f61e4c335d5a1558c61175a565b611965888201357f2e31a07bdd388f34a6d84d0472485df1348189472b2f0119f41660d3c22045bd7f08034f82261ae61a6d5991ff892682a8d3117745585fea2279e9baf22f982cce8c61175a565b6119b560808201357f0c8304577691476e7b57b48d30630acc74c9b52baf12c6ef8bc1e28cc78798397f04a396b83d64f44cb37262119ef21df828153f3e5b22833520b2892c83752ce18c61175a565b611a0560a08201357f090968a6484d95f390fc636cfe1613f6ee8dac2b288485a2cf277886982669c97f25b48ba246ea1a991339587df4a62b88be3279d0b3b1d326cf9521a33d7b15878c61175a565b611a5560c08201357f22bdf3d83eddebc573238bb59aabc778011e095a196740f3ac64f69991275fe77f1073fb6d0a6ed98484e814d7d7cc0382850f5e66ff79e3215e470ccdbc3925728c61175a565b611aa560e08201357f23318a569b541a09f38bb1b3d2dec411fd8c6650abe56326b4abc7cdf5fd0e727f1a81a189d3c977a50f37f8fb6442804d25dced44e296159c9d9a1a313ea45e3c8c61175a565b611af66101008201357f242c422f58c0818ce1bc402140ef550d2ce6f537f7b97990b6c853d772818e7d7f2bd61b1039bd486ebd25c9866b7a34429b9d05f3ada0d35090b2b5a04c03dc108c61175a565b01357f0f73def0c88e50c35c62db1ac618eceec4f44d1d0666468a9c28cd8c8cbf81c97f1818989682bac795f6357e1a3d405e82b9a3bdbc86f5eb980be62287b25d28608961175a565b80358a5201358103068688015280356040880152858101358288015260408101356080880152013560a08601527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08601527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08601527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008601527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208601527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408601527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160860152516101808501528260000101516101a08401527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08401527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08401527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008401527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220840152803561024084015201356102608201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26102808201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6102a08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102c08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa6102e08201526020816103008160086107d05a03fa90511690565b91611e779391611dd3600090565b50604051936103808501604052611ded6000850135611727565b611dfa6020850135611727565b611e076040850135611727565b611e146060850135611727565b611e216080850135611727565b611e2e60a0850135611727565b611e3b60c0850135611727565b611e4860e0850135611727565b611e56610100850135611727565b611e64610120850135611727565b611e72610140850135611727565b6117a5565b60005260206000f3fea2646970667358221220b070e387d647569a745b0f851caaf898e12804e32149ebe4dcfc527f1e24f21e64736f6c63430008120033", + "devdoc": { + "kind": "dev", + "methods": { + "owner()": { + "details": "Returns the address of the current owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "setEmailFromAddress(string)": { + "params": { + "_emailFromAddress": "The from email address for validated emails, MUST BE PROPERLY PADDED" + } + }, + "setTimestampBuffer(uint256)": { + "params": { + "_timestampBuffer": "The timestamp buffer for validated emails" + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "setEmailFromAddress(string)": { + "notice": "ONLY OWNER: Sets the from email address for validated emails. Check that email address is properly padded (if necessary). Padding will be dependent on if unpacking functions cut trailing 0s or not." + }, + "setTimestampBuffer(uint256)": { + "notice": "ONLY OWNER: Sets the timestamp buffer for validated emails. This is the amount of time in seconds that the timestamp can be off by and still be considered valid. Necessary to build in flexibility with L2 timestamps." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/TransferDomainProcessor.sol:TransferDomainProcessor", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 1862, + "contract": "contracts/TransferDomainProcessor.sol:TransferDomainProcessor", + "label": "nullifierRegistry", + "offset": 0, + "slot": "1", + "type": "t_contract(INullifierRegistry)1450" + }, + { + "astId": 1864, + "contract": "contracts/TransferDomainProcessor.sol:TransferDomainProcessor", + "label": "emailFromAddress", + "offset": 0, + "slot": "2", + "type": "t_bytes_storage" + }, + { + "astId": 1866, + "contract": "contracts/TransferDomainProcessor.sol:TransferDomainProcessor", + "label": "timestampBuffer", + "offset": 0, + "slot": "3", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_bytes_storage": { + "encoding": "bytes", + "label": "bytes", + "numberOfBytes": "32" + }, + "t_contract(INullifierRegistry)1450": { + "encoding": "inplace", + "label": "contract INullifierRegistry", + "numberOfBytes": "20" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/contracts-domain/deployments/base/VerifiedDomainRegistry.json b/contracts-domain/deployments/base/VerifiedDomainRegistry.json new file mode 100644 index 000000000..933199ae5 --- /dev/null +++ b/contracts-domain/deployments/base/VerifiedDomainRegistry.json @@ -0,0 +1,1026 @@ +{ + "address": "0x6206EB4c794c7fe58315f76ab088Ee3C17E0d9f5", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "exchange", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "name": "DomainListed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "exchange", + "type": "address" + } + ], + "name": "DomainListingRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "oldOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "DomainTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "domainName", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + } + ], + "name": "DomainVerified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "exchange", + "type": "address" + } + ], + "name": "ExchangeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "exchange", + "type": "address" + } + ], + "name": "ExchangeRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IVerifyDomainProcessor", + "name": "newVerifyDomainProcessor", + "type": "address" + } + ], + "name": "VerifyDomainProcessorUpdated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_exchange", + "type": "address" + } + ], + "name": "addExchange", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "domains", + "outputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + }, + { + "internalType": "address", + "name": "exchange", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "exchanges", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + } + ], + "name": "getDomain", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + }, + { + "internalType": "address", + "name": "exchange", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "internalType": "struct IVerifiedDomainRegistry.Domain", + "name": "domain", + "type": "tuple" + } + ], + "internalType": "struct IVerifiedDomainRegistry.DomainWithId", + "name": "domainInfo", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_domainName", + "type": "string" + } + ], + "name": "getDomainId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + } + ], + "name": "getDomainOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_domains", + "type": "bytes32[]" + } + ], + "name": "getDomains", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + }, + { + "internalType": "address", + "name": "exchange", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "internalType": "struct IVerifiedDomainRegistry.Domain", + "name": "domain", + "type": "tuple" + } + ], + "internalType": "struct IVerifiedDomainRegistry.DomainWithId[]", + "name": "domainInfo", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getExchanges", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getUserDomains", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + }, + { + "internalType": "address", + "name": "exchange", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "internalType": "struct IVerifiedDomainRegistry.Domain", + "name": "domain", + "type": "tuple" + } + ], + "internalType": "struct IVerifiedDomainRegistry.DomainWithId[]", + "name": "domainInfo", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVerifyDomainProcessor", + "name": "_verifyDomainProcessor", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isExchange", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isInitialized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + } + ], + "name": "removeDomainListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_exchange", + "type": "address" + } + ], + "name": "removeExchange", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_listingId", + "type": "uint256" + } + ], + "name": "setDomainListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_newOwner", + "type": "address" + } + ], + "name": "updateDomainOnSale", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVerifyDomainProcessor", + "name": "_verifyDomainProcessor", + "type": "address" + } + ], + "name": "updateVerifyDomainProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "userDomains", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "verifyDomainProcessor", + "outputs": [ + { + "internalType": "contract IVerifyDomainProcessor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "string", + "name": "provider", + "type": "string" + }, + { + "internalType": "string", + "name": "parameters", + "type": "string" + }, + { + "internalType": "string", + "name": "context", + "type": "string" + } + ], + "internalType": "struct Claims.ClaimInfo", + "name": "claimInfo", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "identifier", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint32", + "name": "timestampS", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "epoch", + "type": "uint32" + } + ], + "internalType": "struct Claims.CompleteClaimData", + "name": "claim", + "type": "tuple" + }, + { + "internalType": "bytes[]", + "name": "signatures", + "type": "bytes[]" + } + ], + "internalType": "struct Claims.SignedClaim", + "name": "signedClaim", + "type": "tuple" + } + ], + "internalType": "struct IProxyBaseProcessor.Proof[]", + "name": "_proofs", + "type": "tuple[]" + } + ], + "name": "verifyDomains", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0xcbacd672cc2bd561f56c03e0c9d801c10500f0045678d5d69c779e81a35ead20", + "receipt": { + "to": null, + "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", + "contractAddress": "0x6206EB4c794c7fe58315f76ab088Ee3C17E0d9f5", + "transactionIndex": 88, + "gasUsed": "2387918", + "logsBloom": "0x00000000000000000000000000100000000000000000004000800020000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000201000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xf9b305f107eaa277d6127aad38990d72c52d0eb5c1e46d84a7fdb2a738238e3b", + "transactionHash": "0xcbacd672cc2bd561f56c03e0c9d801c10500f0045678d5d69c779e81a35ead20", + "logs": [ + { + "transactionIndex": 88, + "blockNumber": 20166837, + "transactionHash": "0xcbacd672cc2bd561f56c03e0c9d801c10500f0045678d5d69c779e81a35ead20", + "address": "0x6206EB4c794c7fe58315f76ab088Ee3C17E0d9f5", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" + ], + "data": "0x", + "logIndex": 262, + "blockHash": "0xf9b305f107eaa277d6127aad38990d72c52d0eb5c1e46d84a7fdb2a738238e3b" + } + ], + "blockNumber": 20166837, + "cumulativeGasUsed": "19501406", + "status": 1, + "byzantium": true + }, + "args": [], + "numDeployments": 1, + "solcInputHash": "d865a6f49eab8c58036d78b72f5cb448", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"}],\"name\":\"DomainListed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"}],\"name\":\"DomainListingRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"DomainTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"domainName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"expiryTime\",\"type\":\"uint256\"}],\"name\":\"DomainVerified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"}],\"name\":\"ExchangeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"}],\"name\":\"ExchangeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IVerifyDomainProcessor\",\"name\":\"newVerifyDomainProcessor\",\"type\":\"address\"}],\"name\":\"VerifyDomainProcessorUpdated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_exchange\",\"type\":\"address\"}],\"name\":\"addExchange\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"domains\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"expiryTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"exchanges\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_domainId\",\"type\":\"bytes32\"}],\"name\":\"getDomain\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"expiryTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"}],\"internalType\":\"struct IVerifiedDomainRegistry.Domain\",\"name\":\"domain\",\"type\":\"tuple\"}],\"internalType\":\"struct IVerifiedDomainRegistry.DomainWithId\",\"name\":\"domainInfo\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_domainName\",\"type\":\"string\"}],\"name\":\"getDomainId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_domainId\",\"type\":\"bytes32\"}],\"name\":\"getDomainOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_domains\",\"type\":\"bytes32[]\"}],\"name\":\"getDomains\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"expiryTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"}],\"internalType\":\"struct IVerifiedDomainRegistry.Domain\",\"name\":\"domain\",\"type\":\"tuple\"}],\"internalType\":\"struct IVerifiedDomainRegistry.DomainWithId[]\",\"name\":\"domainInfo\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExchanges\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getUserDomains\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"expiryTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"}],\"internalType\":\"struct IVerifiedDomainRegistry.Domain\",\"name\":\"domain\",\"type\":\"tuple\"}],\"internalType\":\"struct IVerifiedDomainRegistry.DomainWithId[]\",\"name\":\"domainInfo\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IVerifyDomainProcessor\",\"name\":\"_verifyDomainProcessor\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isExchange\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_domainId\",\"type\":\"bytes32\"}],\"name\":\"removeDomainListing\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_exchange\",\"type\":\"address\"}],\"name\":\"removeExchange\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_domainId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_listingId\",\"type\":\"uint256\"}],\"name\":\"setDomainListing\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_domainId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"updateDomainOnSale\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IVerifyDomainProcessor\",\"name\":\"_verifyDomainProcessor\",\"type\":\"address\"}],\"name\":\"updateVerifyDomainProcessor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"userDomains\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifyDomainProcessor\",\"outputs\":[{\"internalType\":\"contract IVerifyDomainProcessor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"provider\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"parameters\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"context\",\"type\":\"string\"}],\"internalType\":\"struct Claims.ClaimInfo\",\"name\":\"claimInfo\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"identifier\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampS\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"internalType\":\"struct Claims.CompleteClaimData\",\"name\":\"claim\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"internalType\":\"struct Claims.SignedClaim\",\"name\":\"signedClaim\",\"type\":\"tuple\"}],\"internalType\":\"struct IProxyBaseProcessor.Proof[]\",\"name\":\"_proofs\",\"type\":\"tuple[]\"}],\"name\":\"verifyDomains\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addExchange(address)\":{\"params\":{\"_exchange\":\"Address of the exchange contract\"}},\"initialize(address)\":{\"params\":{\"_verifyDomainProcessor\":\"Address of the VerifyDomainProcessor contract\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"removeDomainListing(bytes32)\":{\"params\":{\"_domainId\":\"Domain ID to update listing status for\"}},\"removeExchange(address)\":{\"params\":{\"_exchange\":\"Address of the exchange contract\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setDomainListing(bytes32,uint256)\":{\"params\":{\"_domainId\":\"Domain to set listed status for\",\"_listingId\":\"Listing Id of domain on calling exchange\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateDomainOnSale(bytes32,address)\":{\"params\":{\"_domainId\":\"Domain ID to update listing status for\",\"_newOwner\":\"New owner of the domain\"}},\"updateVerifyDomainProcessor(address)\":{\"params\":{\"_verifyDomainProcessor\":\"Address of the new VerifyDomainProcessor contract\"}},\"verifyDomains(((string,string,string),((bytes32,address,uint32,uint32),bytes[]))[])\":{\"params\":{\"_proofs\":\"Array of domain ownership TLS proofs\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addExchange(address)\":{\"notice\":\"ONLY OWNER: Add an exchange to the registry. This can only be called after the contract has been initialized. Exchange must not already exist in the registry. \"},\"initialize(address)\":{\"notice\":\"ONLY OWNER: Initialize the contract with the VerifyDomainProcessor and exchange contracts. This can only be called once.\"},\"removeDomainListing(bytes32)\":{\"notice\":\"ONLY EXCHANGE: Remove a listing status from domain. We check that the calling exchange is the one that the domain is listed on. This removes the exchange and listingId from the domain. \"},\"removeExchange(address)\":{\"notice\":\"ONLY OWNER: Remove an exchange from the registry. Exchange must exist in the registry. \"},\"setDomainListing(bytes32,uint256)\":{\"notice\":\"ONLY EXCHANGE: Add a listing status to domain. We check that the domain has been verified and is listed on the calling exchange. This sets the exchange and listingId of the domain. \"},\"updateDomainOnSale(bytes32,address)\":{\"notice\":\"ONLY EXCHANGE: Update domain on sale. We check that the calling exchange is the one that the domain is listed on. This updates the ownership of the domain to the new owner as well as removes the listing status from the domain. \"},\"updateVerifyDomainProcessor(address)\":{\"notice\":\"ONLY OWNER: Update the verify domain processor\"},\"verifyDomains(((string,string,string),((bytes32,address,uint32,uint32),bytes[]))[])\":{\"notice\":\"Verify domains and add them to the registry. If domain is transferred off-chain to another party then they can re-verify the domain and claim ownership of the domain and previous ownership is removed. The existing owner can re-verify the domain, say after the domain has expired to update the expiry time on the domain. Function reverts if: - Domain ownership TLS proofs are invalid \"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/VerifiedDomainRegistry.sol\":\"VerifiedDomainRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\")\\n mstore(0x1c, hash)\\n message := keccak256(0x00, 0x3c)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40)\\n mstore(ptr, \\\"\\\\x19\\\\x01\\\")\\n mstore(add(ptr, 0x02), domainSeparator)\\n mstore(add(ptr, 0x22), structHash)\\n data := keccak256(ptr, 0x42)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\\n * `validator` and `data` according to the version 0 of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x00\\\", validator, data));\\n }\\n}\\n\",\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"./StringUtils.sol\\\";\\n\\n/**\\n * Library to assist with requesting,\\n * serialising & verifying credentials\\n */\\nlibrary Claims {\\n\\t/** Data required to describe a claim */\\n\\tstruct CompleteClaimData {\\n\\t\\tbytes32 identifier;\\n\\t\\taddress owner;\\n\\t\\tuint32 timestampS;\\n\\t\\tuint32 epoch;\\n\\t}\\n\\n\\tstruct ClaimInfo {\\n\\t\\tstring provider;\\n\\t\\tstring parameters;\\n\\t\\tstring context;\\n\\t}\\n\\n\\t/** Claim with signatures & signer */\\n\\tstruct SignedClaim {\\n\\t\\tCompleteClaimData claim;\\n\\t\\tbytes[] signatures;\\n\\t}\\n\\n\\t/**\\n\\t * Asserts that the claim is signed by the expected witnesses\\n\\t */\\n\\tfunction assertValidSignedClaim(\\n\\t\\tSignedClaim memory self,\\n\\t\\taddress[] memory expectedWitnessAddresses\\n\\t) internal pure {\\n\\t\\trequire(self.signatures.length > 0, \\\"No signatures\\\");\\n\\t\\taddress[] memory signedWitnesses = recoverSignersOfSignedClaim(self);\\n\\t\\tfor (uint256 i = 0; i < expectedWitnessAddresses.length; i++) {\\n\\t\\t\\tbool found = false;\\n\\t\\t\\tfor (uint256 j = 0; j < signedWitnesses.length; j++) {\\n\\t\\t\\t\\tif (signedWitnesses[j] == expectedWitnessAddresses[i]) {\\n\\t\\t\\t\\t\\tfound = true;\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\trequire(found, \\\"Missing witness signature\\\");\\n\\t\\t}\\n\\t}\\n\\n\\t/**\\n\\t * @dev recovers the signer of the claim\\n\\t */\\n\\tfunction recoverSignersOfSignedClaim(\\n\\t\\tSignedClaim memory self\\n\\t) internal pure returns (address[] memory) {\\n\\t\\tbytes memory serialised = serialise(self.claim);\\n\\t\\taddress[] memory signers = new address[](self.signatures.length);\\n\\t\\tfor (uint256 i = 0; i < self.signatures.length; i++) {\\n\\t\\t\\tsigners[i] = verifySignature(serialised, self.signatures[i]);\\n\\t\\t}\\n\\n\\t\\treturn signers;\\n\\t}\\n\\n\\t/**\\n\\t * @dev serialises the credential into a string;\\n\\t * the string is used to verify the signature\\n\\t *\\n\\t * the serialisation is the same as done by the TS library\\n\\t */\\n\\tfunction serialise(\\n\\t\\tCompleteClaimData memory self\\n\\t) internal pure returns (bytes memory) {\\n\\t\\treturn\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\tStringUtils.bytes2str(abi.encodePacked(self.identifier)),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.address2str(self.owner),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.timestampS),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.epoch)\\n\\t\\t\\t);\\n\\t}\\n\\n\\t/**\\n\\t * @dev returns the address of the user that generated the signature\\n\\t */\\n\\tfunction verifySignature(\\n\\t\\tbytes memory content,\\n\\t\\tbytes memory signature\\n\\t) internal pure returns (address signer) {\\n\\t\\tbytes32 signedHash = keccak256(\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\t\\\"\\\\x19Ethereum Signed Message:\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(content.length),\\n\\t\\t\\t\\tcontent\\n\\t\\t\\t)\\n\\t\\t);\\n\\t\\treturn ECDSA.recover(signedHash, signature);\\n\\t}\\n\\n\\tfunction hashClaimInfo(ClaimInfo memory claimInfo) internal pure returns (bytes32) {\\n\\t\\tbytes memory serialised = abi.encodePacked(\\n\\t\\t\\tclaimInfo.provider,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.parameters,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.context\\n\\t\\t);\\n\\t\\treturn keccak256(serialised);\\n\\t}\\n}\\n\",\"keccak256\":\"0x87a41e75d358e86798456ad45e03446cde8f1519c8af17905f6c8b852a5f2da7\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/StringUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/**\\n * Utilities for string manipulation & conversion\\n */\\nlibrary StringUtils {\\n\\tfunction address2str(address x) internal pure returns (string memory) {\\n\\t\\tbytes memory s = new bytes(40);\\n\\t\\tfor (uint i = 0; i < 20; i++) {\\n\\t\\t\\tbytes1 b = bytes1(uint8(uint(uint160(x)) / (2 ** (8 * (19 - i)))));\\n\\t\\t\\tbytes1 hi = bytes1(uint8(b) / 16);\\n\\t\\t\\tbytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));\\n\\t\\t\\ts[2 * i] = getChar(hi);\\n\\t\\t\\ts[2 * i + 1] = getChar(lo);\\n\\t\\t}\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", s));\\n\\t}\\n\\n\\tfunction bytes2str(bytes memory buffer) internal pure returns (string memory) {\\n\\t\\t// Fixed buffer size for hexadecimal convertion\\n\\t\\tbytes memory converted = new bytes(buffer.length * 2);\\n\\t\\tbytes memory _base = \\\"0123456789abcdef\\\";\\n\\n\\t\\tfor (uint256 i = 0; i < buffer.length; i++) {\\n\\t\\t\\tconverted[i * 2] = _base[uint8(buffer[i]) / _base.length];\\n\\t\\t\\tconverted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length];\\n\\t\\t}\\n\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", converted));\\n\\t}\\n\\n\\tfunction getChar(bytes1 b) internal pure returns (bytes1 c) {\\n\\t\\tif (uint8(b) < 10) return bytes1(uint8(b) + 0x30);\\n\\t\\telse return bytes1(uint8(b) + 0x57);\\n\\t}\\n\\n\\tfunction bool2str(bool _b) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_b) {\\n\\t\\t\\treturn \\\"true\\\";\\n\\t\\t} else {\\n\\t\\t\\treturn \\\"false\\\";\\n\\t\\t}\\n\\t}\\n\\n\\tfunction uint2str(uint _i) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_i == 0) {\\n\\t\\t\\treturn \\\"0\\\";\\n\\t\\t}\\n\\t\\tuint j = _i;\\n\\t\\tuint len;\\n\\t\\twhile (j != 0) {\\n\\t\\t\\tlen++;\\n\\t\\t\\tj /= 10;\\n\\t\\t}\\n\\t\\tbytes memory bstr = new bytes(len);\\n\\t\\tuint k = len;\\n\\t\\twhile (_i != 0) {\\n\\t\\t\\tk = k - 1;\\n\\t\\t\\tuint8 temp = (48 + uint8(_i - (_i / 10) * 10));\\n\\t\\t\\tbytes1 b1 = bytes1(temp);\\n\\t\\t\\tbstr[k] = b1;\\n\\t\\t\\t_i /= 10;\\n\\t\\t}\\n\\t\\treturn string(bstr);\\n\\t}\\n\\n\\tfunction areEqual(\\n\\t\\tstring calldata _a,\\n\\t\\tstring storage _b\\n\\t) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction areEqual(string memory _a, string memory _b) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction toLower(string memory str) internal pure returns (string memory) {\\n\\t\\tbytes memory bStr = bytes(str);\\n\\t\\tbytes memory bLower = new bytes(bStr.length);\\n\\t\\tfor (uint i = 0; i < bStr.length; i++) {\\n\\t\\t\\t// Uppercase character...\\n\\t\\t\\tif ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {\\n\\t\\t\\t\\t// So we add 32 to make it lowercase\\n\\t\\t\\t\\tbLower[i] = bytes1(uint8(bStr[i]) + 32);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tbLower[i] = bStr[i];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn string(bLower);\\n\\t}\\n\\n\\tfunction substring(\\n\\t\\tstring memory str,\\n\\t\\tuint startIndex,\\n\\t\\tuint endIndex\\n\\t) internal pure returns (string memory) {\\n\\t\\tbytes memory strBytes = bytes(str);\\n\\t\\tbytes memory result = new bytes(endIndex - startIndex);\\n\\t\\tfor (uint i = startIndex; i < endIndex; i++) {\\n\\t\\t\\tresult[i - startIndex] = strBytes[i];\\n\\t\\t}\\n\\t\\treturn string(result);\\n\\t}\\n}\\n\",\"keccak256\":\"0x15feebafef16d4c74c043b39e652ddae0e121987ceca74b663f6a2d2d7ba8b4b\",\"license\":\"MIT\"},\"contracts/VerifiedDomainRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport { Bytes32ArrayUtils } from \\\"./external/lib/Bytes32ArrayUtils.sol\\\";\\nimport { AddressArrayUtils } from \\\"./external/lib/AddressArrayUtils.sol\\\";\\n\\nimport { IDomainExchange } from \\\"./interfaces/IDomainExchange.sol\\\";\\nimport { IVerifiedDomainRegistry } from \\\"./interfaces/IVerifiedDomainRegistry.sol\\\";\\nimport { IVerifyDomainProcessor } from \\\"./interfaces/IVerifyDomainProcessor.sol\\\";\\n\\n\\npragma solidity ^0.8.18;\\n\\ncontract VerifiedDomainRegistry is IVerifiedDomainRegistry, Ownable {\\n\\n using Bytes32ArrayUtils for bytes32[];\\n using AddressArrayUtils for address[];\\n\\n /* ============ Events ============ */\\n event DomainVerified(\\n bytes32 indexed domainId,\\n address indexed owner,\\n string domainName,\\n uint256 expiryTime\\n );\\n\\n event DomainListed(\\n bytes32 indexed domainId,\\n address indexed exchange,\\n uint256 indexed listingId\\n );\\n\\n event DomainListingRemoved(\\n bytes32 indexed domainId,\\n address indexed exchange\\n );\\n\\n event DomainTransferred(\\n bytes32 indexed domainId,\\n address indexed oldOwner,\\n address indexed newOwner\\n );\\n\\n\\n event VerifyDomainProcessorUpdated(\\n IVerifyDomainProcessor indexed newVerifyDomainProcessor\\n );\\n\\n event ExchangeAdded(address indexed exchange);\\n event ExchangeRemoved(address indexed exchange);\\n\\n /* ============ Modifiers ============ */\\n modifier onlyExchange() {\\n require(isExchange[msg.sender], \\\"Caller must be exchange\\\");\\n _;\\n }\\n\\n modifier onlyInitialized() {\\n require(isInitialized, \\\"Contract must be initialized\\\");\\n _;\\n }\\n\\n /* ============ Public Variables ============ */\\n IVerifyDomainProcessor public verifyDomainProcessor;\\n address[] public exchanges;\\n mapping(address=>bool) public isExchange;\\n\\n bool public isInitialized;\\n\\n mapping(bytes32 => Domain) public domains;\\n mapping(address => bytes32[]) public userDomains;\\n\\n /* ============ Constructor ============ */\\n \\n constructor() Ownable() {}\\n\\n /* ============ Public Functions ============ */\\n\\n /**\\n * @notice Verify domains and add them to the registry. If domain is transferred off-chain to another party \\n * then they can re-verify the domain and claim ownership of the domain and previous ownership is removed.\\n * The existing owner can re-verify the domain, say after the domain has expired to update the expiry time on\\n * the domain. Function reverts if:\\n * - Domain ownership TLS proofs are invalid\\n * \\n * @param _proofs Array of domain ownership TLS proofs\\n */\\n function verifyDomains(IVerifyDomainProcessor.Proof[] memory _proofs) external override\\n onlyInitialized\\n {\\n IVerifyDomainProcessor.DomainRaw[] memory rawDomains = verifyDomainProcessor.verifyProofs(\\n _proofs\\n );\\n\\n for (uint256 i = 0; i < rawDomains.length; i++) {\\n IVerifyDomainProcessor.DomainRaw memory rawDomain = rawDomains[i];\\n bytes32 domainId = getDomainId(rawDomain.name);\\n\\n Domain storage domain = domains[domainId];\\n if (domain.owner == address(0)) {\\n // Case 1.1: Domain has no owner\\n // Add caller as owner\\n userDomains[msg.sender].push(domainId);\\n\\n // Set domain details\\n domains[domainId] = Domain({\\n owner: msg.sender,\\n name: rawDomain.name,\\n expiryTime: rawDomain.expiryTime,\\n exchange: address(0),\\n listingId: 0\\n });\\n } else {\\n // Case 2: Domain has owner\\n // Case 2.1: Caller is owner; skip\\n if (domain.owner == msg.sender) {\\n // No updates to userDomains\\n\\n // Update domain details; Only expiry time can change\\n // Owner and domain name cannot change\\n // Exchange and listingId are kept as is\\n domain.expiryTime = rawDomain.expiryTime;\\n }\\n // Case 2.2: Caller is NOT owner\\n if (domain.owner != msg.sender) {\\n // Remove ownership from old owner\\n userDomains[domain.owner].removeStorage(domainId);\\n\\n // Remove listing on exchange if it exists\\n if (domain.exchange != address(0)) {\\n IDomainExchange(domain.exchange).registryRemoveListing(domain.listingId);\\n }\\n\\n // Add domain to new owner\\n userDomains[msg.sender].push(domainId);\\n\\n // Set domain details except for domain name as it cannot change\\n domain.owner = msg.sender;\\n domain.expiryTime = rawDomain.expiryTime;\\n domain.exchange = address(0);\\n domain.listingId = 0;\\n }\\n }\\n\\n emit DomainVerified(domainId, msg.sender, rawDomain.name, rawDomain.expiryTime);\\n }\\n }\\n\\n // Todo: Add function for relinquishing ownership of domain\\n\\n /**\\n * @notice ONLY EXCHANGE: Add a listing status to domain. We check that the domain has been verified and is\\n * listed on the calling exchange. This sets the exchange and listingId of the domain.\\n * \\n * @param _domainId Domain to set listed status for\\n * @param _listingId Listing Id of domain on calling exchange\\n */\\n function setDomainListing(bytes32 _domainId, uint256 _listingId)\\n external\\n override\\n onlyInitialized\\n onlyExchange\\n {\\n Domain storage domain = domains[_domainId];\\n\\n require(domain.owner != address(0), \\\"Domain must be verified\\\");\\n require(domain.exchange == address(0), \\\"Domain already listed on another exchange\\\");\\n\\n domain.exchange = msg.sender;\\n domain.listingId = _listingId;\\n\\n emit DomainListed(_domainId, msg.sender, _listingId);\\n }\\n\\n /**\\n * @notice ONLY EXCHANGE: Remove a listing status from domain. We check that the calling exchange is the one\\n * that the domain is listed on. This removes the exchange and listingId from the domain.\\n * \\n * @param _domainId Domain ID to update listing status for\\n */\\n function removeDomainListing(bytes32 _domainId) external override onlyInitialized onlyExchange {\\n Domain storage domain = domains[_domainId];\\n require(domain.exchange == msg.sender, \\\"Domain not listed on calling exchange\\\");\\n\\n _removeDomainListing(domain);\\n\\n emit DomainListingRemoved(_domainId, msg.sender);\\n }\\n\\n /**\\n * @notice ONLY EXCHANGE: Update domain on sale. We check that the calling exchange is the one that the domain\\n * is listed on. This updates the ownership of the domain to the new owner as well as removes the listing status\\n * from the domain.\\n * \\n * @param _domainId Domain ID to update listing status for\\n * @param _newOwner New owner of the domain\\n */\\n function updateDomainOnSale(bytes32 _domainId, address _newOwner) \\n external \\n override \\n onlyInitialized \\n onlyExchange \\n {\\n Domain storage domain = domains[_domainId];\\n require(domain.exchange == msg.sender, \\\"Domain not listed on calling exchange\\\");\\n\\n _removeDomainListing(domain);\\n\\n // Update ownership\\n address oldOwner = domain.owner;\\n domain.owner = _newOwner;\\n userDomains[oldOwner].removeStorage(_domainId);\\n userDomains[_newOwner].push(_domainId);\\n\\n emit DomainTransferred(_domainId, oldOwner, _newOwner);\\n }\\n\\n /* ============ Admin Functions ============ */\\n\\n /**\\n * @notice ONLY OWNER: Initialize the contract with the VerifyDomainProcessor and exchange contracts.\\n * This can only be called once.\\n *\\n * @param _verifyDomainProcessor Address of the VerifyDomainProcessor contract\\n */\\n function initialize(\\n IVerifyDomainProcessor _verifyDomainProcessor\\n )\\n external\\n onlyOwner\\n {\\n require(!isInitialized, \\\"Already initialized\\\");\\n\\n verifyDomainProcessor = _verifyDomainProcessor;\\n\\n isInitialized = true;\\n\\n emit VerifyDomainProcessorUpdated(_verifyDomainProcessor);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Add an exchange to the registry. This can only be called after the contract has been initialized.\\n * Exchange must not already exist in the registry.\\n * \\n * @param _exchange Address of the exchange contract\\n */\\n function addExchange(address _exchange) external onlyOwner onlyInitialized {\\n require(!isExchange[_exchange], \\\"Duplicate exchange\\\");\\n\\n isExchange[_exchange] = true;\\n exchanges.push(_exchange);\\n\\n emit ExchangeAdded(_exchange);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Remove an exchange from the registry. Exchange must exist in the registry.\\n * \\n * @param _exchange Address of the exchange contract\\n */\\n function removeExchange(address _exchange) external onlyOwner onlyInitialized {\\n require(isExchange[_exchange], \\\"Exchange does not exist\\\");\\n\\n isExchange[_exchange] = false;\\n exchanges.removeStorage(_exchange);\\n\\n emit ExchangeRemoved(_exchange);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Update the verify domain processor\\n *\\n * @param _verifyDomainProcessor Address of the new VerifyDomainProcessor contract\\n */\\n function updateVerifyDomainProcessor(IVerifyDomainProcessor _verifyDomainProcessor) external onlyOwner {\\n require(address(_verifyDomainProcessor) != address(0), \\\"Invalid address\\\");\\n\\n verifyDomainProcessor = _verifyDomainProcessor;\\n emit VerifyDomainProcessorUpdated(_verifyDomainProcessor);\\n }\\n\\n /* ============ View Functions ============ */\\n\\n function getDomainId(string memory _domainName) public pure override returns (bytes32) {\\n return keccak256(abi.encodePacked(_domainName));\\n }\\n\\n function getDomainOwner(bytes32 _domainId) external view override returns (address) { \\n return domains[_domainId].owner;\\n }\\n\\n function getUserDomains(address _user) external view returns (DomainWithId[] memory domainInfo) {\\n bytes32[] memory domainIds = userDomains[_user];\\n \\n domainInfo = new DomainWithId[](domainIds.length);\\n for (uint256 i = 0; i < domainIds.length; i++) {\\n bytes32 domainId = domainIds[i];\\n domainInfo[i] = DomainWithId({\\n domainId: domainId,\\n domain: domains[domainId]\\n });\\n }\\n }\\n\\n function getDomain(bytes32 _domainId) external view override returns (DomainWithId memory domainInfo) {\\n return DomainWithId({\\n domainId: _domainId,\\n domain: domains[_domainId]\\n });\\n }\\n\\n function getDomains(bytes32[] memory _domains) external view returns (DomainWithId[] memory domainInfo) {\\n domainInfo = new DomainWithId[](_domains.length);\\n for (uint256 i = 0; i < _domains.length; i++) {\\n bytes32 domainId = _domains[i];\\n domainInfo[i] = DomainWithId({\\n domainId: domainId,\\n domain: domains[domainId]\\n });\\n }\\n }\\n\\n function getExchanges() external view returns (address[] memory) {\\n return exchanges;\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n function _removeDomainListing(Domain storage _domain) internal {\\n delete _domain.exchange;\\n delete _domain.listingId;\\n }\\n}\",\"keccak256\":\"0x8162cd31c4aa35caa77d08e3115681bbe33e842a9640b0106816e2ca09137ea8\",\"license\":\"MIT\"},\"contracts/external/interfaces/IProxyBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Claims } from \\\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IProxyBaseProcessor {\\n \\n struct Proof {\\n Claims.ClaimInfo claimInfo;\\n Claims.SignedClaim signedClaim;\\n }\\n}\\n\",\"keccak256\":\"0x65aa00301110dfdf8333bd9bb71ebad241d66ea5840a2db3ac6d4f6037083cb8\",\"license\":\"MIT\"},\"contracts/external/lib/AddressArrayUtils.sol\":{\"content\":\"/*\\n Copyright 2020 Set Labs Inc.\\n\\n Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n you may not use this file except in compliance with the License.\\n You may obtain a copy of the License at\\n\\n http://www.apache.org/licenses/LICENSE-2.0\\n\\n Unless required by applicable law or agreed to in writing, software\\n distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n See the License for the specific language governing permissions and\\n limitations under the License.\\n\\n SPDX-License-Identifier: MIT\\n*/\\n\\npragma solidity ^0.8.17;\\n\\n/**\\n * @title AddressArrayUtils\\n * @author Set Protocol\\n *\\n * Utility functions to handle Address Arrays\\n *\\n * CHANGELOG:\\n * - 4/21/21: Added validatePairsWithArray methods\\n */\\nlibrary AddressArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(address[] memory A, address a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(address[] memory A, address a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns true if there are 2 elements that are the same in an array\\n * @param A The input array to search\\n * @return Returns boolean for the first occurrence of a duplicate\\n */\\n function hasDuplicate(address[] memory A) internal pure returns(bool) {\\n require(A.length > 0, \\\"A is empty\\\");\\n\\n for (uint256 i = 0; i < A.length - 1; i++) {\\n address current = A[i];\\n for (uint256 j = i + 1; j < A.length; j++) {\\n if (current == A[j]) {\\n return true;\\n }\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n * @return Returns the array with the object removed.\\n */\\n function remove(address[] memory A, address a)\\n internal\\n pure\\n returns (address[] memory)\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n (address[] memory _A,) = pop(A, index);\\n return _A;\\n }\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n */\\n function removeStorage(address[] storage A, address a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n\\n /**\\n * Removes specified index from array\\n * @param A The input array to search\\n * @param index The index to remove\\n * @return Returns the new array and the removed entry\\n */\\n function pop(address[] memory A, uint256 index)\\n internal\\n pure\\n returns (address[] memory, address)\\n {\\n uint256 length = A.length;\\n require(index < A.length, \\\"Index must be < A length\\\");\\n address[] memory newAddresses = new address[](length - 1);\\n for (uint256 i = 0; i < index; i++) {\\n newAddresses[i] = A[i];\\n }\\n for (uint256 j = index + 1; j < length; j++) {\\n newAddresses[j - 1] = A[j];\\n }\\n return (newAddresses, A[index]);\\n }\\n}\\n\",\"keccak256\":\"0x486f1a373f33aa167227600ac2d0bf95b37685413d98a3e745107188f00ae405\",\"license\":\"MIT\"},\"contracts/external/lib/Bytes32ArrayUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.17;\\n\\n/**\\n * @title Bytes32ArrayUtils\\n * @author ZKP2P\\n *\\n * Fork of Set Protocol's AddressArrayUtils library adapted for usage with bytes32 arrays.\\n */\\nlibrary Bytes32ArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(bytes32[] memory A, bytes32 a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(bytes32[] memory A, bytes32 a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns true if there are 2 elements that are the same in an array\\n * @param A The input array to search\\n * @return Returns boolean for the first occurrence of a duplicate\\n */\\n function hasDuplicate(bytes32[] memory A) internal pure returns(bool) {\\n require(A.length > 0, \\\"A is empty\\\");\\n\\n for (uint256 i = 0; i < A.length - 1; i++) {\\n bytes32 current = A[i];\\n for (uint256 j = i + 1; j < A.length; j++) {\\n if (current == A[j]) {\\n return true;\\n }\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The bytes32 to remove\\n * @return Returns the array with the object removed.\\n */\\n function remove(bytes32[] memory A, bytes32 a)\\n internal\\n pure\\n returns (bytes32[] memory)\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"bytes32 not in array.\\\");\\n } else {\\n (bytes32[] memory _A,) = pop(A, index);\\n return _A;\\n }\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The bytes32 to remove\\n */\\n function removeStorage(bytes32[] storage A, bytes32 a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"bytes32 not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n\\n /**\\n * Removes specified index from array\\n * @param A The input array to search\\n * @param index The index to remove\\n * @return Returns the new array and the removed entry\\n */\\n function pop(bytes32[] memory A, uint256 index)\\n internal\\n pure\\n returns (bytes32[] memory, bytes32)\\n {\\n uint256 length = A.length;\\n require(index < A.length, \\\"Index must be < A length\\\");\\n bytes32[] memory newBytes = new bytes32[](length - 1);\\n for (uint256 i = 0; i < index; i++) {\\n newBytes[i] = A[i];\\n }\\n for (uint256 j = index + 1; j < length; j++) {\\n newBytes[j - 1] = A[j];\\n }\\n return (newBytes, A[index]);\\n }\\n}\\n\",\"keccak256\":\"0x14d572deda126ff812eb5ab0eed33120e13cc568fd611a4a6bff652f3e8440a8\",\"license\":\"MIT\"},\"contracts/interfaces/IDomainExchange.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.18;\\n\\n\\ninterface IDomainExchange {\\n function registryRemoveListing(uint256 _listingId) external;\\n}\",\"keccak256\":\"0xe9deda400c359c1b42d10c518dc1f01605ea3a466e1be110f1f7c9be4af8253b\",\"license\":\"MIT\"},\"contracts/interfaces/IVerifiedDomainRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { IVerifyDomainProcessor } from \\\"./IVerifyDomainProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IVerifiedDomainRegistry {\\n\\n struct Domain {\\n address owner;\\n string name;\\n uint256 expiryTime;\\n address exchange;\\n uint256 listingId;\\n }\\n\\n struct DomainWithId {\\n bytes32 domainId;\\n Domain domain;\\n }\\n\\n function verifyDomains(IVerifyDomainProcessor.Proof[] memory _proofs) external;\\n \\n function getDomainId(string memory _domainName) external pure returns (bytes32);\\n function getDomainOwner(bytes32 _domainId) external view returns (address);\\n function getDomain(bytes32 _domainId) external view returns (DomainWithId memory);\\n function getDomains(bytes32[] memory _domainId) external view returns (DomainWithId[] memory);\\n \\n function setDomainListing(bytes32 _domainId, uint256 _listingId) external;\\n function removeDomainListing(bytes32 _domainId) external;\\n function updateDomainOnSale(bytes32 _domainId, address _newOwner) external;\\n}\\n\",\"keccak256\":\"0xcc45329e6720b7b9df3c67985b16f8d778528f756c045ba6c2196831b40afe92\",\"license\":\"MIT\"},\"contracts/interfaces/IVerifyDomainProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\nimport { IProxyBaseProcessor } from \\\"../external/interfaces/IProxyBaseProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IVerifyDomainProcessor is IProxyBaseProcessor {\\n \\n struct DomainRaw {\\n string name;\\n uint256 expiryTime;\\n }\\n\\n function verifyProofs(\\n Proof[] memory _proofs\\n ) \\n external \\n returns (DomainRaw[] memory domains);\\n}\",\"keccak256\":\"0xe66335a9d8fb3d03a9ee76bf44fbec775311aeed3f6666862f06124b6605a123\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x6080604052346200002657620000146200002b565b6040516129b06200012682396129b090f35b600080fd5b6200003562000037565b565b6200003533620000c3565b62000054905b6001600160a01b031690565b90565b62000054905462000042565b620000549062000048906001600160a01b031682565b620000549062000063565b620000549062000079565b90620000a362000054620000bf9262000084565b82546001600160a01b0319166001600160a01b03919091161790565b9055565b620000cf600062000057565b90620000dd8160006200008f565b620001146200010d7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09362000084565b9162000084565b916200011f60405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c806236d2d3146101815780630183196b1461017c57806311d4c3a2146101775780631a242547146101725780631e2e3a6b1461016d57806327d335a8146101685780632839fc29146101635780632b8a80021461015e578063392e53cd146101595780635e8441d3146101545780636e74da681461014f578063715018a61461014a5780637f200269146101455780638da5cb5b146101405780638e0be3691461013b5780639f4cb8f0146101365780639f6eb88c14610131578063a9c56e911461012c578063aa10ce2214610127578063b3533dfe14610122578063c4d66de81461011d578063c722f177146101185763f2fde38b036101a757610e91565b610e60565b610c98565b610c71565b610c34565b610c1c565b610951565b610891565b610817565b6107f2565b6107da565b610792565b61077a565b61074f565b61064d565b610628565b6105ea565b61054c565b610502565b610460565b61041a565b6103cc565b610242565b6001600160a01b031690565b90565b6001600160a01b0381165b036101a757565b600080fd5b905035906101b982610195565b565b906020828203126101a757610192916101ac565b61019290610186906001600160a01b031682565b610192906101cf565b610192906101e3565b906101ff906101ec565b600052602052604060002090565b610192916008021c5b60ff1690565b90610192915461020d565b610192906102396003916000926101f5565b61021c565b9052565b346101a75761026f61025d6102583660046101bb565b610227565b60405191829182901515815260200190565b0390f35b60005b8381106102865750506000910152565b8181015183820152602001610276565b6102b76102c06020936102ca936102ab815190565b80835293849260200190565b95869101610273565b601f01601f191690565b0190565b80516001600160a01b0316825290610192906080806102fc60a0840160208701518582036020870152610296565b9461030c60408201516040860152565b6060818101516001600160a01b0316908501520151910152565b80518252610192916040810191602001519060208184039101526102ce565b9061019291610326565b9061036561035b835190565b8083529160200190565b90816103776020830284019460200190565b926000915b83831061038b57505050505090565b909192939460206103ae6103a783856001950387528951610345565b9760200190565b930193019193929061037c565b60208082526101929291019061034f565b346101a75761026f6103e76103e23660046101bb565b612456565b604051918291826103bb565b806101a0565b905035906101b9826103f3565b906020828203126101a757610192916103f9565b346101a75761026f610435610430366004610406565b612258565b604051918291826001600160a01b03909116815260200190565b602080825261019292910190610326565b346101a75761026f61047b610476366004610406565b612507565b6040519182918261044f565b60009103126101a757565b906104b26104ab6104a1845190565b8084529260200190565b9260200190565b9060005b8181106104c35750505090565b9091926104e96104e260019286516001600160a01b0316815260200190565b9460200190565b9291016104b6565b602080825261019292910190610492565b346101a757610512366004610487565b61026f61051d6125f6565b604051918291826104f1565b91906040838203126101a7576101929061054381856103f9565b936020016103f9565b346101a75761056561055f366004610529565b90611cac565b604051005b634e487b7160e01b600052603260045260246000fd5b80548210156105a35761059a600191600052602060002090565b91020190600090565b61056a565b610192916008021c610186565b9061019291546105a8565b600260006105cc825490565b8310156105e75750610192916105e191610580565b906105b5565b80fd5b346101a75761026f610435610600366004610406565b6105c0565b91906040838203126101a7576101929061061f81856103f9565b936020016101ac565b346101a75761056561063b366004610605565b90611e7e565b6101926000600461021c565b346101a75761065d366004610487565b61026f61025d610641565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761069f57604052565b610668565b906101b96106b160405190565b928361067e565b6001600160401b03811161069f57602090601f01601f19160190565b90826000939282370152565b909291926106f56106f0826106b8565b6106a4565b938185526020850190828401116101a7576101b9926106d4565b9080601f830112156101a757816020610192933591016106e0565b906020828203126101a75781356001600160401b0381116101a757610192920161070f565b346101a75761026f61076a61076536600461072a565b61221a565b6040519182918290815260200190565b346101a75761056561078d366004610406565b611da6565b346101a7576107a2366004610487565b610565610ee1565b6001600160a01b0381166101a0565b905035906101b9826107aa565b906020828203126101a757610192916107b9565b346101a7576105656107ed3660046107c6565b6121e7565b346101a757610802366004610487565b61026f6104356000546001600160a01b031690565b346101a75761056561082a3660046101bb565b612161565b91906040838203126101a7576101929061054381856101ac565b610192916008021c81565b906101929154610849565b61086d6006916000926101f5565b90610876825490565b8310156105e757506101929161088b91610580565b90610854565b346101a75761026f61076a6108a736600461082f565b9061085f565b6001600160401b03811161069f5760208091020190565b909291926108d46106f0826108ad565b93818552602080860192028301928184116101a757915b8383106108f85750505050565b6020809161090684866103f9565b8152019201916108eb565b9080601f830112156101a757816020610192933591016108c4565b906020828203126101a75781356001600160401b0381116101a7576101929201610911565b346101a75761026f6103e761096736600461092c565b612531565b9190916060818403126101a75761098360606106a4565b9281356001600160401b0381116101a757816109a091840161070f565b845260208201356001600160401b0381116101a757816109c191840161070f565b602085015260408201356001600160401b0381116101a7576109e3920161070f565b6040830152565b63ffffffff81166101a0565b905035906101b9826109ea565b9190916080818403126101a757610a5c610a1d60806106a4565b936000610a2a82856103f9565b908601526020610a3c828286016101ac565b908601526040610a4e828286016109f6565b9086015260608093016109f6565b90830152565b929190610a716106f0826108ad565b93818552602080860192028101918383116101a75781905b838210610a97575050505050565b81356001600160401b0381116101a757602091610ab7878493870161070f565b815201910190610a89565b9080601f830112156101a75781602061019293359101610a62565b91909160a0818403126101a757610af460406106a4565b926000610b018284610a03565b9085015260808201356001600160401b0381116101a757610b229201610ac2565b6020830152565b9190916040818403126101a757610b4060406106a4565b9281356001600160401b0381116101a75781610b5d91840161096c565b845260208201356001600160401b0381116101a757610b229201610add565b929190610b8b6106f0826108ad565b93818552602080860192028101918383116101a75781905b838210610bb1575050505050565b81356001600160401b0381116101a757602091610bd18784938701610b29565b815201910190610ba3565b9080601f830112156101a75781602061019293359101610b7c565b906020828203126101a75781356001600160401b0381116101a7576101929201610bdc565b346101a757610565610c2f366004610bf7565b611a96565b346101a757610565610c473660046101bb565b61208f565b610192600060016105b5565b61023e906101ec565b6020810192916101b99190610c58565b346101a757610c81366004610487565b61026f610c8c610c4c565b60405191829182610c61565b346101a757610565610cab3660046107c6565b611f65565b906101ff565b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015610cec575b6020831014610ce757565b610cb6565b91607f1691610cdc565b80546000939291610d13610d0983610ccc565b8085529360200190565b9160018116908115610d655750600114610d2c57505050565b610d3f9192939450600052602060002090565b916000925b818410610d515750500190565b805484840152602090930192600101610d44565b92949550505060ff1916825215156020020190565b9061019291610cf6565b906101b9610d9e92610d9560405190565b93848092610d7a565b038361067e565b6101929081565b6101929054610da5565b610dc1906005610cb0565b80546001600160a01b031691610dd960018301610d84565b91610de660028201610dac565b916101926004610e0060038501546001600160a01b031690565b9301610dac565b906101b994610e4c610e44610e5c936080969a99979a610e3760a088019260008901906001600160a01b03169052565b8682036020880152610296565b986040850152565b6001600160a01b03166060830152565b0152565b346101a75761026f610e7b610e76366004610406565b610db6565b91610e8895939560405190565b95869586610e07565b346101a757610565610ea43660046101bb565b611002565b610eb1610f3d565b6101b9610ecf565b6101866101926101929290565b61019290610eb9565b6101b9610edc6000610ec6565b61103b565b6101b9610ea9565b15610ef057565b60405162461bcd60e51b815280610f39600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6101b9610f526000546001600160a01b031690565b610f6b610f5e33610186565b916001600160a01b031690565b14610ee9565b6101b990610f7d610f3d565b610fdd565b15610f8957565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6101b990610edc610ff16101866000610ec6565b6001600160a01b0383161415610f82565b6101b990610f71565b906001600160a01b03905b9181191691161790565b90611030610192611037926101ec565b825461100b565b9055565b6000546001600160a01b031690611053816000611020565b6110866110807f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936101ec565b916101ec565b9161109060405190565b600090a3565b61019290610216565b6101929054611096565b156110b057565b60405162461bcd60e51b815260206004820152601c60248201527f436f6e7472616374206d75737420626520696e697469616c697a6564000000006044820152606490fd5b6101b99061110b611106600461109f565b6110a9565b6116e2565b909291926111206106f0826106b8565b938185526020850190828401116101a7576101b992610273565b9080601f830112156101a757815161019292602001611110565b905051906101b9826103f3565b9190916040818403126101a75761117860406106a4565b815190936001600160401b0382116101a75761119981610a5c93850161113a565b85526020928301611154565b9291906111b46106f0826108ad565b93818552602080860192028101918383116101a75781905b8382106111da575050505050565b81516001600160401b0381116101a7576020916111fa8784938701611161565b8152019101906111cc565b9080601f830112156101a7578151610192926020016111a5565b906020828203126101a75781516001600160401b0381116101a7576101929201611205565b8051606080845261019293916040916112759161126391850190610296565b60208501518482036020860152610296565b920151906040818403910152610296565b805182526020808201516001600160a01b0316908301526101b99190606090819060408181015163ffffffff1690850152015163ffffffff16910152565b9061019291610296565b906112da61035b835190565b90816112ec6020830284019460200190565b926000915b83831061130057505050505090565b9091929394602061131c6103a7838560019503875289516112c4565b93019301919392906112f1565b61019291602060a082019261134660008201516000850190611286565b01519060808184039101526112ce565b8051604080845261019293916020916113729190840190611244565b920151906020818403910152611329565b9061019291611356565b9061139961035b835190565b90816113ab6020830284019460200190565b926000915b8383106113bf57505050505090565b909192939460206113db6103a783856001950387528951611383565b93019301919392906113b0565b60208082526101929291019061138d565b6040513d6000823e3d90fd5b6101926101926101929290565b634e487b7160e01b600052601160045260246000fd5b60001981146114375760010190565b611412565b90611445825190565b8110156105a3576020809102010190565b9060001990611016565b9061147061019261103792611405565b8254611456565b9160001960089290920291821b911b611016565b919061149a6101926110379390565b908354611477565b90815491600160401b83101561069f57826114c59160016101b995018155610580565b9061148b565b61019260a06106a4565b919061149a61019261103793611405565b6101b9916000916114d5565b8181106114fd575050565b8061150b60006001936114e6565b016114f2565b9190601f811161152057505050565b6115326101b993600052602060002090565b906020601f840181900483019310611554575b6020601f9091010401906114f2565b9091508190611545565b90611567815190565b906001600160401b03821161069f5761158a826115848554610ccc565b85611511565b602090601f83116001146115c5576110379291600091836115ba575b5050600019600883021c1916906002021790565b0151905038806115a6565b601f198316916115da85600052602060002090565b9260005b818110611618575091600293918560019694106115ff575b50505002019055565b01516000196008601f8516021c191690553880806115f6565b919360206001819287870151815501950192016115de565b906101b99161155e565b6101b9919061168e906080906004906116648161165e87516001600160a01b031690565b90611020565b61167c60018201611676602088015190565b90611630565b6116946002820161168e604088015190565b90611460565b6116af6003820161165e60608801516001600160a01b031690565b0192015190565b906101b99161163a565b929160206116dd6101b99360408701908782036000890152610296565b940152565b600061172c916117026116fd6001546001600160a01b031690565b6101ec565b61172183637de24fcf61171460405190565b9687958694859360e01b90565b8352600483016113e8565b03925af1908115611a5057600091611a75575b5061174a6000611405565b611755610192835190565b811015611a7157611766818361143c565b5190611775600083015161221a565b916005926117866101928286610cb0565b9361179885546001600160a01b031690565b946117a36000610ec6565b956117b66001600160a01b038816610f5e565b036118b657506118b19461184b83611850936118326006946117e5846117e061019233809a6101f5565b6114a2565b88516118229061181b6117f960208d015190565b916118146118056114cb565b6001600160a01b03909b168b52565b60208a0152565b6040880152565b6001600160a01b03166060860152565b61184661183f6000611405565b6080860152565b610cb0565b6116b6565b33906118626020600085015194015190565b61189361188d7f04c47544b62d97fc6d744e7cc21ed4a24af06a46427efcfd15a0db261dbb27d69390565b936101ec565b936118a96118a060405190565b928392836116c0565b0390a3611428565b61174a565b90506118c981546001600160a01b031690565b6118d233610f5e565b14611a55575b80546001600160a01b03166118ec33610f5e565b036118fd575b506118b19350611850565b6119248261191f61019261191885546001600160a01b031690565b60066101f5565b6128ab565b60038101546001600160a01b03166119446001600160a01b038716610f5e565b036119aa575b6119a4906119916118b196611967856117e06101923360066101f5565b6119713384611020565b61198861197f602088015190565b60028501611460565b60038301611020565b600461199d6000611405565b9101611460565b386118f2565b6119c46116fd6116fd60038401546001600160a01b031690565b90631756c30e6119d660048301610dac565b833b156101a757611a0c936119fe600080946119f160405190565b9788958694859360e01b90565b835260048301526024820190565b03925af18015611a50576118b1966119a49361199192611a32575b50965050905061194a565b611a4a906000611a42818361067e565b810190610487565b38611a27565b6113f9565b611a6c611a63602085015190565b60028301611460565b6118d8565b5050565b611a90913d8091833e611a88818361067e565b81019061121f565b3861173f565b6101b9906110f5565b906101b991611ab1611106600461109f565b611b02565b15611abd57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206d7573742062652065786368616e67650000000000000000006044820152606490fd5b6101b99190611b22611b1d611b183360036101f5565b61109f565b611ab6565b611bd1565b15611b2e57565b60405162461bcd60e51b815260206004820152601760248201527f446f6d61696e206d7573742062652076657269666965640000000000000000006044820152606490fd5b15611b7a57565b60405162461bcd60e51b815260206004820152602960248201527f446f6d61696e20616c7265616479206c6973746564206f6e20616e6f746865726044820152682065786368616e676560b81b6064820152608490fd5b90611be0610192836005610cb0565b611c62826004611bf784546001600160a01b031690565b93611c1f611c056000610ec6565b95611c186001600160a01b038816610f5e565b1415611b27565b611c516003820195611c4b610f5e611c3e89546001600160a01b031690565b926001600160a01b031690565b14611b73565b611c5c338096611020565b01611460565b611c9c611c96611c907f94ec80928933a86cc2847706c09c43fa58866b537c8fce8eef172af4036af5209590565b926101ec565b92611405565b92611ca660405190565b600090a4565b906101b991611a9f565b6101b990611cc7611106600461109f565b6101b990611cdc611b1d611b183360036101f5565b611d3b565b15611ce857565b60405162461bcd60e51b815260206004820152602560248201527f446f6d61696e206e6f74206c6973746564206f6e2063616c6c696e672065786360448201526468616e676560d81b6064820152608490fd5b611d49610192826005610cb0565b611d7b611d6060038301546001600160a01b031690565b339290611d7690611d7085610f5e565b14611ce1565b61260c565b6110866110807ff27bc8e4c954bf9eead2d99629d460313da75ee401666af4d3cb1eb821ddb1f69390565b6101b990611cb6565b906101b991611dc1611106600461109f565b6101b99190611dd7611b1d611b183360036101f5565b906000611de8610192846005610cb0565b611e08611dff60038301546001600160a01b031690565b611d7033610f5e565b611e118161260c565b01611e2d82611e2783546001600160a01b031690565b92611020565b611e50836117e0610192856006611e4b8561191f6101928a856101f5565b6101f5565b611c9c611c90611c907f3275c4afb1638bd20394301d401c788e5091157ddca135fd84970904da6541af9590565b906101b991611daf565b6101b990611e94610f3d565b611efb565b15611ea057565b60405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b9060ff90611016565b90611ef461019261103792151590565b8254611edb565b611f14611f0f611f0b600461109f565b1590565b611e99565b611f1f816001611020565b611f2b60016004611ee4565b611f557f9b7c520e9e227a011fa79baf4082565a9fd780e2bcb20889c0fe36eba4b5c8db916101ec565b90611f5f60405190565b600090a2565b6101b990611e88565b6101b990611f7a610f3d565b6101b990611f8b611106600461109f565b61202c565b15611f9757565b60405162461bcd60e51b81526020600482015260126024820152714475706c69636174652065786368616e676560701b6044820152606490fd5b916001600160a01b0360089290920291821b911b611016565b9190611ffb610192611037936101ec565b908354611fd1565b90815491600160401b83101561069f57826120269160016101b995018155610580565b90611fea565b61205a6003612049612044611f0b611b1886856101f5565b611f90565b612055836001926101f5565b611ee4565b612065816002612003565b611f557f3e535d1ab441ef41c268fd9b52b478aee02d693c5ca2a84b5d26b89e0922e5e1916101ec565b6101b990611f6e565b6101b9906120a4610f3d565b6101b9906120b5611106600461109f565b612106565b156120c157565b60405162461bcd60e51b815260206004820152601760248201527f45786368616e676520646f6573206e6f742065786973740000000000000000006044820152606490fd5b61212c600361212061211b611b1885846101f5565b6120ba565b612055836000926101f5565b6121378160026126e4565b611f557ff50d0d312d501878616eb5e78ebf3ed6dcd3955aaef8165af9c6b057cc4832fb916101ec565b6101b990612098565b6101b990612176610f3d565b6121b9565b1561218257565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b6121dc6121c5826101ec565b6121d5610f5e6101866000610ec6565b141561217b565b611f2b816001611020565b6101b99061216a565b6102ca61220892602092612202815190565b94859290565b93849101610273565b610192916121f0565b61224261222660405190565b8092612236602083019182612211565b9081038252038261067e565b61225461224d825190565b9160200190565b2090565b600061227161019292612269600090565b506005610cb0565b01546001600160a01b031690565b9061229a61228e6104a1845490565b92600052602060002090565b9060005b8181106122ab5750505090565b9091926122cf6122c86001926122c087610dac565b815260200190565b9460010190565b92910161229e565b906101929161227f565b906101b9610d9e926122f260405190565b938480926122d7565b610192906122e1565b906123116106f0836108ad565b918252565b61019260406106a4565b6123286114cb565b906000825260208080808086016060815201600081520160008152016000905250565b905250565b610192612320565b612360612316565b9060008252602080830161234b612350565b610192612358565b60005b82811061238957505050565b602090612394612372565b818401520161237d565b906101b96123b46123ae84612304565b936108ad565b601f19016020840161237a565b906101b961244660046123d26114cb565b946123f46123e782546001600160a01b031690565b6001600160a01b03168752565b61240a61240360018301610d84565b6020880152565b61241961181b60028301610dac565b61244061243060038301546001600160a01b031690565b6001600160a01b03166060880152565b01610dac565b6080840152565b610192906123c1565b61246d61247291612465606090565b5060066101f5565b6122fb565b9061248361247e835190565b61239e565b916000908361249183611405565b61249c610192845190565b81101561250057806124b86124b46124fb938661143c565b5190565b6124e0610b226124c9836005610cb0565b6124db6124d4612316565b948a860152565b61244d565b6124ea828961143c565b526124f5818861143c565b50611428565b612491565b5093505050565b61250f612372565b50610192610b22612521836005610cb0565b6124db61252c612316565b948552565b9061253d61247e835190565b916000908361254b83611405565b612556610192845190565b81101561250057806124b86124b461256e938661143c565b61254b565b9061258261228e6104a1845490565b9060005b8181106125935750505090565b9091926125c16122c86001926125b087546001600160a01b031690565b6001600160a01b0316815260200190565b929101612586565b9061019291612573565b906101b9610d9e926125e460405190565b938480926125c9565b610192906125d3565b61019260026125ed565b6101b991600091611fea565b600060046101b9926126218360038301612600565b016114e6565b9061263661228e6104a1845490565b9060005b8181106126475750505090565b9091926126646122c86001926125b087546001600160a01b031690565b92910161263a565b9061019291612627565b906101b9610d9e9261268760405190565b9384809261266c565b61019290612676565b9190820391821161143757565b634e487b7160e01b600052603160045260246000fd5b805480156126df5760001901906126dc6126d68383610580565b90612600565b55565b6126a6565b6126f9612700926126f483612690565b61279d565b9092901590565b156127425760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b6101b991612761612751835490565b61275b6001611405565b90612699565b90818103612771575b50506126bc565b6120266127846105e161278b9486610580565b9184610580565b388061276a565b610192600019611405565b919082519260006127ad81611405565b855b811015612804576127d06127c3828561143c565b516001600160a01b031690565b6127e26001600160a01b038616610f5e565b146127fa576127f36127af91611428565b90506127ad565b9450505050600190565b5093505050612811612792565b9190565b9061282461228e6104a1845490565b9060005b8181106128355750505090565b90919261284a6122c86001926122c087610dac565b929101612828565b9061019291612815565b906101b9610d9e9261286d60405190565b93848092612852565b6101929061285c565b6101b99160009161148b565b805480156126df5760001901906126dc6128a58383610580565b9061287f565b6126f96128c0926128bb83612876565b61293b565b156129025760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b6044820152606490fd5b6101b991612911612751835490565b90818103612921575b505061288b565b6114c561278461088b6129349486610580565b388061291a565b9190825192600061294b81611405565b855b811015612804576129616124b4828561143c565b84146127fa5761297361294d91611428565b905061294b56fea2646970667358221220a6032f571ac9fa51b48f09a32827ab67ff828148f9996dd432fe8f26a821634c64736f6c63430008120033", + "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806236d2d3146101815780630183196b1461017c57806311d4c3a2146101775780631a242547146101725780631e2e3a6b1461016d57806327d335a8146101685780632839fc29146101635780632b8a80021461015e578063392e53cd146101595780635e8441d3146101545780636e74da681461014f578063715018a61461014a5780637f200269146101455780638da5cb5b146101405780638e0be3691461013b5780639f4cb8f0146101365780639f6eb88c14610131578063a9c56e911461012c578063aa10ce2214610127578063b3533dfe14610122578063c4d66de81461011d578063c722f177146101185763f2fde38b036101a757610e91565b610e60565b610c98565b610c71565b610c34565b610c1c565b610951565b610891565b610817565b6107f2565b6107da565b610792565b61077a565b61074f565b61064d565b610628565b6105ea565b61054c565b610502565b610460565b61041a565b6103cc565b610242565b6001600160a01b031690565b90565b6001600160a01b0381165b036101a757565b600080fd5b905035906101b982610195565b565b906020828203126101a757610192916101ac565b61019290610186906001600160a01b031682565b610192906101cf565b610192906101e3565b906101ff906101ec565b600052602052604060002090565b610192916008021c5b60ff1690565b90610192915461020d565b610192906102396003916000926101f5565b61021c565b9052565b346101a75761026f61025d6102583660046101bb565b610227565b60405191829182901515815260200190565b0390f35b60005b8381106102865750506000910152565b8181015183820152602001610276565b6102b76102c06020936102ca936102ab815190565b80835293849260200190565b95869101610273565b601f01601f191690565b0190565b80516001600160a01b0316825290610192906080806102fc60a0840160208701518582036020870152610296565b9461030c60408201516040860152565b6060818101516001600160a01b0316908501520151910152565b80518252610192916040810191602001519060208184039101526102ce565b9061019291610326565b9061036561035b835190565b8083529160200190565b90816103776020830284019460200190565b926000915b83831061038b57505050505090565b909192939460206103ae6103a783856001950387528951610345565b9760200190565b930193019193929061037c565b60208082526101929291019061034f565b346101a75761026f6103e76103e23660046101bb565b612456565b604051918291826103bb565b806101a0565b905035906101b9826103f3565b906020828203126101a757610192916103f9565b346101a75761026f610435610430366004610406565b612258565b604051918291826001600160a01b03909116815260200190565b602080825261019292910190610326565b346101a75761026f61047b610476366004610406565b612507565b6040519182918261044f565b60009103126101a757565b906104b26104ab6104a1845190565b8084529260200190565b9260200190565b9060005b8181106104c35750505090565b9091926104e96104e260019286516001600160a01b0316815260200190565b9460200190565b9291016104b6565b602080825261019292910190610492565b346101a757610512366004610487565b61026f61051d6125f6565b604051918291826104f1565b91906040838203126101a7576101929061054381856103f9565b936020016103f9565b346101a75761056561055f366004610529565b90611cac565b604051005b634e487b7160e01b600052603260045260246000fd5b80548210156105a35761059a600191600052602060002090565b91020190600090565b61056a565b610192916008021c610186565b9061019291546105a8565b600260006105cc825490565b8310156105e75750610192916105e191610580565b906105b5565b80fd5b346101a75761026f610435610600366004610406565b6105c0565b91906040838203126101a7576101929061061f81856103f9565b936020016101ac565b346101a75761056561063b366004610605565b90611e7e565b6101926000600461021c565b346101a75761065d366004610487565b61026f61025d610641565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761069f57604052565b610668565b906101b96106b160405190565b928361067e565b6001600160401b03811161069f57602090601f01601f19160190565b90826000939282370152565b909291926106f56106f0826106b8565b6106a4565b938185526020850190828401116101a7576101b9926106d4565b9080601f830112156101a757816020610192933591016106e0565b906020828203126101a75781356001600160401b0381116101a757610192920161070f565b346101a75761026f61076a61076536600461072a565b61221a565b6040519182918290815260200190565b346101a75761056561078d366004610406565b611da6565b346101a7576107a2366004610487565b610565610ee1565b6001600160a01b0381166101a0565b905035906101b9826107aa565b906020828203126101a757610192916107b9565b346101a7576105656107ed3660046107c6565b6121e7565b346101a757610802366004610487565b61026f6104356000546001600160a01b031690565b346101a75761056561082a3660046101bb565b612161565b91906040838203126101a7576101929061054381856101ac565b610192916008021c81565b906101929154610849565b61086d6006916000926101f5565b90610876825490565b8310156105e757506101929161088b91610580565b90610854565b346101a75761026f61076a6108a736600461082f565b9061085f565b6001600160401b03811161069f5760208091020190565b909291926108d46106f0826108ad565b93818552602080860192028301928184116101a757915b8383106108f85750505050565b6020809161090684866103f9565b8152019201916108eb565b9080601f830112156101a757816020610192933591016108c4565b906020828203126101a75781356001600160401b0381116101a7576101929201610911565b346101a75761026f6103e761096736600461092c565b612531565b9190916060818403126101a75761098360606106a4565b9281356001600160401b0381116101a757816109a091840161070f565b845260208201356001600160401b0381116101a757816109c191840161070f565b602085015260408201356001600160401b0381116101a7576109e3920161070f565b6040830152565b63ffffffff81166101a0565b905035906101b9826109ea565b9190916080818403126101a757610a5c610a1d60806106a4565b936000610a2a82856103f9565b908601526020610a3c828286016101ac565b908601526040610a4e828286016109f6565b9086015260608093016109f6565b90830152565b929190610a716106f0826108ad565b93818552602080860192028101918383116101a75781905b838210610a97575050505050565b81356001600160401b0381116101a757602091610ab7878493870161070f565b815201910190610a89565b9080601f830112156101a75781602061019293359101610a62565b91909160a0818403126101a757610af460406106a4565b926000610b018284610a03565b9085015260808201356001600160401b0381116101a757610b229201610ac2565b6020830152565b9190916040818403126101a757610b4060406106a4565b9281356001600160401b0381116101a75781610b5d91840161096c565b845260208201356001600160401b0381116101a757610b229201610add565b929190610b8b6106f0826108ad565b93818552602080860192028101918383116101a75781905b838210610bb1575050505050565b81356001600160401b0381116101a757602091610bd18784938701610b29565b815201910190610ba3565b9080601f830112156101a75781602061019293359101610b7c565b906020828203126101a75781356001600160401b0381116101a7576101929201610bdc565b346101a757610565610c2f366004610bf7565b611a96565b346101a757610565610c473660046101bb565b61208f565b610192600060016105b5565b61023e906101ec565b6020810192916101b99190610c58565b346101a757610c81366004610487565b61026f610c8c610c4c565b60405191829182610c61565b346101a757610565610cab3660046107c6565b611f65565b906101ff565b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015610cec575b6020831014610ce757565b610cb6565b91607f1691610cdc565b80546000939291610d13610d0983610ccc565b8085529360200190565b9160018116908115610d655750600114610d2c57505050565b610d3f9192939450600052602060002090565b916000925b818410610d515750500190565b805484840152602090930192600101610d44565b92949550505060ff1916825215156020020190565b9061019291610cf6565b906101b9610d9e92610d9560405190565b93848092610d7a565b038361067e565b6101929081565b6101929054610da5565b610dc1906005610cb0565b80546001600160a01b031691610dd960018301610d84565b91610de660028201610dac565b916101926004610e0060038501546001600160a01b031690565b9301610dac565b906101b994610e4c610e44610e5c936080969a99979a610e3760a088019260008901906001600160a01b03169052565b8682036020880152610296565b986040850152565b6001600160a01b03166060830152565b0152565b346101a75761026f610e7b610e76366004610406565b610db6565b91610e8895939560405190565b95869586610e07565b346101a757610565610ea43660046101bb565b611002565b610eb1610f3d565b6101b9610ecf565b6101866101926101929290565b61019290610eb9565b6101b9610edc6000610ec6565b61103b565b6101b9610ea9565b15610ef057565b60405162461bcd60e51b815280610f39600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6101b9610f526000546001600160a01b031690565b610f6b610f5e33610186565b916001600160a01b031690565b14610ee9565b6101b990610f7d610f3d565b610fdd565b15610f8957565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6101b990610edc610ff16101866000610ec6565b6001600160a01b0383161415610f82565b6101b990610f71565b906001600160a01b03905b9181191691161790565b90611030610192611037926101ec565b825461100b565b9055565b6000546001600160a01b031690611053816000611020565b6110866110807f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936101ec565b916101ec565b9161109060405190565b600090a3565b61019290610216565b6101929054611096565b156110b057565b60405162461bcd60e51b815260206004820152601c60248201527f436f6e7472616374206d75737420626520696e697469616c697a6564000000006044820152606490fd5b6101b99061110b611106600461109f565b6110a9565b6116e2565b909291926111206106f0826106b8565b938185526020850190828401116101a7576101b992610273565b9080601f830112156101a757815161019292602001611110565b905051906101b9826103f3565b9190916040818403126101a75761117860406106a4565b815190936001600160401b0382116101a75761119981610a5c93850161113a565b85526020928301611154565b9291906111b46106f0826108ad565b93818552602080860192028101918383116101a75781905b8382106111da575050505050565b81516001600160401b0381116101a7576020916111fa8784938701611161565b8152019101906111cc565b9080601f830112156101a7578151610192926020016111a5565b906020828203126101a75781516001600160401b0381116101a7576101929201611205565b8051606080845261019293916040916112759161126391850190610296565b60208501518482036020860152610296565b920151906040818403910152610296565b805182526020808201516001600160a01b0316908301526101b99190606090819060408181015163ffffffff1690850152015163ffffffff16910152565b9061019291610296565b906112da61035b835190565b90816112ec6020830284019460200190565b926000915b83831061130057505050505090565b9091929394602061131c6103a7838560019503875289516112c4565b93019301919392906112f1565b61019291602060a082019261134660008201516000850190611286565b01519060808184039101526112ce565b8051604080845261019293916020916113729190840190611244565b920151906020818403910152611329565b9061019291611356565b9061139961035b835190565b90816113ab6020830284019460200190565b926000915b8383106113bf57505050505090565b909192939460206113db6103a783856001950387528951611383565b93019301919392906113b0565b60208082526101929291019061138d565b6040513d6000823e3d90fd5b6101926101926101929290565b634e487b7160e01b600052601160045260246000fd5b60001981146114375760010190565b611412565b90611445825190565b8110156105a3576020809102010190565b9060001990611016565b9061147061019261103792611405565b8254611456565b9160001960089290920291821b911b611016565b919061149a6101926110379390565b908354611477565b90815491600160401b83101561069f57826114c59160016101b995018155610580565b9061148b565b61019260a06106a4565b919061149a61019261103793611405565b6101b9916000916114d5565b8181106114fd575050565b8061150b60006001936114e6565b016114f2565b9190601f811161152057505050565b6115326101b993600052602060002090565b906020601f840181900483019310611554575b6020601f9091010401906114f2565b9091508190611545565b90611567815190565b906001600160401b03821161069f5761158a826115848554610ccc565b85611511565b602090601f83116001146115c5576110379291600091836115ba575b5050600019600883021c1916906002021790565b0151905038806115a6565b601f198316916115da85600052602060002090565b9260005b818110611618575091600293918560019694106115ff575b50505002019055565b01516000196008601f8516021c191690553880806115f6565b919360206001819287870151815501950192016115de565b906101b99161155e565b6101b9919061168e906080906004906116648161165e87516001600160a01b031690565b90611020565b61167c60018201611676602088015190565b90611630565b6116946002820161168e604088015190565b90611460565b6116af6003820161165e60608801516001600160a01b031690565b0192015190565b906101b99161163a565b929160206116dd6101b99360408701908782036000890152610296565b940152565b600061172c916117026116fd6001546001600160a01b031690565b6101ec565b61172183637de24fcf61171460405190565b9687958694859360e01b90565b8352600483016113e8565b03925af1908115611a5057600091611a75575b5061174a6000611405565b611755610192835190565b811015611a7157611766818361143c565b5190611775600083015161221a565b916005926117866101928286610cb0565b9361179885546001600160a01b031690565b946117a36000610ec6565b956117b66001600160a01b038816610f5e565b036118b657506118b19461184b83611850936118326006946117e5846117e061019233809a6101f5565b6114a2565b88516118229061181b6117f960208d015190565b916118146118056114cb565b6001600160a01b03909b168b52565b60208a0152565b6040880152565b6001600160a01b03166060860152565b61184661183f6000611405565b6080860152565b610cb0565b6116b6565b33906118626020600085015194015190565b61189361188d7f04c47544b62d97fc6d744e7cc21ed4a24af06a46427efcfd15a0db261dbb27d69390565b936101ec565b936118a96118a060405190565b928392836116c0565b0390a3611428565b61174a565b90506118c981546001600160a01b031690565b6118d233610f5e565b14611a55575b80546001600160a01b03166118ec33610f5e565b036118fd575b506118b19350611850565b6119248261191f61019261191885546001600160a01b031690565b60066101f5565b6128ab565b60038101546001600160a01b03166119446001600160a01b038716610f5e565b036119aa575b6119a4906119916118b196611967856117e06101923360066101f5565b6119713384611020565b61198861197f602088015190565b60028501611460565b60038301611020565b600461199d6000611405565b9101611460565b386118f2565b6119c46116fd6116fd60038401546001600160a01b031690565b90631756c30e6119d660048301610dac565b833b156101a757611a0c936119fe600080946119f160405190565b9788958694859360e01b90565b835260048301526024820190565b03925af18015611a50576118b1966119a49361199192611a32575b50965050905061194a565b611a4a906000611a42818361067e565b810190610487565b38611a27565b6113f9565b611a6c611a63602085015190565b60028301611460565b6118d8565b5050565b611a90913d8091833e611a88818361067e565b81019061121f565b3861173f565b6101b9906110f5565b906101b991611ab1611106600461109f565b611b02565b15611abd57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206d7573742062652065786368616e67650000000000000000006044820152606490fd5b6101b99190611b22611b1d611b183360036101f5565b61109f565b611ab6565b611bd1565b15611b2e57565b60405162461bcd60e51b815260206004820152601760248201527f446f6d61696e206d7573742062652076657269666965640000000000000000006044820152606490fd5b15611b7a57565b60405162461bcd60e51b815260206004820152602960248201527f446f6d61696e20616c7265616479206c6973746564206f6e20616e6f746865726044820152682065786368616e676560b81b6064820152608490fd5b90611be0610192836005610cb0565b611c62826004611bf784546001600160a01b031690565b93611c1f611c056000610ec6565b95611c186001600160a01b038816610f5e565b1415611b27565b611c516003820195611c4b610f5e611c3e89546001600160a01b031690565b926001600160a01b031690565b14611b73565b611c5c338096611020565b01611460565b611c9c611c96611c907f94ec80928933a86cc2847706c09c43fa58866b537c8fce8eef172af4036af5209590565b926101ec565b92611405565b92611ca660405190565b600090a4565b906101b991611a9f565b6101b990611cc7611106600461109f565b6101b990611cdc611b1d611b183360036101f5565b611d3b565b15611ce857565b60405162461bcd60e51b815260206004820152602560248201527f446f6d61696e206e6f74206c6973746564206f6e2063616c6c696e672065786360448201526468616e676560d81b6064820152608490fd5b611d49610192826005610cb0565b611d7b611d6060038301546001600160a01b031690565b339290611d7690611d7085610f5e565b14611ce1565b61260c565b6110866110807ff27bc8e4c954bf9eead2d99629d460313da75ee401666af4d3cb1eb821ddb1f69390565b6101b990611cb6565b906101b991611dc1611106600461109f565b6101b99190611dd7611b1d611b183360036101f5565b906000611de8610192846005610cb0565b611e08611dff60038301546001600160a01b031690565b611d7033610f5e565b611e118161260c565b01611e2d82611e2783546001600160a01b031690565b92611020565b611e50836117e0610192856006611e4b8561191f6101928a856101f5565b6101f5565b611c9c611c90611c907f3275c4afb1638bd20394301d401c788e5091157ddca135fd84970904da6541af9590565b906101b991611daf565b6101b990611e94610f3d565b611efb565b15611ea057565b60405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b9060ff90611016565b90611ef461019261103792151590565b8254611edb565b611f14611f0f611f0b600461109f565b1590565b611e99565b611f1f816001611020565b611f2b60016004611ee4565b611f557f9b7c520e9e227a011fa79baf4082565a9fd780e2bcb20889c0fe36eba4b5c8db916101ec565b90611f5f60405190565b600090a2565b6101b990611e88565b6101b990611f7a610f3d565b6101b990611f8b611106600461109f565b61202c565b15611f9757565b60405162461bcd60e51b81526020600482015260126024820152714475706c69636174652065786368616e676560701b6044820152606490fd5b916001600160a01b0360089290920291821b911b611016565b9190611ffb610192611037936101ec565b908354611fd1565b90815491600160401b83101561069f57826120269160016101b995018155610580565b90611fea565b61205a6003612049612044611f0b611b1886856101f5565b611f90565b612055836001926101f5565b611ee4565b612065816002612003565b611f557f3e535d1ab441ef41c268fd9b52b478aee02d693c5ca2a84b5d26b89e0922e5e1916101ec565b6101b990611f6e565b6101b9906120a4610f3d565b6101b9906120b5611106600461109f565b612106565b156120c157565b60405162461bcd60e51b815260206004820152601760248201527f45786368616e676520646f6573206e6f742065786973740000000000000000006044820152606490fd5b61212c600361212061211b611b1885846101f5565b6120ba565b612055836000926101f5565b6121378160026126e4565b611f557ff50d0d312d501878616eb5e78ebf3ed6dcd3955aaef8165af9c6b057cc4832fb916101ec565b6101b990612098565b6101b990612176610f3d565b6121b9565b1561218257565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b6121dc6121c5826101ec565b6121d5610f5e6101866000610ec6565b141561217b565b611f2b816001611020565b6101b99061216a565b6102ca61220892602092612202815190565b94859290565b93849101610273565b610192916121f0565b61224261222660405190565b8092612236602083019182612211565b9081038252038261067e565b61225461224d825190565b9160200190565b2090565b600061227161019292612269600090565b506005610cb0565b01546001600160a01b031690565b9061229a61228e6104a1845490565b92600052602060002090565b9060005b8181106122ab5750505090565b9091926122cf6122c86001926122c087610dac565b815260200190565b9460010190565b92910161229e565b906101929161227f565b906101b9610d9e926122f260405190565b938480926122d7565b610192906122e1565b906123116106f0836108ad565b918252565b61019260406106a4565b6123286114cb565b906000825260208080808086016060815201600081520160008152016000905250565b905250565b610192612320565b612360612316565b9060008252602080830161234b612350565b610192612358565b60005b82811061238957505050565b602090612394612372565b818401520161237d565b906101b96123b46123ae84612304565b936108ad565b601f19016020840161237a565b906101b961244660046123d26114cb565b946123f46123e782546001600160a01b031690565b6001600160a01b03168752565b61240a61240360018301610d84565b6020880152565b61241961181b60028301610dac565b61244061243060038301546001600160a01b031690565b6001600160a01b03166060880152565b01610dac565b6080840152565b610192906123c1565b61246d61247291612465606090565b5060066101f5565b6122fb565b9061248361247e835190565b61239e565b916000908361249183611405565b61249c610192845190565b81101561250057806124b86124b46124fb938661143c565b5190565b6124e0610b226124c9836005610cb0565b6124db6124d4612316565b948a860152565b61244d565b6124ea828961143c565b526124f5818861143c565b50611428565b612491565b5093505050565b61250f612372565b50610192610b22612521836005610cb0565b6124db61252c612316565b948552565b9061253d61247e835190565b916000908361254b83611405565b612556610192845190565b81101561250057806124b86124b461256e938661143c565b61254b565b9061258261228e6104a1845490565b9060005b8181106125935750505090565b9091926125c16122c86001926125b087546001600160a01b031690565b6001600160a01b0316815260200190565b929101612586565b9061019291612573565b906101b9610d9e926125e460405190565b938480926125c9565b610192906125d3565b61019260026125ed565b6101b991600091611fea565b600060046101b9926126218360038301612600565b016114e6565b9061263661228e6104a1845490565b9060005b8181106126475750505090565b9091926126646122c86001926125b087546001600160a01b031690565b92910161263a565b9061019291612627565b906101b9610d9e9261268760405190565b9384809261266c565b61019290612676565b9190820391821161143757565b634e487b7160e01b600052603160045260246000fd5b805480156126df5760001901906126dc6126d68383610580565b90612600565b55565b6126a6565b6126f9612700926126f483612690565b61279d565b9092901590565b156127425760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b6101b991612761612751835490565b61275b6001611405565b90612699565b90818103612771575b50506126bc565b6120266127846105e161278b9486610580565b9184610580565b388061276a565b610192600019611405565b919082519260006127ad81611405565b855b811015612804576127d06127c3828561143c565b516001600160a01b031690565b6127e26001600160a01b038616610f5e565b146127fa576127f36127af91611428565b90506127ad565b9450505050600190565b5093505050612811612792565b9190565b9061282461228e6104a1845490565b9060005b8181106128355750505090565b90919261284a6122c86001926122c087610dac565b929101612828565b9061019291612815565b906101b9610d9e9261286d60405190565b93848092612852565b6101929061285c565b6101b99160009161148b565b805480156126df5760001901906126dc6128a58383610580565b9061287f565b6126f96128c0926128bb83612876565b61293b565b156129025760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b6044820152606490fd5b6101b991612911612751835490565b90818103612921575b505061288b565b6114c561278461088b6129349486610580565b388061291a565b9190825192600061294b81611405565b855b811015612804576129616124b4828561143c565b84146127fa5761297361294d91611428565b905061294b56fea2646970667358221220a6032f571ac9fa51b48f09a32827ab67ff828148f9996dd432fe8f26a821634c64736f6c63430008120033", + "devdoc": { + "kind": "dev", + "methods": { + "addExchange(address)": { + "params": { + "_exchange": "Address of the exchange contract" + } + }, + "initialize(address)": { + "params": { + "_verifyDomainProcessor": "Address of the VerifyDomainProcessor contract" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "removeDomainListing(bytes32)": { + "params": { + "_domainId": "Domain ID to update listing status for" + } + }, + "removeExchange(address)": { + "params": { + "_exchange": "Address of the exchange contract" + } + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "setDomainListing(bytes32,uint256)": { + "params": { + "_domainId": "Domain to set listed status for", + "_listingId": "Listing Id of domain on calling exchange" + } + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "updateDomainOnSale(bytes32,address)": { + "params": { + "_domainId": "Domain ID to update listing status for", + "_newOwner": "New owner of the domain" + } + }, + "updateVerifyDomainProcessor(address)": { + "params": { + "_verifyDomainProcessor": "Address of the new VerifyDomainProcessor contract" + } + }, + "verifyDomains(((string,string,string),((bytes32,address,uint32,uint32),bytes[]))[])": { + "params": { + "_proofs": "Array of domain ownership TLS proofs" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "addExchange(address)": { + "notice": "ONLY OWNER: Add an exchange to the registry. This can only be called after the contract has been initialized. Exchange must not already exist in the registry. " + }, + "initialize(address)": { + "notice": "ONLY OWNER: Initialize the contract with the VerifyDomainProcessor and exchange contracts. This can only be called once." + }, + "removeDomainListing(bytes32)": { + "notice": "ONLY EXCHANGE: Remove a listing status from domain. We check that the calling exchange is the one that the domain is listed on. This removes the exchange and listingId from the domain. " + }, + "removeExchange(address)": { + "notice": "ONLY OWNER: Remove an exchange from the registry. Exchange must exist in the registry. " + }, + "setDomainListing(bytes32,uint256)": { + "notice": "ONLY EXCHANGE: Add a listing status to domain. We check that the domain has been verified and is listed on the calling exchange. This sets the exchange and listingId of the domain. " + }, + "updateDomainOnSale(bytes32,address)": { + "notice": "ONLY EXCHANGE: Update domain on sale. We check that the calling exchange is the one that the domain is listed on. This updates the ownership of the domain to the new owner as well as removes the listing status from the domain. " + }, + "updateVerifyDomainProcessor(address)": { + "notice": "ONLY OWNER: Update the verify domain processor" + }, + "verifyDomains(((string,string,string),((bytes32,address,uint32,uint32),bytes[]))[])": { + "notice": "Verify domains and add them to the registry. If domain is transferred off-chain to another party then they can re-verify the domain and claim ownership of the domain and previous ownership is removed. The existing owner can re-verify the domain, say after the domain has expired to update the expiry time on the domain. Function reverts if: - Domain ownership TLS proofs are invalid " + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 7156, + "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", + "label": "verifyDomainProcessor", + "offset": 0, + "slot": "1", + "type": "t_contract(IVerifyDomainProcessor)11894" + }, + { + "astId": 7159, + "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", + "label": "exchanges", + "offset": 0, + "slot": "2", + "type": "t_array(t_address)dyn_storage" + }, + { + "astId": 7163, + "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", + "label": "isExchange", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 7165, + "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", + "label": "isInitialized", + "offset": 0, + "slot": "4", + "type": "t_bool" + }, + { + "astId": 7170, + "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", + "label": "domains", + "offset": 0, + "slot": "5", + "type": "t_mapping(t_bytes32,t_struct(Domain)11806_storage)" + }, + { + "astId": 7175, + "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", + "label": "userDomains", + "offset": 0, + "slot": "6", + "type": "t_mapping(t_address,t_array(t_bytes32)dyn_storage)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "base": "t_address", + "encoding": "dynamic_array", + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_bytes32)dyn_storage": { + "base": "t_bytes32", + "encoding": "dynamic_array", + "label": "bytes32[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_contract(IVerifyDomainProcessor)11894": { + "encoding": "inplace", + "label": "contract IVerifyDomainProcessor", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_array(t_bytes32)dyn_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bytes32[])", + "numberOfBytes": "32", + "value": "t_array(t_bytes32)dyn_storage" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_bytes32,t_struct(Domain)11806_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct IVerifiedDomainRegistry.Domain)", + "numberOfBytes": "32", + "value": "t_struct(Domain)11806_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(Domain)11806_storage": { + "encoding": "inplace", + "label": "struct IVerifiedDomainRegistry.Domain", + "members": [ + { + "astId": 11797, + "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", + "label": "owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 11799, + "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", + "label": "name", + "offset": 0, + "slot": "1", + "type": "t_string_storage" + }, + { + "astId": 11801, + "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", + "label": "expiryTime", + "offset": 0, + "slot": "2", + "type": "t_uint256" + }, + { + "astId": 11803, + "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", + "label": "exchange", + "offset": 0, + "slot": "3", + "type": "t_address" + }, + { + "astId": 11805, + "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", + "label": "listingId", + "offset": 0, + "slot": "4", + "type": "t_uint256" + } + ], + "numberOfBytes": "160" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/contracts-domain/deployments/base/VerifyDomainProcessor.json b/contracts-domain/deployments/base/VerifyDomainProcessor.json new file mode 100644 index 000000000..1f3619b07 --- /dev/null +++ b/contracts-domain/deployments/base/VerifyDomainProcessor.json @@ -0,0 +1,1995 @@ +{ + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_registry", + "type": "address" + }, + { + "internalType": "contract INullifierRegistry", + "name": "_nullifierRegistry", + "type": "address" + }, + { + "internalType": "string[]", + "name": "_providerHashes", + "type": "string[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "providerHash", + "type": "string" + } + ], + "name": "ProviderHashAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "providerHash", + "type": "string" + } + ], + "name": "ProviderHashRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "witness", + "type": "address" + } + ], + "name": "WitnessAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "witness", + "type": "address" + } + ], + "name": "WitnessRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_newProviderHash", + "type": "string" + } + ], + "name": "addProviderHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newWitness", + "type": "address" + } + ], + "name": "addWitness", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getProviderHashes", + "outputs": [ + { + "internalType": "string[]", + "name": "", + "type": "string[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWitnesses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "isProviderHash", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isWitness", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nullifierRegistry", + "outputs": [ + { + "internalType": "contract INullifierRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "providerHashes", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "registry", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_removeProviderHash", + "type": "string" + } + ], + "name": "removeProviderHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_removeWitness", + "type": "address" + } + ], + "name": "removeWitness", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "string", + "name": "provider", + "type": "string" + }, + { + "internalType": "string", + "name": "parameters", + "type": "string" + }, + { + "internalType": "string", + "name": "context", + "type": "string" + } + ], + "internalType": "struct Claims.ClaimInfo", + "name": "claimInfo", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "identifier", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint32", + "name": "timestampS", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "epoch", + "type": "uint32" + } + ], + "internalType": "struct Claims.CompleteClaimData", + "name": "claim", + "type": "tuple" + }, + { + "internalType": "bytes[]", + "name": "signatures", + "type": "bytes[]" + } + ], + "internalType": "struct Claims.SignedClaim", + "name": "signedClaim", + "type": "tuple" + } + ], + "internalType": "struct IProxyBaseProcessor.Proof", + "name": "proof", + "type": "tuple" + } + ], + "name": "verifyProofSignatures", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "string", + "name": "provider", + "type": "string" + }, + { + "internalType": "string", + "name": "parameters", + "type": "string" + }, + { + "internalType": "string", + "name": "context", + "type": "string" + } + ], + "internalType": "struct Claims.ClaimInfo", + "name": "claimInfo", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "identifier", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint32", + "name": "timestampS", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "epoch", + "type": "uint32" + } + ], + "internalType": "struct Claims.CompleteClaimData", + "name": "claim", + "type": "tuple" + }, + { + "internalType": "bytes[]", + "name": "signatures", + "type": "bytes[]" + } + ], + "internalType": "struct Claims.SignedClaim", + "name": "signedClaim", + "type": "tuple" + } + ], + "internalType": "struct IProxyBaseProcessor.Proof[]", + "name": "_proofs", + "type": "tuple[]" + } + ], + "name": "verifyProofs", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + } + ], + "internalType": "struct IVerifyDomainProcessor.DomainRaw[]", + "name": "domains", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "witnesses", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "receipt": { + "to": null, + "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", + "contractAddress": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "transactionIndex": 60, + "gasUsed": "15020436", + "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000020000000000000000000000000000000010000000000040000000000000000000000000000000000002000000001000000000000000000000000000000000000020000010000000000000800000000000000010000000000000000400000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab", + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "logs": [ + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" + ], + "data": "0x", + "logIndex": 240, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307866643436323230333962653365343238366464333238356433366437373261373164353830613961666130613137313861376536343335333963393532636639000000000000000000000000000000000000000000000000000000000000", + "logIndex": 241, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839306136343839656666333831343036383961313531333366623538393036613765383437636331383237316166303336393336633865646139316464636338000000000000000000000000000000000000000000000000000000000000", + "logIndex": 242, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307831346432366430326233616539663236663965363261346438643736656266666630636434613464343632396330386339303961663939656330656234316437000000000000000000000000000000000000000000000000000000000000", + "logIndex": 243, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836343535386234333633633466386434653763316565316137356534643832663866613736363430653137346230366434656433346533623436656263316137000000000000000000000000000000000000000000000000000000000000", + "logIndex": 244, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865346163393363663332613538353839376233303065656330643232666464616564373031363539343866376161666431633434333634383035383133303537000000000000000000000000000000000000000000000000000000000000", + "logIndex": 245, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834613236366664363366353530646236623739313732333235663333343139646636643564383762663932346231373564386231383137663031306132316366000000000000000000000000000000000000000000000000000000000000", + "logIndex": 246, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864633065363637323466636633386538353139633761623333616239653661303437633735386462333532303462316430383635303066653530333333663731000000000000000000000000000000000000000000000000000000000000", + "logIndex": 247, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835313561383265333332366239383563613037336435386133626139323930653834666638643032316430373265376234323066643036313662633630396537000000000000000000000000000000000000000000000000000000000000", + "logIndex": 248, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307862343161353133666464336532623761366238653063303266386137313461613361636131303163643332333635646536636261633930666165333038653036000000000000000000000000000000000000000000000000000000000000", + "logIndex": 249, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307831666463343733386233323364346333386266363537613333663734663935363138626331313933336663633463653665396633663763393366356134393265000000000000000000000000000000000000000000000000000000000000", + "logIndex": 250, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835663135323331653537613266613836663565316562316332616264626435343835313039616461363562623633626564383763373234323564636138323835000000000000000000000000000000000000000000000000000000000000", + "logIndex": 251, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835343539656262656136343664316134613063393339343465363836303063396533353539313861393062333664333532613132393162613535376535353663000000000000000000000000000000000000000000000000000000000000", + "logIndex": 252, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307866663636633765633166376338316663383333626166623935323263633135626534656635363436323236376338393837393531303530316331626337376664000000000000000000000000000000000000000000000000000000000000", + "logIndex": 253, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835666161353135303039636137393238303562646630336439353164373533616232343163333231303636653366306362633065653866346330396563623332000000000000000000000000000000000000000000000000000000000000", + "logIndex": 254, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838303438313862323836653663323034623366313832383262316637613061343062316235353562633339646366323536333432653062346463336632393932000000000000000000000000000000000000000000000000000000000000", + "logIndex": 255, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835666631363933333461383162386239386261396537626562316566326533383630663739663134386366303735323635323465383239656366366436653564000000000000000000000000000000000000000000000000000000000000", + "logIndex": 256, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833383938393332396535636564353835396536353039646133396631316636333434633130353232633031393363306362353733653738336539373466626430000000000000000000000000000000000000000000000000000000000000", + "logIndex": 257, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307861633434316436643165393936326562306162636263383139323331653438363134373836633137393530376664306661616563346361643062356431653062000000000000000000000000000000000000000000000000000000000000", + "logIndex": 258, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865363265363332396162656664656532346663656366333763613535623131326661396430616261636232633939636437663863306461366337626134366138000000000000000000000000000000000000000000000000000000000000", + "logIndex": 259, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830393962363732366465313338323336666137643339313766313763616566343265626431396661393364653936623162316661666663373133323635643330000000000000000000000000000000000000000000000000000000000000", + "logIndex": 260, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864653165333763626232383737306131623165643730643461363833376530656537323739323630363965653866613136333366303365346465326333356364000000000000000000000000000000000000000000000000000000000000", + "logIndex": 261, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836633065306232333432346437356336313931323039343837613237626463623965653966373438656330356638373262346166643536616636366333366335000000000000000000000000000000000000000000000000000000000000", + "logIndex": 262, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839663736613234346237333164373235376434636338343666336461393837613632303338363261333261626535643337393738356462656364323335643161000000000000000000000000000000000000000000000000000000000000", + "logIndex": 263, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865663633656237643064613538303830373761663661386539633136303431366361363664623136373739656633306534393439643331656464373062663039000000000000000000000000000000000000000000000000000000000000", + "logIndex": 264, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307832623564623037663538386264323764333739353238316336343066643566666536646531313134353033613237653531306134616134626439643030346434000000000000000000000000000000000000000000000000000000000000", + "logIndex": 265, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837313839393430303730623035613731326663363330353365396337373138373730633536326364376466303834653530613934313636396636383030393061000000000000000000000000000000000000000000000000000000000000", + "logIndex": 266, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307831363537666161633934646435356530363333363264646662366639356335613664323165373966663735386336613864363037393531306230303462653332000000000000000000000000000000000000000000000000000000000000", + "logIndex": 267, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836306131386639623861663430356463623930623531653637313966633134623763373932376135393631343434636439376562386563666663376563626439000000000000000000000000000000000000000000000000000000000000", + "logIndex": 268, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830343066626536386539316134353735616439316437646362393030373766636663313736323765663261313239336635396431373732393539636361656437000000000000000000000000000000000000000000000000000000000000", + "logIndex": 269, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865326631396633633931643961353930636661663235663436353531623461303233396162343532656635663633386162313732636366626430613063363137000000000000000000000000000000000000000000000000000000000000", + "logIndex": 270, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837306138633062353630623436353563336137633638633062623736636639666334323438346133626237336335666564303261356662343239373936356236000000000000000000000000000000000000000000000000000000000000", + "logIndex": 271, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835366338313264636364383436323032393261313861383239313538626132306665663439653532656661353739346335386437643237383031343866633233000000000000000000000000000000000000000000000000000000000000", + "logIndex": 272, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837326162373032333736383634646261316562373631613639333761623164396664303265363037303433643764363433346262336633343262323230613733000000000000000000000000000000000000000000000000000000000000", + "logIndex": 273, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864373865353566303964653963313836393036343133353830376331353134623262376639303562323039636335373065636435326530346230333635386561000000000000000000000000000000000000000000000000000000000000", + "logIndex": 274, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837353263313535376134656461613734663963366464376331363665643931656663653134656439303634373136343133373366326137623032383463316464000000000000000000000000000000000000000000000000000000000000", + "logIndex": 275, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830613664393963386535306238363535366162376362383466353133653130303432316662663330626665633637636464313863653732303235353331393933000000000000000000000000000000000000000000000000000000000000", + "logIndex": 276, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836383133626466356532346536623564626137626634336461383933623839326237373265646536326664343464643262363461333131373333376262663166000000000000000000000000000000000000000000000000000000000000", + "logIndex": 277, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833646534326637353832333662666237393464663139396439653834353833373964333731326432656336383865326535666633633364663566393538666131000000000000000000000000000000000000000000000000000000000000", + "logIndex": 278, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307863336464313363656166326639646531323563623233366133646263663739633063316637353861623631383763656461363834653338343535646636316433000000000000000000000000000000000000000000000000000000000000", + "logIndex": 279, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864393333356236396430613939313235353765316139656465313235313038393331626361623661656536383734663235666633386264376634653135623533000000000000000000000000000000000000000000000000000000000000", + "logIndex": 280, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307832386634643661313032613432356633323361623039623364663739323435636331303761663132373530333539613361626666363834656461386363616234000000000000000000000000000000000000000000000000000000000000", + "logIndex": 281, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839366533313166366463373838303933386138333264383137643963376266353336326462316331316231616135633734373730323965633161363766646462000000000000000000000000000000000000000000000000000000000000", + "logIndex": 282, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836303830343636663738326437396366356533363964376464623964666164306131386433333035663931373566356464613966303138333739646661303962000000000000000000000000000000000000000000000000000000000000", + "logIndex": 283, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830326530306532323831343432376532353464386633383634653363326663376434646638663561383830613032616364343533653765643236366433346633000000000000000000000000000000000000000000000000000000000000", + "logIndex": 284, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837323237643039306465353233306239346262313237366233663766383836333763356638316361373836313164643638386162616164386634343466393934000000000000000000000000000000000000000000000000000000000000", + "logIndex": 285, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833356539383462353539383263356666303532613535366634323232643638633834313862333066656632613439326135346664633239333264333764393232000000000000000000000000000000000000000000000000000000000000", + "logIndex": 286, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837313338653064646261626330613630616364343562656162326465336233353862353364653734663432333266333964653130376536333835393438353734000000000000000000000000000000000000000000000000000000000000", + "logIndex": 287, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838653564363532323035343333373561373837383731626637356664393761633565393261623139653465333936366638636431306536323661326136306137000000000000000000000000000000000000000000000000000000000000", + "logIndex": 288, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839333336386338316131623561653762646461356636643434333861343638643032313437336262383766323439376661393138323931396461346230633934000000000000000000000000000000000000000000000000000000000000", + "logIndex": 289, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834343237313533343837353339616537333065663865666561383038633037626232303438373432353466316332313232633130303631663435623966336336000000000000000000000000000000000000000000000000000000000000", + "logIndex": 290, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834333563313132303261633631383562323162386462346662363131323339663838623135613966616264353932383831646364633865316435363939623166000000000000000000000000000000000000000000000000000000000000", + "logIndex": 291, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307862643839303664306265666436656530303264646535363137383433393135393264383737303064356530353666656235356564656566333739623038313865000000000000000000000000000000000000000000000000000000000000", + "logIndex": 292, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838623265386330333365363535326663383430393739353937353864323832666566656639316231666231346166343033303030306239623963306534303032000000000000000000000000000000000000000000000000000000000000", + "logIndex": 293, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307862306263653434636639373735333937613531363538363662613330626433653038643830333336316530376463643133383336623065366261633930313135000000000000000000000000000000000000000000000000000000000000", + "logIndex": 294, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834643439386665386135633034316135623764623736313933653764386238393266303637316535316365393634323863656231303666663331363961376334000000000000000000000000000000000000000000000000000000000000", + "logIndex": 295, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833313564383433666231373131363230393163306234386263646639653762366364353031653565376239353933393030383330376531353238666534376239000000000000000000000000000000000000000000000000000000000000", + "logIndex": 296, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864376466666532633632663535303536346562333963333662636630643663356534326138316234363535383864323133306630656138303639613730333265000000000000000000000000000000000000000000000000000000000000", + "logIndex": 297, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865393262303463363864353833323938663363346237626363323935306531656238376331663037633364316562623838326635386231633835393536396434000000000000000000000000000000000000000000000000000000000000", + "logIndex": 298, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838643366306165313535363063363236303230303362336165336163333135323235636533656663356238663130393566383739383734633537333134626261000000000000000000000000000000000000000000000000000000000000", + "logIndex": 299, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835383638343263353434623236353532356132376632663639623234653865613865303464343439663564613362383338326637376239616266666136653230000000000000000000000000000000000000000000000000000000000000", + "logIndex": 300, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830396138623230623364653233623866363631653338386536353431616134653138623339656466376532663039323665346233373633633832666565316532000000000000000000000000000000000000000000000000000000000000", + "logIndex": 301, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307862373930353632383564376436323731386439623166313930383763663234366636666134626435346235396665666236653533363734656230333638313966000000000000000000000000000000000000000000000000000000000000", + "logIndex": 302, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839313062636330386565636134356631313539336665376233616138303832313361313434646463633935326264343634383065626338323731303064656632000000000000000000000000000000000000000000000000000000000000", + "logIndex": 303, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307862323336353536616164396539323363343535306665653862626138316334316337353336383533333534656264363764663264663339643038303564626331000000000000000000000000000000000000000000000000000000000000", + "logIndex": 304, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834663437333835353334643834343336356439656331363432333133373133646637623530323030643139333466663835303066303231613465353066306531000000000000000000000000000000000000000000000000000000000000", + "logIndex": 305, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307863323334653761616137306633353338316363653465643631656235666464656262383661316362303064656434336461366266363065316461373566666535000000000000000000000000000000000000000000000000000000000000", + "logIndex": 306, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307832636334633339623732373466383430373139633037613635663630303461343361323835343530353266623739363131353638623934663866323836323436000000000000000000000000000000000000000000000000000000000000", + "logIndex": 307, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830646465343061356238613634353961393033613639633338306538646431663565323230343833346462373235376439313964303563663566623562363065000000000000000000000000000000000000000000000000000000000000", + "logIndex": 308, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830393437373132623835333464316339346463393962656234343731623566663861383239313436616338303561383438393935313662613763326239323162000000000000000000000000000000000000000000000000000000000000", + "logIndex": 309, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838396561636431663063646462383862376565663565323966623465633032656332633138303931653033326130633637383138336635323565393632653162000000000000000000000000000000000000000000000000000000000000", + "logIndex": 310, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833633935646532623935396566313034663532333765376337643832376338346237363039653163363533643535386438376330643235393139343830633262000000000000000000000000000000000000000000000000000000000000", + "logIndex": 311, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838343239336165343230633236396433633663313534356139323564653831313061323638326430353538306330323930386562353939643933653838393333000000000000000000000000000000000000000000000000000000000000", + "logIndex": 312, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835313761656530623465623536383365613265653665656137316162313138356130643966636266646633323633356662376533613030623433656436313035000000000000000000000000000000000000000000000000000000000000", + "logIndex": 313, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837646165653239343961633835643266336463626134633264343561343834316334666635336336663932383066303136323765393731323066646665396461000000000000000000000000000000000000000000000000000000000000", + "logIndex": 314, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865653933306431383732623332376466333836306563643733323330663934376536663538306163366430646164633638326137346463386134393832646339000000000000000000000000000000000000000000000000000000000000", + "logIndex": 315, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833303264643966623138643765623432616536666233333838356664323964313966363939346666666364636239616566326437636437333661643632343937000000000000000000000000000000000000000000000000000000000000", + "logIndex": 316, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307863613662353732636331343639323935336261633261633361313232626238323564656532313764326663303661333662343563613235393839663730303139000000000000000000000000000000000000000000000000000000000000", + "logIndex": 317, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307831316463376138623231336262353836353764383464613064356133636466663837336464653138626531396232623634346366306233653131356236366431000000000000000000000000000000000000000000000000000000000000", + "logIndex": 318, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838353030643233373239343732663063333232363432373930383162656536356536333263393333636463386638636635356537363333373566323035666462000000000000000000000000000000000000000000000000000000000000", + "logIndex": 319, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830316264323736666133343535383361666536393030646430616463613031316632343033363938373733623838353935396239613032396630356233633537000000000000000000000000000000000000000000000000000000000000", + "logIndex": 320, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307832643861376637353466393036316535393365306363306332383337636363633338356235663862373863303232396330626462393839366438386234343333000000000000000000000000000000000000000000000000000000000000", + "logIndex": 321, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837616261623931313531323366396535373431616561333865613036376337346466613862363039326338353332646263633839383966376138643833613932000000000000000000000000000000000000000000000000000000000000", + "logIndex": 322, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834373262323532373933323536393563383138363066653064363461633862373034326431633834656138653835396339376534616362613964353836393235000000000000000000000000000000000000000000000000000000000000", + "logIndex": 323, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836303666366135643831346136666530653139653039326231356164613333343438653862346165376465393731393364333966623838623565323261326263000000000000000000000000000000000000000000000000000000000000", + "logIndex": 324, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830323636323063323736353737313534326632626265343364646531626263643139363164376361343261656538373862373030336264353866626364666135000000000000000000000000000000000000000000000000000000000000", + "logIndex": 325, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307861376235653462633438663430636332653665373133366564353333356231653731346233313038626661336533386261313133333732363062636334613131000000000000000000000000000000000000000000000000000000000000", + "logIndex": 326, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838343530616230336262363864636566386130326465303739656134333038353964386665366236373664323736366432643065396235316566393864656233000000000000000000000000000000000000000000000000000000000000", + "logIndex": 327, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307866346361646164326265326162393039613637663634653630393263616138303735386236633730356336393439393366653735316336306134333965313934000000000000000000000000000000000000000000000000000000000000", + "logIndex": 328, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838353366646635396233653064396438666139643035393038646633643231306434653061636538393632336438633064323633646634653263323864323965000000000000000000000000000000000000000000000000000000000000", + "logIndex": 329, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307863663837396337656439336665643366666533323839366132663066343762303462303631613335353362316132393133373838356532633263653839313337000000000000000000000000000000000000000000000000000000000000", + "logIndex": 330, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839306565333836623438633166333865643462643738393266373962343330356139386633663766643664336236666630383637333764636632376363353764000000000000000000000000000000000000000000000000000000000000", + "logIndex": 331, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307861396261653735316666666636623364326336616666313037366133613865633833663939336639633130336337383363353962633664393934663930336166000000000000000000000000000000000000000000000000000000000000", + "logIndex": 332, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307866326261343837646666383661646364623364653534376662333739633736633532396433653238316166386334663061343130373738626438326431363637000000000000000000000000000000000000000000000000000000000000", + "logIndex": 333, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307861323035393836346462363537643837336230313433643364376430303833353739316565616437316264353162336139663535353265656334323232623465000000000000000000000000000000000000000000000000000000000000", + "logIndex": 334, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830313135313863326462343936636137616164313164383532623037353034373033393235666135653036386466393030323438306166343962623561396366000000000000000000000000000000000000000000000000000000000000", + "logIndex": 335, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307861393435323661326665633162306661643035636262623830396237353732663434383966616432366562313836393030663032396239313331373334353837000000000000000000000000000000000000000000000000000000000000", + "logIndex": 336, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830613163386561343632333431356130303565303163326239623764313632626539623939396237356133636137633235623931396265363361353635336537000000000000000000000000000000000000000000000000000000000000", + "logIndex": 337, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833386433393064666361373435633964333230333264623834356334353530653637666232373130363562303432373738636330346339346435383864336565000000000000000000000000000000000000000000000000000000000000", + "logIndex": 338, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864623335373565363265646233303332626264616565343561376136356432323866633766356363613263356237616130393535636339646638613039656362000000000000000000000000000000000000000000000000000000000000", + "logIndex": 339, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + }, + { + "transactionIndex": 60, + "blockNumber": 20166840, + "transactionHash": "0xe4a54c2ad3774d5499efa4f79977113475871bcc27dba595b0796c81ee32e871", + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307863323764353138666435613639663266373931373938383136326533623730376235326534633137313433666630373733376131353866313964323732383139000000000000000000000000000000000000000000000000000000000000", + "logIndex": 340, + "blockHash": "0xfb52cc6b903bcffe509d043b9ba8fdb119f9bc902e53d32162ff0f51531edeab" + } + ], + "blockNumber": 20166840, + "cumulativeGasUsed": "28084710", + "status": 1, + "byzantium": true + }, + "args": [ + "0x6206EB4c794c7fe58315f76ab088Ee3C17E0d9f5", + "0xcE4d0DE6589bF2b439d08dc9addD56428D76eC25", + [ + "0xfd4622039be3e4286dd3285d36d772a71d580a9afa0a1718a7e643539c952cf9", + "0x90a6489eff38140689a15133fb58906a7e847cc18271af036936c8eda91ddcc8", + "0x14d26d02b3ae9f26f9e62a4d8d76ebfff0cd4a4d4629c08c909af99ec0eb41d7", + "0x64558b4363c4f8d4e7c1ee1a75e4d82f8fa76640e174b06d4ed34e3b46ebc1a7", + "0xe4ac93cf32a585897b300eec0d22fddaed70165948f7aafd1c44364805813057", + "0x4a266fd63f550db6b79172325f33419df6d5d87bf924b175d8b1817f010a21cf", + "0xdc0e66724fcf38e8519c7ab33ab9e6a047c758db35204b1d086500fe50333f71", + "0x515a82e3326b985ca073d58a3ba9290e84ff8d021d072e7b420fd0616bc609e7", + "0xb41a513fdd3e2b7a6b8e0c02f8a714aa3aca101cd32365de6cbac90fae308e06", + "0x1fdc4738b323d4c38bf657a33f74f95618bc11933fcc4ce6e9f3f7c93f5a492e", + "0x5f15231e57a2fa86f5e1eb1c2abdbd5485109ada65bb63bed87c72425dca8285", + "0x5459ebbea646d1a4a0c93944e68600c9e355918a90b36d352a1291ba557e556c", + "0xff66c7ec1f7c81fc833bafb9522cc15be4ef56462267c89879510501c1bc77fd", + "0x5faa515009ca792805bdf03d951d753ab241c321066e3f0cbc0ee8f4c09ecb32", + "0x804818b286e6c204b3f18282b1f7a0a40b1b555bc39dcf256342e0b4dc3f2992", + "0x5ff169334a81b8b98ba9e7beb1ef2e3860f79f148cf07526524e829ecf6d6e5d", + "0x38989329e5ced5859e6509da39f11f6344c10522c0193c0cb573e783e974fbd0", + "0xac441d6d1e9962eb0abcbc819231e48614786c179507fd0faaec4cad0b5d1e0b", + "0xe62e6329abefdee24fcecf37ca55b112fa9d0abacb2c99cd7f8c0da6c7ba46a8", + "0x099b6726de138236fa7d3917f17caef42ebd19fa93de96b1b1faffc713265d30", + "0xde1e37cbb28770a1b1ed70d4a6837e0ee727926069ee8fa1633f03e4de2c35cd", + "0x6c0e0b23424d75c6191209487a27bdcb9ee9f748ec05f872b4afd56af66c36c5", + "0x9f76a244b731d7257d4cc846f3da987a6203862a32abe5d379785dbecd235d1a", + "0xef63eb7d0da5808077af6a8e9c160416ca66db16779ef30e4949d31edd70bf09", + "0x2b5db07f588bd27d3795281c640fd5ffe6de1114503a27e510a4aa4bd9d004d4", + "0x7189940070b05a712fc63053e9c7718770c562cd7df084e50a941669f680090a", + "0x1657faac94dd55e063362ddfb6f95c5a6d21e79ff758c6a8d6079510b004be32", + "0x60a18f9b8af405dcb90b51e6719fc14b7c7927a5961444cd97eb8ecffc7ecbd9", + "0x040fbe68e91a4575ad91d7dcb90077fcfc17627ef2a1293f59d1772959ccaed7", + "0xe2f19f3c91d9a590cfaf25f46551b4a0239ab452ef5f638ab172ccfbd0a0c617", + "0x70a8c0b560b4655c3a7c68c0bb76cf9fc42484a3bb73c5fed02a5fb4297965b6", + "0x56c812dccd84620292a18a829158ba20fef49e52efa5794c58d7d2780148fc23", + "0x72ab702376864dba1eb761a6937ab1d9fd02e607043d7d6434bb3f342b220a73", + "0xd78e55f09de9c1869064135807c1514b2b7f905b209cc570ecd52e04b03658ea", + "0x752c1557a4edaa74f9c6dd7c166ed91efce14ed906471641373f2a7b0284c1dd", + "0x0a6d99c8e50b86556ab7cb84f513e100421fbf30bfec67cdd18ce72025531993", + "0x6813bdf5e24e6b5dba7bf43da893b892b772ede62fd44dd2b64a3117337bbf1f", + "0x3de42f758236bfb794df199d9e8458379d3712d2ec688e2e5ff3c3df5f958fa1", + "0xc3dd13ceaf2f9de125cb236a3dbcf79c0c1f758ab6187ceda684e38455df61d3", + "0xd9335b69d0a9912557e1a9ede125108931bcab6aee6874f25ff38bd7f4e15b53", + "0x28f4d6a102a425f323ab09b3df79245cc107af12750359a3abff684eda8ccab4", + "0x96e311f6dc7880938a832d817d9c7bf5362db1c11b1aa5c7477029ec1a67fddb", + "0x6080466f782d79cf5e369d7ddb9dfad0a18d3305f9175f5dda9f018379dfa09b", + "0x02e00e22814427e254d8f3864e3c2fc7d4df8f5a880a02acd453e7ed266d34f3", + "0x7227d090de5230b94bb1276b3f7f88637c5f81ca78611dd688abaad8f444f994", + "0x35e984b55982c5ff052a556f4222d68c8418b30fef2a492a54fdc2932d37d922", + "0x7138e0ddbabc0a60acd45beab2de3b358b53de74f4232f39de107e6385948574", + "0x8e5d65220543375a787871bf75fd97ac5e92ab19e4e3966f8cd10e626a2a60a7", + "0x93368c81a1b5ae7bdda5f6d4438a468d021473bb87f2497fa9182919da4b0c94", + "0x4427153487539ae730ef8efea808c07bb204874254f1c2122c10061f45b9f3c6", + "0x435c11202ac6185b21b8db4fb611239f88b15a9fabd592881dcdc8e1d5699b1f", + "0xbd8906d0befd6ee002dde561784391592d87700d5e056feb55edeef379b0818e", + "0x8b2e8c033e6552fc84097959758d282fefef91b1fb14af4030000b9b9c0e4002", + "0xb0bce44cf9775397a5165866ba30bd3e08d803361e07dcd13836b0e6bac90115", + "0x4d498fe8a5c041a5b7db76193e7d8b892f0671e51ce96428ceb106ff3169a7c4", + "0x315d843fb171162091c0b48bcdf9e7b6cd501e5e7b95939008307e1528fe47b9", + "0xd7dffe2c62f550564eb39c36bcf0d6c5e42a81b465588d2130f0ea8069a7032e", + "0xe92b04c68d583298f3c4b7bcc2950e1eb87c1f07c3d1ebb882f58b1c859569d4", + "0x8d3f0ae15560c62602003b3ae3ac315225ce3efc5b8f1095f879874c57314bba", + "0x586842c544b265525a27f2f69b24e8ea8e04d449f5da3b8382f77b9abffa6e20", + "0x09a8b20b3de23b8f661e388e6541aa4e18b39edf7e2f0926e4b3763c82fee1e2", + "0xb79056285d7d62718d9b1f19087cf246f6fa4bd54b59fefb6e53674eb036819f", + "0x910bcc08eeca45f11593fe7b3aa808213a144ddcc952bd46480ebc827100def2", + "0xb236556aad9e923c4550fee8bba81c41c7536853354ebd67df2df39d0805dbc1", + "0x4f47385534d844365d9ec1642313713df7b50200d1934ff8500f021a4e50f0e1", + "0xc234e7aaa70f35381cce4ed61eb5fddebb86a1cb00ded43da6bf60e1da75ffe5", + "0x2cc4c39b7274f840719c07a65f6004a43a28545052fb79611568b94f8f286246", + "0x0dde40a5b8a6459a903a69c380e8dd1f5e2204834db7257d919d05cf5fb5b60e", + "0x0947712b8534d1c94dc99beb4471b5ff8a829146ac805a84899516ba7c2b921b", + "0x89eacd1f0cddb88b7eef5e29fb4ec02ec2c18091e032a0c678183f525e962e1b", + "0x3c95de2b959ef104f5237e7c7d827c84b7609e1c653d558d87c0d25919480c2b", + "0x84293ae420c269d3c6c1545a925de8110a2682d05580c02908eb599d93e88933", + "0x517aee0b4eb5683ea2ee6eea71ab1185a0d9fcbfdf32635fb7e3a00b43ed6105", + "0x7daee2949ac85d2f3dcba4c2d45a4841c4ff53c6f9280f01627e97120fdfe9da", + "0xee930d1872b327df3860ecd73230f947e6f580ac6d0dadc682a74dc8a4982dc9", + "0x302dd9fb18d7eb42ae6fb33885fd29d19f6994fffcdcb9aef2d7cd736ad62497", + "0xca6b572cc14692953bac2ac3a122bb825dee217d2fc06a36b45ca25989f70019", + "0x11dc7a8b213bb58657d84da0d5a3cdff873dde18be19b2b644cf0b3e115b66d1", + "0x8500d23729472f0c32264279081bee65e632c933cdc8f8cf55e763375f205fdb", + "0x01bd276fa345583afe6900dd0adca011f2403698773b885959b9a029f05b3c57", + "0x2d8a7f754f9061e593e0cc0c2837cccc385b5f8b78c0229c0bdb9896d88b4433", + "0x7abab9115123f9e5741aea38ea067c74dfa8b6092c8532dbcc8989f7a8d83a92", + "0x472b25279325695c81860fe0d64ac8b7042d1c84ea8e859c97e4acba9d586925", + "0x606f6a5d814a6fe0e19e092b15ada33448e8b4ae7de97193d39fb88b5e22a2bc", + "0x026620c2765771542f2bbe43dde1bbcd1961d7ca42aee878b7003bd58fbcdfa5", + "0xa7b5e4bc48f40cc2e6e7136ed5335b1e714b3108bfa3e38ba11337260bcc4a11", + "0x8450ab03bb68dcef8a02de079ea430859d8fe6b676d2766d2d0e9b51ef98deb3", + "0xf4cadad2be2ab909a67f64e6092caa80758b6c705c694993fe751c60a439e194", + "0x853fdf59b3e0d9d8fa9d05908df3d210d4e0ace89623d8c0d263df4e2c28d29e", + "0xcf879c7ed93fed3ffe32896a2f0f47b04b061a3553b1a29137885e2c2ce89137", + "0x90ee386b48c1f38ed4bd7892f79b4305a98f3f7fd6d3b6ff086737dcf27cc57d", + "0xa9bae751ffff6b3d2c6aff1076a3a8ec83f993f9c103c783c59bc6d994f903af", + "0xf2ba487dff86adcdb3de547fb379c76c529d3e281af8c4f0a410778bd82d1667", + "0xa2059864db657d873b0143d3d7d00835791eead71bd51b3a9f5552eec4222b4e", + "0x011518c2db496ca7aad11d852b07504703925fa5e068df9002480af49bb5a9cf", + "0xa94526a2fec1b0fad05cbbb809b7572f4489fad26eb186900f029b9131734587", + "0x0a1c8ea4623415a005e01c2b9b7d162be9b999b75a3ca7c25b919be63a5653e7", + "0x38d390dfca745c9d32032db845c4550e67fb271065b042778cc04c94d588d3ee", + "0xdb3575e62edb3032bbdaee45a7a65d228fc7f5cca2c5b7aa0955cc9df8a09ecb", + "0xc27d518fd5a69f2f7917988162e3b707b52e4c17143ff07737a158f19d272819" + ] + ], + "numDeployments": 1, + "solcInputHash": "d865a6f49eab8c58036d78b72f5cb448", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_registry\",\"type\":\"address\"},{\"internalType\":\"contract INullifierRegistry\",\"name\":\"_nullifierRegistry\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"_providerHashes\",\"type\":\"string[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"providerHash\",\"type\":\"string\"}],\"name\":\"ProviderHashAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"providerHash\",\"type\":\"string\"}],\"name\":\"ProviderHashRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"witness\",\"type\":\"address\"}],\"name\":\"WitnessAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"witness\",\"type\":\"address\"}],\"name\":\"WitnessRemoved\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_newProviderHash\",\"type\":\"string\"}],\"name\":\"addProviderHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newWitness\",\"type\":\"address\"}],\"name\":\"addWitness\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProviderHashes\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWitnesses\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"isProviderHash\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isWitness\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nullifierRegistry\",\"outputs\":[{\"internalType\":\"contract INullifierRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"providerHashes\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_removeProviderHash\",\"type\":\"string\"}],\"name\":\"removeProviderHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_removeWitness\",\"type\":\"address\"}],\"name\":\"removeWitness\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"provider\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"parameters\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"context\",\"type\":\"string\"}],\"internalType\":\"struct Claims.ClaimInfo\",\"name\":\"claimInfo\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"identifier\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampS\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"internalType\":\"struct Claims.CompleteClaimData\",\"name\":\"claim\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"internalType\":\"struct Claims.SignedClaim\",\"name\":\"signedClaim\",\"type\":\"tuple\"}],\"internalType\":\"struct IProxyBaseProcessor.Proof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"name\":\"verifyProofSignatures\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"provider\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"parameters\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"context\",\"type\":\"string\"}],\"internalType\":\"struct Claims.ClaimInfo\",\"name\":\"claimInfo\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"identifier\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampS\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"internalType\":\"struct Claims.CompleteClaimData\",\"name\":\"claim\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"internalType\":\"struct Claims.SignedClaim\",\"name\":\"signedClaim\",\"type\":\"tuple\"}],\"internalType\":\"struct IProxyBaseProcessor.Proof[]\",\"name\":\"_proofs\",\"type\":\"tuple[]\"}],\"name\":\"verifyProofs\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"expiryTime\",\"type\":\"uint256\"}],\"internalType\":\"struct IVerifyDomainProcessor.DomainRaw[]\",\"name\":\"domains\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"witnesses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addProviderHash(string)\":{\"params\":{\"_newProviderHash\":\"New provider hash to be added\"}},\"addWitness(address)\":{\"params\":{\"_newWitness\":\"Address of the new witness\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"removeProviderHash(string)\":{\"params\":{\"_removeProviderHash\":\"Provider hash to be removed\"}},\"removeWitness(address)\":{\"params\":{\"_removeWitness\":\"Address of witness to be removed\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"verifyProofSignatures(((string,string,string),((bytes32,address,uint32,uint32),bytes[])))\":{\"params\":{\"proof\":\"Proof to be verified\"}},\"verifyProofs(((string,string,string),((bytes32,address,uint32,uint32),bytes[]))[])\":{\"params\":{\"_proofs\":\"Proofs to be verified\"},\"returns\":{\"domains\":\" Array of Domain structs\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addProviderHash(string)\":{\"notice\":\"ONLY OWNER: Add provider hash string. Provider hash must not have been previously added.\"},\"addWitness(address)\":{\"notice\":\"ONLY OWNER: Add witness address. Witness must not have been previously added.\"},\"removeProviderHash(string)\":{\"notice\":\"ONLY OWNER: Remove provider hash string. Provider hash must have been previously added.\"},\"removeWitness(address)\":{\"notice\":\"ONLY OWNER: Remove witness address. Witness must have been previously added.\"},\"verifyProofSignatures(((string,string,string),((bytes32,address,uint32,uint32),bytes[])))\":{\"notice\":\"Verify proof generated by witnesses. Claim is constructed by hashing claimInfo (provider, context, parameters) to get the identifier. And then signing on (identifier, owner, timestamp, epoch) to get claim signature. This function verifies a claim by performing the following checks on the claim - Calculates the hash of the claimInfo and checks if it matches the identifier in the claim - Checks if the signatures are valid and from the witnesses This function reverts if - No signatures are found on the proof - Number of signatures is not equal to the number of witnesses - ClaimInfo hash does not match the identifier in the claim - Signatures are invalid (not from the witnesses) DEV NOTE: This function does NOT validate that the claim provider hash is valid. That is the responsibility of the caller. Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code \"},\"verifyProofs(((string,string,string),((bytes32,address,uint32,uint32),bytes[]))[])\":{\"notice\":\"ONLY REGISTRY: Verifies proofs. Extracts values and formats them into Domain structs.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/VerifyDomainProcessor.sol\":\"VerifyDomainProcessor\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\")\\n mstore(0x1c, hash)\\n message := keccak256(0x00, 0x3c)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40)\\n mstore(ptr, \\\"\\\\x19\\\\x01\\\")\\n mstore(add(ptr, 0x02), domainSeparator)\\n mstore(add(ptr, 0x22), structHash)\\n data := keccak256(ptr, 0x42)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\\n * `validator` and `data` according to the version 0 of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x00\\\", validator, data));\\n }\\n}\\n\",\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"./StringUtils.sol\\\";\\n\\n/**\\n * Library to assist with requesting,\\n * serialising & verifying credentials\\n */\\nlibrary Claims {\\n\\t/** Data required to describe a claim */\\n\\tstruct CompleteClaimData {\\n\\t\\tbytes32 identifier;\\n\\t\\taddress owner;\\n\\t\\tuint32 timestampS;\\n\\t\\tuint32 epoch;\\n\\t}\\n\\n\\tstruct ClaimInfo {\\n\\t\\tstring provider;\\n\\t\\tstring parameters;\\n\\t\\tstring context;\\n\\t}\\n\\n\\t/** Claim with signatures & signer */\\n\\tstruct SignedClaim {\\n\\t\\tCompleteClaimData claim;\\n\\t\\tbytes[] signatures;\\n\\t}\\n\\n\\t/**\\n\\t * Asserts that the claim is signed by the expected witnesses\\n\\t */\\n\\tfunction assertValidSignedClaim(\\n\\t\\tSignedClaim memory self,\\n\\t\\taddress[] memory expectedWitnessAddresses\\n\\t) internal pure {\\n\\t\\trequire(self.signatures.length > 0, \\\"No signatures\\\");\\n\\t\\taddress[] memory signedWitnesses = recoverSignersOfSignedClaim(self);\\n\\t\\tfor (uint256 i = 0; i < expectedWitnessAddresses.length; i++) {\\n\\t\\t\\tbool found = false;\\n\\t\\t\\tfor (uint256 j = 0; j < signedWitnesses.length; j++) {\\n\\t\\t\\t\\tif (signedWitnesses[j] == expectedWitnessAddresses[i]) {\\n\\t\\t\\t\\t\\tfound = true;\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\trequire(found, \\\"Missing witness signature\\\");\\n\\t\\t}\\n\\t}\\n\\n\\t/**\\n\\t * @dev recovers the signer of the claim\\n\\t */\\n\\tfunction recoverSignersOfSignedClaim(\\n\\t\\tSignedClaim memory self\\n\\t) internal pure returns (address[] memory) {\\n\\t\\tbytes memory serialised = serialise(self.claim);\\n\\t\\taddress[] memory signers = new address[](self.signatures.length);\\n\\t\\tfor (uint256 i = 0; i < self.signatures.length; i++) {\\n\\t\\t\\tsigners[i] = verifySignature(serialised, self.signatures[i]);\\n\\t\\t}\\n\\n\\t\\treturn signers;\\n\\t}\\n\\n\\t/**\\n\\t * @dev serialises the credential into a string;\\n\\t * the string is used to verify the signature\\n\\t *\\n\\t * the serialisation is the same as done by the TS library\\n\\t */\\n\\tfunction serialise(\\n\\t\\tCompleteClaimData memory self\\n\\t) internal pure returns (bytes memory) {\\n\\t\\treturn\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\tStringUtils.bytes2str(abi.encodePacked(self.identifier)),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.address2str(self.owner),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.timestampS),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.epoch)\\n\\t\\t\\t);\\n\\t}\\n\\n\\t/**\\n\\t * @dev returns the address of the user that generated the signature\\n\\t */\\n\\tfunction verifySignature(\\n\\t\\tbytes memory content,\\n\\t\\tbytes memory signature\\n\\t) internal pure returns (address signer) {\\n\\t\\tbytes32 signedHash = keccak256(\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\t\\\"\\\\x19Ethereum Signed Message:\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(content.length),\\n\\t\\t\\t\\tcontent\\n\\t\\t\\t)\\n\\t\\t);\\n\\t\\treturn ECDSA.recover(signedHash, signature);\\n\\t}\\n\\n\\tfunction hashClaimInfo(ClaimInfo memory claimInfo) internal pure returns (bytes32) {\\n\\t\\tbytes memory serialised = abi.encodePacked(\\n\\t\\t\\tclaimInfo.provider,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.parameters,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.context\\n\\t\\t);\\n\\t\\treturn keccak256(serialised);\\n\\t}\\n}\\n\",\"keccak256\":\"0x87a41e75d358e86798456ad45e03446cde8f1519c8af17905f6c8b852a5f2da7\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/StringUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/**\\n * Utilities for string manipulation & conversion\\n */\\nlibrary StringUtils {\\n\\tfunction address2str(address x) internal pure returns (string memory) {\\n\\t\\tbytes memory s = new bytes(40);\\n\\t\\tfor (uint i = 0; i < 20; i++) {\\n\\t\\t\\tbytes1 b = bytes1(uint8(uint(uint160(x)) / (2 ** (8 * (19 - i)))));\\n\\t\\t\\tbytes1 hi = bytes1(uint8(b) / 16);\\n\\t\\t\\tbytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));\\n\\t\\t\\ts[2 * i] = getChar(hi);\\n\\t\\t\\ts[2 * i + 1] = getChar(lo);\\n\\t\\t}\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", s));\\n\\t}\\n\\n\\tfunction bytes2str(bytes memory buffer) internal pure returns (string memory) {\\n\\t\\t// Fixed buffer size for hexadecimal convertion\\n\\t\\tbytes memory converted = new bytes(buffer.length * 2);\\n\\t\\tbytes memory _base = \\\"0123456789abcdef\\\";\\n\\n\\t\\tfor (uint256 i = 0; i < buffer.length; i++) {\\n\\t\\t\\tconverted[i * 2] = _base[uint8(buffer[i]) / _base.length];\\n\\t\\t\\tconverted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length];\\n\\t\\t}\\n\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", converted));\\n\\t}\\n\\n\\tfunction getChar(bytes1 b) internal pure returns (bytes1 c) {\\n\\t\\tif (uint8(b) < 10) return bytes1(uint8(b) + 0x30);\\n\\t\\telse return bytes1(uint8(b) + 0x57);\\n\\t}\\n\\n\\tfunction bool2str(bool _b) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_b) {\\n\\t\\t\\treturn \\\"true\\\";\\n\\t\\t} else {\\n\\t\\t\\treturn \\\"false\\\";\\n\\t\\t}\\n\\t}\\n\\n\\tfunction uint2str(uint _i) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_i == 0) {\\n\\t\\t\\treturn \\\"0\\\";\\n\\t\\t}\\n\\t\\tuint j = _i;\\n\\t\\tuint len;\\n\\t\\twhile (j != 0) {\\n\\t\\t\\tlen++;\\n\\t\\t\\tj /= 10;\\n\\t\\t}\\n\\t\\tbytes memory bstr = new bytes(len);\\n\\t\\tuint k = len;\\n\\t\\twhile (_i != 0) {\\n\\t\\t\\tk = k - 1;\\n\\t\\t\\tuint8 temp = (48 + uint8(_i - (_i / 10) * 10));\\n\\t\\t\\tbytes1 b1 = bytes1(temp);\\n\\t\\t\\tbstr[k] = b1;\\n\\t\\t\\t_i /= 10;\\n\\t\\t}\\n\\t\\treturn string(bstr);\\n\\t}\\n\\n\\tfunction areEqual(\\n\\t\\tstring calldata _a,\\n\\t\\tstring storage _b\\n\\t) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction areEqual(string memory _a, string memory _b) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction toLower(string memory str) internal pure returns (string memory) {\\n\\t\\tbytes memory bStr = bytes(str);\\n\\t\\tbytes memory bLower = new bytes(bStr.length);\\n\\t\\tfor (uint i = 0; i < bStr.length; i++) {\\n\\t\\t\\t// Uppercase character...\\n\\t\\t\\tif ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {\\n\\t\\t\\t\\t// So we add 32 to make it lowercase\\n\\t\\t\\t\\tbLower[i] = bytes1(uint8(bStr[i]) + 32);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tbLower[i] = bStr[i];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn string(bLower);\\n\\t}\\n\\n\\tfunction substring(\\n\\t\\tstring memory str,\\n\\t\\tuint startIndex,\\n\\t\\tuint endIndex\\n\\t) internal pure returns (string memory) {\\n\\t\\tbytes memory strBytes = bytes(str);\\n\\t\\tbytes memory result = new bytes(endIndex - startIndex);\\n\\t\\tfor (uint i = startIndex; i < endIndex; i++) {\\n\\t\\t\\tresult[i - startIndex] = strBytes[i];\\n\\t\\t}\\n\\t\\treturn string(result);\\n\\t}\\n}\\n\",\"keccak256\":\"0x15feebafef16d4c74c043b39e652ddae0e121987ceca74b663f6a2d2d7ba8b4b\",\"license\":\"MIT\"},\"contracts/VerifyDomainProcessor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\nimport { ClaimVerifier } from \\\"./external/ClaimVerifier.sol\\\";\\nimport { INullifierRegistry } from \\\"./external/interfaces/INullifierRegistry.sol\\\";\\nimport { ProxyBaseProcessor } from \\\"./external/processors/ProxyBaseProcessor.sol\\\";\\nimport { StringConversionUtils } from \\\"./external/lib/StringConversionUtils.sol\\\";\\nimport { TicketmasterDataParsing } from \\\"./external/TicketmasterDataParsing.sol\\\";\\n\\nimport { IVerifyDomainProcessor } from \\\"./interfaces/IVerifyDomainProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\n\\ncontract VerifyDomainProcessor is IVerifyDomainProcessor, ProxyBaseProcessor {\\n\\n using StringConversionUtils for string;\\n\\n /* ============ Constants ============ */\\n uint8 constant MAX_EXTRACT_VALUES = 5;\\n\\n /* ============ State Variables ============ */\\n address public immutable registry;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _registry,\\n INullifierRegistry _nullifierRegistry,\\n string[] memory _providerHashes\\n ) \\n ProxyBaseProcessor(_nullifierRegistry, _providerHashes)\\n {\\n registry = _registry;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * ONLY REGISTRY: Verifies proofs. Extracts values and formats them into Domain structs.\\n *\\n * @param _proofs Proofs to be verified\\n * @return domains Array of Domain structs\\n */\\n function verifyProofs(\\n Proof[] memory _proofs\\n ) \\n external \\n override\\n returns (DomainRaw[] memory domains)\\n {\\n require(msg.sender == registry, \\\"Only registry can call\\\");\\n\\n domains = new DomainRaw[](_proofs.length);\\n\\n for (uint256 i = 0; i < _proofs.length; i++) {\\n Proof memory proof = _proofs[i];\\n\\n verifyProofSignatures(proof);\\n\\n (\\n string memory domainName,\\n string memory expiryTimeStr,\\n string memory providerHash\\n ) = _extractValues(proof);\\n\\n // Check provider hash\\n require(_validateProviderHash(providerHash), \\\"No valid providerHash\\\");\\n\\n _validateAndAddNullifier(proof.signedClaim.signatures);\\n\\n domains[i] = DomainRaw({\\n name: domainName,\\n // The TicketmasterDataParsing library's date parsing logic is pretty generic, and works for domain \\n // expiry dates as well. Similar to Ticketmaster dates, the expiry time is of the format \\\"YYYY-MM-DDTHH:MM:SS\\\"\\n // and returns UTC timestamps.\\n expiryTime: TicketmasterDataParsing._dateStringToTimestamp(expiryTimeStr)\\n });\\n }\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n /**\\n * Extracts all values from the proof context.\\n *\\n * @param _proof The proof containing the context to extract values from.\\n */\\n function _extractValues(Proof memory _proof) internal pure returns (\\n string memory domainName,\\n string memory expiryTime,\\n string memory providerHash\\n ) {\\n string[] memory values = ClaimVerifier.extractAllFromContext(\\n _proof.claimInfo.context, \\n MAX_EXTRACT_VALUES, \\n true\\n );\\n\\n return (\\n values[0], // domainName\\n values[1], // expiryTime\\n values[2] // providerHash\\n );\\n }\\n}\\n\",\"keccak256\":\"0x34c84f99070a4b76cca1d63b5d8eee8edd8a0e98ace63cca4681d71327f4c18a\",\"license\":\"MIT\"},\"contracts/external/ClaimVerifier.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Claims } from \\\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\nlibrary ClaimVerifier {\\n\\n /**\\n * Find the end index of target string in the data string. Returns the end index + 1 if\\n * the target string in the data string if found. Returns type(uint256).max if:\\n * - Target is longer than data\\n * - Target is not found\\n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\\n */\\n function findSubstringEndIndex(\\n string memory data,\\n string memory target\\n ) public pure returns (uint256) {\\n bytes memory dataBytes = bytes(data);\\n bytes memory targetBytes = bytes(target);\\n\\n if (dataBytes.length < targetBytes.length) {\\n return type(uint256).max;\\n }\\n\\n // Find start of target\\n for (uint i = 0; i <= dataBytes.length - targetBytes.length; i++) {\\n bool isMatch = true;\\n\\n for (uint j = 0; j < targetBytes.length && isMatch; j++) {\\n if (dataBytes[i + j] != targetBytes[j]) {\\n isMatch = false;\\n break;\\n }\\n }\\n\\n if (isMatch) {\\n return i + targetBytes.length; // Return end index + 1\\n }\\n }\\n\\n return type(uint256).max;\\n }\\n\\n /**\\n * Extracts given target field value from context in claims. Extracts only ONE value.\\n * Pass prefix formatted with quotes, for example '\\\"providerHash\\\\\\\":\\\\\\\"'\\n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\\n *\\n * @param data Context string from which target value needs to be extracted\\n * @param prefix Prefix of the target value that needs to be extracted \\n */\\n function extractFieldFromContext(\\n string memory data,\\n string memory prefix\\n ) public pure returns (string memory) {\\n // Find end index of prefix; which is the start index of the value\\n uint256 start = findSubstringEndIndex(data, prefix);\\n\\n bytes memory dataBytes = bytes(data);\\n if (start == dataBytes.length) {\\n return \\\"\\\"; // Prefix not found. Malformed or missing message\\n }\\n \\n // Find the end of the VALUE, assuming it ends with a quote not preceded by a backslash\\n uint256 end = start;\\n while (\\n end < dataBytes.length &&\\n !(dataBytes[end] == '\\\"' && dataBytes[end - 1] != \\\"\\\\\\\\\\\")\\n ) {\\n end++;\\n }\\n if (end <= start) {\\n return \\\"\\\"; // Malformed or missing message\\n }\\n bytes memory contextMessage = new bytes(end - start);\\n for (uint i = start; i < end; i++) {\\n contextMessage[i - start] = dataBytes[i];\\n }\\n return string(contextMessage);\\n }\\n\\n\\n /**\\n * Extracts ALL values from context in a single pass. Context is stored as serialized JSON string with \\n * two keys: extractedParameters and providerHash. ExtractedParameters itself is a JSON string with \\n * key-value pairs. This function returns extracted individual values from extractedParameters along \\n * with providerHash (if extractProviderHash is true). Use maxValues to limit the number of expected values\\n * to be extracted from extractedParameters. In most cases, one would need to extract all values from\\n * extractedParameters and providerHash, hence use this function over calling extractFieldFromContext \\n * multiple times.\\n * \\n * @param data Context string from which target value needs to be extracted\\n * @param maxValues Maximum number of values to be extracted from extractedParameters\\n * @param extractProviderHash Extracts and returns providerHash if true\\n */\\n function extractAllFromContext(\\n string memory data,\\n uint8 maxValues,\\n bool extractProviderHash\\n ) public pure returns (string[] memory) {\\n \\n require(maxValues > 0, \\\"Max values must be greater than 0\\\");\\n\\n bytes memory dataBytes = bytes(data);\\n uint index = 0;\\n\\n bytes memory extractedParametersBytes = bytes('{\\\\\\\"extractedParameters\\\\\\\":{\\\\\\\"');\\n for (uint i = 0; i < extractedParametersBytes.length; i++) {\\n require(dataBytes[index + i] == extractedParametersBytes[i], \\\"Extraction failed. Malformed extractedParameters\\\");\\n }\\n index += extractedParametersBytes.length;\\n\\n bool isValue = false; // starts with a key right after '{\\\\\\\"extractedParameters\\\\\\\":{\\\\\\\"'\\n uint valuesFound = 0;\\n \\n uint[] memory valueIndices = new uint[](extractProviderHash ? 2 * (maxValues + 1): 2 * maxValues);\\n\\n while (\\n index < dataBytes.length\\n ) {\\n // Keep incrementing until '\\\"', escaped quotes are not considered\\n if (!(dataBytes[index] == '\\\"' && dataBytes[index - 1] != \\\"\\\\\\\\\\\")) {\\n index++;\\n continue;\\n }\\n\\n if (!isValue) {\\n // \\\\\\\":\\\\\\\" (3 chars)\\n require(dataBytes[index + 1] == \\\":\\\" && dataBytes[index + 2] == '\\\\\\\"', \\\"Extraction failed. Malformed data 1\\\");\\n index += 3; // move it after \\\\\\\"\\n isValue = true;\\n valueIndices[2 * valuesFound] = index; // start index\\n } else {\\n // \\\\\\\",\\\\\\\" (3 chars) or \\\\\\\"}, (3 chars)\\n // \\\\\\\"}} is not supported, there should always be a providerHash\\n require(\\n dataBytes[index + 1] == \\\",\\\" && dataBytes[index + 2] == '\\\\\\\"' || \\n dataBytes[index + 1] == '}' && dataBytes[index + 2] == \\\",\\\",\\n \\\"Extraction failed. Malformed data 2\\\"\\n );\\n valueIndices[2 * valuesFound + 1] = index; // end index\\n valuesFound++;\\n\\n if (dataBytes[index + 1] == \\\",\\\") {\\n // Revert if valuesFound == maxValues and next char is a comma as there will be more values\\n require(valuesFound != maxValues, \\\"Extraction failed. Exceeded max values\\\");\\n index += 3;\\n isValue = false;\\n } else { // index + 1 = \\\"}\\\"\\n index += 3;\\n break; // end of extractedParameters\\n }\\n }\\n }\\n\\n if (extractProviderHash) {\\n bytes memory providerHashParamBytes = bytes(\\\"\\\\\\\"providerHash\\\\\\\":\\\\\\\"\\\");\\n for (uint i = 0; i < providerHashParamBytes.length; i++) {\\n require(dataBytes[index + i] == providerHashParamBytes[i], \\\"Extraction failed. Malformed providerHash\\\");\\n }\\n index += providerHashParamBytes.length;\\n \\n // final indices tuple in valueIndices will be for star and end indices of provider hash\\n valueIndices[2 * valuesFound] = index;\\n // Keep incrementing until '\\\"'\\n while (\\n index < dataBytes.length && dataBytes[index] != '\\\"'\\n ) {\\n index++;\\n }\\n valueIndices[2 * valuesFound + 1] = index;\\n valuesFound++;\\n } \\n \\n string[] memory values = new string[](valuesFound);\\n \\n for (uint i = 0; i < valuesFound; i++) {\\n uint startIndex = valueIndices[2 * i];\\n uint endIndex = valueIndices[2 * i + 1];\\n bytes memory contextValue = new bytes(endIndex - startIndex);\\n for (uint j = startIndex; j < endIndex; j++) {\\n contextValue[j - startIndex] = dataBytes[j];\\n }\\n values[i] = string(contextValue);\\n }\\n\\n return values;\\n }\\n}\\n\",\"keccak256\":\"0xac6a8d456c3b2c5ab5a475279a2f0f103faff3cb2d6abb2ce2029cd4265b904e\",\"license\":\"MIT\"},\"contracts/external/TicketmasterDataParsing.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { DateTime } from \\\"./lib/DateTime.sol\\\";\\n\\nimport { StringConversionUtils } from \\\"./lib/StringConversionUtils.sol\\\";\\nimport { ClaimVerifier } from \\\"./ClaimVerifier.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\nlibrary TicketmasterDataParsing {\\n \\n using StringConversionUtils for string;\\n\\n /**\\n * @notice Iterates through every character in the date string and splits the string at each dash, \\\"T\\\", or colon. Function will revert\\n * if there are not 6 substrings formed from the split. The substrings are then converted to uints and passed to the DateTime lib\\n * to get the unix timestamp. This function is SPECIFIC TO THE DATE FORMAT USED BY Ticketmaster, not suitable for use with other date\\n * formats. Ticketmaster date format is: \\\"YYYY-MM-DDTHH:MM:SS\\\" and returns UTC timestamps.\\n *\\n * @param _dateString Date string to be converted to a UTC timestamp\\n */\\n function _dateStringToTimestamp(string memory _dateString) internal pure returns (uint256 utcTimestamp) {\\n string[6] memory extractedStrings;\\n uint256 breakCounter;\\n uint256 lastBreak;\\n for (uint256 i = 0; i < bytes(_dateString).length; i++) {\\n if (bytes(_dateString)[i] == 0x2d || bytes(_dateString)[i] == 0x3a || bytes(_dateString)[i] == 0x54) {\\n extractedStrings[breakCounter] = _dateString.substring(lastBreak, i);\\n lastBreak = i + 1;\\n breakCounter++;\\n }\\n }\\n // Add last substring to array\\n extractedStrings[breakCounter] = _dateString.substring(lastBreak, bytes(_dateString).length);\\n\\n // Check that exactly 6 substrings were found (string is split at 5 different places)\\n require(breakCounter == 5, \\\"Invalid date string\\\");\\n\\n utcTimestamp = DateTime.timestampFromDateTime(\\n extractedStrings[0].stringToUint(0), // year\\n extractedStrings[1].stringToUint(0), // month\\n extractedStrings[2].stringToUint(0), // day\\n extractedStrings[3].stringToUint(0), // hour\\n extractedStrings[4].stringToUint(0), // minute\\n 0 // we don't need to the second granularity\\n );\\n }\\n\\n /**\\n * Extract event ID from URL by finding the last slash and taking the substring after it. We assume the\\n * URL is formulated something like: {domainRoot}/.../event/EVENT_ID\\n *\\n * @param _url URL to extract event ID from\\n * @return Event ID extracted from URL\\n */\\n function _extractEventIdFromUrl(string memory _url) internal pure returns (string memory) {\\n string memory prefix = \\\"event/\\\";\\n bytes memory urlBytes = bytes(_url);\\n uint256 urlLength = urlBytes.length;\\n\\n uint256 startIndex = ClaimVerifier.findSubstringEndIndex(_url, prefix);\\n // If the start index is the max value or the URL length, then the event ID was not found\\n if (startIndex == type(uint256).max || startIndex == urlLength) {\\n revert(\\\"Event ID not found in URL\\\");\\n }\\n\\n bytes memory contextMessage = new bytes(urlLength - startIndex);\\n for (uint i = startIndex; i < urlLength; i++) {\\n contextMessage[i - startIndex] = urlBytes[i];\\n }\\n return string(contextMessage);\\n }\\n\\n /**\\n * Parse tickets out of a ticket string of the format: '[\\\"ticket1\\\", \\\"ticket2\\\", \\\"ticket3\\\"]'.\\n * We start by getting the number of tickets in a string by counting the number of commas and adding 1.\\n * Then we iterate through the string and find the ticket IDs by looking for the quotes. We need to extract\\n * from quote to quote so we look for all even-numbered quotes then extract the string between that and the\\n * previous quote index.\\n *\\n * @param _ticketString Stringified array of tickets\\n */\\n function _parseTicketString(string memory _ticketString) internal pure returns (string[] memory ticketIds) {\\n // Assume there is at least one ticket (which means array would not have a comma)\\n // If there is no ticket then the transaction will end up reverting\\n uint256 ticketCount = 1;\\n for (uint256 i = 0; i < bytes(_ticketString).length; i++) {\\n if (bytes(_ticketString)[i] == 0x2C) {\\n ticketCount++;\\n }\\n }\\n\\n ticketIds = new string[](ticketCount);\\n uint256 breakCounter;\\n uint256 lastBreak;\\n for (uint256 i = 0; i < bytes(_ticketString).length; i++) {\\n if (bytes(_ticketString)[i] == 0x22) {\\n breakCounter++;\\n if (breakCounter % 2 == 0) {\\n ticketIds[(breakCounter/2)-1] = _ticketString.substring(lastBreak, i-1);\\n }\\n lastBreak = i + 1;\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x23a87b78bf72170f5e0cee6e4a8c59f68947c50971e00d183580ebe473a148c2\",\"license\":\"MIT\"},\"contracts/external/interfaces/INullifierRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface INullifierRegistry {\\n function addNullifier(bytes32 _nullifier) external;\\n function isNullified(bytes32 _nullifier) external view returns(bool);\\n}\\n\",\"keccak256\":\"0x107164bc9a320938b513305878163b7fa884da4cdae58d0c8e81bfbb00c97c5e\",\"license\":\"MIT\"},\"contracts/external/interfaces/IProxyBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Claims } from \\\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IProxyBaseProcessor {\\n \\n struct Proof {\\n Claims.ClaimInfo claimInfo;\\n Claims.SignedClaim signedClaim;\\n }\\n}\\n\",\"keccak256\":\"0x65aa00301110dfdf8333bd9bb71ebad241d66ea5840a2db3ac6d4f6037083cb8\",\"license\":\"MIT\"},\"contracts/external/lib/AddressArrayUtils.sol\":{\"content\":\"/*\\n Copyright 2020 Set Labs Inc.\\n\\n Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n you may not use this file except in compliance with the License.\\n You may obtain a copy of the License at\\n\\n http://www.apache.org/licenses/LICENSE-2.0\\n\\n Unless required by applicable law or agreed to in writing, software\\n distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n See the License for the specific language governing permissions and\\n limitations under the License.\\n\\n SPDX-License-Identifier: MIT\\n*/\\n\\npragma solidity ^0.8.17;\\n\\n/**\\n * @title AddressArrayUtils\\n * @author Set Protocol\\n *\\n * Utility functions to handle Address Arrays\\n *\\n * CHANGELOG:\\n * - 4/21/21: Added validatePairsWithArray methods\\n */\\nlibrary AddressArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(address[] memory A, address a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(address[] memory A, address a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns true if there are 2 elements that are the same in an array\\n * @param A The input array to search\\n * @return Returns boolean for the first occurrence of a duplicate\\n */\\n function hasDuplicate(address[] memory A) internal pure returns(bool) {\\n require(A.length > 0, \\\"A is empty\\\");\\n\\n for (uint256 i = 0; i < A.length - 1; i++) {\\n address current = A[i];\\n for (uint256 j = i + 1; j < A.length; j++) {\\n if (current == A[j]) {\\n return true;\\n }\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n * @return Returns the array with the object removed.\\n */\\n function remove(address[] memory A, address a)\\n internal\\n pure\\n returns (address[] memory)\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n (address[] memory _A,) = pop(A, index);\\n return _A;\\n }\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n */\\n function removeStorage(address[] storage A, address a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n\\n /**\\n * Removes specified index from array\\n * @param A The input array to search\\n * @param index The index to remove\\n * @return Returns the new array and the removed entry\\n */\\n function pop(address[] memory A, uint256 index)\\n internal\\n pure\\n returns (address[] memory, address)\\n {\\n uint256 length = A.length;\\n require(index < A.length, \\\"Index must be < A length\\\");\\n address[] memory newAddresses = new address[](length - 1);\\n for (uint256 i = 0; i < index; i++) {\\n newAddresses[i] = A[i];\\n }\\n for (uint256 j = index + 1; j < length; j++) {\\n newAddresses[j - 1] = A[j];\\n }\\n return (newAddresses, A[index]);\\n }\\n}\\n\",\"keccak256\":\"0x486f1a373f33aa167227600ac2d0bf95b37685413d98a3e745107188f00ae405\",\"license\":\"MIT\"},\"contracts/external/lib/DateTime.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// ----------------------------------------------------------------------------\\n// DateTime Library v2.0\\n//\\n// A gas-efficient Solidity date and time library\\n//\\n// https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary\\n//\\n// Tested date range 1970/01/01 to 2345/12/31\\n//\\n// Conventions:\\n// Unit | Range | Notes\\n// :-------- |:-------------:|:-----\\n// timestamp | >= 0 | Unix timestamp, number of seconds since 1970/01/01 00:00:00 UTC\\n// year | 1970 ... 2345 |\\n// month | 1 ... 12 |\\n// day | 1 ... 31 |\\n// hour | 0 ... 23 |\\n// minute | 0 ... 59 |\\n// second | 0 ... 59 |\\n// dayOfWeek | 1 ... 7 | 1 = Monday, ..., 7 = Sunday\\n//\\n//\\n// Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018-2019. The MIT Licence.\\n//\\n// NOTE: This library has been pruned to keep only functions needed by zkp2p\\n// ----------------------------------------------------------------------------\\n\\nlibrary DateTime {\\n uint256 constant SECONDS_PER_DAY = 24 * 60 * 60;\\n uint256 constant SECONDS_PER_HOUR = 60 * 60;\\n uint256 constant SECONDS_PER_MINUTE = 60;\\n int256 constant OFFSET19700101 = 2440588;\\n\\n uint256 constant DOW_MON = 1;\\n uint256 constant DOW_TUE = 2;\\n uint256 constant DOW_WED = 3;\\n uint256 constant DOW_THU = 4;\\n uint256 constant DOW_FRI = 5;\\n uint256 constant DOW_SAT = 6;\\n uint256 constant DOW_SUN = 7;\\n\\n // ------------------------------------------------------------------------\\n // Calculate the number of days from 1970/01/01 to year/month/day using\\n // the date conversion algorithm from\\n // http://aa.usno.navy.mil/faq/docs/JD_Formula.php\\n // and subtracting the offset 2440588 so that 1970/01/01 is day 0\\n //\\n // days = day\\n // - 32075\\n // + 1461 * (year + 4800 + (month - 14) / 12) / 4\\n // + 367 * (month - 2 - (month - 14) / 12 * 12) / 12\\n // - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4\\n // - offset\\n // ------------------------------------------------------------------------\\n function _daysFromDate(uint256 year, uint256 month, uint256 day) internal pure returns (uint256 _days) {\\n require(year >= 1970);\\n int256 _year = int256(year);\\n int256 _month = int256(month);\\n int256 _day = int256(day);\\n\\n int256 __days = _day - 32075 + (1461 * (_year + 4800 + (_month - 14) / 12)) / 4\\n + (367 * (_month - 2 - ((_month - 14) / 12) * 12)) / 12\\n - (3 * ((_year + 4900 + (_month - 14) / 12) / 100)) / 4 - OFFSET19700101;\\n\\n _days = uint256(__days);\\n }\\n\\n function timestampFromDateTime(\\n uint256 year,\\n uint256 month,\\n uint256 day,\\n uint256 hour,\\n uint256 minute,\\n uint256 second\\n )\\n internal\\n pure\\n returns (uint256 timestamp)\\n {\\n timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + hour * SECONDS_PER_HOUR\\n + minute * SECONDS_PER_MINUTE + second;\\n }\\n}\\n\",\"keccak256\":\"0x64f6113ad342f8bd3c2eb74fde279401d604faf77dd08f6c16c3912c3519f170\",\"license\":\"MIT\"},\"contracts/external/lib/StringArrayUtils.sol\":{\"content\":\"/*\\n Copyright 2020 Set Labs Inc.\\n\\n Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n you may not use this file except in compliance with the License.\\n You may obtain a copy of the License at\\n\\n http://www.apache.org/licenses/LICENSE-2.0\\n\\n Unless required by applicable law or agreed to in writing, software\\n distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n See the License for the specific language governing permissions and\\n limitations under the License.\\n\\n SPDX-License-Identifier: Apache-2.0\\n*/\\n\\npragma solidity ^0.8.18;\\n\\n/**\\n * @title StringArrayUtils\\n * @author Set Protocol\\n *\\n * Utility functions to handle String Arrays\\n */\\nlibrary StringArrayUtils {\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input string to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(string[] memory A, string memory a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (keccak256(bytes(A[i])) == keccak256(bytes(a))) {\\n return (i, true);\\n }\\n }\\n return (type(uint256).max, false);\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The string to remove\\n */\\n function removeStorage(string[] storage A, string memory a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"String not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n}\",\"keccak256\":\"0x249b6dc922e7e1602f3c2e77075d3b9d259d3badc744241ecf2ca2ee1cbcd56c\",\"license\":\"Apache-2.0\"},\"contracts/external/lib/StringConversionUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\n// Building on zk-email's StringUtils library we add the ability to handle decimals when\\n// converting from string to Uint\\nlibrary StringConversionUtils {\\n \\n /**\\n * @notice Function that parses numbers returned as strings including floating point numbers. Returned floating point\\n * numbers are to have the desired amount of decimal specified. If the stringified version of the floating point\\n * number has more decimal places than desired then the function will revert in order to be maximally safe. If\\n * the returned number has multiple floating points then the function will revert.\\n *\\n * Examples: _s = \\\"12.34\\\", _expectedDecimals = 6 => 12340000\\n * _s = \\\"12.34\\\", _expectedDecimals = 2 => 1234\\n * _s = \\\"12.34\\\", _expectedDecimals = 1 => REVERT (we never want loss of precision only addition)\\n * _s = \\\"12.34.56\\\", _expectedDecimals = 6 => REVERT (Invalid number)\\n *\\n * @param _s String being processed\\n * @param _desiredDecimals Desired amount of decimal places\\n */\\n function stringToUint(string memory _s, uint256 _desiredDecimals) internal pure returns (uint256) {\\n return stringToUint(_s, 0x2E, _desiredDecimals);\\n }\\n\\n function stringToUint(\\n string memory _s,\\n bytes1 _decimalCharacter,\\n uint256 _desiredDecimals\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n bytes memory b = bytes(_s);\\n\\n uint256 result = 0;\\n uint256 decimalPlaces = 0;\\n\\n bool decimals = false;\\n for (uint256 i = 0; i < b.length; i++) {\\n if (b[i] >= 0x30 && b[i] <= 0x39) {\\n result = result * 10 + (uint256(uint8(b[i])) - 48);\\n }\\n\\n if (decimals) {\\n decimalPlaces++;\\n }\\n\\n if (b[i] == _decimalCharacter) {\\n require(decimals == false, \\\"String has multiple decimals\\\");\\n decimals = true;\\n }\\n }\\n\\n require(decimalPlaces <= _desiredDecimals, \\\"String has too many decimal places\\\");\\n return result * (10 ** (_desiredDecimals - decimalPlaces));\\n }\\n\\n /**\\n * @notice Function that returns a substring from _startIndex to _endIndex (non-inclusive).\\n *\\n * @param _str String being processed\\n * @param _startIndex Index to start parsing from\\n * @param _endIndex Index to stop parsing at (index not included in result)\\n */\\n function substring(string memory _str, uint _startIndex, uint _endIndex) internal pure returns (string memory ) {\\n bytes memory strBytes = bytes(_str);\\n bytes memory result = new bytes(_endIndex-_startIndex);\\n for(uint i = _startIndex; i < _endIndex; i++) {\\n result[i-_startIndex] = strBytes[i];\\n }\\n return string(result);\\n }\\n\\n function replaceString(\\n string memory _str,\\n string memory _lookupValue,\\n string memory _replaceValue\\n )\\n internal\\n pure\\n returns (string memory)\\n {\\n bytes memory strBytes = bytes(_str);\\n bytes memory lookupBytes = bytes(_lookupValue);\\n\\n uint256 lookupIndex = indexOf(_str, _lookupValue);\\n if (lookupIndex == type(uint256).max) {\\n return _str;\\n }\\n\\n // Split the original string into two parts: before and after the keyword\\n string memory beforeKeyword = substring(_str, 0, lookupIndex);\\n string memory afterKeyword = substring(_str, lookupIndex + lookupBytes.length, strBytes.length);\\n \\n return string.concat(beforeKeyword, _replaceValue, afterKeyword);\\n }\\n\\n function indexOf(string memory str, string memory substr) internal pure returns (uint) {\\n bytes memory strBytes = bytes(str);\\n bytes memory substrBytes = bytes(substr);\\n \\n if (strBytes.length < substrBytes.length) return type(uint256).max;\\n \\n for (uint i = 0; i <= strBytes.length - substrBytes.length; i++) {\\n bool found = true;\\n for (uint j = 0; j < substrBytes.length; j++) {\\n if (strBytes[i + j] != substrBytes[j]) {\\n found = false;\\n break;\\n }\\n }\\n if (found) return i;\\n }\\n \\n return type(uint256).max;\\n }\\n\\n function stringComparison(string memory _a, string memory _b) internal pure returns (bool) {\\n return (keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b)));\\n }\\n}\\n\",\"keccak256\":\"0xfcdfb3c2c8d5a6b7f480f827049782a70fb98f8b3838dcad0e0bb95237b94a0c\",\"license\":\"MIT\"},\"contracts/external/processors/ProxyBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport { Claims } from \\\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\\\";\\n\\nimport { AddressArrayUtils } from \\\"../lib/AddressArrayUtils.sol\\\";\\nimport { StringArrayUtils } from \\\"../lib/StringArrayUtils.sol\\\";\\nimport { INullifierRegistry } from \\\"../interfaces/INullifierRegistry.sol\\\";\\nimport { IProxyBaseProcessor } from \\\"../interfaces/IProxyBaseProcessor.sol\\\";\\nimport { ClaimVerifier } from \\\"../ClaimVerifier.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract ProxyBaseProcessor is IProxyBaseProcessor, Ownable {\\n\\n using AddressArrayUtils for address[];\\n using StringArrayUtils for string[];\\n\\n /* ============ State Variables ============ */\\n mapping(address => bool) public isWitness;\\n address[] public witnesses;\\n mapping(string => bool) public isProviderHash;\\n string[] public providerHashes; // Set of provider hashes that these proofs should be for\\n INullifierRegistry public immutable nullifierRegistry;\\n\\n /* ============ Events ============ */\\n event WitnessAdded(address witness);\\n event WitnessRemoved(address witness);\\n event ProviderHashAdded(string providerHash);\\n event ProviderHashRemoved(string providerHash);\\n\\n /* ============ Constructor ============ */\\n constructor(\\n INullifierRegistry _nulliferRegistry,\\n string[] memory _providerHashes\\n )\\n Ownable()\\n {\\n nullifierRegistry = _nulliferRegistry;\\n\\n for (uint256 i = 0; i < _providerHashes.length; i++) {\\n require(!isProviderHash[_providerHashes[i]], \\\"Provider hash already added\\\");\\n isProviderHash[_providerHashes[i]] = true;\\n providerHashes.push(_providerHashes[i]);\\n\\n emit ProviderHashAdded(_providerHashes[i]);\\n }\\n }\\n\\n /* ============ Admin Functions ============ */\\n\\n /**\\n * ONLY OWNER: Add witness address. Witness must not have been previously added.\\n *\\n * @param _newWitness Address of the new witness\\n */\\n function addWitness(address _newWitness) external onlyOwner {\\n require(!isWitness[_newWitness], \\\"Address is already a witness\\\");\\n\\n isWitness[_newWitness] = true;\\n witnesses.push(_newWitness);\\n\\n emit WitnessAdded(_newWitness);\\n }\\n\\n /**\\n * ONLY OWNER: Remove witness address. Witness must have been previously added.\\n *\\n * @param _removeWitness Address of witness to be removed\\n */\\n function removeWitness(address _removeWitness) external onlyOwner {\\n require(isWitness[_removeWitness], \\\"Address is not a witness\\\");\\n\\n delete isWitness[_removeWitness];\\n witnesses.removeStorage(_removeWitness);\\n\\n emit WitnessRemoved(_removeWitness);\\n }\\n\\n /**\\n * ONLY OWNER: Add provider hash string. Provider hash must not have been previously added.\\n *\\n * @param _newProviderHash New provider hash to be added\\n */\\n function addProviderHash(string memory _newProviderHash) external onlyOwner {\\n require(!isProviderHash[_newProviderHash], \\\"Provider hash already added\\\");\\n\\n isProviderHash[_newProviderHash] = true;\\n providerHashes.push(_newProviderHash);\\n\\n emit ProviderHashAdded(_newProviderHash);\\n }\\n\\n /**\\n * ONLY OWNER: Remove provider hash string. Provider hash must have been previously added.\\n *\\n * @param _removeProviderHash Provider hash to be removed\\n */\\n function removeProviderHash(string memory _removeProviderHash) external onlyOwner {\\n require(isProviderHash[_removeProviderHash], \\\"Provider hash not found\\\");\\n\\n delete isProviderHash[_removeProviderHash];\\n providerHashes.removeStorage(_removeProviderHash);\\n\\n emit ProviderHashRemoved(_removeProviderHash);\\n }\\n\\n /* ============ Public Functions ============ */\\n \\n /**\\n * Verify proof generated by witnesses. Claim is constructed by hashing claimInfo (provider, context, parameters)\\n * to get the identifier. And then signing on (identifier, owner, timestamp, epoch) to get claim signature. \\n * This function verifies a claim by performing the following checks on the claim\\n * - Calculates the hash of the claimInfo and checks if it matches the identifier in the claim\\n * - Checks if the signatures are valid and from the witnesses\\n * This function reverts if\\n * - No signatures are found on the proof\\n * - Number of signatures is not equal to the number of witnesses\\n * - ClaimInfo hash does not match the identifier in the claim\\n * - Signatures are invalid (not from the witnesses)\\n * \\n * DEV NOTE: This function does NOT validate that the claim provider hash is valid. That is the \\n * responsibility of the caller.\\n * \\n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\\n * \\n * @param proof Proof to be verified\\n */\\n function verifyProofSignatures(Proof memory proof) public view returns (bool) {\\n\\n // create signed claim using claimData and signature.\\n require(proof.signedClaim.signatures.length > 0, \\\"No signatures\\\");\\n Claims.SignedClaim memory signed = Claims.SignedClaim(\\n proof.signedClaim.claim,\\n proof.signedClaim.signatures\\n );\\n\\n // check if the hash from the claimInfo is equal to the infoHash in the claimData\\n bytes32 hashed = Claims.hashClaimInfo(proof.claimInfo);\\n require(proof.signedClaim.claim.identifier == hashed, \\\"ClaimInfo hash doesn't match\\\");\\n\\n // Recover signers of the signed claim\\n address[] memory signedWitnesses = Claims.recoverSignersOfSignedClaim(signed);\\n\\n // check if the number of signatures is equal to the number of witnesses\\n require(\\n signedWitnesses.length == witnesses.length,\\n \\\"Number of signatures not equal to number of witnesses\\\"\\n );\\n\\n // Check signatures are from witnesses\\n for (uint256 i = 0; i < signed.signatures.length; i++) {\\n bool found = false;\\n for (uint j = 0; j < witnesses.length; j++) {\\n if (signedWitnesses[i] == witnesses[j]) {\\n found = true;\\n break;\\n }\\n }\\n require(found, \\\"Signature not appropriate\\\");\\n }\\n\\n return true;\\n }\\n\\n\\n /* ============ View Functions ============ */\\n\\n function getWitnesses() external view returns (address[] memory) {\\n return witnesses;\\n }\\n\\n function getProviderHashes() external view returns (string[] memory) {\\n return providerHashes;\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n function _validateProviderHash(string memory _providerHash) internal view returns (bool) {\\n return isProviderHash[_providerHash];\\n }\\n \\n function _validateAndAddNullifier(bytes[] memory _sigArray) internal {\\n bytes32 nullifier = keccak256(abi.encode(_sigArray));\\n require(!nullifierRegistry.isNullified(nullifier), \\\"Nullifier has already been used\\\");\\n nullifierRegistry.addNullifier(nullifier);\\n }\\n}\\n\",\"keccak256\":\"0xbfbe301dc003e40793876e36d29ac7da3b294031dc74d26f4e41fcdf3deb1144\",\"license\":\"MIT\"},\"contracts/interfaces/IVerifyDomainProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\nimport { IProxyBaseProcessor } from \\\"../external/interfaces/IProxyBaseProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IVerifyDomainProcessor is IProxyBaseProcessor {\\n \\n struct DomainRaw {\\n string name;\\n uint256 expiryTime;\\n }\\n\\n function verifyProofs(\\n Proof[] memory _proofs\\n ) \\n external \\n returns (DomainRaw[] memory domains);\\n}\",\"keccak256\":\"0xe66335a9d8fb3d03a9ee76bf44fbec775311aeed3f6666862f06124b6605a123\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60c06040523462000051576200001f620000186200027f565b91620002a7565b6040516136af620008888239608051818181610b4a015261357d015260a0518181816108a50152610fff01526136af90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200008e57604052565b62000056565b90620000ab620000a360405190565b92836200006c565b565b6001600160a01b031690565b90565b6001600160a01b0381165b036200005157565b90505190620000ab82620000bc565b6001600160a01b038116620000c7565b90505190620000ab82620000de565b6001600160401b0381116200008e5760208091020190565b6001600160401b0381116200008e57602090601f01601f19160190565b0190565b60005b8381106200014a5750506000910152565b818101518382015260200162000139565b90929192620001746200016e8262000115565b62000094565b938185526020850190828401116200005157620000ab9262000136565b9080601f8301121562000051578151620000b9926020016200015b565b929190620001c06200016e82620000fd565b9381855260208086019202810191838311620000515781905b838210620001e8575050505050565b81516001600160401b03811162000051576020916200020b878493870162000191565b815201910190620001d9565b9080601f8301121562000051578151620000b992602001620001ae565b9160608383031262000051576200024c8284620000cf565b926200025c8360208301620000ee565b60408201519093906001600160401b0381116200005157620000b9920162000217565b620002a262003f3780380380620002968162000094565b92833981019062000234565b909192565b91620002b391620006bb565b60a052565b620000b9620000b9620000b99290565b634e487b7160e01b600052601160045260246000fd5b6000198114620002ee5760010190565b620002c8565b634e487b7160e01b600052603260045260246000fd5b9062000314825190565b81101562000326576020809102010190565b620002f4565b62000132620003479260209262000341815190565b94859290565b9384910162000136565b620003646200013291602094936200032c565b918252565b620003816200037760405190565b9283928362000351565b03902090565b620000b99162000369565b156200039a57565b60405162461bcd60e51b815260206004820152601b60248201527f50726f7669646572206861736820616c726561647920616464656400000000006044820152606490fd5b9060ff905b9181191691161790565b9062000401620000b96200040992151590565b8254620003df565b9055565b8054821015620003265762000429600191600052602060002090565b91020190600090565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801562000481575b60208310146200047b57565b62000448565b91607f16916200046f565b9160001960089290920291821b911b620003e4565b9190620004b6620000b96200040993620002b8565b9083546200048c565b620000ab91600091620004a1565b818110620004d9575050565b80620004e96000600193620004bf565b01620004cd565b9190601f81116200050057505050565b62000514620000ab93600052602060002090565b906020601f84018190048301931062000538575b6020601f909101040190620004cd565b909150819062000528565b906200054d815190565b906001600160401b0382116200008e5762000575826200056e85546200045e565b85620004f0565b602090601f8311600114620005b45762000409929160009183620005a8575b5050600019600883021c1916906002021790565b01519050388062000594565b601f19831691620005ca85600052602060002090565b9260005b8181106200060b57509160029391856001969410620005f1575b50505002019055565b01516000196008601f8516021c19169055388080620005e8565b91936020600181928787015181550195019201620005ce565b91906200063657620000ab9162000543565b62000432565b90815491680100000000000000008310156200008e578262000668916001620000ab950181556200040d565b9062000624565b620006946200069e602093620001329362000688815190565b80835293849260200190565b9586910162000136565b601f01601f191690565b6020808252620000b9929101906200066f565b919091620006c8620007c2565b608052620006d76000620002b8565b620006e4620000b9845190565b811015620007bd57620007b7906200074d60036200072c62000726620007226200071b62000713878b6200030a565b518562000387565b5460ff1690565b1590565b62000392565b620007476001916200073f85896200030a565b519062000387565b620003ee565b6200076760046200075f83876200030a565b51906200063c565b6200077381856200030a565b51620007ae7fc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f409691620007a460405190565b91829182620006a8565b0390a1620002de565b620006d7565b509050565b620000ab3362000825565b906001600160a01b0390620003e4565b620000b990620000ad906001600160a01b031682565b620000b990620007dd565b620000b990620007f3565b906200081d620000b96200040992620007fe565b8254620007cd565b6000546001600160a01b0316906200083f81600062000809565b620008766200086f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093620007fe565b91620007fe565b916200088160405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c80631cba9bed146101225780632ca6927d1461011d57806350262c001461011857806357c6e12a1461011357806359e26be11461010e578063670a8cb714610109578063715018a6146101045780637b103999146100ff5780637de24fcf146100fa5780638da5cb5b146100f557806396d195bd146100f0578063b870676c146100eb578063bd6e7741146100e6578063c2107e73146100e1578063ee2f13cd146100dc578063f2fde38b146100d75763fa7643f4036101d457610c7e565b610c3c565b610c24565b610bfd565b610b6f565b610b31565b610acb565b610a40565b610a19565b610890565b610878565b610837565b6107d9565b61079d565b6105a6565b6102ef565b61021c565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761015e57604052565b610127565b9061017761017060405190565b928361013d565b565b6001600160401b03811161015e57602090601f01601f19160190565b0190565b90826000939282370152565b909291926101ba6101b582610179565b610163565b938185526020850190828401116101d45761017792610199565b600080fd5b9080601f830112156101d4578160206101f4933591016101a5565b90565b906020828203126101d45781356001600160401b0381116101d4576101f492016101d9565b346101d45761023461022f3660046101f7565b612392565b604051005b0390f35b60005b8381106102505750506000910152565b8181015183820152602001610240565b61019561027892602092610272815190565b94859290565b9384910161023d565b9052565b6102956101959160209493610260565b918252565b6102af6102a660405190565b92839283610285565b03902090565b6101f49161029a565b6101f4916008021c5b60ff1690565b906101f491546102be565b6101f4906102ea6003916000926102b5565b6102cd565b346101d45761023961030a6103053660046101f7565b6102d8565b60405191829182901515815260200190565b9190916060818403126101d4576103336060610163565b9281356001600160401b0381116101d457816103509184016101d9565b845260208201356001600160401b0381116101d457816103719184016101d9565b602085015260408201356001600160401b0381116101d45761039392016101d9565b6040830152565b805b036101d457565b905035906101778261039a565b6001600160a01b031690565b6001600160a01b03811661039c565b90503590610177826103bc565b63ffffffff811661039c565b90503590610177826103d8565b9190916080818403126101d45761044a61040b6080610163565b93600061041882856103a3565b90860152602061042a828286016103cb565b90860152604061043c828286016103e4565b9086015260608093016103e4565b90830152565b6001600160401b03811161015e5760208091020190565b9291906104766101b582610450565b93818552602080860192028101918383116101d45781905b83821061049c575050505050565b81356001600160401b0381116101d4576020916104bc87849387016101d9565b81520191019061048e565b9080601f830112156101d4578160206101f493359101610467565b91909160a0818403126101d4576104f96040610163565b92600061050682846103f1565b9085015260808201356001600160401b0381116101d45761052792016104c7565b6020830152565b9190916040818403126101d4576105456040610163565b9281356001600160401b0381116101d4578161056291840161031c565b845260208201356001600160401b0381116101d45761052792016104e2565b906020828203126101d45781356001600160401b0381116101d4576101f4920161052e565b346101d45761023961030a6105bc366004610581565b6128f5565b906020828203126101d4576101f4916103a3565b634e487b7160e01b600052603260045260246000fd5b805482101561060e57610605600191600052602060002090565b91020190600090565b6105d5565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561065f575b602083101461065a57565b610629565b91607f169161064f565b8054600093929161068661067c8361063f565b8085529360200190565b91600181169081156106d8575060011461069f57505050565b6106b29192939450600052602060002090565b916000925b8184106106c45750500190565b8054848401526020909301926001016106b7565b92949550505060ff1916825215156020020190565b906101f491610669565b906101776107119261070860405190565b938480926106ed565b038361013d565b90600010610729576101f4906106f7565b610613565b6004600061073a825490565b83101561075557506101f49161074f916105eb565b90610718565b80fd5b6107796107826020936101959361076d815190565b80835293849260200190565b9586910161023d565b601f01601f191690565b60208082526101f492910190610758565b346101d4576102396107b86107b33660046105c1565b61072e565b6040515b9182918261078c565b906020828203126101d4576101f4916103cb565b346101d4576102346107ec3660046107c5565b611d4f565b6101f4916008021c6001600160a01b031690565b906101f491546107f1565b6002600061081c825490565b83101561075557506101f491610831916105eb565b90610805565b346101d45761023961085261084d3660046105c1565b610810565b6040515b918291826001600160a01b03909116815260200190565b60009103126101d457565b346101d45761088836600461086d565b610234610cee565b346101d4576108a036600461086d565b6102397f0000000000000000000000000000000000000000000000000000000000000000610852565b9291906108d86101b582610450565b93818552602080860192028101918383116101d45781905b8382106108fe575050505050565b81356001600160401b0381116101d45760209161091e878493870161052e565b8152019101906108f0565b9080601f830112156101d4578160206101f4933591016108c9565b906020828203126101d45781356001600160401b0381116101d4576101f49201610929565b906101f49060208061098a6040840160008701518582036000870152610758565b940151910152565b906101f491610969565b906109b26109a8835190565b8083529160200190565b90816109c46020830284019460200190565b926000915b8383106109d857505050505090565b909192939460206109fb6109f483856001950387528951610992565b9760200190565b93019301919392906109c9565b60208082526101f49291019061099c565b346101d457610239610a34610a2f366004610944565b610fed565b60405191829182610a08565b346101d457610a5036600461086d565b610239610852610cac565b90610a7b610a74610a6a845190565b8084529260200190565b9260200190565b9060005b818110610a8c5750505090565b909192610ab2610aab60019286516001600160a01b0316815260200190565b9460200190565b929101610a7f565b60208082526101f492910190610a5b565b346101d457610adb36600461086d565b610239610ae66133e7565b60405191829182610aba565b6101f4906103b0906001600160a01b031682565b6101f490610af2565b6101f490610b06565b61028190610b0f565b6020810192916101779190610b18565b346101d457610b4136600461086d565b604051806102397f000000000000000000000000000000000000000000000000000000000000000082610b21565b346101d457610234610b823660046101f7565b6122ce565b906101f491610758565b90610b9d6109a8835190565b9081610baf6020830284019460200190565b926000915b838310610bc357505050505090565b90919293946020610bdf6109f483856001950387528951610b87565b9301930191939290610bb4565b60208082526101f492910190610b91565b346101d457610c0d36600461086d565b610239610c1861344e565b60405191829182610bec565b346101d457610234610c373660046107c5565b611e51565b346101d457610234610c4f3660046107c5565b610e05565b90610c5e90610b0f565b600052602052604060002090565b6101f4906102ea600191600092610c54565b346101d45761023961030a610c943660046107c5565b610c6c565b6101f4906103b0565b6101f49054610c99565b6101f46000610ca2565b610cbe610d4a565b610177610cdc565b6103b06101f46101f49290565b6101f490610cc6565b610177610ce96000610cd3565b610e3e565b610177610cb6565b15610cfd57565b60405162461bcd60e51b815280610d46600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b610177610d55610cac565b610d6e610d61336103b0565b916001600160a01b031690565b14610cf6565b61017790610d80610d4a565b610de0565b15610d8c57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61017790610ce9610df46103b06000610cd3565b6001600160a01b0383161415610d85565b61017790610d74565b906001600160a01b03905b9181191691161790565b90610e336101f4610e3a92610b0f565b8254610e0e565b9055565b610e486000610ca2565b90610e54816000610e23565b610e87610e817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610b0f565b91610b0f565b91610e9160405190565b600090a3565b15610e9e57565b60405162461bcd60e51b815260206004820152601660248201527513db9b1e481c9959da5cdd1c9e4818d85b8818d85b1b60521b6044820152606490fd5b906102956101b583610450565b6101f46040610163565b610efb610ee9565b906060825260006020830152565b6101f4610ef3565b60005b828110610f2057505050565b602090610f2b610f09565b8184015201610f14565b90610177610f4b610f4584610edc565b93610450565b601f190160208401610f11565b6101f46101f46101f49290565b634e487b7160e01b600052601160045260246000fd5b6000198114610f8a5760010190565b610f65565b90610f98825190565b81101561060e576020809102010190565b15610fb057565b60405162461bcd60e51b815260206004820152601560248201527409cde40ecc2d8d2c840e0e4deecd2c8cae490c2e6d605b1b6044820152606490fd5b9061102a336110246001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016610d61565b14610e97565b61103a611035835190565b610f35565b916000908361104883610f58565b6110536101f4845190565b8110156110de578061109e6110be6110ac6110996110a760208061107a6110d9998c610f8f565b51611084816128f5565b5061108e81611221565b999199969096613458565b610fa9565b01510151613550565b6113f1565b6105276110b7610ee9565b9389850152565b6110c88289610f8f565b526110d38188610f8f565b50610f7b565b611048565b5093505050565b6102c76101f46101f49290565b6101f460056110e5565b9092919261110c6101b582610179565b938185526020850190828401116101d4576101779261023d565b9080601f830112156101d45781516101f4926020016110fc565b92919061114f6101b582610450565b93818552602080860192028101918383116101d45781905b838210611175575050505050565b81516001600160401b0381116101d4576020916111958784938701611126565b815201910190611167565b9080601f830112156101d45781516101f492602001611140565b906020828203126101d45781516001600160401b0381116101d4576101f492016111a0565b60409061120d6112016101779597969460608401908482036000860152610758565b60ff9097166020830152565b019015159052565b6040513d6000823e3d90fd5b516040015173BA4D6eA209c3C3A6B0B31fE136a5F0eFd9De2bd191634be6d4f89160009061124d6110f2565b9461126e6001956112798761126160405190565b998a968795869560e01b90565b8552600485016111df565b03915af49283156112f2576000936112cf575b506112c86112b66112b06112a96112a36000610f58565b87610f8f565b5194610f58565b85610f8f565b51936112c26002610f58565b90610f8f565b5191929190565b6112eb91933d8091833e6112e3818361013d565b8101906111ba565b913861128c565b611215565b6001600160401b03811161015e5760200290565b6101b56101f4916112f7565b60005b82811061132657505050565b60608282015260200161131a565b9061017761134a6113448461130b565b936112f7565b83611317565b6101f46006611334565b90611363825190565b81101561060e570160200190565b61138461137e6101f49290565b60f81b90565b6001600160f81b03191690565b90600681101561060e576020020190565b91908201809211610f8a57565b156113b657565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206461746520737472696e6760681b6044820152606490fd5b906000916113fd611350565b8390600061140a81610f58565b846114166101f4825190565b82101561150a578161143961142b828461135a565b516001600160f81b03191690565b611454611446602d611371565b916001600160f81b03191690565b149182156114e7575b82156114c3575b5050611479575b61147490610f7b565b61140a565b9295836114869186611b86565b6114908784611391565b5261149b8683611391565b506114746114bb6114b56114af6001610f58565b866113a2565b97610f7b565b93905061146b565b6114d292509061142b9161135a565b6114df6114466054611371565b148138611464565b91506114f661142b828461135a565b611503611446603a611371565b149161145d565b5050929161152f61155c92936101f496976115296115258390565b5190565b91611b86565b6115398285611391565b526115448184611391565b506115566115526005610f58565b9190565b146113af565b61158261157b61157461156e85610f58565b84611391565b5193610f58565b8093611905565b9061159a8361159461156e6001610f58565b51611905565b6115b1846115946115ab6002610f58565b85611391565b906115e1856115946115d0826115946115ca6003610f58565b89611391565b956115db6004610f58565b90611391565b9361161b565b6101f462015180610f58565b81810292918115918404141715610f8a57565b6101f4610e10610f58565b6101f4603c610f58565b61166a9361165b6116526116446101f499989661165b966116619661163e600090565b50611712565b61164c6115e7565b906115f3565b9161164c611606565b906113a2565b9161164c611611565b6113a2565b156101d457565b91908083039260009091128015828513169184121617610f8a57565b919082810192600013801591841291821691151617610f8a57565b634e487b7160e01b600052601260045260246000fd5b81156116de57600160ff1b8114600019831416610f8a570590565b6116ad565b8181029291600160ff1b81146000831216610f8a578184051490151715610f8a57565b6101f462253d8c610f58565b61171d6107b2610f58565b8110156117299061166f565b61173290610f58565b9061173c90610f58565b9161174690610f58565b611751617d4b610f58565b61175a91611676565b906105b56117696112c0610f58565b6117739083611692565b600e9161177f83610f58565b6117899087611676565b91600c9261179684610f58565b61179f916116c3565b6117a891611692565b906117b290610f58565b906117bc916116e3565b936004946117c986610f58565b6117d2916116c3565b6117db91611692565b61016f6117e86002610f58565b6117f29088611676565b6117fb85610f58565b6118059089611676565b61180e85610f58565b611817916116c3565b61182085610f58565b611829916116e3565b61183291611676565b9061183c90610f58565b90611846916116e3565b61184f83610f58565b611858916116c3565b61186191611692565b94600393611870611324610f58565b61187991611692565b9261188390610f58565b61188c91611676565b9061189690610f58565b61189f916116c3565b6118a891611692565b6118b26064610f58565b6118bb916116c3565b906118c590610f58565b906118cf916116e3565b906118d990610f58565b6118e2916116c3565b6118eb91611676565b6118f3611706565b6118fc91611676565b6101f490610f58565b6101f49190611914602e611371565b90611a04565b6102c76101f46101f49260ff1690565b6101f49060f81c61191a565b6101f46101f46101f49260ff1690565b91908203918211610f8a57565b1561195a57565b60405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606490fd5b156119a657565b60405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608490fd5b604d8111610f8a57600a0a90565b92600091611a1183610f58565b808493815b611a216101f48a5190565b811015611b22578589611a3761142b848361135a565b603090611a4661144683611371565b101580611b00575b611ab6575b5050611aa6575b611a6761142b828b61135a565b611a7a6001600160f81b03198716611446565b14611a8e575b611a8990610f7b565b611a16565b94611a9e90151587151514611953565b600194611a80565b92611ab090610f7b565b92611a5a565b61165b90611af2611aec611ae7611ae261142b89611adc611af89a9d61164c600a610f58565b9861135a565b61192a565b611936565b91610f58565b90611946565b928938611a53565b50611b0e61142b858461135a565b611b1b6114466039611371565b1115611a4e565b509650935061164c9250611b4c91506101f494611b47611b3f8290565b83111561199f565b611946565b6119f6565b906102956101b583610179565b369037565b90610177611b79611b7384611b51565b93610179565b601f190160208401611b5e565b909290611b9b611b968585611946565b611b63565b91845b845b811015611be057611bd981611bbb61142b611ba0948761135a565b611bd3611bc88a84611946565b9160001a918861135a565b53610f7b565b9050611b9e565b509350506101f4915090565b61017790611bf8610d4a565b611cdc565b6101f4906102c7565b6101f49054611bfd565b15611c1757565b60405162461bcd60e51b815260206004820152601c60248201527f4164647265737320697320616c72656164792061207769746e657373000000006044820152606490fd5b9060ff90610e19565b90611c756101f4610e3a92151590565b8254611c5c565b916001600160a01b0360089290920291821b911b610e19565b921b90565b9190611cab6101f4610e3a93610b0f565b908354611c7c565b90815491600160401b83101561015e5782611cd6916001610177950181556105eb565b90611c9a565b611d116001611d02611cfd611cf9611cf48685610c54565b611c06565b1590565b611c10565b611d0c8382610c54565b611c65565b611d1c816002611cb3565b611d4a7ff5944521c155e80db583372b9992336b6616b14dfb924a5cf6ef97b256d280349161085660405190565b0390a1565b61017790611bec565b61017790611d64610d4a565b611dee565b15611d7057565b60405162461bcd60e51b815260206004820152601860248201527f41646472657373206973206e6f742061207769746e65737300000000000000006044820152606490fd5b91906008610e19910291611c9560ff841b90565b9190611dda6101f4610e3a93151590565b908354611db5565b61017791600091611dc9565b611e186000611e13836001611e0e611e09611cf48484610c54565b611d69565b610c54565b611de2565b611e23816002611f32565b611d4a7f8b5785dce93ca82765b1cc25cedcda1b501288cb23a1fd171c0091d83900f9bd9161085660405190565b61017790611d58565b90611e75611e69610a6a845490565b92600052602060002090565b9060005b818110611e865750505090565b909192611eb3611eac600192611e9b87610ca2565b6001600160a01b0316815260200190565b9460010190565b929101611e79565b906101f491611e5a565b9061017761071192611ed660405190565b93848092611ebb565b6101f490611ec5565b634e487b7160e01b600052603160045260246000fd5b61017791600091611c9a565b80548015611f2d576000190190611f2a611f2483836105eb565b90611efe565b55565b611ee8565b611f47611f4e92611f4283611edf565b611fe5565b9092901590565b15611f905760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b61017791611fa9611f9f835490565b611af26001610f58565b90818103611fb9575b5050611f0a565b611cd6611fcc610831611fd394866105eb565b91846105eb565b3880611fb2565b6101f4600019610f58565b91908251926000611ff581610f58565b855b81101561204c5761201861200b8285610f8f565b516001600160a01b031690565b61202a6001600160a01b038616610d61565b146120425761203b611ff791610f7b565b9050611ff5565b9450505050600190565b5093505050611552611fda565b61017790612065610d4a565b61226c565b1561207157565b60405162461bcd60e51b815260206004820152601b60248201527f50726f7669646572206861736820616c726561647920616464656400000000006044820152606490fd5b9160001960089290920291821b911b610e19565b91906120db6101f4610e3a93610f58565b9083546120b6565b610177916000916120ca565b8181106120fa575050565b8061210860006001936120e3565b016120ef565b9190601f811161211d57505050565b61212f61017793600052602060002090565b906020601f840181900483019310612152575b6020601f909101045b01906120ef565b9091508190612142565b600019600883021c1916906002021790565b90612177815190565b906001600160401b03821161015e5761219a82612194855461063f565b8561210e565b602090601f83116001146121c857610e3a9291600091836121bd575b505061215c565b0151905038806121b6565b601f198316916121dd85600052602060002090565b9260005b81811061221c57509160029391856001969410612202575b50505002019055565b01516000196008601f8516021c19165b90553880806121f9565b919360206001819287870151815501950192016121e1565b9190610729576101779161216e565b90815491600160401b83101561015e5782612266916001610177950181556105eb565b90612234565b6122956003612289612284611cf9611cf486856102b5565b61206a565b611d0c836001926102b5565b6122a0816004612243565b611d4a7fc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096916107bc60405190565b61017790612059565b610177906122e3610d4a565b612334565b156122ef57565b60405162461bcd60e51b815260206004820152601760248201527f50726f76696465722068617368206e6f7420666f756e640000000000000000006044820152606490fd5b6123596000611e1383600361235461234f611cf484846102b5565b6122e8565b6102b5565b6123648160046126aa565b611d4a7f6f594b4b4f0580c66aabba75218163a99fa1fe330a171cc9e2bfd8e167db22f8916107bc60405190565b610177906122d7565b6101f4906106f7565b906123ad825490565b6123b681610edc565b926123ca6020850191600052602060002090565b6000915b8383106123db5750505050565b6001602081926123ea8561239b565b8152019201920191906123ce565b6101f4906123a4565b6101f4905461063f565b908082146124da5761241c81612401565b906001600160401b03821161015e5761243982612194855461063f565b600090601f831160011461246657610e3a92916000918361245b57505061215c565b0154905038806121b6565b9061247b601f19841692600052602060002090565b9061248b85600052602060002090565b92815b8181106124c2575091600293918560019694106124ae5750505002019055565b01546000196008601f8516021c1916612212565b9193600180602092878701548155019501920161248e565b5050565b9190610729576101779161240b565b9061250090600019906020036008021c90565b8154169055565b9060009161252561251d82600052602060002090565b92835461215c565b905555565b919290602082101561258257601f841160011461254c57610e3a92935061215c565b509061257d61017793600161257461256985600052602060002090565b92601f602091010490565b820191016120ef565b612507565b506125bb8293612599600194600052602060002090565b61214b6020601f860104820192601f8616806125c3575b50601f602091010490565b600202179055565b6125cf908886036124ed565b386125b0565b929091600160401b821161015e576020111561261c5760208110156125fd57610e3a9161215c565b60019160ff191661261384600052602060002090565b55600202019055565b60019150600202019055565b9081546126348161063f565b9081831161265d575b81831061264b575b50505050565b6126549361252a565b38808080612645565b612669838383876125d5565b61263d565b600061017791612628565b90600003610729576101779061266e565b80548015611f2d576000190190611f2a6126a483836105eb565b90612679565b611f476126bf926126ba836123f8565b612744565b156127005760405162461bcd60e51b815260206004820152601460248201527329ba3934b733903737ba1034b71030b93930bc9760611b6044820152606490fd5b6101779161270f611f9f835490565b9081810361271f575b505061268a565b61273761272f61273d93856105eb565b5091846105eb565b906124de565b3880612718565b9190825192600061275481610f58565b855b8110156127ac5761276a6115258285610f8f565b61277c612775825190565b9160200190565b20612794611552865b612790612775825190565b2090565b14612042576127a561275691610f7b565b9050612754565b509350505081199190565b156127be57565b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b156127fa57565b60405162461bcd60e51b815260206004820152601c60248201527f436c61696d496e666f206861736820646f65736e2774206d61746368000000006044820152606490fd5b1561284657565b60405162461bcd60e51b815260206004820152603560248201527f4e756d626572206f66207369676e617475726573206e6f7420657175616c20746044820152746f206e756d626572206f66207769746e657373657360581b6064820152608490fd5b156128b057565b60405162461bcd60e51b815260206004820152601960248201527f5369676e6174757265206e6f7420617070726f707269617465000000000000006044820152606490fd5b906020820190815160200151612909905190565b9160009261291684610f58565b10612920906127b7565b828080808451015196845160200151612937610ee9565b98838a01906129439152565b6020890152015161295390612efe565b925101510161296190611525565b1461296b906127f3565b61297483612a5b565b805191600292612982845490565b1461298c9061283f565b61299584610f58565b935b6129a66101f460208801515190565b851015612a405780956129b882610f58565b6129c36101f4875490565b811015612a28576129d761200b8887610f8f565b6129ea610d616103b0610831858b6105eb565b146129fd576129f890610f7b565b6129b8565b50946129a69196506020612a1d6101f492612a1860016128a9565b610f7b565b969792505050612997565b50946020612a1d6101f492612a186129a6959a6128a9565b509350505050600190565b90610177611b79610f4584610edc565b6020612a6a6000830151612b2b565b910190612a7e612a7983515190565b612a4b565b91612a896000610f58565b612a956101f483515190565b811015612ad55780612a18612ab8612ab1612ad0948651610f8f565b5186612c02565b612ac28388610f8f565b906001600160a01b03169052565b612a89565b50505090565b610195816020939052565b6101f46101f46101f49263ffffffff1690565b92612b25612b18612b2594612b25612b186101f49998612b1897610260565b600560f91b815260010190565b90610260565b6101f4612b67612b3a83611525565b612b62612b4660405190565b8092612b56602083019182612adb565b9081038252038261013d565b613130565b612b83612b7e60208501516001600160a01b031690565b612fb9565b90612b56612bbf612bae612ba96060612bb3612bae612ba960408c015163ffffffff1690565b612ae6565b61329e565b98015163ffffffff1690565b604051958694602086019485612af9565b7f19457468657265756d205369676e6564204d6573736167653a0a00000000000081526101f49291612b2591601a0182565b90612b56612c326101f493612c15600090565b50612c21612bae825190565b604051938492602084019283612bd0565b612c3d612775825190565b206101f491612c4b91612dc1565b919091612c82565b634e487b7160e01b600052602160045260246000fd5b60051115612c7357565b612c53565b9061017782612c69565b612c8c6000612c78565b612c9582612c78565b03612c9d5750565b612ca76001612c78565b612cb082612c78565b03612cfa5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b612d046002612c78565b612d0d82612c78565b03612d575760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b612d6a612d646003612c78565b91612c78565b14612d7157565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b908051612dd16115526041610f58565b03612df757612df3916020820151906060604084015193015160001a90612e36565b9091565b5050612e036000610cd3565b90600290565b612e3261017794610393606094989795612e28608086019a6000870152565b60ff166020850152565b0152565b919291612e42836118fc565b612e6e6115527f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0610f58565b11612ed257612e8e600093602095612e8560405190565b94859485612e09565b838052039060015afa156112f25760005190600091612eac83610cd3565b6001600160a01b0381166001600160a01b03831614612eca57509190565b925050600190565b50505050612ee06000610cd3565b90600390565b6101f49392612b25612b18612b1893612b2595610260565b8051602082015160409283015192516127859290612b5690948593602085019384612ee6565b6101f49081906001600160a01b031681565b60ff8111610f8a5760020a90565b905b9081156116de570490565b61138461137e6101f49260ff1690565b612f469060ff165b9160ff1690565b612f7c9060ff16612f69565b029060ff8216918203610f8a57565b612f979060ff16612f69565b90039060ff8211610f8a57565b61060f60f31b81526101f49190600201612b25565b90612fc7611b966028610f58565b600092612fd384610f58565b612fdd6014610f58565b8110156130d45780613037611bd36130c56130bb6130cf956130376130b58c8b6130af613051611ae261304c8f61301e61301961304792610b06565b612f24565b61304161303c6008613037611aec8f611b476013610f58565b6115f3565b612f36565b90612f44565b6110e5565b612f51565b9261309a61309461304c60109661308e61307661304c6130708b6110e5565b84612f61565b986130896130838b61192a565b916110e5565b612f70565b90612f8b565b9461323a565b6130a78860029d8e610f58565b911a9261135a565b5361323a565b95610f58565b61165b6001610f58565b91881a918661135a565b612fd3565b50506101f49192506101f46130e860405190565b8092612b56602083019182612fa4565b6131026010611b51565b6f181899199a1a9b1b9c1cb0b131b232b360811b602082015290565b6101f46130f8565b81156116de570690565b90815191613146611b9660029461164c86610f58565b9061314f61311e565b60009161315b83610f58565b6131666101f4835190565b81101561320c57806131a661142b6131a061318a611ae261142b613207978961135a565b61319b613195895190565b91611936565b612f44565b8661135a565b6131c56131bb6131b58b610f58565b846115f3565b91871a918861135a565b536131ef61142b6131a06131df611ae261142b868961135a565b6131ea613195895190565b613126565b611bd36131bb6130bb6132018c610f58565b856115f3565b61315b565b505050506101f49192506101f46130e860405190565b61322e9060ff16612f69565b019060ff8211610f8a57565b6132439061192a565b61324d600a6110e5565b60ff8216101561326e5761304c6101f49161326860306110e5565b90613222565b61304c6101f49161326860576110e5565b6132896001611b51565b600360fc1b602082015290565b6101f461327f565b6000916132aa83610f58565b821461337257908060005b6132be85610f58565b83146132e1576132d06132db91610f7b565b92613041600a610f58565b916132b5565b91506132ec82611b63565b915b6132f785610f58565b82146133675761330e61336191611af26001610f58565b91613041600a8461335b61335261304c603061334d61308361304761334761333e6133388b610f58565b8d612f44565b61164c8b610f58565b8b611946565b613222565b8a1a918861135a565b53610f58565b906132ee565b50506101f491925090565b9150506101f4613296565b9061338c611e69610a6a845490565b9060005b81811061339d5750505090565b9091926133b2611eac600192611e9b87610ca2565b929101613390565b906101f49161337d565b90610177610711926133d560405190565b938480926133ba565b6101f4906133c4565b6101f460026133de565b906133fa825490565b61340381610edc565b926134176020850191600052602060002090565b6000915b8383106134285750505050565b6001602081926134378561239b565b81520192019201919061341b565b6101f4906133f1565b6101f46004613445565b611cf46101f491613467600090565b5060036102b5565b9061347b6109a8835190565b908161348d6020830284019460200190565b926000915b8383106134a157505050505090565b909192939460206134bd6109f483856001950387528951610b87565b9301930191939290613492565b60208082526101f49291019061346f565b80151561039c565b90505190610177826134db565b906020828203126101d4576101f4916134e3565b1561350b57565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b61356c61355c60405190565b8092612b566020830191826134ca565b613577612775825190565b206135a17f0000000000000000000000000000000000000000000000000000000000000000610b0f565b9063169394bb6135ba6135b360405190565b9160e01b90565b815260048101829052602081602481865afa9081156112f2576135ec916135e79160009161365157501590565b613504565b635bd4df3290823b156101d4576136289261361a6000809461360d60405190565b9687958694859360e01b90565b835260048301526024820190565b03925af180156112f2576136395750565b610177906000613649818361013d565b81019061086d565b611cf9915060203d8111613672575b61366a818361013d565b8101906134f0565b503d61366056fea2646970667358221220ac32ca16a78f612ec68240d59214076e1784464c21ff8fabfeff4b46fd239e1c64736f6c63430008120033", + "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c80631cba9bed146101225780632ca6927d1461011d57806350262c001461011857806357c6e12a1461011357806359e26be11461010e578063670a8cb714610109578063715018a6146101045780637b103999146100ff5780637de24fcf146100fa5780638da5cb5b146100f557806396d195bd146100f0578063b870676c146100eb578063bd6e7741146100e6578063c2107e73146100e1578063ee2f13cd146100dc578063f2fde38b146100d75763fa7643f4036101d457610c7e565b610c3c565b610c24565b610bfd565b610b6f565b610b31565b610acb565b610a40565b610a19565b610890565b610878565b610837565b6107d9565b61079d565b6105a6565b6102ef565b61021c565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761015e57604052565b610127565b9061017761017060405190565b928361013d565b565b6001600160401b03811161015e57602090601f01601f19160190565b0190565b90826000939282370152565b909291926101ba6101b582610179565b610163565b938185526020850190828401116101d45761017792610199565b600080fd5b9080601f830112156101d4578160206101f4933591016101a5565b90565b906020828203126101d45781356001600160401b0381116101d4576101f492016101d9565b346101d45761023461022f3660046101f7565b612392565b604051005b0390f35b60005b8381106102505750506000910152565b8181015183820152602001610240565b61019561027892602092610272815190565b94859290565b9384910161023d565b9052565b6102956101959160209493610260565b918252565b6102af6102a660405190565b92839283610285565b03902090565b6101f49161029a565b6101f4916008021c5b60ff1690565b906101f491546102be565b6101f4906102ea6003916000926102b5565b6102cd565b346101d45761023961030a6103053660046101f7565b6102d8565b60405191829182901515815260200190565b9190916060818403126101d4576103336060610163565b9281356001600160401b0381116101d457816103509184016101d9565b845260208201356001600160401b0381116101d457816103719184016101d9565b602085015260408201356001600160401b0381116101d45761039392016101d9565b6040830152565b805b036101d457565b905035906101778261039a565b6001600160a01b031690565b6001600160a01b03811661039c565b90503590610177826103bc565b63ffffffff811661039c565b90503590610177826103d8565b9190916080818403126101d45761044a61040b6080610163565b93600061041882856103a3565b90860152602061042a828286016103cb565b90860152604061043c828286016103e4565b9086015260608093016103e4565b90830152565b6001600160401b03811161015e5760208091020190565b9291906104766101b582610450565b93818552602080860192028101918383116101d45781905b83821061049c575050505050565b81356001600160401b0381116101d4576020916104bc87849387016101d9565b81520191019061048e565b9080601f830112156101d4578160206101f493359101610467565b91909160a0818403126101d4576104f96040610163565b92600061050682846103f1565b9085015260808201356001600160401b0381116101d45761052792016104c7565b6020830152565b9190916040818403126101d4576105456040610163565b9281356001600160401b0381116101d4578161056291840161031c565b845260208201356001600160401b0381116101d45761052792016104e2565b906020828203126101d45781356001600160401b0381116101d4576101f4920161052e565b346101d45761023961030a6105bc366004610581565b6128f5565b906020828203126101d4576101f4916103a3565b634e487b7160e01b600052603260045260246000fd5b805482101561060e57610605600191600052602060002090565b91020190600090565b6105d5565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561065f575b602083101461065a57565b610629565b91607f169161064f565b8054600093929161068661067c8361063f565b8085529360200190565b91600181169081156106d8575060011461069f57505050565b6106b29192939450600052602060002090565b916000925b8184106106c45750500190565b8054848401526020909301926001016106b7565b92949550505060ff1916825215156020020190565b906101f491610669565b906101776107119261070860405190565b938480926106ed565b038361013d565b90600010610729576101f4906106f7565b610613565b6004600061073a825490565b83101561075557506101f49161074f916105eb565b90610718565b80fd5b6107796107826020936101959361076d815190565b80835293849260200190565b9586910161023d565b601f01601f191690565b60208082526101f492910190610758565b346101d4576102396107b86107b33660046105c1565b61072e565b6040515b9182918261078c565b906020828203126101d4576101f4916103cb565b346101d4576102346107ec3660046107c5565b611d4f565b6101f4916008021c6001600160a01b031690565b906101f491546107f1565b6002600061081c825490565b83101561075557506101f491610831916105eb565b90610805565b346101d45761023961085261084d3660046105c1565b610810565b6040515b918291826001600160a01b03909116815260200190565b60009103126101d457565b346101d45761088836600461086d565b610234610cee565b346101d4576108a036600461086d565b6102397f0000000000000000000000000000000000000000000000000000000000000000610852565b9291906108d86101b582610450565b93818552602080860192028101918383116101d45781905b8382106108fe575050505050565b81356001600160401b0381116101d45760209161091e878493870161052e565b8152019101906108f0565b9080601f830112156101d4578160206101f4933591016108c9565b906020828203126101d45781356001600160401b0381116101d4576101f49201610929565b906101f49060208061098a6040840160008701518582036000870152610758565b940151910152565b906101f491610969565b906109b26109a8835190565b8083529160200190565b90816109c46020830284019460200190565b926000915b8383106109d857505050505090565b909192939460206109fb6109f483856001950387528951610992565b9760200190565b93019301919392906109c9565b60208082526101f49291019061099c565b346101d457610239610a34610a2f366004610944565b610fed565b60405191829182610a08565b346101d457610a5036600461086d565b610239610852610cac565b90610a7b610a74610a6a845190565b8084529260200190565b9260200190565b9060005b818110610a8c5750505090565b909192610ab2610aab60019286516001600160a01b0316815260200190565b9460200190565b929101610a7f565b60208082526101f492910190610a5b565b346101d457610adb36600461086d565b610239610ae66133e7565b60405191829182610aba565b6101f4906103b0906001600160a01b031682565b6101f490610af2565b6101f490610b06565b61028190610b0f565b6020810192916101779190610b18565b346101d457610b4136600461086d565b604051806102397f000000000000000000000000000000000000000000000000000000000000000082610b21565b346101d457610234610b823660046101f7565b6122ce565b906101f491610758565b90610b9d6109a8835190565b9081610baf6020830284019460200190565b926000915b838310610bc357505050505090565b90919293946020610bdf6109f483856001950387528951610b87565b9301930191939290610bb4565b60208082526101f492910190610b91565b346101d457610c0d36600461086d565b610239610c1861344e565b60405191829182610bec565b346101d457610234610c373660046107c5565b611e51565b346101d457610234610c4f3660046107c5565b610e05565b90610c5e90610b0f565b600052602052604060002090565b6101f4906102ea600191600092610c54565b346101d45761023961030a610c943660046107c5565b610c6c565b6101f4906103b0565b6101f49054610c99565b6101f46000610ca2565b610cbe610d4a565b610177610cdc565b6103b06101f46101f49290565b6101f490610cc6565b610177610ce96000610cd3565b610e3e565b610177610cb6565b15610cfd57565b60405162461bcd60e51b815280610d46600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b610177610d55610cac565b610d6e610d61336103b0565b916001600160a01b031690565b14610cf6565b61017790610d80610d4a565b610de0565b15610d8c57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61017790610ce9610df46103b06000610cd3565b6001600160a01b0383161415610d85565b61017790610d74565b906001600160a01b03905b9181191691161790565b90610e336101f4610e3a92610b0f565b8254610e0e565b9055565b610e486000610ca2565b90610e54816000610e23565b610e87610e817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610b0f565b91610b0f565b91610e9160405190565b600090a3565b15610e9e57565b60405162461bcd60e51b815260206004820152601660248201527513db9b1e481c9959da5cdd1c9e4818d85b8818d85b1b60521b6044820152606490fd5b906102956101b583610450565b6101f46040610163565b610efb610ee9565b906060825260006020830152565b6101f4610ef3565b60005b828110610f2057505050565b602090610f2b610f09565b8184015201610f14565b90610177610f4b610f4584610edc565b93610450565b601f190160208401610f11565b6101f46101f46101f49290565b634e487b7160e01b600052601160045260246000fd5b6000198114610f8a5760010190565b610f65565b90610f98825190565b81101561060e576020809102010190565b15610fb057565b60405162461bcd60e51b815260206004820152601560248201527409cde40ecc2d8d2c840e0e4deecd2c8cae490c2e6d605b1b6044820152606490fd5b9061102a336110246001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016610d61565b14610e97565b61103a611035835190565b610f35565b916000908361104883610f58565b6110536101f4845190565b8110156110de578061109e6110be6110ac6110996110a760208061107a6110d9998c610f8f565b51611084816128f5565b5061108e81611221565b999199969096613458565b610fa9565b01510151613550565b6113f1565b6105276110b7610ee9565b9389850152565b6110c88289610f8f565b526110d38188610f8f565b50610f7b565b611048565b5093505050565b6102c76101f46101f49290565b6101f460056110e5565b9092919261110c6101b582610179565b938185526020850190828401116101d4576101779261023d565b9080601f830112156101d45781516101f4926020016110fc565b92919061114f6101b582610450565b93818552602080860192028101918383116101d45781905b838210611175575050505050565b81516001600160401b0381116101d4576020916111958784938701611126565b815201910190611167565b9080601f830112156101d45781516101f492602001611140565b906020828203126101d45781516001600160401b0381116101d4576101f492016111a0565b60409061120d6112016101779597969460608401908482036000860152610758565b60ff9097166020830152565b019015159052565b6040513d6000823e3d90fd5b516040015173__$5b71c94e19686701747fb081826a62a8ff$__91634be6d4f89160009061124d6110f2565b9461126e6001956112798761126160405190565b998a968795869560e01b90565b8552600485016111df565b03915af49283156112f2576000936112cf575b506112c86112b66112b06112a96112a36000610f58565b87610f8f565b5194610f58565b85610f8f565b51936112c26002610f58565b90610f8f565b5191929190565b6112eb91933d8091833e6112e3818361013d565b8101906111ba565b913861128c565b611215565b6001600160401b03811161015e5760200290565b6101b56101f4916112f7565b60005b82811061132657505050565b60608282015260200161131a565b9061017761134a6113448461130b565b936112f7565b83611317565b6101f46006611334565b90611363825190565b81101561060e570160200190565b61138461137e6101f49290565b60f81b90565b6001600160f81b03191690565b90600681101561060e576020020190565b91908201809211610f8a57565b156113b657565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206461746520737472696e6760681b6044820152606490fd5b906000916113fd611350565b8390600061140a81610f58565b846114166101f4825190565b82101561150a578161143961142b828461135a565b516001600160f81b03191690565b611454611446602d611371565b916001600160f81b03191690565b149182156114e7575b82156114c3575b5050611479575b61147490610f7b565b61140a565b9295836114869186611b86565b6114908784611391565b5261149b8683611391565b506114746114bb6114b56114af6001610f58565b866113a2565b97610f7b565b93905061146b565b6114d292509061142b9161135a565b6114df6114466054611371565b148138611464565b91506114f661142b828461135a565b611503611446603a611371565b149161145d565b5050929161152f61155c92936101f496976115296115258390565b5190565b91611b86565b6115398285611391565b526115448184611391565b506115566115526005610f58565b9190565b146113af565b61158261157b61157461156e85610f58565b84611391565b5193610f58565b8093611905565b9061159a8361159461156e6001610f58565b51611905565b6115b1846115946115ab6002610f58565b85611391565b906115e1856115946115d0826115946115ca6003610f58565b89611391565b956115db6004610f58565b90611391565b9361161b565b6101f462015180610f58565b81810292918115918404141715610f8a57565b6101f4610e10610f58565b6101f4603c610f58565b61166a9361165b6116526116446101f499989661165b966116619661163e600090565b50611712565b61164c6115e7565b906115f3565b9161164c611606565b906113a2565b9161164c611611565b6113a2565b156101d457565b91908083039260009091128015828513169184121617610f8a57565b919082810192600013801591841291821691151617610f8a57565b634e487b7160e01b600052601260045260246000fd5b81156116de57600160ff1b8114600019831416610f8a570590565b6116ad565b8181029291600160ff1b81146000831216610f8a578184051490151715610f8a57565b6101f462253d8c610f58565b61171d6107b2610f58565b8110156117299061166f565b61173290610f58565b9061173c90610f58565b9161174690610f58565b611751617d4b610f58565b61175a91611676565b906105b56117696112c0610f58565b6117739083611692565b600e9161177f83610f58565b6117899087611676565b91600c9261179684610f58565b61179f916116c3565b6117a891611692565b906117b290610f58565b906117bc916116e3565b936004946117c986610f58565b6117d2916116c3565b6117db91611692565b61016f6117e86002610f58565b6117f29088611676565b6117fb85610f58565b6118059089611676565b61180e85610f58565b611817916116c3565b61182085610f58565b611829916116e3565b61183291611676565b9061183c90610f58565b90611846916116e3565b61184f83610f58565b611858916116c3565b61186191611692565b94600393611870611324610f58565b61187991611692565b9261188390610f58565b61188c91611676565b9061189690610f58565b61189f916116c3565b6118a891611692565b6118b26064610f58565b6118bb916116c3565b906118c590610f58565b906118cf916116e3565b906118d990610f58565b6118e2916116c3565b6118eb91611676565b6118f3611706565b6118fc91611676565b6101f490610f58565b6101f49190611914602e611371565b90611a04565b6102c76101f46101f49260ff1690565b6101f49060f81c61191a565b6101f46101f46101f49260ff1690565b91908203918211610f8a57565b1561195a57565b60405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606490fd5b156119a657565b60405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608490fd5b604d8111610f8a57600a0a90565b92600091611a1183610f58565b808493815b611a216101f48a5190565b811015611b22578589611a3761142b848361135a565b603090611a4661144683611371565b101580611b00575b611ab6575b5050611aa6575b611a6761142b828b61135a565b611a7a6001600160f81b03198716611446565b14611a8e575b611a8990610f7b565b611a16565b94611a9e90151587151514611953565b600194611a80565b92611ab090610f7b565b92611a5a565b61165b90611af2611aec611ae7611ae261142b89611adc611af89a9d61164c600a610f58565b9861135a565b61192a565b611936565b91610f58565b90611946565b928938611a53565b50611b0e61142b858461135a565b611b1b6114466039611371565b1115611a4e565b509650935061164c9250611b4c91506101f494611b47611b3f8290565b83111561199f565b611946565b6119f6565b906102956101b583610179565b369037565b90610177611b79611b7384611b51565b93610179565b601f190160208401611b5e565b909290611b9b611b968585611946565b611b63565b91845b845b811015611be057611bd981611bbb61142b611ba0948761135a565b611bd3611bc88a84611946565b9160001a918861135a565b53610f7b565b9050611b9e565b509350506101f4915090565b61017790611bf8610d4a565b611cdc565b6101f4906102c7565b6101f49054611bfd565b15611c1757565b60405162461bcd60e51b815260206004820152601c60248201527f4164647265737320697320616c72656164792061207769746e657373000000006044820152606490fd5b9060ff90610e19565b90611c756101f4610e3a92151590565b8254611c5c565b916001600160a01b0360089290920291821b911b610e19565b921b90565b9190611cab6101f4610e3a93610b0f565b908354611c7c565b90815491600160401b83101561015e5782611cd6916001610177950181556105eb565b90611c9a565b611d116001611d02611cfd611cf9611cf48685610c54565b611c06565b1590565b611c10565b611d0c8382610c54565b611c65565b611d1c816002611cb3565b611d4a7ff5944521c155e80db583372b9992336b6616b14dfb924a5cf6ef97b256d280349161085660405190565b0390a1565b61017790611bec565b61017790611d64610d4a565b611dee565b15611d7057565b60405162461bcd60e51b815260206004820152601860248201527f41646472657373206973206e6f742061207769746e65737300000000000000006044820152606490fd5b91906008610e19910291611c9560ff841b90565b9190611dda6101f4610e3a93151590565b908354611db5565b61017791600091611dc9565b611e186000611e13836001611e0e611e09611cf48484610c54565b611d69565b610c54565b611de2565b611e23816002611f32565b611d4a7f8b5785dce93ca82765b1cc25cedcda1b501288cb23a1fd171c0091d83900f9bd9161085660405190565b61017790611d58565b90611e75611e69610a6a845490565b92600052602060002090565b9060005b818110611e865750505090565b909192611eb3611eac600192611e9b87610ca2565b6001600160a01b0316815260200190565b9460010190565b929101611e79565b906101f491611e5a565b9061017761071192611ed660405190565b93848092611ebb565b6101f490611ec5565b634e487b7160e01b600052603160045260246000fd5b61017791600091611c9a565b80548015611f2d576000190190611f2a611f2483836105eb565b90611efe565b55565b611ee8565b611f47611f4e92611f4283611edf565b611fe5565b9092901590565b15611f905760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b61017791611fa9611f9f835490565b611af26001610f58565b90818103611fb9575b5050611f0a565b611cd6611fcc610831611fd394866105eb565b91846105eb565b3880611fb2565b6101f4600019610f58565b91908251926000611ff581610f58565b855b81101561204c5761201861200b8285610f8f565b516001600160a01b031690565b61202a6001600160a01b038616610d61565b146120425761203b611ff791610f7b565b9050611ff5565b9450505050600190565b5093505050611552611fda565b61017790612065610d4a565b61226c565b1561207157565b60405162461bcd60e51b815260206004820152601b60248201527f50726f7669646572206861736820616c726561647920616464656400000000006044820152606490fd5b9160001960089290920291821b911b610e19565b91906120db6101f4610e3a93610f58565b9083546120b6565b610177916000916120ca565b8181106120fa575050565b8061210860006001936120e3565b016120ef565b9190601f811161211d57505050565b61212f61017793600052602060002090565b906020601f840181900483019310612152575b6020601f909101045b01906120ef565b9091508190612142565b600019600883021c1916906002021790565b90612177815190565b906001600160401b03821161015e5761219a82612194855461063f565b8561210e565b602090601f83116001146121c857610e3a9291600091836121bd575b505061215c565b0151905038806121b6565b601f198316916121dd85600052602060002090565b9260005b81811061221c57509160029391856001969410612202575b50505002019055565b01516000196008601f8516021c19165b90553880806121f9565b919360206001819287870151815501950192016121e1565b9190610729576101779161216e565b90815491600160401b83101561015e5782612266916001610177950181556105eb565b90612234565b6122956003612289612284611cf9611cf486856102b5565b61206a565b611d0c836001926102b5565b6122a0816004612243565b611d4a7fc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096916107bc60405190565b61017790612059565b610177906122e3610d4a565b612334565b156122ef57565b60405162461bcd60e51b815260206004820152601760248201527f50726f76696465722068617368206e6f7420666f756e640000000000000000006044820152606490fd5b6123596000611e1383600361235461234f611cf484846102b5565b6122e8565b6102b5565b6123648160046126aa565b611d4a7f6f594b4b4f0580c66aabba75218163a99fa1fe330a171cc9e2bfd8e167db22f8916107bc60405190565b610177906122d7565b6101f4906106f7565b906123ad825490565b6123b681610edc565b926123ca6020850191600052602060002090565b6000915b8383106123db5750505050565b6001602081926123ea8561239b565b8152019201920191906123ce565b6101f4906123a4565b6101f4905461063f565b908082146124da5761241c81612401565b906001600160401b03821161015e5761243982612194855461063f565b600090601f831160011461246657610e3a92916000918361245b57505061215c565b0154905038806121b6565b9061247b601f19841692600052602060002090565b9061248b85600052602060002090565b92815b8181106124c2575091600293918560019694106124ae5750505002019055565b01546000196008601f8516021c1916612212565b9193600180602092878701548155019501920161248e565b5050565b9190610729576101779161240b565b9061250090600019906020036008021c90565b8154169055565b9060009161252561251d82600052602060002090565b92835461215c565b905555565b919290602082101561258257601f841160011461254c57610e3a92935061215c565b509061257d61017793600161257461256985600052602060002090565b92601f602091010490565b820191016120ef565b612507565b506125bb8293612599600194600052602060002090565b61214b6020601f860104820192601f8616806125c3575b50601f602091010490565b600202179055565b6125cf908886036124ed565b386125b0565b929091600160401b821161015e576020111561261c5760208110156125fd57610e3a9161215c565b60019160ff191661261384600052602060002090565b55600202019055565b60019150600202019055565b9081546126348161063f565b9081831161265d575b81831061264b575b50505050565b6126549361252a565b38808080612645565b612669838383876125d5565b61263d565b600061017791612628565b90600003610729576101779061266e565b80548015611f2d576000190190611f2a6126a483836105eb565b90612679565b611f476126bf926126ba836123f8565b612744565b156127005760405162461bcd60e51b815260206004820152601460248201527329ba3934b733903737ba1034b71030b93930bc9760611b6044820152606490fd5b6101779161270f611f9f835490565b9081810361271f575b505061268a565b61273761272f61273d93856105eb565b5091846105eb565b906124de565b3880612718565b9190825192600061275481610f58565b855b8110156127ac5761276a6115258285610f8f565b61277c612775825190565b9160200190565b20612794611552865b612790612775825190565b2090565b14612042576127a561275691610f7b565b9050612754565b509350505081199190565b156127be57565b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b156127fa57565b60405162461bcd60e51b815260206004820152601c60248201527f436c61696d496e666f206861736820646f65736e2774206d61746368000000006044820152606490fd5b1561284657565b60405162461bcd60e51b815260206004820152603560248201527f4e756d626572206f66207369676e617475726573206e6f7420657175616c20746044820152746f206e756d626572206f66207769746e657373657360581b6064820152608490fd5b156128b057565b60405162461bcd60e51b815260206004820152601960248201527f5369676e6174757265206e6f7420617070726f707269617465000000000000006044820152606490fd5b906020820190815160200151612909905190565b9160009261291684610f58565b10612920906127b7565b828080808451015196845160200151612937610ee9565b98838a01906129439152565b6020890152015161295390612efe565b925101510161296190611525565b1461296b906127f3565b61297483612a5b565b805191600292612982845490565b1461298c9061283f565b61299584610f58565b935b6129a66101f460208801515190565b851015612a405780956129b882610f58565b6129c36101f4875490565b811015612a28576129d761200b8887610f8f565b6129ea610d616103b0610831858b6105eb565b146129fd576129f890610f7b565b6129b8565b50946129a69196506020612a1d6101f492612a1860016128a9565b610f7b565b969792505050612997565b50946020612a1d6101f492612a186129a6959a6128a9565b509350505050600190565b90610177611b79610f4584610edc565b6020612a6a6000830151612b2b565b910190612a7e612a7983515190565b612a4b565b91612a896000610f58565b612a956101f483515190565b811015612ad55780612a18612ab8612ab1612ad0948651610f8f565b5186612c02565b612ac28388610f8f565b906001600160a01b03169052565b612a89565b50505090565b610195816020939052565b6101f46101f46101f49263ffffffff1690565b92612b25612b18612b2594612b25612b186101f49998612b1897610260565b600560f91b815260010190565b90610260565b6101f4612b67612b3a83611525565b612b62612b4660405190565b8092612b56602083019182612adb565b9081038252038261013d565b613130565b612b83612b7e60208501516001600160a01b031690565b612fb9565b90612b56612bbf612bae612ba96060612bb3612bae612ba960408c015163ffffffff1690565b612ae6565b61329e565b98015163ffffffff1690565b604051958694602086019485612af9565b7f19457468657265756d205369676e6564204d6573736167653a0a00000000000081526101f49291612b2591601a0182565b90612b56612c326101f493612c15600090565b50612c21612bae825190565b604051938492602084019283612bd0565b612c3d612775825190565b206101f491612c4b91612dc1565b919091612c82565b634e487b7160e01b600052602160045260246000fd5b60051115612c7357565b612c53565b9061017782612c69565b612c8c6000612c78565b612c9582612c78565b03612c9d5750565b612ca76001612c78565b612cb082612c78565b03612cfa5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b612d046002612c78565b612d0d82612c78565b03612d575760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b612d6a612d646003612c78565b91612c78565b14612d7157565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b908051612dd16115526041610f58565b03612df757612df3916020820151906060604084015193015160001a90612e36565b9091565b5050612e036000610cd3565b90600290565b612e3261017794610393606094989795612e28608086019a6000870152565b60ff166020850152565b0152565b919291612e42836118fc565b612e6e6115527f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0610f58565b11612ed257612e8e600093602095612e8560405190565b94859485612e09565b838052039060015afa156112f25760005190600091612eac83610cd3565b6001600160a01b0381166001600160a01b03831614612eca57509190565b925050600190565b50505050612ee06000610cd3565b90600390565b6101f49392612b25612b18612b1893612b2595610260565b8051602082015160409283015192516127859290612b5690948593602085019384612ee6565b6101f49081906001600160a01b031681565b60ff8111610f8a5760020a90565b905b9081156116de570490565b61138461137e6101f49260ff1690565b612f469060ff165b9160ff1690565b612f7c9060ff16612f69565b029060ff8216918203610f8a57565b612f979060ff16612f69565b90039060ff8211610f8a57565b61060f60f31b81526101f49190600201612b25565b90612fc7611b966028610f58565b600092612fd384610f58565b612fdd6014610f58565b8110156130d45780613037611bd36130c56130bb6130cf956130376130b58c8b6130af613051611ae261304c8f61301e61301961304792610b06565b612f24565b61304161303c6008613037611aec8f611b476013610f58565b6115f3565b612f36565b90612f44565b6110e5565b612f51565b9261309a61309461304c60109661308e61307661304c6130708b6110e5565b84612f61565b986130896130838b61192a565b916110e5565b612f70565b90612f8b565b9461323a565b6130a78860029d8e610f58565b911a9261135a565b5361323a565b95610f58565b61165b6001610f58565b91881a918661135a565b612fd3565b50506101f49192506101f46130e860405190565b8092612b56602083019182612fa4565b6131026010611b51565b6f181899199a1a9b1b9c1cb0b131b232b360811b602082015290565b6101f46130f8565b81156116de570690565b90815191613146611b9660029461164c86610f58565b9061314f61311e565b60009161315b83610f58565b6131666101f4835190565b81101561320c57806131a661142b6131a061318a611ae261142b613207978961135a565b61319b613195895190565b91611936565b612f44565b8661135a565b6131c56131bb6131b58b610f58565b846115f3565b91871a918861135a565b536131ef61142b6131a06131df611ae261142b868961135a565b6131ea613195895190565b613126565b611bd36131bb6130bb6132018c610f58565b856115f3565b61315b565b505050506101f49192506101f46130e860405190565b61322e9060ff16612f69565b019060ff8211610f8a57565b6132439061192a565b61324d600a6110e5565b60ff8216101561326e5761304c6101f49161326860306110e5565b90613222565b61304c6101f49161326860576110e5565b6132896001611b51565b600360fc1b602082015290565b6101f461327f565b6000916132aa83610f58565b821461337257908060005b6132be85610f58565b83146132e1576132d06132db91610f7b565b92613041600a610f58565b916132b5565b91506132ec82611b63565b915b6132f785610f58565b82146133675761330e61336191611af26001610f58565b91613041600a8461335b61335261304c603061334d61308361304761334761333e6133388b610f58565b8d612f44565b61164c8b610f58565b8b611946565b613222565b8a1a918861135a565b53610f58565b906132ee565b50506101f491925090565b9150506101f4613296565b9061338c611e69610a6a845490565b9060005b81811061339d5750505090565b9091926133b2611eac600192611e9b87610ca2565b929101613390565b906101f49161337d565b90610177610711926133d560405190565b938480926133ba565b6101f4906133c4565b6101f460026133de565b906133fa825490565b61340381610edc565b926134176020850191600052602060002090565b6000915b8383106134285750505050565b6001602081926134378561239b565b81520192019201919061341b565b6101f4906133f1565b6101f46004613445565b611cf46101f491613467600090565b5060036102b5565b9061347b6109a8835190565b908161348d6020830284019460200190565b926000915b8383106134a157505050505090565b909192939460206134bd6109f483856001950387528951610b87565b9301930191939290613492565b60208082526101f49291019061346f565b80151561039c565b90505190610177826134db565b906020828203126101d4576101f4916134e3565b1561350b57565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b61356c61355c60405190565b8092612b566020830191826134ca565b613577612775825190565b206135a17f0000000000000000000000000000000000000000000000000000000000000000610b0f565b9063169394bb6135ba6135b360405190565b9160e01b90565b815260048101829052602081602481865afa9081156112f2576135ec916135e79160009161365157501590565b613504565b635bd4df3290823b156101d4576136289261361a6000809461360d60405190565b9687958694859360e01b90565b835260048301526024820190565b03925af180156112f2576136395750565b610177906000613649818361013d565b81019061086d565b611cf9915060203d8111613672575b61366a818361013d565b8101906134f0565b503d61366056fea2646970667358221220ac32ca16a78f612ec68240d59214076e1784464c21ff8fabfeff4b46fd239e1c64736f6c63430008120033", + "libraries": { + "ClaimVerifier": "0xBA4D6eA209c3C3A6B0B31fE136a5F0eFd9De2bd1" + }, + "devdoc": { + "kind": "dev", + "methods": { + "addProviderHash(string)": { + "params": { + "_newProviderHash": "New provider hash to be added" + } + }, + "addWitness(address)": { + "params": { + "_newWitness": "Address of the new witness" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "removeProviderHash(string)": { + "params": { + "_removeProviderHash": "Provider hash to be removed" + } + }, + "removeWitness(address)": { + "params": { + "_removeWitness": "Address of witness to be removed" + } + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "verifyProofSignatures(((string,string,string),((bytes32,address,uint32,uint32),bytes[])))": { + "params": { + "proof": "Proof to be verified" + } + }, + "verifyProofs(((string,string,string),((bytes32,address,uint32,uint32),bytes[]))[])": { + "params": { + "_proofs": "Proofs to be verified" + }, + "returns": { + "domains": " Array of Domain structs" + } + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": { + "addProviderHash(string)": { + "notice": "ONLY OWNER: Add provider hash string. Provider hash must not have been previously added." + }, + "addWitness(address)": { + "notice": "ONLY OWNER: Add witness address. Witness must not have been previously added." + }, + "removeProviderHash(string)": { + "notice": "ONLY OWNER: Remove provider hash string. Provider hash must have been previously added." + }, + "removeWitness(address)": { + "notice": "ONLY OWNER: Remove witness address. Witness must have been previously added." + }, + "verifyProofSignatures(((string,string,string),((bytes32,address,uint32,uint32),bytes[])))": { + "notice": "Verify proof generated by witnesses. Claim is constructed by hashing claimInfo (provider, context, parameters) to get the identifier. And then signing on (identifier, owner, timestamp, epoch) to get claim signature. This function verifies a claim by performing the following checks on the claim - Calculates the hash of the claimInfo and checks if it matches the identifier in the claim - Checks if the signatures are valid and from the witnesses This function reverts if - No signatures are found on the proof - Number of signatures is not equal to the number of witnesses - ClaimInfo hash does not match the identifier in the claim - Signatures are invalid (not from the witnesses) DEV NOTE: This function does NOT validate that the claim provider hash is valid. That is the responsibility of the caller. Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code " + }, + "verifyProofs(((string,string,string),((bytes32,address,uint32,uint32),bytes[]))[])": { + "notice": "ONLY REGISTRY: Verifies proofs. Extracts values and formats them into Domain structs." + } + }, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 7, + "contract": "contracts/VerifyDomainProcessor.sol:VerifyDomainProcessor", + "label": "_owner", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 11343, + "contract": "contracts/VerifyDomainProcessor.sol:VerifyDomainProcessor", + "label": "isWitness", + "offset": 0, + "slot": "1", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 11346, + "contract": "contracts/VerifyDomainProcessor.sol:VerifyDomainProcessor", + "label": "witnesses", + "offset": 0, + "slot": "2", + "type": "t_array(t_address)dyn_storage" + }, + { + "astId": 11350, + "contract": "contracts/VerifyDomainProcessor.sol:VerifyDomainProcessor", + "label": "isProviderHash", + "offset": 0, + "slot": "3", + "type": "t_mapping(t_string_memory_ptr,t_bool)" + }, + { + "astId": 11353, + "contract": "contracts/VerifyDomainProcessor.sol:VerifyDomainProcessor", + "label": "providerHashes", + "offset": 0, + "slot": "4", + "type": "t_array(t_string_storage)dyn_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "base": "t_address", + "encoding": "dynamic_array", + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_string_storage)dyn_storage": { + "base": "t_string_storage", + "encoding": "dynamic_array", + "label": "string[]", + "numberOfBytes": "32" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_string_memory_ptr,t_bool)": { + "encoding": "mapping", + "key": "t_string_memory_ptr", + "label": "mapping(string => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_string_memory_ptr": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + } + } + } +} \ No newline at end of file diff --git a/contracts-domain/deployments/base/solcInputs/a43d75c8fa53cbd70612f5013c5d17a2.json b/contracts-domain/deployments/base/solcInputs/a43d75c8fa53cbd70612f5013c5d17a2.json new file mode 100644 index 000000000..0a9b68d56 --- /dev/null +++ b/contracts-domain/deployments/base/solcInputs/a43d75c8fa53cbd70612f5013c5d17a2.json @@ -0,0 +1,68 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" + }, + "@zk-email/contracts/utils/StringUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.7.6;\n\n// https://github.com/nalinbhardwaj/ethdosnumber/blob/main/ethdos-contracts/src/HexStrings.sol\nlibrary StringUtils {\n bytes16 internal constant ALPHABET = \"0123456789abcdef\";\n uint256 internal constant DEFAULT_PACK_SIZE = 31;\n\n /// @notice Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n /// @dev Credit to Open Zeppelin under MIT license https://github.com/OpenZeppelin/openzeppelin-contracts/blob/243adff49ce1700e0ecb99fe522fb16cff1d1ddc/contracts/utils/Strings.sol#L55\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = ALPHABET[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n function toHexStringNoPrefix(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length);\n for (uint256 i = buffer.length; i > 0; i--) {\n buffer[i - 1] = ALPHABET[value & 0xf];\n value >>= 4;\n }\n return string(buffer);\n }\n\n function toString(uint256 value) internal pure returns (string memory) {\n return toString(abi.encodePacked(value));\n }\n\n function toString(bytes32 value) internal pure returns (string memory) {\n return toString(abi.encodePacked(value));\n }\n\n function toString(address account) internal pure returns (string memory) {\n return toString(abi.encodePacked(account));\n }\n\n function stringEq(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));\n }\n\n function toString(bytes memory data) internal pure returns (string memory) {\n bytes memory alphabet = \"0123456789abcdef\";\n\n bytes memory str = new bytes(2 + data.length * 2);\n str[0] = \"0\";\n str[1] = \"x\";\n for (uint256 i = 0; i < data.length; i++) {\n str[2 + i * 2] = alphabet[uint256(uint8(data[i] >> 4))];\n str[3 + i * 2] = alphabet[uint256(uint8(data[i] & 0x0f))];\n }\n return string(str);\n }\n\n // 1 packed byte = packSize (usually 31) normal bytes, all in one 255/256-bit value\n // Note that this is not 32 due to the field modulus of circom\n function convertPackedByteToString(uint256 packedByte, uint256 packSize)\n internal\n pure\n returns (string memory extractedString)\n {\n uint256[] memory packedBytes = new uint256[](1);\n packedBytes[0] = packedByte;\n return convertPackedBytesToString(packedBytes, packSize, packSize);\n }\n\n // Note: This convenience function removes the max string length check, which may cause misalignment with the circom\n // If using this, then the circom needs to rangecheck packed length in the circuit itself\n // This defaults to 31 bytes per packed byte\n function convertPackedBytesToString(uint256[] memory packedBytes) \n internal\n pure\n returns (string memory extractedString)\n {\n return convertPackedBytesToString(packedBytes, packedBytes.length * DEFAULT_PACK_SIZE, DEFAULT_PACK_SIZE);\n }\n\n // Unpacks uint256s into bytes and then extracts the non-zero characters\n // Only extracts contiguous non-zero characters and ensures theres only 1 such state\n // Note that unpackedLen may be more than packedBytes.length * 8 since there may be 0s\n // signals is the total number of signals (i.e. bytes) packed into the packedBytes. it defaults to packedBytes.length * packSize\n function convertPackedBytesToString(uint256[] memory packedBytes, uint256 signals, uint256 packSize)\n internal\n pure\n returns (string memory extractedString)\n {\n uint8 state = 0;\n // bytes: 0 0 0 0 y u s h _ g 0 0 0\n // state: 0 0 0 0 1 1 1 1 1 1 2 2 2\n bytes memory nonzeroBytesArray = new bytes(packedBytes.length * packSize);\n uint256 nonzeroBytesArrayIndex = 0;\n for (uint16 i = 0; i < packedBytes.length; i++) {\n uint256 packedByte = packedBytes[i];\n uint8[] memory unpackedBytes = new uint8[](packSize);\n for (uint256 j = 0; j < packSize; j++) {\n unpackedBytes[j] = uint8(packedByte >> (j * 8));\n }\n for (uint256 j = 0; j < packSize; j++) {\n uint256 unpackedByte = unpackedBytes[j]; //unpackedBytes[j];\n if (unpackedByte != 0) {\n nonzeroBytesArray[nonzeroBytesArrayIndex] = bytes1(uint8(unpackedByte));\n nonzeroBytesArrayIndex++;\n if (state % 2 == 0) {\n state += 1;\n }\n } else {\n if (state % 2 == 1) {\n state += 1;\n }\n }\n packedByte = packedByte >> 8;\n }\n }\n // TODO: You might want to assert that the state is exactly 1 or 2\n // If not, that means empty bytse have been removed from the middle and things have been concatenated.\n // We removed due to some tests failing, but this is not ideal and the require should be uncommented as soon as tests pass with it.\n\n // require(state == 1 || state == 2, \"Invalid final state of packed bytes in email; more than two non-zero regions found!\");\n require(state >= 1, \"No packed bytes found! Invalid final state of packed bytes in email; value is likely 0!\");\n require(nonzeroBytesArrayIndex <= signals, \"Packed bytes more than allowed max number of signals!\");\n string memory returnValue = removeTrailingZeros(string(nonzeroBytesArray));\n return returnValue;\n // Have to end at the end of the email -- state cannot be 1 since there should be an email footer\n }\n\n function bytes32ToString(bytes32 input) internal pure returns (string memory) {\n uint256 i;\n for (i = 0; i < 32 && input[i] != 0; i++) {}\n bytes memory resultBytes = new bytes(i);\n for (i = 0; i < 32 && input[i] != 0; i++) {\n resultBytes[i] = input[i];\n }\n return string(resultBytes);\n }\n\n // sliceArray is used to slice an array of uint256s from start-end into a new array of uint256s\n function sliceArray(uint256[] memory input, uint256 start, uint256 end) internal pure returns (uint256[] memory) {\n require(start <= end && end <= input.length, \"Invalid slice indices\");\n uint256[] memory result = new uint256[](end - start);\n for (uint256 i = start; i < end; i++) {\n result[i - start] = input[i];\n }\n return result;\n }\n\n // stringToUint is used to convert a string like \"45\" to a uint256 4\n function stringToUint(string memory s) internal pure returns (uint256) {\n bytes memory b = bytes(s);\n uint256 result = 0;\n for (uint256 i = 0; i < b.length; i++) {\n if (b[i] >= 0x30 && b[i] <= 0x39) {\n result = result * 10 + (uint256(uint8(b[i])) - 48);\n }\n\n // TODO: Currently truncates decimals\n if (b[i] == 0x2E) {\n return result;\n }\n }\n return result;\n }\n\n // getDomainFromEmail is used to extract the domain from an email i.e. the part after the @\n function getDomainFromEmail(string memory fromEmail) internal pure returns (string memory) {\n bytes memory emailBytes = bytes(fromEmail);\n uint256 atIndex;\n for (uint256 i = 0; i < emailBytes.length; i++) {\n if (emailBytes[i] == \"@\") {\n atIndex = i;\n break;\n }\n }\n\n bytes memory domainBytes = new bytes(emailBytes.length - atIndex - 1);\n for (uint256 j = 0; j < domainBytes.length; j++) {\n domainBytes[j] = emailBytes[atIndex + 1 + j];\n }\n return bytes32ToString(bytes32(bytes(domainBytes)));\n }\n\n function removeTrailingZeros(string memory input) public pure returns (string memory) {\n bytes memory inputBytes = bytes(input);\n uint256 endIndex = inputBytes.length;\n\n for (uint256 i = 0; i < inputBytes.length; i++) {\n if (inputBytes[i] == 0) {\n endIndex = i;\n break;\n }\n }\n\n bytes memory resultBytes = new bytes(endIndex);\n for (uint256 i = 0; i < endIndex; i++) {\n resultBytes[i] = inputBytes[i];\n }\n\n return string(resultBytes);\n }\n\n // Upper/lower string utils from https://github.com/willitscale/solidity-util/blob/master/lib/Strings.sol\n /**\n * Upper\n *\n * Converts all the values of a string to their corresponding upper case\n * value.\n *\n * @param _base When being used for a data type this is the extended object\n * otherwise this is the string base to convert to upper case\n * @return string\n */\n function upper(string memory _base) public pure returns (string memory) {\n bytes memory _baseBytes = bytes(_base);\n for (uint256 i = 0; i < _baseBytes.length; i++) {\n _baseBytes[i] = _upper(_baseBytes[i]);\n }\n return string(_baseBytes);\n }\n\n /**\n * Lower\n *\n * Converts all the values of a string to their corresponding lower case\n * value.\n *\n * @param _base When being used for a data type this is the extended object\n * otherwise this is the string base to convert to lower case\n * @return string\n */\n function lower(string memory _base) public pure returns (string memory) {\n bytes memory _baseBytes = bytes(_base);\n for (uint256 i = 0; i < _baseBytes.length; i++) {\n _baseBytes[i] = _lower(_baseBytes[i]);\n }\n return string(_baseBytes);\n }\n\n /**\n * Upper\n *\n * Convert an alphabetic character to upper case and return the original\n * value when not alphabetic\n *\n * @param _b1 The byte to be converted to upper case\n * @return bytes1 The converted value if the passed value was alphabetic\n * and in a lower case otherwise returns the original value\n */\n function _upper(bytes1 _b1) private pure returns (bytes1) {\n if (_b1 >= 0x61 && _b1 <= 0x7A) {\n return bytes1(uint8(_b1) - 32);\n }\n\n return _b1;\n }\n\n /**\n * Lower\n *\n * Convert an alphabetic character to lower case and return the original\n * value when not alphabetic\n *\n * @param _b1 The byte to be converted to lower case\n * @return bytes1 The converted value if the passed value was alphabetic\n * and in a upper case otherwise returns the original value\n */\n function _lower(bytes1 _b1) private pure returns (bytes1) {\n if (_b1 >= 0x41 && _b1 <= 0x5A) {\n return bytes1(uint8(_b1) + 32);\n }\n\n return _b1;\n }\n}\n" + }, + "contracts/external/interfaces/IKeyHashAdapterV2.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IKeyHashAdapterV2 {\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external;\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external;\n function getMailServerKeyHashes() external view returns (bytes32[] memory);\n function isMailServerKeyHash(bytes32 _mailserverKeyHash) external view returns (bool);\n}\n" + }, + "contracts/external/interfaces/INullifierRegistry.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface INullifierRegistry {\n function addNullifier(bytes32 _nullifier) external;\n function isNullified(bytes32 _nullifier) external view returns(bool);\n}\n" + }, + "contracts/external/lib/StringConversionUtils.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\n// Building on zk-email's StringUtils library we add the ability to handle decimals when\n// converting from string to Uint\nlibrary StringConversionUtils {\n \n /**\n * @notice Function that parses numbers returned as strings including floating point numbers. Returned floating point\n * numbers are to have the desired amount of decimal specified. If the stringified version of the floating point\n * number has more decimal places than desired then the function will revert in order to be maximally safe. If\n * the returned number has multiple floating points then the function will revert.\n *\n * Examples: _s = \"12.34\", _expectedDecimals = 6 => 12340000\n * _s = \"12.34\", _expectedDecimals = 2 => 1234\n * _s = \"12.34\", _expectedDecimals = 1 => REVERT (we never want loss of precision only addition)\n * _s = \"12.34.56\", _expectedDecimals = 6 => REVERT (Invalid number)\n *\n * @param _s String being processed\n * @param _desiredDecimals Desired amount of decimal places\n */\n function stringToUint(string memory _s, uint256 _desiredDecimals) internal pure returns (uint256) {\n return stringToUint(_s, 0x2E, _desiredDecimals);\n }\n\n function stringToUint(\n string memory _s,\n bytes1 _decimalCharacter,\n uint256 _desiredDecimals\n )\n internal\n pure\n returns (uint256)\n {\n bytes memory b = bytes(_s);\n\n uint256 result = 0;\n uint256 decimalPlaces = 0;\n\n bool decimals = false;\n for (uint256 i = 0; i < b.length; i++) {\n if (b[i] >= 0x30 && b[i] <= 0x39) {\n result = result * 10 + (uint256(uint8(b[i])) - 48);\n }\n\n if (decimals) {\n decimalPlaces++;\n }\n\n if (b[i] == _decimalCharacter) {\n require(decimals == false, \"String has multiple decimals\");\n decimals = true;\n }\n }\n\n require(decimalPlaces <= _desiredDecimals, \"String has too many decimal places\");\n return result * (10 ** (_desiredDecimals - decimalPlaces));\n }\n\n /**\n * @notice Function that returns a substring from _startIndex to _endIndex (non-inclusive).\n *\n * @param _str String being processed\n * @param _startIndex Index to start parsing from\n * @param _endIndex Index to stop parsing at (index not included in result)\n */\n function substring(string memory _str, uint _startIndex, uint _endIndex) internal pure returns (string memory ) {\n bytes memory strBytes = bytes(_str);\n bytes memory result = new bytes(_endIndex-_startIndex);\n for(uint i = _startIndex; i < _endIndex; i++) {\n result[i-_startIndex] = strBytes[i];\n }\n return string(result);\n }\n\n function replaceString(\n string memory _str,\n string memory _lookupValue,\n string memory _replaceValue\n )\n internal\n pure\n returns (string memory)\n {\n bytes memory strBytes = bytes(_str);\n bytes memory lookupBytes = bytes(_lookupValue);\n\n uint256 lookupIndex = indexOf(_str, _lookupValue);\n if (lookupIndex == type(uint256).max) {\n return _str;\n }\n\n // Split the original string into two parts: before and after the keyword\n string memory beforeKeyword = substring(_str, 0, lookupIndex);\n string memory afterKeyword = substring(_str, lookupIndex + lookupBytes.length, strBytes.length);\n \n return string.concat(beforeKeyword, _replaceValue, afterKeyword);\n }\n\n function indexOf(string memory str, string memory substr) internal pure returns (uint) {\n bytes memory strBytes = bytes(str);\n bytes memory substrBytes = bytes(substr);\n \n if (strBytes.length < substrBytes.length) return type(uint256).max;\n \n for (uint i = 0; i <= strBytes.length - substrBytes.length; i++) {\n bool found = true;\n for (uint j = 0; j < substrBytes.length; j++) {\n if (strBytes[i + j] != substrBytes[j]) {\n found = false;\n break;\n }\n }\n if (found) return i;\n }\n \n return type(uint256).max;\n }\n\n function stringComparison(string memory _a, string memory _b) internal pure returns (bool) {\n return (keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b)));\n }\n}\n" + }, + "contracts/external/processors/EmailBaseProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { IKeyHashAdapterV2 } from \"../interfaces/IKeyHashAdapterV2.sol\";\nimport { INullifierRegistry } from \"../interfaces/INullifierRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract EmailBaseProcessor is Ownable {\n\n /* ============ Modifiers ============ */\n modifier onlyExchange() {\n require(msg.sender == exchange, \"Only exchange can call this function\");\n _;\n }\n\n /* ============ State Variables ============ */\n address public immutable exchange;\n INullifierRegistry public nullifierRegistry;\n bytes public emailFromAddress;\n uint256 public timestampBuffer;\n\n /* ============ Constructor ============ */\n constructor(\n address _exchange,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Ownable()\n {\n exchange = _exchange;\n nullifierRegistry = _nullifierRegistry;\n emailFromAddress = bytes(_emailFromAddress);\n timestampBuffer = _timestampBuffer;\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice ONLY OWNER: Sets the from email address for validated emails. Check that email address is properly\n * padded (if necessary). Padding will be dependent on if unpacking functions cut trailing 0s or not.\n *\n * @param _emailFromAddress The from email address for validated emails, MUST BE PROPERLY PADDED\n */\n function setEmailFromAddress(string memory _emailFromAddress) external onlyOwner {\n emailFromAddress = bytes(_emailFromAddress);\n }\n\n /**\n * @notice ONLY OWNER: Sets the timestamp buffer for validated emails. This is the amount of time in seconds\n * that the timestamp can be off by and still be considered valid. Necessary to build in flexibility with L2\n * timestamps.\n *\n * @param _timestampBuffer The timestamp buffer for validated emails\n */\n function setTimestampBuffer(uint256 _timestampBuffer) external onlyOwner {\n timestampBuffer = _timestampBuffer;\n }\n\n /* ============ External Getters ============ */\n\n function getEmailFromAddress() external view returns (bytes memory) {\n return emailFromAddress;\n }\n\n\n /* ============ Internal Functions ============ */\n\n function _validateAndAddNullifier(bytes32 _nullifier) internal {\n require(!nullifierRegistry.isNullified(_nullifier), \"Nullifier has already been used\");\n nullifierRegistry.addNullifier(_nullifier);\n }\n}\n" + }, + "contracts/interfaces/ITransferDomainProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\n\ninterface ITransferDomainProcessor {\n\n struct TransferProof {\n uint256[2] a;\n uint256[2][2] b;\n uint256[2] c;\n uint256[10] signals;\n }\n\n function processProof(\n TransferProof calldata _proof\n ) \n external \n returns (\n bytes32 dkimKeyHash, \n bytes32 hashedReceiverId, \n string memory domainName, \n uint256 bidId\n );\n}" + }, + "contracts/TransferDomainProcessor.sol": { + "content": "// SPDX-License-Identifier: MIT\n\nimport { StringUtils } from \"@zk-email/contracts/utils/StringUtils.sol\";\n\nimport { EmailBaseProcessor } from \"./external/processors/EmailBaseProcessor.sol\";\nimport { INullifierRegistry } from \"./external/interfaces/INullifierRegistry.sol\";\nimport { StringConversionUtils } from \"./external/lib/StringConversionUtils.sol\";\n\nimport { Groth16Verifier } from \"./verifiers/namecheap_transfer_verifier.sol\";\nimport { ITransferDomainProcessor } from \"./interfaces/ITransferDomainProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract TransferDomainProcessor is Groth16Verifier, ITransferDomainProcessor, EmailBaseProcessor {\n \n using StringUtils for uint256[];\n using StringConversionUtils for string;\n\n /* ============ Constants ============ */\n uint256 constant PACK_SIZE = 31;\n\n /* ============ Constructor ============ */\n constructor(\n address _exchange,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Groth16Verifier()\n EmailBaseProcessor(\n _exchange,\n _nullifierRegistry,\n _emailFromAddress,\n _timestampBuffer\n )\n {}\n \n /* ============ External Functions ============ */\n\n function processProof(\n TransferProof calldata _proof\n )\n external\n override\n onlyExchange\n returns (\n bytes32 dkimKeyHash,\n bytes32 hashedReceiverId,\n string memory domainName, \n uint256 bidId\n )\n {\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \"Invalid Proof\");\n\n // Signal [0] is the DKIM key hash\n dkimKeyHash = bytes32(_proof.signals[0]);\n\n // Signals [1:2] are the packed from email address\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 2);\n require(\n keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \n \"Invalid email from address\"\n );\n \n // Signals [2:7] are packed domain name\n domainName = _parseSignalArray(_proof.signals, 2, 7);\n\n // Signal [7] is packed hashed namecheap id to which domain was transferred\n hashedReceiverId = bytes32(_proof.signals[7]);\n\n // Check if email has been used previously, if not nullify it so it can't be used again\n _validateAndAddNullifier(bytes32(_proof.signals[8]));\n\n // Signal [9] is bidId\n bidId = _proof.signals[9];\n }\n \n /* ============ Internal Functions ============ */\n\n function _parseSignalArray(uint256[10] calldata _signals, uint8 _from, uint8 _to) \n internal \n pure \n returns (string memory) \n {\n uint256[] memory signalArray = new uint256[](_to - _from);\n for (uint256 i = _from; i < _to; i++) {\n signalArray[i - _from] = _signals[i];\n }\n\n return signalArray.convertPackedBytesToString(signalArray.length * PACK_SIZE, PACK_SIZE);\n }\n}\n" + }, + "contracts/verifiers/namecheap_transfer_verifier.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n/*\n Copyright 2021 0KIMS association.\n\n This file is generated with [snarkJS](https://github.com/iden3/snarkjs).\n\n snarkJS is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n snarkJS is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with snarkJS. If not, see .\n*/\n\npragma solidity >=0.7.0 <0.9.0;\n\ncontract Groth16Verifier {\n // Scalar field size\n uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n // Base field size\n uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\n\n // Verification Key data\n uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042;\n uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958;\n uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132;\n uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731;\n uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679;\n uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856;\n uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\n uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\n uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\n uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\n uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\n uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\n uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\n uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\n\n \n uint256 constant IC0x = 12718791721466586474772975178991944367361898681403889293050590835735829974174;\n uint256 constant IC0y = 6579614210328804738196110281777440845203538387714672921854127346802897741731;\n \n uint256 constant IC1x = 15050971342023334328313633330499885418161248915553086390701402242486225179368;\n uint256 constant IC1y = 5024764877577619588829734526990256704181621131776349449360023481477820279987;\n \n uint256 constant IC2x = 7494265978725599958916265753653166549633529129800692658333846839504191651648;\n uint256 constant IC2y = 6331829577874431053631060489192183034310045972687441697179743819760334117448;\n \n uint256 constant IC3x = 19001722242244131321371144536562173279385056519981716838131699446018662048085;\n uint256 constant IC3y = 8148711952593941450664988855383229951630582602775661040234820121548658879338;\n \n uint256 constant IC4x = 3624352076627862068761560802183636400416483488844158805038644908873200708814;\n uint256 constant IC4y = 20894074159790604892251457333772898092352374489464929653588484093719978460605;\n \n uint256 constant IC5x = 2098287694939727519558784139808406325855172668407809961967029546183317335265;\n uint256 constant IC5y = 5659241113472526955215440521431168972841548603376846026887752206139550832697;\n \n uint256 constant IC6x = 17054571586962694690567468783102453574497782768524521043534058966826398455175;\n uint256 constant IC6y = 4087439525418017845490176926142509334113265173570304433911881676407144081865;\n \n uint256 constant IC7x = 7441928267847731392209447389119131741297268634643246304512516729270550734194;\n uint256 constant IC7y = 15714253901405577134617988311525363228461039013850912155558149694323922788327;\n \n uint256 constant IC8x = 11989172231499636764423272601594485978016807201316866170676011918612131765820;\n uint256 constant IC8y = 15918479982497737545158513843427772249925445687882255296587424450200131669618;\n \n uint256 constant IC9x = 19827744545534206076315711984525184804508732918768894016552346430789516516368;\n uint256 constant IC9y = 16361460611570894490152793347002588479282989223552655286979659973731335376509;\n \n uint256 constant IC10x = 10898965818757221383985300751768263931593441442012024286290119328446015154272;\n uint256 constant IC10y = 6989418820395701171656324073128354251482680955655018162117108617053607002569;\n \n \n // Memory data\n uint16 constant pVk = 0;\n uint16 constant pPairing = 128;\n\n uint16 constant pLastMem = 896;\n\n function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[10] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, r)) {\n mstore(0, 0)\n return(0, 0x20)\n }\n }\n \n // G1 function to multiply a G1 value(x,y) to value in an address\n function g1_mulAccC(pR, x, y, s) {\n let success\n let mIn := mload(0x40)\n mstore(mIn, x)\n mstore(add(mIn, 32), y)\n mstore(add(mIn, 64), s)\n\n success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)\n\n if iszero(success) {\n mstore(0, 0)\n return(0, 0x20)\n }\n\n mstore(add(mIn, 64), mload(pR))\n mstore(add(mIn, 96), mload(add(pR, 32)))\n\n success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)\n\n if iszero(success) {\n mstore(0, 0)\n return(0, 0x20)\n }\n }\n\n function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {\n let _pPairing := add(pMem, pPairing)\n let _pVk := add(pMem, pVk)\n\n mstore(_pVk, IC0x)\n mstore(add(_pVk, 32), IC0y)\n\n // Compute the linear combination vk_x\n \n g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))\n \n g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))\n \n g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))\n \n g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))\n \n g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))\n \n g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)))\n \n g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)))\n \n g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)))\n \n g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)))\n \n g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288)))\n \n\n // -A\n mstore(_pPairing, calldataload(pA))\n mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q))\n\n // B\n mstore(add(_pPairing, 64), calldataload(pB))\n mstore(add(_pPairing, 96), calldataload(add(pB, 32)))\n mstore(add(_pPairing, 128), calldataload(add(pB, 64)))\n mstore(add(_pPairing, 160), calldataload(add(pB, 96)))\n\n // alpha1\n mstore(add(_pPairing, 192), alphax)\n mstore(add(_pPairing, 224), alphay)\n\n // beta2\n mstore(add(_pPairing, 256), betax1)\n mstore(add(_pPairing, 288), betax2)\n mstore(add(_pPairing, 320), betay1)\n mstore(add(_pPairing, 352), betay2)\n\n // vk_x\n mstore(add(_pPairing, 384), mload(add(pMem, pVk)))\n mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))\n\n\n // gamma2\n mstore(add(_pPairing, 448), gammax1)\n mstore(add(_pPairing, 480), gammax2)\n mstore(add(_pPairing, 512), gammay1)\n mstore(add(_pPairing, 544), gammay2)\n\n // C\n mstore(add(_pPairing, 576), calldataload(pC))\n mstore(add(_pPairing, 608), calldataload(add(pC, 32)))\n\n // delta2\n mstore(add(_pPairing, 640), deltax1)\n mstore(add(_pPairing, 672), deltax2)\n mstore(add(_pPairing, 704), deltay1)\n mstore(add(_pPairing, 736), deltay2)\n\n\n let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20)\n\n isOk := and(success, mload(_pPairing))\n }\n\n let pMem := mload(0x40)\n mstore(0x40, add(pMem, pLastMem))\n\n // Validate that all evaluations ∈ F\n \n checkField(calldataload(add(_pubSignals, 0)))\n \n checkField(calldataload(add(_pubSignals, 32)))\n \n checkField(calldataload(add(_pubSignals, 64)))\n \n checkField(calldataload(add(_pubSignals, 96)))\n \n checkField(calldataload(add(_pubSignals, 128)))\n \n checkField(calldataload(add(_pubSignals, 160)))\n \n checkField(calldataload(add(_pubSignals, 192)))\n \n checkField(calldataload(add(_pubSignals, 224)))\n \n checkField(calldataload(add(_pubSignals, 256)))\n \n checkField(calldataload(add(_pubSignals, 288)))\n \n checkField(calldataload(add(_pubSignals, 320)))\n \n\n // Validate all evaluations\n let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)\n\n mstore(0, isValid)\n return(0, 0x20)\n }\n }\n }\n" + } + }, + "settings": { + "viaIR": true, + "optimizer": { + "enabled": true, + "runs": 200, + "details": { + "yulDetails": { + "optimizerSteps": "u" + } + } + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/contracts-domain/deployments/sepolia/solcInputs/2d5447dc2e8fb3a2517c08b948266497.json b/contracts-domain/deployments/base/solcInputs/d865a6f49eab8c58036d78b72f5cb448.json similarity index 77% rename from contracts-domain/deployments/sepolia/solcInputs/2d5447dc2e8fb3a2517c08b948266497.json rename to contracts-domain/deployments/base/solcInputs/d865a6f49eab8c58036d78b72f5cb448.json index 41adce65c..1bf0b3e3a 100644 --- a/contracts-domain/deployments/sepolia/solcInputs/2d5447dc2e8fb3a2517c08b948266497.json +++ b/contracts-domain/deployments/base/solcInputs/d865a6f49eab8c58036d78b72f5cb448.json @@ -47,7 +47,7 @@ "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.7.6;\n\n// https://github.com/nalinbhardwaj/ethdosnumber/blob/main/ethdos-contracts/src/HexStrings.sol\nlibrary StringUtils {\n bytes16 internal constant ALPHABET = \"0123456789abcdef\";\n uint256 internal constant DEFAULT_PACK_SIZE = 31;\n\n /// @notice Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n /// @dev Credit to Open Zeppelin under MIT license https://github.com/OpenZeppelin/openzeppelin-contracts/blob/243adff49ce1700e0ecb99fe522fb16cff1d1ddc/contracts/utils/Strings.sol#L55\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = ALPHABET[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n function toHexStringNoPrefix(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length);\n for (uint256 i = buffer.length; i > 0; i--) {\n buffer[i - 1] = ALPHABET[value & 0xf];\n value >>= 4;\n }\n return string(buffer);\n }\n\n function toString(uint256 value) internal pure returns (string memory) {\n return toString(abi.encodePacked(value));\n }\n\n function toString(bytes32 value) internal pure returns (string memory) {\n return toString(abi.encodePacked(value));\n }\n\n function toString(address account) internal pure returns (string memory) {\n return toString(abi.encodePacked(account));\n }\n\n function stringEq(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));\n }\n\n function toString(bytes memory data) internal pure returns (string memory) {\n bytes memory alphabet = \"0123456789abcdef\";\n\n bytes memory str = new bytes(2 + data.length * 2);\n str[0] = \"0\";\n str[1] = \"x\";\n for (uint256 i = 0; i < data.length; i++) {\n str[2 + i * 2] = alphabet[uint256(uint8(data[i] >> 4))];\n str[3 + i * 2] = alphabet[uint256(uint8(data[i] & 0x0f))];\n }\n return string(str);\n }\n\n // 1 packed byte = packSize (usually 31) normal bytes, all in one 255/256-bit value\n // Note that this is not 32 due to the field modulus of circom\n function convertPackedByteToString(uint256 packedByte, uint256 packSize)\n internal\n pure\n returns (string memory extractedString)\n {\n uint256[] memory packedBytes = new uint256[](1);\n packedBytes[0] = packedByte;\n return convertPackedBytesToString(packedBytes, packSize, packSize);\n }\n\n // Note: This convenience function removes the max string length check, which may cause misalignment with the circom\n // If using this, then the circom needs to rangecheck packed length in the circuit itself\n // This defaults to 31 bytes per packed byte\n function convertPackedBytesToString(uint256[] memory packedBytes) \n internal\n pure\n returns (string memory extractedString)\n {\n return convertPackedBytesToString(packedBytes, packedBytes.length * DEFAULT_PACK_SIZE, DEFAULT_PACK_SIZE);\n }\n\n // Unpacks uint256s into bytes and then extracts the non-zero characters\n // Only extracts contiguous non-zero characters and ensures theres only 1 such state\n // Note that unpackedLen may be more than packedBytes.length * 8 since there may be 0s\n // signals is the total number of signals (i.e. bytes) packed into the packedBytes. it defaults to packedBytes.length * packSize\n function convertPackedBytesToString(uint256[] memory packedBytes, uint256 signals, uint256 packSize)\n internal\n pure\n returns (string memory extractedString)\n {\n uint8 state = 0;\n // bytes: 0 0 0 0 y u s h _ g 0 0 0\n // state: 0 0 0 0 1 1 1 1 1 1 2 2 2\n bytes memory nonzeroBytesArray = new bytes(packedBytes.length * packSize);\n uint256 nonzeroBytesArrayIndex = 0;\n for (uint16 i = 0; i < packedBytes.length; i++) {\n uint256 packedByte = packedBytes[i];\n uint8[] memory unpackedBytes = new uint8[](packSize);\n for (uint256 j = 0; j < packSize; j++) {\n unpackedBytes[j] = uint8(packedByte >> (j * 8));\n }\n for (uint256 j = 0; j < packSize; j++) {\n uint256 unpackedByte = unpackedBytes[j]; //unpackedBytes[j];\n if (unpackedByte != 0) {\n nonzeroBytesArray[nonzeroBytesArrayIndex] = bytes1(uint8(unpackedByte));\n nonzeroBytesArrayIndex++;\n if (state % 2 == 0) {\n state += 1;\n }\n } else {\n if (state % 2 == 1) {\n state += 1;\n }\n }\n packedByte = packedByte >> 8;\n }\n }\n // TODO: You might want to assert that the state is exactly 1 or 2\n // If not, that means empty bytse have been removed from the middle and things have been concatenated.\n // We removed due to some tests failing, but this is not ideal and the require should be uncommented as soon as tests pass with it.\n\n // require(state == 1 || state == 2, \"Invalid final state of packed bytes in email; more than two non-zero regions found!\");\n require(state >= 1, \"No packed bytes found! Invalid final state of packed bytes in email; value is likely 0!\");\n require(nonzeroBytesArrayIndex <= signals, \"Packed bytes more than allowed max number of signals!\");\n string memory returnValue = removeTrailingZeros(string(nonzeroBytesArray));\n return returnValue;\n // Have to end at the end of the email -- state cannot be 1 since there should be an email footer\n }\n\n function bytes32ToString(bytes32 input) internal pure returns (string memory) {\n uint256 i;\n for (i = 0; i < 32 && input[i] != 0; i++) {}\n bytes memory resultBytes = new bytes(i);\n for (i = 0; i < 32 && input[i] != 0; i++) {\n resultBytes[i] = input[i];\n }\n return string(resultBytes);\n }\n\n // sliceArray is used to slice an array of uint256s from start-end into a new array of uint256s\n function sliceArray(uint256[] memory input, uint256 start, uint256 end) internal pure returns (uint256[] memory) {\n require(start <= end && end <= input.length, \"Invalid slice indices\");\n uint256[] memory result = new uint256[](end - start);\n for (uint256 i = start; i < end; i++) {\n result[i - start] = input[i];\n }\n return result;\n }\n\n // stringToUint is used to convert a string like \"45\" to a uint256 4\n function stringToUint(string memory s) internal pure returns (uint256) {\n bytes memory b = bytes(s);\n uint256 result = 0;\n for (uint256 i = 0; i < b.length; i++) {\n if (b[i] >= 0x30 && b[i] <= 0x39) {\n result = result * 10 + (uint256(uint8(b[i])) - 48);\n }\n\n // TODO: Currently truncates decimals\n if (b[i] == 0x2E) {\n return result;\n }\n }\n return result;\n }\n\n // getDomainFromEmail is used to extract the domain from an email i.e. the part after the @\n function getDomainFromEmail(string memory fromEmail) internal pure returns (string memory) {\n bytes memory emailBytes = bytes(fromEmail);\n uint256 atIndex;\n for (uint256 i = 0; i < emailBytes.length; i++) {\n if (emailBytes[i] == \"@\") {\n atIndex = i;\n break;\n }\n }\n\n bytes memory domainBytes = new bytes(emailBytes.length - atIndex - 1);\n for (uint256 j = 0; j < domainBytes.length; j++) {\n domainBytes[j] = emailBytes[atIndex + 1 + j];\n }\n return bytes32ToString(bytes32(bytes(domainBytes)));\n }\n\n function removeTrailingZeros(string memory input) public pure returns (string memory) {\n bytes memory inputBytes = bytes(input);\n uint256 endIndex = inputBytes.length;\n\n for (uint256 i = 0; i < inputBytes.length; i++) {\n if (inputBytes[i] == 0) {\n endIndex = i;\n break;\n }\n }\n\n bytes memory resultBytes = new bytes(endIndex);\n for (uint256 i = 0; i < endIndex; i++) {\n resultBytes[i] = inputBytes[i];\n }\n\n return string(resultBytes);\n }\n\n // Upper/lower string utils from https://github.com/willitscale/solidity-util/blob/master/lib/Strings.sol\n /**\n * Upper\n *\n * Converts all the values of a string to their corresponding upper case\n * value.\n *\n * @param _base When being used for a data type this is the extended object\n * otherwise this is the string base to convert to upper case\n * @return string\n */\n function upper(string memory _base) public pure returns (string memory) {\n bytes memory _baseBytes = bytes(_base);\n for (uint256 i = 0; i < _baseBytes.length; i++) {\n _baseBytes[i] = _upper(_baseBytes[i]);\n }\n return string(_baseBytes);\n }\n\n /**\n * Lower\n *\n * Converts all the values of a string to their corresponding lower case\n * value.\n *\n * @param _base When being used for a data type this is the extended object\n * otherwise this is the string base to convert to lower case\n * @return string\n */\n function lower(string memory _base) public pure returns (string memory) {\n bytes memory _baseBytes = bytes(_base);\n for (uint256 i = 0; i < _baseBytes.length; i++) {\n _baseBytes[i] = _lower(_baseBytes[i]);\n }\n return string(_baseBytes);\n }\n\n /**\n * Upper\n *\n * Convert an alphabetic character to upper case and return the original\n * value when not alphabetic\n *\n * @param _b1 The byte to be converted to upper case\n * @return bytes1 The converted value if the passed value was alphabetic\n * and in a lower case otherwise returns the original value\n */\n function _upper(bytes1 _b1) private pure returns (bytes1) {\n if (_b1 >= 0x61 && _b1 <= 0x7A) {\n return bytes1(uint8(_b1) - 32);\n }\n\n return _b1;\n }\n\n /**\n * Lower\n *\n * Convert an alphabetic character to lower case and return the original\n * value when not alphabetic\n *\n * @param _b1 The byte to be converted to lower case\n * @return bytes1 The converted value if the passed value was alphabetic\n * and in a upper case otherwise returns the original value\n */\n function _lower(bytes1 _b1) private pure returns (bytes1) {\n if (_b1 >= 0x41 && _b1 <= 0x5A) {\n return bytes1(uint8(_b1) + 32);\n }\n\n return _b1;\n }\n}\n" }, "contracts/DomainExchange.sol": { - "content": "// SPDX-License-Identifier: MIT\n\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport { ReentrancyGuard } from \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\nimport { Pausable } from \"@openzeppelin/contracts/security/Pausable.sol\";\n\nimport { AddressAllowList } from \"./external/AddressAllowList.sol\";\nimport { Bytes32ArrayUtils } from \"./external/lib/Bytes32ArrayUtils.sol\";\nimport { Uint256ArrayUtils } from \"./external/lib/Uint256ArrayUtils.sol\";\nimport { IKeyHashAdapterV2 } from \"./external/interfaces/IKeyHashAdapterV2.sol\";\n\nimport { ITransferDomainProcessor } from \"./interfaces/ITransferDomainProcessor.sol\";\nimport { IVerifiedDomainRegistry } from \"./interfaces/IVerifiedDomainRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract DomainExchange is AddressAllowList, ReentrancyGuard, Pausable {\n\n using Address for address payable;\n using Bytes32ArrayUtils for bytes32[];\n using Uint256ArrayUtils for uint256[];\n\n /* ============ Events ============ */\n \n event ListingCreated(\n uint256 indexed listingId, \n address indexed seller, \n bytes32 indexed domainId, \n bytes32 dkimKeyHash,\n uint256 askPrice,\n uint256 minBidPrice,\n address saleEthRecipient\n );\n event ListingUpdated(uint256 indexed listingId, address indexed seller, uint256 newAskPrice, address saleEthRecipient);\n event ListingDeleted(uint256 indexed listingId, address indexed seller);\n \n event BidCreated(uint256 indexed bidId, uint256 indexed listingId, address indexed buyer, uint256 price);\n event BidPriceIncreased(uint256 indexed bidId, address indexed buyer, uint256 newPrice);\n event RefundInitiated(uint256 indexed bidId, address indexed buyer);\n event BidWithdrawn(uint256 indexed bidId, address indexed buyer, uint256 amount);\n \n event SaleFinalized(uint256 indexed bidId, uint256 indexed listingId, uint256 priceNetFees, uint256 fees);\n \n event FeeUpdated(uint256 newFee);\n event FeeRecipientUpdated(address indexed newFeeRecipient);\n event BidSettlementPeriodUpdated(uint256 newBidSettlementPeriod);\n event BidRefundPeriodUpdated(uint256 newBidRefundPeriod);\n event TransferDomainProcessorUpdated(ITransferDomainProcessor indexed newTransferDomainProcessor);\n event MailServerKeyHashAdapterUpdated(IKeyHashAdapterV2 indexed newMailServerKeyHashAdapter);\n\n /* ============ Structs ============ */\n struct Listing {\n address seller;\n address payable saleEthRecipient; // Must be a contract that can receive ETH or an EOA\n bytes32 dkimKeyHash; // Allow for custom DKIM key hash\n bytes encryptionKey;\n bytes32 domainId;\n uint256 createdAt;\n uint256 askPrice;\n uint256 minBidPrice;\n bool isActive; // false by default, set to true when the listing is created\n uint256[] bids;\n }\n\n struct ListingWithId {\n uint256 listingId;\n Listing listing;\n }\n\n struct Bid {\n address buyer;\n uint256 listingId;\n string encryptedBuyerId;\n bytes32 buyerIdHash;\n uint256 createdAt;\n uint256 expiryTimestamp;\n uint256 price;\n bool refundInitiated;\n }\n\n struct BidWithId {\n uint256 bidId;\n Bid bid;\n }\n\n /* ============ Modifiers ============ */\n modifier onlyInitialized() {\n require(isInitialized, \"Contract must be initialized\");\n _;\n }\n\n /* ============ Public Variables ============ */\n\n mapping(uint256 => Listing) public listings;\n mapping(address => uint256[]) public userListings;\n mapping(uint256 => Bid) public bids;\n mapping(address => uint256[]) public userBids;\n mapping(bytes32 => uint256) public domainListing;\n\n uint256 public fee;\n address payable public feeRecipient;\n uint256 public bidCounter;\n uint256 public listingCounter;\n uint256 public bidSettlementPeriod;\n uint256 public bidRefundPeriod;\n \n bool public isInitialized;\n \n ITransferDomainProcessor public transferDomainProcessor;\n IVerifiedDomainRegistry public verifiedDomainRegistry;\n IKeyHashAdapterV2 public mailServerKeyHashAdapter;\n\n /* ============ Constants ============ */\n uint256 internal constant PRECISE_UNIT = 1e18;\n\n /* ============ Constructor ============ */\n\n constructor(\n address _owner,\n uint256 _fee,\n address payable _feeRecipient,\n uint256 _bidSettlementPeriod,\n uint256 _bidRefundPeriod,\n address[] memory _allowedAddresses\n ) AddressAllowList(_allowedAddresses) {\n fee = _fee;\n feeRecipient = _feeRecipient;\n bidSettlementPeriod = _bidSettlementPeriod;\n bidRefundPeriod = _bidRefundPeriod;\n \n bidCounter = 1;\n listingCounter = 1;\n isInitialized = false;\n \n transferOwnership(_owner);\n }\n\n /* ============ Public Functions ============ */\n\n /**\n * @notice Creates listing for a domain. If ownership of domain changes offchain, the new owner\n * will have to first register the domain on the domain registry contract. Then the new owner\n * can create a listing for the domain. The old listing will be deleted from the old owner's \n * listings and the old listing is marked as NOT active, which prevents any new bids from being\n * created on it and makes the old bids immediately withdrawable. We also allow the seller to\n * specify a custom DKIM key hash for Namecheap if they want to opt out of using the managed DKIM\n * key hash set in the transferDomainProcessor contract. The managed DKIM key hash *can* be \n * updated by us whenever Namecheap rotates their DKIM key.\n *\n * Function reverts if:\n * - Caller is not domain owner on the domain registry contract\n * - Ask price is less than min bid price\n * - Sale ETH recipient is the zero address\n *\n * @param _domainId The unique identifier of the domain\n * @param _askPrice An asking price for the domain\n * @param _minBidPrice The minimum bid price for the domain\n * @param _saleEthRecipient The address to receive the ETH from the sale; must be a contract that can\n * receive ETH or an EOA\n * @param _encryptionKey The encryption key for buyers to encrypt the buyerId to\n * @param _dkimKeyHash The custom DKIM key hash. If empty, the managed DKIM key hash will be used\n */\n function createListing(\n bytes32 _domainId, \n uint256 _askPrice, \n uint256 _minBidPrice, \n address payable _saleEthRecipient, \n bytes memory _encryptionKey,\n bytes32 _dkimKeyHash\n ) \n external\n onlyAllowed\n onlyInitialized \n whenNotPaused\n {\n address domainOwner = verifiedDomainRegistry.getDomainOwner(_domainId);\n require(domainOwner == msg.sender, \"Caller is not domain owner\");\n require(_minBidPrice > 0, \"Minimum bid price is zero\");\n require(_askPrice >= _minBidPrice, \"Ask price is less than min bid price\");\n require(_saleEthRecipient != address(0), \"Invalid sale ETH recipient\");\n\n uint256 listingId = _updateCreateListingState(\n _domainId, _askPrice, _minBidPrice, _saleEthRecipient, _encryptionKey, _dkimKeyHash\n );\n\n emit ListingCreated(listingId, msg.sender, _domainId, _dkimKeyHash, _askPrice, _minBidPrice, _saleEthRecipient);\n }\n\n /**\n * @notice Creates a new bid for a listing. Transfers ETH from the buyer to the contract. Every buyer\n * has a unique identifier, for Namecheap it's their username. The seller needs the raw buyerId\n * to transfer the domain off-chain. To facilitate this, the buyer encrypts their buyerId using the \n * seller's encryption key and sends it along with the bid. The seller then decrypts the buyerId \n * using their private key to get the raw buyerId.\n *\n * DEV NOTE: We do not check that the encrypted buyerId is the same as the hashed buyerId. This must be\n * done in the client! This does not affect the security of the protocol as the encrypted buyerId is only \n * used for communication between the buyer and the seller while maintaining privacy.\n *\n * @param _listingId The unique identifier of the listing to bid on\n * @param _buyerIdHash The hashed buyerId which is also output as part of the transfer proof later\n * @param _encryptedBuyerId The encrypted buyerId. Should be the same as the buyerId hashed\n */\n function createBid(uint256 _listingId, bytes32 _buyerIdHash, string memory _encryptedBuyerId) \n external \n payable\n nonReentrant\n whenNotPaused\n {\n uint256 price = msg.value;\n Listing storage listing = listings[_listingId];\n\n _validateCreateBid(listing, price, _buyerIdHash);\n\n uint256 bidId = _updateCreateBidState(listing, _listingId, price, _buyerIdHash, _encryptedBuyerId);\n\n emit BidCreated(bidId, _listingId, msg.sender, price);\n }\n\n /**\n * @notice ONLY SELLER: Finalizes a sale by verifying the domain transfer and unlocking bid funds to \n * the listing owner. The seller can also finalize the sale with bids that have initiated a refund \n * including the ones that have expired based on timestamp but not withdrawn yet.\n *\n * @param _proof The zk-email proof of domain transfer\n */\n function finalizeSale(ITransferDomainProcessor.TransferProof calldata _proof) \n external\n onlyInitialized\n nonReentrant\n whenNotPaused\n {\n // Check\n (\n bytes32 dkimKeyHash,\n bytes32 hashedReceiverId, \n string memory domainName, \n uint256 bidId\n ) = transferDomainProcessor.processProof(_proof);\n\n Bid storage bid = bids[bidId];\n Listing storage listing = listings[bid.listingId];\n \n _validateFinalizeSale(bid, listing, dkimKeyHash, hashedReceiverId, domainName);\n \n // Effect\n uint256 transferValue = bid.price;\n address payable recipient = listing.saleEthRecipient;\n uint256 listingId = bid.listingId;\n _updateFinalizeSaleState(bid, bidId, listing);\n\n // Interaction\n uint256 feeAmount = _settleSale(recipient, transferValue);\n \n emit SaleFinalized(bidId, listingId, transferValue - feeAmount, feeAmount);\n }\n\n /**\n * @notice ONLY BUYER: Finalize a sale by releasing funds to the seller. Proof of transfer is not required\n * because it is not in the buyer's interest to release funds unless they have received the domain. Note that the\n * bid can be in ANY STATE when this function is called. Upon calling this function funds will be transferred to\n * the seller and fees will be taken by the protocol. The listing and the bid will be deleted. The function will\n * revert if:\n * - The bid is not owned by the caller\n * - The listing is not active (sold or withdrawn)\n *\n * @param _bidId The unique identifier of the bid to release funds for\n */\n function buyerReleaseFunds(uint256 _bidId) \n external\n nonReentrant\n {\n // Check\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n require(bid.buyer == msg.sender, \"Caller is not bid owner\");\n require(listing.isActive, \"Listing not active\");\n\n // Effect\n uint256 transferValue = bid.price;\n address payable recipient = listing.saleEthRecipient;\n uint256 listingId = bid.listingId;\n \n _updateFinalizeSaleState(bid, _bidId, listing);\n\n // Interaction\n uint256 feeAmount = _settleSale(recipient, transferValue);\n\n emit SaleFinalized(_bidId, listingId, transferValue - feeAmount, feeAmount);\n }\n\n /**\n * @notice ONLY SELLER: Updates the asking price of an existing listing. We don't update\n * the existing bids against the listing because the newAskPrice is an indicative value.\n * The new ask price must be greater than or equal to the existing min bid price. If seller\n * wants to update the min bid price, they should delete the listing and create a new one with\n * the new min bid price.\n *\n * @param _listingId The unique identifier of the listing to update\n * @param _newAskPrice The new asking price for the listing\n * @param _saleEthRecipient The new address to receive the ETH from the sale; must be a contract that can\n * receive ETH or an EOA\n */\n function updateListing(uint256 _listingId, uint256 _newAskPrice, address payable _saleEthRecipient) external whenNotPaused {\n Listing storage listing = listings[_listingId];\n \n require(listing.seller == msg.sender, \"Caller is not listing owner\");\n require(listing.isActive, \"Listing not active\");\n require(_newAskPrice >= listing.minBidPrice, \"Ask price is less than min bid price\");\n require(_saleEthRecipient != address(0), \"Invalid sale ETH recipient\");\n \n listing.askPrice = _newAskPrice;\n listing.saleEthRecipient = _saleEthRecipient;\n\n emit ListingUpdated(_listingId, msg.sender, _newAskPrice, _saleEthRecipient);\n }\n\n /**\n * @notice ONLY SELLER: Marks a listing as NOT active. Removes the listing from the seller's listings array\n * and domain listing. If the listing has no bids, it is deleted from the exchange. Bids against the listing\n * are left as is to allow the buyer to withdraw the bid.\n *\n * @param _listingId The unique identifier of the listing to delete\n */\n function deleteListing(uint256 _listingId) external {\n Listing storage listing = listings[_listingId];\n \n require(listing.seller == msg.sender, \"Caller is not listing owner\");\n require(listing.isActive, \"Listing not active\");\n \n _pruneListing(listing, _listingId);\n\n emit ListingDeleted(_listingId, msg.sender);\n }\n\n /**\n * @notice ONLY BUYER: Increases the price of an existing bid. The new price can ONLY be higher \n * than the old price. The buyer must send the additional amount of ETH. The function reverts if\n * - bid has initiated refund, caller is not bid owner or listing is not active\n * - the new price is less than old price\n * - msg.value is NOT STRICTLY EQUAL to than new price - old price\n *\n * @param _bidId The unique identifier of the bid to increase the price for\n * @param _newPrice The new price for the bid\n */\n function increaseBidPrice(uint256 _bidId, uint256 _newPrice) \n external\n payable\n nonReentrant\n whenNotPaused\n {\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n // Check\n _validateIncreaseBidPrice(bid, listing, _newPrice); \n \n // Effect\n bid.price = _newPrice;\n\n emit BidPriceIncreased(_bidId, msg.sender, _newPrice);\n }\n\n\n /**\n * @notice ONLY BUYER: Initiates the refund process for a bid. Can only be called by the bid owner \n * after the initial bid expiry period has passed.\n *\n * @param _bidId The unique identifier of the bid to initiate refund for\n */\n function initiateRefund(uint256 _bidId) external {\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n _validateInitiateRefund(bid, listing);\n\n bid.expiryTimestamp = block.timestamp + bidRefundPeriod;\n bid.refundInitiated = true;\n\n emit RefundInitiated(_bidId, bid.buyer);\n }\n\n /**\n * @notice ONLY BUYER: Withdraws a bid after the refund period has ended. Transfers ETH back to the buyer.\n *\n * @param _bidId The unique identifier of the bid to withdraw\n */\n function withdrawBid(uint256 _bidId) external nonReentrant {\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n // Check\n _validateWithdrawBid(bid, listing);\n\n // Effect\n uint256 refundAmount = bid.price;\n _pruneBid(bid, _bidId, listing);\n \n // Interaction\n payable(msg.sender).sendValue(refundAmount);\n\n emit BidWithdrawn(_bidId, msg.sender, refundAmount);\n }\n\n /* ============ Admin Functions ============ */\n\n /**\n * @notice Initializes the contract with domain verification and transfer processors. Can \n * only be called once by the contract owner\n * \n * @param _transferDomainProcessor The address of the domain transfer processor contract\n * @param _verifiedDomainRegistry The address of the verified domain registry contract\n * @param _mailServerKeyHashAdapter The address of the mail server key hash adapter contract\n */\n function initialize(\n ITransferDomainProcessor _transferDomainProcessor,\n IVerifiedDomainRegistry _verifiedDomainRegistry,\n IKeyHashAdapterV2 _mailServerKeyHashAdapter\n ) external onlyOwner {\n require(!isInitialized, \"Already initialized\");\n transferDomainProcessor = _transferDomainProcessor;\n verifiedDomainRegistry = _verifiedDomainRegistry;\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\n isInitialized = true;\n }\n\n /**\n * @notice ONLY OWNER: Pauses listing and proof submission functionality for the marketplace. \n * Functionalites that are paused:\n * - Listing creation and update\n * - Bid creation and update\n * - Sale finalization\n * \n * Functinonalites that remain unpaused to allow users to retrieve funds in contract:\n * - Bid refund initiation and withdrawal\n * - Listing deletion\n * - Manual settlement between buyer and seller\n */\n function pauseMarketplace() external onlyOwner {\n _pause();\n }\n\n /**\n * @notice ONLY OWNER: Restarts paused functionality for the marketplace.\n */\n function unpauseMarketplace() external onlyOwner {\n _unpause();\n }\n\n /**\n * @notice ONLY OWNER: Update the transfer domain processor\n *\n * @param _transferDomainProcessor The new transfer domain processor\n */\n function updateTransferDomainProcessor(ITransferDomainProcessor _transferDomainProcessor) external onlyOwner {\n require(address(_transferDomainProcessor) != address(0), \"Invalid address\");\n \n transferDomainProcessor = _transferDomainProcessor;\n emit TransferDomainProcessorUpdated(_transferDomainProcessor);\n }\n\n /**\n * @notice ONLY OWNER: Update the managed mail server key hash adapter\n *\n * @param _mailServerKeyHashAdapter The new mail server key hash adapter\n */\n function updateMailServerKeyHashAdapter(IKeyHashAdapterV2 _mailServerKeyHashAdapter) external onlyOwner {\n require(address(_mailServerKeyHashAdapter) != address(0), \"Invalid address\");\n \n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\n emit MailServerKeyHashAdapterUpdated(_mailServerKeyHashAdapter);\n }\n\n /**\n * @notice ONLY OWNER: Updates the fee percentage for the marketplace\n *\n * @param _newFee The new fee percentage (in basis points)\n */\n function updateFee(uint256 _newFee) external onlyOwner {\n fee = _newFee;\n emit FeeUpdated(_newFee);\n }\n\n /**\n * @notice ONLY OWNER: Updates the fee recipient address\n *\n * @param _newFeeRecipient The new address to receive fees\n */\n function updateFeeRecipient(address payable _newFeeRecipient) external onlyOwner {\n require(_newFeeRecipient != address(0), \"Invalid address\");\n feeRecipient = _newFeeRecipient;\n emit FeeRecipientUpdated(_newFeeRecipient);\n }\n\n /**\n * @notice ONLY OWNER: Updates the minimum bid active period\n *\n * @param _newBidSettlementPeriod The new bid settlement period in seconds\n */\n function updateBidSettlementPeriod(uint256 _newBidSettlementPeriod) external onlyOwner {\n require(_newBidSettlementPeriod > 0, \"Bid settlement period must be greater than 0\");\n bidSettlementPeriod = _newBidSettlementPeriod;\n emit BidSettlementPeriodUpdated(_newBidSettlementPeriod);\n }\n\n /**\n * @notice ONLY OWNER: Updates the bid refund period\n *\n * @param _newBidRefundPeriod The new bid refund period in seconds\n */\n function updateBidRefundPeriod(uint256 _newBidRefundPeriod) external onlyOwner {\n require(_newBidRefundPeriod > 0, \"Bid refund period must be greater than 0\");\n bidRefundPeriod = _newBidRefundPeriod;\n emit BidRefundPeriodUpdated(_newBidRefundPeriod);\n }\n\n /* ============ View Functions ============ */ \n\n /**\n * @notice Get listing information with listingId for a list of listingIds\n * @param _listingIds An array of listingIds to fetch details for\n */\n function getListings(uint256[] memory _listingIds)\n external \n view \n returns (ListingWithId[] memory listingInfo) \n {\n listingInfo = new ListingWithId[](_listingIds.length);\n for (uint256 i = 0; i < _listingIds.length; i++) {\n listingInfo[i] = ListingWithId({\n listingId: _listingIds[i],\n listing: listings[_listingIds[i]]\n });\n }\n }\n\n /**\n * @notice Returns all listings created by a user\n * @param _user The address of the user to fetch listings for\n */\n function getUserListings(address _user) external view returns (ListingWithId[] memory listingInfo) {\n uint256[] memory userListingIds = userListings[_user];\n listingInfo = new ListingWithId[](userListingIds.length);\n for (uint256 i = 0; i < userListingIds.length; i++) {\n uint256 listingId = userListingIds[i];\n listingInfo[i] = ListingWithId({\n listingId: listingId,\n listing: listings[listingId]\n });\n }\n }\n\n /**\n * @notice Returns the bids created by a user\n * @param _user The address of the user to fetch bids for\n */\n function getUserBids(address _user) external view returns (BidWithId[] memory bidInfo) {\n uint256[] memory userBidIds = userBids[_user];\n bidInfo = new BidWithId[](userBidIds.length);\n for (uint256 i = 0; i < userBidIds.length; i++) {\n uint256 bidId = userBidIds[i];\n bidInfo[i] = BidWithId({\n bidId: bidId,\n bid: bids[bidId]\n });\n }\n }\n\n /**\n * @notice Returns the bids for given listingIds\n * @param _listingIds An array of listingIds to fetch bids for\n */\n function getListingBids(uint256[] memory _listingIds) external view returns (BidWithId[][] memory bidInfo) {\n bidInfo = new BidWithId[][](_listingIds.length);\n for (uint256 i = 0; i < _listingIds.length; i++) {\n uint256 listingId = _listingIds[i];\n uint256[] memory listingBidIds = listings[listingId].bids;\n bidInfo[i] = new BidWithId[](listingBidIds.length);\n for (uint256 j = 0; j < listingBidIds.length; j++) {\n uint256 bidId = listingBidIds[j];\n bidInfo[i][j] = BidWithId({\n bidId: bidId,\n bid: bids[bidId]\n });\n }\n }\n }\n\n /**\n * @notice Get all allowed sellers\n */\n function getAllowedSellers() external view returns (address[] memory) {\n return _getAllowedAddresses();\n }\n\n /**\n * @notice Get the active listing for given domain id\n * @param _domainId The domain id to fetch the active listing for\n */\n function getDomainListing(bytes32 _domainId) external view returns (ListingWithId memory) {\n uint256 listingId = domainListing[_domainId];\n return ListingWithId({\n listingId: listingId,\n listing: listings[listingId]\n });\n }\n\n /* ============ Internal Functions ============ */\n\n function _updateCreateListingState(\n bytes32 _domainId, \n uint256 _askPrice, \n uint256 _minBidPrice,\n address payable _saleEthRecipient,\n bytes memory _encryptionKey,\n bytes32 _dkimKeyHash\n ) internal returns (uint256 listingId) {\n \n // If listing already exists, delete the old listing\n uint256 oldListingId = domainListing[_domainId];\n if (oldListingId != 0) {\n Listing storage listing = listings[oldListingId];\n _pruneListing(listing, oldListingId);\n }\n \n // New listing\n listingId = listingCounter;\n listings[listingId] = Listing({\n seller: msg.sender,\n saleEthRecipient: _saleEthRecipient,\n encryptionKey: _encryptionKey,\n dkimKeyHash: _dkimKeyHash,\n askPrice: _askPrice,\n minBidPrice: _minBidPrice,\n domainId: _domainId,\n createdAt: block.timestamp,\n isActive: true,\n bids: new uint256[](0)\n });\n userListings[msg.sender].push(listingId);\n domainListing[_domainId] = listingId;\n\n // Increment listingCounter\n listingCounter = listingCounter + 1;\n }\n\n function _validateCreateBid(Listing storage _listing, uint256 _price, bytes32 _buyerIdHash) internal view {\n require(_listing.seller != address(0), \"Listing does not exist\");\n require(_listing.isActive, \"Listing not active\");\n \n // Validate inputs\n require(_price >= _listing.minBidPrice, \"Bid price is less than min bid price\");\n require(_buyerIdHash != bytes32(0), \"Buyer ID hash cannot be empty\");\n }\n\n function _updateCreateBidState(\n Listing storage _listing, \n uint256 _listingId, \n uint256 _price, \n bytes32 _buyerIdHash, \n string memory _encryptedBuyerId\n ) internal returns (uint256 bidId) {\n bidId = bidCounter;\n bids[bidId] = Bid({\n buyer: msg.sender,\n listingId: _listingId,\n encryptedBuyerId: _encryptedBuyerId,\n buyerIdHash: _buyerIdHash,\n createdAt: block.timestamp,\n expiryTimestamp: type(uint256).max,\n price: _price,\n refundInitiated: false\n });\n userBids[msg.sender].push(bidId);\n _listing.bids.push(bidId);\n\n // Increment bidCounter\n bidCounter = bidCounter + 1;\n }\n\n function _validateFinalizeSale(\n Bid storage _bid, \n Listing storage _listing,\n bytes32 _dkimKeyHash,\n bytes32 _hashedReceiverId, \n string memory _transferredDomainName\n ) internal view {\n require(_bid.buyer != address(0), \"Bid does not exist\");\n require(_listing.seller == msg.sender, \"Caller is not listing owner\");\n require(_listing.isActive, \"Listing not active\");\n\n // Validate namecheap DKIM key\n if (_listing.dkimKeyHash != bytes32(0)) {\n require(_dkimKeyHash == _listing.dkimKeyHash, \"Invalid custom DKIM key hash\");\n } else {\n require(\n mailServerKeyHashAdapter.isMailServerKeyHash(_dkimKeyHash), \n \"Invalid managed DKIM key hash\"\n );\n }\n\n // Validate domain and receiver\n bytes32 transferredDomainId = keccak256(abi.encodePacked(_transferredDomainName));\n require(_bid.buyerIdHash == _hashedReceiverId, \"Invalid receiver\");\n require(_listing.domainId == transferredDomainId, \"Invalid domain\");\n }\n\n function _updateFinalizeSaleState(Bid storage _bid, uint256 _bidId, Listing storage _listing) internal {\n uint256 listingId = _bid.listingId;\n \n _pruneBid(_bid, _bidId, _listing);\n _pruneListing(_listing, listingId);\n }\n\n function _validateIncreaseBidPrice(\n Bid storage _bid, \n Listing storage _listing, \n uint256 _newPrice\n ) internal view {\n require(_bid.buyer == msg.sender, \"Caller is not bid owner\");\n require(!_bid.refundInitiated, \"Refund already initiated\");\n require(_listing.isActive, \"Listing not active\");\n\n // Validate new price\n require(_newPrice > _bid.price, \"New price not greater than old price\");\n require(msg.value == _newPrice - _bid.price, \"Incorrect amount of ETH sent\");\n }\n\n function _validateInitiateRefund(Bid storage _bid, Listing storage _listing) internal view {\n require(_bid.buyer == msg.sender, \"Caller is not bid owner\");\n require(!_bid.refundInitiated, \"Refund already initiated\");\n require(block.timestamp > bidSettlementPeriod + _bid.createdAt, \"Refund period not started\");\n require(_listing.isActive, \"Listing expired. Bid can be withdrawn directly\");\n }\n\n function _validateWithdrawBid(Bid storage _bid, Listing storage _listing) internal view {\n require(_bid.buyer == msg.sender, \"Caller is not bid owner\");\n if (_listing.isActive) {\n require(_bid.refundInitiated, \"Refund not initiated\");\n require(block.timestamp >= _bid.expiryTimestamp, \"Refund period not ended\");\n }\n }\n\n function _settleSale(address payable _recipient, uint256 _amount) internal returns (uint256 feeAmount) {\n feeAmount = (_amount * fee) / PRECISE_UNIT;\n _recipient.sendValue(_amount - feeAmount);\n\n if (feeAmount > 0) {\n feeRecipient.sendValue(feeAmount);\n }\n }\n\n /**\n * @notice Deletes a bid from the exchange. Removes the bid from the listing's bids array and the buyer's\n * bids array. Deletes the listing if it is expired and has no bids.\n */\n function _pruneBid(Bid storage _bid, uint256 _bidId, Listing storage _listing) internal {\n userBids[_bid.buyer].removeStorage(_bidId);\n _listing.bids.removeStorage(_bidId);\n if (!_listing.isActive && _listing.bids.length == 0) {\n delete listings[_bid.listingId];\n }\n delete bids[_bidId];\n }\n\n /**\n * @notice Marks a listing as expired. Removes the listing from the seller's listings array and domain listing.\n * If the listing has no bids, it is deleted from the exchange.\n */\n function _pruneListing(Listing storage _listing, uint256 _listingId) internal {\n _listing.isActive = false;\n userListings[_listing.seller].removeStorage(_listingId);\n delete domainListing[_listing.domainId];\n if (_listing.bids.length == 0) {\n delete listings[_listingId];\n }\n }\n}\n" + "content": "// SPDX-License-Identifier: MIT\n\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport { ReentrancyGuard } from \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\nimport { Pausable } from \"@openzeppelin/contracts/security/Pausable.sol\";\n\nimport { AddressAllowList } from \"./external/AddressAllowList.sol\";\nimport { Bytes32ArrayUtils } from \"./external/lib/Bytes32ArrayUtils.sol\";\nimport { Uint256ArrayUtils } from \"./external/lib/Uint256ArrayUtils.sol\";\nimport { IKeyHashAdapterV2 } from \"./external/interfaces/IKeyHashAdapterV2.sol\";\n\nimport { IDomainExchange } from \"./interfaces/IDomainExchange.sol\";\nimport { ITransferDomainProcessor } from \"./interfaces/ITransferDomainProcessor.sol\";\nimport { IVerifiedDomainRegistry } from \"./interfaces/IVerifiedDomainRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract DomainExchange is IDomainExchange, AddressAllowList, ReentrancyGuard, Pausable {\n\n using Address for address payable;\n using Bytes32ArrayUtils for bytes32[];\n using Uint256ArrayUtils for uint256[];\n\n /* ============ Events ============ */\n \n event ListingCreated(\n uint256 indexed listingId, \n address indexed seller, \n bytes32 indexed domainId, \n bytes32 dkimKeyHash,\n uint256 askPrice,\n uint256 minBidPrice,\n address saleEthRecipient\n );\n event ListingUpdated(uint256 indexed listingId, address indexed seller, uint256 newAskPrice, address saleEthRecipient);\n event ListingDeleted(uint256 indexed listingId, address indexed seller);\n event ListingDeletedByRegistry(uint256 indexed listingId);\n \n event BidCreated(uint256 indexed bidId, uint256 indexed listingId, address indexed buyer, uint256 price);\n event BidPriceIncreased(uint256 indexed bidId, address indexed buyer, uint256 newPrice);\n event RefundInitiated(uint256 indexed bidId, address indexed buyer);\n event BidWithdrawn(uint256 indexed bidId, address indexed buyer, uint256 amount);\n \n event SaleFinalized(uint256 indexed bidId, uint256 indexed listingId, uint256 priceNetFees, uint256 fees);\n \n event InstantAcceptUpdated(address indexed buyer, bool instantAccept);\n\n event FeeUpdated(uint256 newFee);\n event FeeRecipientUpdated(address indexed newFeeRecipient);\n event BidSettlementPeriodUpdated(uint256 newBidSettlementPeriod);\n event BidRefundPeriodUpdated(uint256 newBidRefundPeriod);\n event TransferDomainProcessorUpdated(ITransferDomainProcessor indexed newTransferDomainProcessor);\n event MailServerKeyHashAdapterUpdated(IKeyHashAdapterV2 indexed newMailServerKeyHashAdapter);\n\n /* ============ Structs ============ */\n struct Listing {\n address seller;\n address payable saleEthRecipient; // Must be a contract that can receive ETH or an EOA\n bytes32 dkimKeyHash; // Allow for custom DKIM key hash\n bytes encryptionKey;\n bytes32 domainId;\n uint256 createdAt;\n uint256 askPrice;\n uint256 minBidPrice;\n bool isActive; // false by default, set to true when the listing is created\n uint256[] bids;\n }\n\n struct ListingWithId {\n uint256 listingId;\n Listing listing;\n }\n\n struct Bid {\n address buyer;\n uint256 listingId;\n string encryptedBuyerId;\n bytes32 buyerIdHash;\n uint256 createdAt;\n uint256 expiryTimestamp;\n uint256 price;\n bool refundInitiated;\n }\n\n struct BidDetailsWithId {\n uint256 bidId;\n Bid bid;\n bool buyerInstantAcceptEnabled;\n }\n\n /* ============ Modifiers ============ */\n modifier onlyInitialized() {\n require(isInitialized, \"Contract must be initialized\");\n _;\n }\n\n /* ============ Public Variables ============ */\n\n mapping(uint256 => Listing) public listings;\n mapping(address => uint256[]) public userListings;\n mapping(uint256 => Bid) public bids;\n mapping(address => uint256[]) public userBids;\n mapping(address => bool) public instantAcceptEnabled;\n\n uint256 public fee;\n address payable public feeRecipient;\n uint256 public bidCounter;\n uint256 public listingCounter;\n uint256 public bidSettlementPeriod;\n uint256 public bidRefundPeriod;\n \n bool public isInitialized;\n \n ITransferDomainProcessor public transferDomainProcessor;\n IVerifiedDomainRegistry public verifiedDomainRegistry;\n IKeyHashAdapterV2 public mailServerKeyHashAdapter;\n\n /* ============ Constants ============ */\n uint256 internal constant PRECISE_UNIT = 1e18;\n\n /* ============ Constructor ============ */\n\n constructor(\n address _owner,\n uint256 _fee,\n address payable _feeRecipient,\n uint256 _bidSettlementPeriod,\n uint256 _bidRefundPeriod,\n address[] memory _allowedAddresses\n ) AddressAllowList(_allowedAddresses) {\n fee = _fee;\n feeRecipient = _feeRecipient;\n bidSettlementPeriod = _bidSettlementPeriod;\n bidRefundPeriod = _bidRefundPeriod;\n \n bidCounter = 1;\n listingCounter = 1;\n isInitialized = false;\n \n transferOwnership(_owner);\n }\n\n /* ============ Public Functions ============ */\n\n /**\n * @notice Creates listing for a domain. If ownership of domain changes offchain, the new owner\n * will have to first register the domain on the domain registry contract. Then the new owner\n * can create a listing for the domain. The old listing will be deleted from the old owner's \n * listings and the old listing is marked as NOT active, which prevents any new bids from being\n * created on it and makes the old bids immediately withdrawable. We also allow the seller to\n * specify a custom DKIM key hash for Namecheap if they want to opt out of using the managed DKIM\n * key hash set in the transferDomainProcessor contract. The managed DKIM key hash *can* be \n * updated by us whenever Namecheap rotates their DKIM key.\n *\n * Function reverts if:\n * - Caller is not domain owner on the domain registry contract\n * - Ask price is less than min bid price\n * - Sale ETH recipient is the zero address\n *\n * @param _domainId The unique identifier of the domain\n * @param _askPrice An asking price for the domain\n * @param _minBidPrice The minimum bid price for the domain\n * @param _saleEthRecipient The address to receive the ETH from the sale; must be a contract that can\n * receive ETH or an EOA\n * @param _encryptionKey The encryption key for buyers to encrypt the buyerId to\n * @param _dkimKeyHash The custom DKIM key hash. If empty, the managed DKIM key hash will be used\n */\n function createListing(\n bytes32 _domainId, \n uint256 _askPrice, \n uint256 _minBidPrice, \n address payable _saleEthRecipient, \n bytes memory _encryptionKey,\n bytes32 _dkimKeyHash\n ) \n external\n onlyAllowed\n onlyInitialized \n whenNotPaused\n {\n _verifyCreateListing(_domainId, _minBidPrice, _askPrice, _saleEthRecipient);\n\n uint256 listingId = _updateCreateListingState(\n _domainId, _askPrice, _minBidPrice, _saleEthRecipient, _encryptionKey, _dkimKeyHash\n );\n\n verifiedDomainRegistry.setDomainListing(_domainId, listingId);\n\n emit ListingCreated(listingId, msg.sender, _domainId, _dkimKeyHash, _askPrice, _minBidPrice, _saleEthRecipient);\n }\n\n /**\n * @notice Creates a new bid for a listing. Transfers ETH from the buyer to the contract. Every buyer\n * has a unique identifier, for Namecheap it's their username. The seller needs the raw buyerId\n * to transfer the domain off-chain. To facilitate this, the buyer encrypts their buyerId using the \n * seller's encryption key and sends it along with the bid. The seller then decrypts the buyerId \n * using their private key to get the raw buyerId.\n *\n * DEV NOTE: We do not check that the encrypted buyerId is the same as the hashed buyerId. This must be\n * done in the client! This does not affect the security of the protocol as the encrypted buyerId is only \n * used for communication between the buyer and the seller while maintaining privacy.\n *\n * @param _listingId The unique identifier of the listing to bid on\n * @param _buyerIdHash The hashed buyerId which is also output as part of the transfer proof later\n * @param _encryptedBuyerId The encrypted buyerId. Should be the same as the buyerId hashed\n */\n function createBid(uint256 _listingId, bytes32 _buyerIdHash, string memory _encryptedBuyerId) \n external \n payable\n nonReentrant\n whenNotPaused\n {\n uint256 price = msg.value;\n Listing storage listing = listings[_listingId];\n\n _validateCreateBid(listing, price, _buyerIdHash);\n\n uint256 bidId = _updateCreateBidState(listing, _listingId, price, _buyerIdHash, _encryptedBuyerId);\n\n emit BidCreated(bidId, _listingId, msg.sender, price);\n }\n\n /**\n * @notice ONLY SELLER: Finalizes a sale by verifying the domain transfer and unlocking bid funds to \n * the listing owner. The seller can also finalize the sale with bids that have initiated a refund \n * including the ones that have expired based on timestamp but not withdrawn yet.\n *\n * @param _proof The zk-email proof of domain transfer\n */\n function finalizeSale(ITransferDomainProcessor.TransferProof calldata _proof) \n external\n onlyInitialized\n nonReentrant\n whenNotPaused\n {\n // Check\n (\n bytes32 dkimKeyHash,\n bytes32 hashedReceiverId, \n string memory domainName, \n uint256 bidId\n ) = transferDomainProcessor.processProof(_proof);\n\n Bid storage bid = bids[bidId];\n Listing storage listing = listings[bid.listingId];\n \n _validateFinalizeSale(bid, listing, dkimKeyHash, hashedReceiverId, domainName);\n \n // Effect\n verifiedDomainRegistry.updateDomainOnSale(listing.domainId, bid.buyer);\n\n uint256 transferValue = bid.price;\n address payable recipient = listing.saleEthRecipient;\n uint256 listingId = bid.listingId;\n _updateFinalizeSaleState(bid, bidId, listing);\n\n // Interaction\n uint256 feeAmount = _settleSale(recipient, transferValue);\n \n emit SaleFinalized(bidId, listingId, transferValue - feeAmount, feeAmount);\n }\n\n /**\n * @notice ONLY BUYER: Finalize a sale by releasing funds to the seller. Proof of transfer is not required\n * because it is not in the buyer's interest to release funds unless they have received the domain. Note that the\n * bid can be in ANY STATE when this function is called. Upon calling this function funds will be transferred to\n * the seller and fees will be taken by the protocol. The listing and the bid will be deleted. The function will\n * revert if:\n * - The bid is not owned by the caller\n * - The listing is not active (sold or withdrawn)\n *\n * @param _bidId The unique identifier of the bid to release funds for\n */\n function buyerReleaseFunds(uint256 _bidId) \n external\n nonReentrant\n {\n // Check\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n require(bid.buyer == msg.sender, \"Caller is not bid owner\");\n require(listing.isActive, \"Listing not active\");\n\n // Effect\n verifiedDomainRegistry.updateDomainOnSale(listing.domainId, bid.buyer);\n\n uint256 transferValue = bid.price;\n address payable recipient = listing.saleEthRecipient;\n uint256 listingId = bid.listingId;\n \n _updateFinalizeSaleState(bid, _bidId, listing);\n\n // Interaction\n uint256 feeAmount = _settleSale(recipient, transferValue);\n\n emit SaleFinalized(_bidId, listingId, transferValue - feeAmount, feeAmount);\n }\n\n /**\n * @notice ONLY SELLER: Updates the asking price of an existing listing. We don't update\n * the existing bids against the listing because the newAskPrice is an indicative value.\n * The new ask price must be greater than or equal to the existing min bid price. If seller\n * wants to update the min bid price, they should delete the listing and create a new one with\n * the new min bid price.\n *\n * @param _listingId The unique identifier of the listing to update\n * @param _newAskPrice The new asking price for the listing\n * @param _saleEthRecipient The new address to receive the ETH from the sale; must be a contract that can\n * receive ETH or an EOA\n */\n function updateListing(uint256 _listingId, uint256 _newAskPrice, address payable _saleEthRecipient) external whenNotPaused {\n Listing storage listing = listings[_listingId];\n \n require(listing.seller == msg.sender, \"Caller is not listing owner\");\n require(listing.isActive, \"Listing not active\");\n require(_newAskPrice >= listing.minBidPrice, \"Ask price is less than min bid price\");\n require(_saleEthRecipient != address(0), \"Invalid sale ETH recipient\");\n \n listing.askPrice = _newAskPrice;\n listing.saleEthRecipient = _saleEthRecipient;\n\n emit ListingUpdated(_listingId, msg.sender, _newAskPrice, _saleEthRecipient);\n }\n\n /**\n * @notice ONLY SELLER: Marks a listing as NOT active. Removes the listing from the seller's listings array\n * and domain listing. If the listing has no bids, it is deleted from the exchange. Bids against the listing\n * are left as is to allow the buyer to withdraw the bid.\n *\n * @param _listingId The unique identifier of the listing to delete\n */\n function deleteListing(uint256 _listingId) external {\n Listing storage listing = listings[_listingId];\n \n require(listing.seller == msg.sender, \"Caller is not listing owner\");\n require(listing.isActive, \"Listing not active\");\n \n verifiedDomainRegistry.removeDomainListing(listing.domainId);\n\n _pruneListing(listing, _listingId);\n\n emit ListingDeleted(_listingId, msg.sender);\n }\n\n /**\n * @notice ONLY EXCHANGE: Remove a listing for domain when ownership changes on the registry.\n * \n * @param _listingId Listing Id to remove\n */\n function registryRemoveListing(uint256 _listingId) external override {\n Listing storage listing = listings[_listingId];\n\n require(address(verifiedDomainRegistry) == msg.sender, \"Caller is not registry\");\n // If listing is NOT active, this function will NOT be called because the listing status\n // would have already been removed from the registry beforehand; so there is no need to \n // check if listing is active\n \n _pruneListing(listing, _listingId);\n\n emit ListingDeletedByRegistry(_listingId);\n }\n\n /**\n * @notice ONLY BUYER: Increases the price of an existing bid. The new price can ONLY be higher \n * than the old price. The buyer must send the additional amount of ETH. The function reverts if\n * - bid has initiated refund, caller is not bid owner or listing is not active\n * - the new price is less than old price\n * - msg.value is NOT STRICTLY EQUAL to than new price - old price\n *\n * @param _bidId The unique identifier of the bid to increase the price for\n * @param _newPrice The new price for the bid\n */\n function increaseBidPrice(uint256 _bidId, uint256 _newPrice)\n external\n payable\n nonReentrant\n whenNotPaused\n {\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n // Check\n _validateIncreaseBidPrice(bid, listing, _newPrice);\n \n // Effect\n bid.price = _newPrice;\n\n emit BidPriceIncreased(_bidId, msg.sender, _newPrice);\n }\n\n /**\n * @notice Enables the instant accept flag for the buyer. This flag is used to indicate if the buyer has \n * configured their Namecheap account to accept ownership of domains immediately upon transfer.\n * \n * DEV NOTE: We can not check that the buyer has actually enabled instant accept on Namecheap. It is only \n * an indicative flag to help the seller know if they can finalize the sale immediately or not. The seller\n * may get tricked by a malicious buyer to initiate a transfer to them assuming instant accept is on. But\n * if the buyer does not have instant accept enabled, the seller will get immediate feedback and they can \n * cancel the transfer immediately.\n */\n function enableInstantAccept() external onlyInitialized {\n require(!instantAcceptEnabled[msg.sender], \"Instant accept already enabled\");\n \n instantAcceptEnabled[msg.sender] = true; \n emit InstantAcceptUpdated(msg.sender, true);\n }\n\n /**\n * @notice Disables the instant accept flag for the buyer.\n */\n function disableInstantAccept() external onlyInitialized {\n require(instantAcceptEnabled[msg.sender], \"Instant accept already disabled\");\n\n instantAcceptEnabled[msg.sender] = false;\n emit InstantAcceptUpdated(msg.sender, false);\n }\n\n /**\n * @notice ONLY BUYER: Initiates the refund process for a bid. Can only be called by the bid owner \n * after the initial bid expiry period has passed.\n *\n * @param _bidId The unique identifier of the bid to initiate refund for\n */\n function initiateRefund(uint256 _bidId) external {\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n _validateInitiateRefund(bid, listing);\n\n bid.expiryTimestamp = block.timestamp + bidRefundPeriod;\n bid.refundInitiated = true;\n\n emit RefundInitiated(_bidId, bid.buyer);\n }\n\n /**\n * @notice ONLY BUYER: Withdraws a bid after the refund period has ended. Transfers ETH back to the buyer.\n *\n * @param _bidId The unique identifier of the bid to withdraw\n */\n function withdrawBid(uint256 _bidId) external nonReentrant {\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n // Check\n _validateWithdrawBid(bid, listing);\n\n // Effect\n uint256 refundAmount = bid.price;\n _pruneBid(bid, _bidId, listing);\n \n // Interaction\n payable(msg.sender).sendValue(refundAmount);\n\n emit BidWithdrawn(_bidId, msg.sender, refundAmount);\n }\n\n /* ============ Admin Functions ============ */\n\n /**\n * @notice Initializes the contract with domain verification and transfer processors. Can \n * only be called once by the contract owner\n * \n * @param _transferDomainProcessor The address of the domain transfer processor contract\n * @param _verifiedDomainRegistry The address of the verified domain registry contract\n * @param _mailServerKeyHashAdapter The address of the mail server key hash adapter contract\n */\n function initialize(\n ITransferDomainProcessor _transferDomainProcessor,\n IVerifiedDomainRegistry _verifiedDomainRegistry,\n IKeyHashAdapterV2 _mailServerKeyHashAdapter\n ) external onlyOwner {\n require(!isInitialized, \"Already initialized\");\n transferDomainProcessor = _transferDomainProcessor;\n verifiedDomainRegistry = _verifiedDomainRegistry;\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\n isInitialized = true;\n }\n\n /**\n * @notice ONLY OWNER: Pauses listing and proof submission functionality for the marketplace. \n * Functionalites that are paused:\n * - Listing creation and update\n * - Bid creation and update\n * - Sale finalization\n * \n * Functinonalites that remain unpaused to allow users to retrieve funds in contract:\n * - Bid refund initiation and withdrawal\n * - Listing deletion\n * - Manual settlement between buyer and seller\n */\n function pauseMarketplace() external onlyOwner {\n _pause();\n }\n\n /**\n * @notice ONLY OWNER: Restarts paused functionality for the marketplace.\n */\n function unpauseMarketplace() external onlyOwner {\n _unpause();\n }\n\n /**\n * @notice ONLY OWNER: Update the transfer domain processor\n *\n * @param _transferDomainProcessor The new transfer domain processor\n */\n function updateTransferDomainProcessor(ITransferDomainProcessor _transferDomainProcessor) external onlyOwner {\n require(address(_transferDomainProcessor) != address(0), \"Invalid address\");\n \n transferDomainProcessor = _transferDomainProcessor;\n emit TransferDomainProcessorUpdated(_transferDomainProcessor);\n }\n\n /**\n * @notice ONLY OWNER: Update the managed mail server key hash adapter\n *\n * @param _mailServerKeyHashAdapter The new mail server key hash adapter\n */\n function updateMailServerKeyHashAdapter(IKeyHashAdapterV2 _mailServerKeyHashAdapter) external onlyOwner {\n require(address(_mailServerKeyHashAdapter) != address(0), \"Invalid address\");\n \n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\n emit MailServerKeyHashAdapterUpdated(_mailServerKeyHashAdapter);\n }\n\n /**\n * @notice ONLY OWNER: Updates the fee percentage for the marketplace\n *\n * @param _newFee The new fee percentage (in basis points)\n */\n function updateFee(uint256 _newFee) external onlyOwner {\n fee = _newFee;\n emit FeeUpdated(_newFee);\n }\n\n /**\n * @notice ONLY OWNER: Updates the fee recipient address\n *\n * @param _newFeeRecipient The new address to receive fees\n */\n function updateFeeRecipient(address payable _newFeeRecipient) external onlyOwner {\n require(_newFeeRecipient != address(0), \"Invalid address\");\n feeRecipient = _newFeeRecipient;\n emit FeeRecipientUpdated(_newFeeRecipient);\n }\n\n /**\n * @notice ONLY OWNER: Updates the minimum bid active period\n *\n * @param _newBidSettlementPeriod The new bid settlement period in seconds\n */\n function updateBidSettlementPeriod(uint256 _newBidSettlementPeriod) external onlyOwner {\n require(_newBidSettlementPeriod > 0, \"Bid settlement period must be greater than 0\");\n bidSettlementPeriod = _newBidSettlementPeriod;\n emit BidSettlementPeriodUpdated(_newBidSettlementPeriod);\n }\n\n /**\n * @notice ONLY OWNER: Updates the bid refund period\n *\n * @param _newBidRefundPeriod The new bid refund period in seconds\n */\n function updateBidRefundPeriod(uint256 _newBidRefundPeriod) external onlyOwner {\n require(_newBidRefundPeriod > 0, \"Bid refund period must be greater than 0\");\n bidRefundPeriod = _newBidRefundPeriod;\n emit BidRefundPeriodUpdated(_newBidRefundPeriod);\n }\n\n /* ============ View Functions ============ */ \n\n /**\n * @notice Get listing information with listingId for a list of listingIds\n * @param _listingIds An array of listingIds to fetch details for\n */\n function getListings(uint256[] memory _listingIds)\n external \n view \n returns (ListingWithId[] memory listingInfo) \n {\n listingInfo = new ListingWithId[](_listingIds.length);\n for (uint256 i = 0; i < _listingIds.length; i++) {\n listingInfo[i] = ListingWithId({\n listingId: _listingIds[i],\n listing: listings[_listingIds[i]]\n });\n }\n }\n\n /**\n * @notice Returns all listings created by a user\n * @param _user The address of the user to fetch listings for\n */\n function getUserListings(address _user) external view returns (ListingWithId[] memory listingInfo) {\n uint256[] memory userListingIds = userListings[_user];\n listingInfo = new ListingWithId[](userListingIds.length);\n for (uint256 i = 0; i < userListingIds.length; i++) {\n uint256 listingId = userListingIds[i];\n listingInfo[i] = ListingWithId({\n listingId: listingId,\n listing: listings[listingId]\n });\n }\n }\n\n /**\n * @notice Returns the bids created by a user\n * @param _user The address of the user to fetch bids for\n */\n function getUserBids(address _user) external view returns (BidDetailsWithId[] memory bidInfo) {\n uint256[] memory userBidIds = userBids[_user];\n bidInfo = new BidDetailsWithId[](userBidIds.length);\n for (uint256 i = 0; i < userBidIds.length; i++) {\n uint256 bidId = userBidIds[i];\n bidInfo[i] = BidDetailsWithId({\n bidId: bidId,\n bid: bids[bidId],\n buyerInstantAcceptEnabled: instantAcceptEnabled[_user]\n });\n }\n }\n\n /**\n * @notice Returns the bids for given listingIds\n * @param _listingIds An array of listingIds to fetch bids for\n */\n function getListingBids(uint256[] memory _listingIds) external view returns (BidDetailsWithId[][] memory bidInfo) {\n bidInfo = new BidDetailsWithId[][](_listingIds.length);\n for (uint256 i = 0; i < _listingIds.length; i++) {\n uint256 listingId = _listingIds[i];\n uint256[] memory listingBidIds = listings[listingId].bids;\n bidInfo[i] = new BidDetailsWithId[](listingBidIds.length);\n for (uint256 j = 0; j < listingBidIds.length; j++) {\n uint256 bidId = listingBidIds[j];\n bidInfo[i][j] = BidDetailsWithId({\n bidId: bidId,\n bid: bids[bidId],\n buyerInstantAcceptEnabled: instantAcceptEnabled[bids[bidId].buyer]\n });\n }\n }\n }\n\n /**\n * @notice Get all allowed sellers\n */\n function getAllowedSellers() external view returns (address[] memory) {\n return _getAllowedAddresses();\n }\n\n\n /* ============ Internal Functions ============ */\n\n function _verifyCreateListing(\n bytes32 _domainId, \n uint256 _minBidPrice, \n uint256 _askPrice, \n address _saleEthRecipient\n ) internal view {\n IVerifiedDomainRegistry.DomainWithId memory domainWithId = verifiedDomainRegistry.getDomain(_domainId);\n require(domainWithId.domain.owner == msg.sender, \"Caller is not domain owner\");\n require(domainWithId.domain.exchange == address(0), \"Domain already listed on registry\");\n\n require(_minBidPrice > 0, \"Minimum bid price is zero\");\n require(_askPrice >= _minBidPrice, \"Ask price is less than min bid price\");\n require(_saleEthRecipient != address(0), \"Invalid sale ETH recipient\");\n }\n\n function _updateCreateListingState(\n bytes32 _domainId, \n uint256 _askPrice, \n uint256 _minBidPrice,\n address payable _saleEthRecipient,\n bytes memory _encryptionKey,\n bytes32 _dkimKeyHash\n ) internal returns (uint256 listingId) {\n \n // New listing\n listingId = listingCounter;\n listings[listingId] = Listing({\n seller: msg.sender,\n saleEthRecipient: _saleEthRecipient,\n encryptionKey: _encryptionKey,\n dkimKeyHash: _dkimKeyHash,\n askPrice: _askPrice,\n minBidPrice: _minBidPrice,\n domainId: _domainId,\n createdAt: block.timestamp,\n isActive: true,\n bids: new uint256[](0)\n });\n userListings[msg.sender].push(listingId);\n\n // Increment listingCounter\n listingCounter = listingCounter + 1;\n }\n\n function _validateCreateBid(Listing storage _listing, uint256 _price, bytes32 _buyerIdHash) internal view {\n require(_listing.seller != address(0), \"Listing does not exist\");\n require(_listing.isActive, \"Listing not active\");\n \n // Validate inputs\n require(_price >= _listing.minBidPrice, \"Bid price is less than min bid price\");\n require(_buyerIdHash != bytes32(0), \"Buyer ID hash cannot be empty\");\n }\n\n function _updateCreateBidState(\n Listing storage _listing, \n uint256 _listingId, \n uint256 _price, \n bytes32 _buyerIdHash, \n string memory _encryptedBuyerId\n ) internal returns (uint256 bidId) {\n bidId = bidCounter;\n bids[bidId] = Bid({\n buyer: msg.sender,\n listingId: _listingId,\n encryptedBuyerId: _encryptedBuyerId,\n buyerIdHash: _buyerIdHash,\n createdAt: block.timestamp,\n expiryTimestamp: type(uint256).max,\n price: _price,\n refundInitiated: false\n });\n userBids[msg.sender].push(bidId);\n _listing.bids.push(bidId);\n\n // Increment bidCounter\n bidCounter = bidCounter + 1;\n }\n\n function _validateFinalizeSale(\n Bid storage _bid, \n Listing storage _listing,\n bytes32 _dkimKeyHash,\n bytes32 _hashedReceiverId, \n string memory _transferredDomainName\n ) internal view {\n require(_bid.buyer != address(0), \"Bid does not exist\");\n require(_listing.seller == msg.sender, \"Caller is not listing owner\");\n require(_listing.isActive, \"Listing not active\");\n\n // Validate namecheap DKIM key\n if (_listing.dkimKeyHash != bytes32(0)) {\n require(_dkimKeyHash == _listing.dkimKeyHash, \"Invalid custom DKIM key hash\");\n } else {\n require(\n mailServerKeyHashAdapter.isMailServerKeyHash(_dkimKeyHash), \n \"Invalid managed DKIM key hash\"\n );\n }\n\n // Validate domain and receiver\n bytes32 transferredDomainId = keccak256(abi.encodePacked(_transferredDomainName));\n require(_bid.buyerIdHash == _hashedReceiverId, \"Invalid receiver\");\n require(_listing.domainId == transferredDomainId, \"Invalid domain\");\n }\n\n function _updateFinalizeSaleState(Bid storage _bid, uint256 _bidId, Listing storage _listing) internal {\n uint256 listingId = _bid.listingId;\n \n _pruneBid(_bid, _bidId, _listing);\n _pruneListing(_listing, listingId);\n }\n\n function _validateIncreaseBidPrice(\n Bid storage _bid, \n Listing storage _listing, \n uint256 _newPrice\n ) internal view {\n require(_bid.buyer == msg.sender, \"Caller is not bid owner\");\n require(!_bid.refundInitiated, \"Refund already initiated\");\n require(_listing.isActive, \"Listing not active\");\n\n // Validate new price\n require(_newPrice > _bid.price, \"New price not greater than old price\");\n require(msg.value == _newPrice - _bid.price, \"Incorrect amount of ETH sent\");\n }\n\n function _validateInitiateRefund(Bid storage _bid, Listing storage _listing) internal view {\n require(_bid.buyer == msg.sender, \"Caller is not bid owner\");\n require(!_bid.refundInitiated, \"Refund already initiated\");\n require(block.timestamp > bidSettlementPeriod + _bid.createdAt, \"Refund period not started\");\n require(_listing.isActive, \"Listing expired. Bid can be withdrawn directly\");\n }\n\n function _validateWithdrawBid(Bid storage _bid, Listing storage _listing) internal view {\n require(_bid.buyer == msg.sender, \"Caller is not bid owner\");\n if (_listing.isActive) {\n require(_bid.refundInitiated, \"Refund not initiated\");\n require(block.timestamp >= _bid.expiryTimestamp, \"Refund period not ended\");\n }\n }\n\n function _settleSale(address payable _recipient, uint256 _amount) internal returns (uint256 feeAmount) {\n feeAmount = (_amount * fee) / PRECISE_UNIT;\n _recipient.sendValue(_amount - feeAmount);\n\n if (feeAmount > 0) {\n feeRecipient.sendValue(feeAmount);\n }\n }\n\n /**\n * @notice Deletes a bid from the exchange. Removes the bid from the listing's bids array and the buyer's\n * bids array. Deletes the listing if it is expired and has no bids.\n */\n function _pruneBid(Bid storage _bid, uint256 _bidId, Listing storage _listing) internal {\n userBids[_bid.buyer].removeStorage(_bidId);\n _listing.bids.removeStorage(_bidId);\n if (!_listing.isActive && _listing.bids.length == 0) {\n delete listings[_bid.listingId];\n }\n delete bids[_bidId];\n }\n\n /**\n * @notice Marks a listing as expired. Removes the listing from the seller's listings array and domain listing.\n * If the listing has no bids, it is deleted from the exchange.\n */\n function _pruneListing(Listing storage _listing, uint256 _listingId) internal {\n _listing.isActive = false;\n userListings[_listing.seller].removeStorage(_listingId);\n if (_listing.bids.length == 0) {\n delete listings[_listingId];\n }\n }\n}\n" }, "contracts/external/AddressAllowList.sol": { "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { AddressArrayUtils } from \"./lib/AddressArrayUtils.sol\";\n\npragma solidity ^0.8.18;\n\ncontract AddressAllowList is Ownable {\n\n using AddressArrayUtils for address[];\n\n /* ============ Events ============ */\n event AddressAddedToAllowlist(address indexed allowedAddress);\n event AddressRemovedFromAllowlist(address indexed allowedAddress);\n event AllowlistEnabled();\n event AllowlistDisabled();\n \n /* ============ Modifier ============ */\n modifier onlyAllowed() {\n require(isEnabled ? isAllowed[msg.sender] : true, \"Address is not allowed\");\n _;\n }\n \n /* ============ State Variables ============ */\n bool public isEnabled; // Boolean indicating if the allowlist is enabled\n address[] public allowedAddresses; // Array of addresses that are allowed from taking depositors liquidity\n mapping(address => bool) public isAllowed; // Mapping of address to boolean indicating if the user is allowed\n\n /* ============ Constructor ============ */\n constructor(address[] memory _allowedAddresses) Ownable() {\n for (uint256 i = 0; i < _allowedAddresses.length; i++) {\n address allowedAddress = _allowedAddresses[i];\n\n require(!isAllowed[allowedAddress], \"Address is already allowed\");\n isAllowed[allowedAddress] = true;\n emit AddressAddedToAllowlist(allowedAddress);\n }\n allowedAddresses = _allowedAddresses;\n isEnabled = true;\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice Adds passed addresses to an allow list. Addresses on the allow list are able to call allow listed\n * functions.\n *\n * @param _allowedAddresses List of addresses allowed to call allow listed functions\n */\n function addAddressesToAllowlist(address[] memory _allowedAddresses) external onlyOwner {\n for(uint256 i = 0; i < _allowedAddresses.length; i++) {\n address allowedAddress = _allowedAddresses[i];\n\n require(!isAllowed[allowedAddress], \"Address already on allowlist\");\n\n isAllowed[allowedAddress] = true;\n allowedAddresses.push(allowedAddress);\n\n emit AddressAddedToAllowlist(allowedAddress);\n }\n }\n\n /**\n * @notice Removes passed addresses from an allow list. Addresses not on the allow list are unable to call\n * allow listed functions.\n *\n * @param _disallowedAddresses List of addresses being disallowed from calling allow listed functions\n */\n function removeAddressesFromAllowlist(address[] memory _disallowedAddresses) external onlyOwner {\n for(uint256 i = 0; i < _disallowedAddresses.length; i++) {\n address disallowedAddress = _disallowedAddresses[i];\n\n require(isAllowed[disallowedAddress], \"Address already disallowed\");\n\n isAllowed[disallowedAddress] = false;\n allowedAddresses.removeStorage(disallowedAddress);\n\n emit AddressRemovedFromAllowlist(disallowedAddress);\n }\n }\n\n /**\n * @notice Enable the allow list. When the allow list is enabled, only approved addresses are allowed to\n * functions with onlyAllowed modifier.\n */\n function enableAllowlist() external onlyOwner {\n require(!isEnabled, \"Allow list is already enabled\");\n\n isEnabled = true;\n emit AllowlistEnabled();\n }\n\n /**\n * @notice Disable the allow list. When the allow list is disabled, any address is allowed to call functions\n * with onlyAllowed modifier.\n */\n function disableAllowlist() external onlyOwner {\n require(isEnabled, \"Allow list is already disabled\");\n\n isEnabled = false;\n emit AllowlistDisabled();\n }\n\n /* ============ View Functions ============ */\n\n function _getAllowedAddresses() internal view returns (address[] memory) {\n return allowedAddresses;\n }\n}\n" @@ -97,15 +97,21 @@ "contracts/external/TicketmasterDataParsing.sol": { "content": "//SPDX-License-Identifier: MIT\n\nimport { DateTime } from \"./lib/DateTime.sol\";\n\nimport { StringConversionUtils } from \"./lib/StringConversionUtils.sol\";\nimport { ClaimVerifier } from \"./ClaimVerifier.sol\";\n\npragma solidity ^0.8.18;\n\nlibrary TicketmasterDataParsing {\n \n using StringConversionUtils for string;\n\n /**\n * @notice Iterates through every character in the date string and splits the string at each dash, \"T\", or colon. Function will revert\n * if there are not 6 substrings formed from the split. The substrings are then converted to uints and passed to the DateTime lib\n * to get the unix timestamp. This function is SPECIFIC TO THE DATE FORMAT USED BY Ticketmaster, not suitable for use with other date\n * formats. Ticketmaster date format is: \"YYYY-MM-DDTHH:MM:SS\" and returns UTC timestamps.\n *\n * @param _dateString Date string to be converted to a UTC timestamp\n */\n function _dateStringToTimestamp(string memory _dateString) internal pure returns (uint256 utcTimestamp) {\n string[6] memory extractedStrings;\n uint256 breakCounter;\n uint256 lastBreak;\n for (uint256 i = 0; i < bytes(_dateString).length; i++) {\n if (bytes(_dateString)[i] == 0x2d || bytes(_dateString)[i] == 0x3a || bytes(_dateString)[i] == 0x54) {\n extractedStrings[breakCounter] = _dateString.substring(lastBreak, i);\n lastBreak = i + 1;\n breakCounter++;\n }\n }\n // Add last substring to array\n extractedStrings[breakCounter] = _dateString.substring(lastBreak, bytes(_dateString).length);\n\n // Check that exactly 6 substrings were found (string is split at 5 different places)\n require(breakCounter == 5, \"Invalid date string\");\n\n utcTimestamp = DateTime.timestampFromDateTime(\n extractedStrings[0].stringToUint(0), // year\n extractedStrings[1].stringToUint(0), // month\n extractedStrings[2].stringToUint(0), // day\n extractedStrings[3].stringToUint(0), // hour\n extractedStrings[4].stringToUint(0), // minute\n 0 // we don't need to the second granularity\n );\n }\n\n /**\n * Extract event ID from URL by finding the last slash and taking the substring after it. We assume the\n * URL is formulated something like: {domainRoot}/.../event/EVENT_ID\n *\n * @param _url URL to extract event ID from\n * @return Event ID extracted from URL\n */\n function _extractEventIdFromUrl(string memory _url) internal pure returns (string memory) {\n string memory prefix = \"event/\";\n bytes memory urlBytes = bytes(_url);\n uint256 urlLength = urlBytes.length;\n\n uint256 startIndex = ClaimVerifier.findSubstringEndIndex(_url, prefix);\n // If the start index is the max value or the URL length, then the event ID was not found\n if (startIndex == type(uint256).max || startIndex == urlLength) {\n revert(\"Event ID not found in URL\");\n }\n\n bytes memory contextMessage = new bytes(urlLength - startIndex);\n for (uint i = startIndex; i < urlLength; i++) {\n contextMessage[i - startIndex] = urlBytes[i];\n }\n return string(contextMessage);\n }\n\n /**\n * Parse tickets out of a ticket string of the format: '[\"ticket1\", \"ticket2\", \"ticket3\"]'.\n * We start by getting the number of tickets in a string by counting the number of commas and adding 1.\n * Then we iterate through the string and find the ticket IDs by looking for the quotes. We need to extract\n * from quote to quote so we look for all even-numbered quotes then extract the string between that and the\n * previous quote index.\n *\n * @param _ticketString Stringified array of tickets\n */\n function _parseTicketString(string memory _ticketString) internal pure returns (string[] memory ticketIds) {\n // Assume there is at least one ticket (which means array would not have a comma)\n // If there is no ticket then the transaction will end up reverting\n uint256 ticketCount = 1;\n for (uint256 i = 0; i < bytes(_ticketString).length; i++) {\n if (bytes(_ticketString)[i] == 0x2C) {\n ticketCount++;\n }\n }\n\n ticketIds = new string[](ticketCount);\n uint256 breakCounter;\n uint256 lastBreak;\n for (uint256 i = 0; i < bytes(_ticketString).length; i++) {\n if (bytes(_ticketString)[i] == 0x22) {\n breakCounter++;\n if (breakCounter % 2 == 0) {\n ticketIds[(breakCounter/2)-1] = _ticketString.substring(lastBreak, i-1);\n }\n lastBreak = i + 1;\n }\n }\n }\n}\n" }, + "contracts/interfaces/IDomainExchange.sol": { + "content": "//SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\n\ninterface IDomainExchange {\n function registryRemoveListing(uint256 _listingId) external;\n}" + }, "contracts/interfaces/ITransferDomainProcessor.sol": { "content": "//SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\n\ninterface ITransferDomainProcessor {\n\n struct TransferProof {\n uint256[2] a;\n uint256[2][2] b;\n uint256[2] c;\n uint256[10] signals;\n }\n\n function processProof(\n TransferProof calldata _proof\n ) \n external \n returns (\n bytes32 dkimKeyHash, \n bytes32 hashedReceiverId, \n string memory domainName, \n uint256 bidId\n );\n}" }, "contracts/interfaces/IVerifiedDomainRegistry.sol": { - "content": "//SPDX-License-Identifier: MIT\n\nimport { IVerifyDomainProcessor } from \"./IVerifyDomainProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ninterface IVerifiedDomainRegistry {\n\n struct Domain {\n address owner;\n string name;\n uint256 expiryTime;\n }\n\n struct DomainWithId {\n bytes32 domainId;\n Domain domain;\n }\n\n function verifyDomains(IVerifyDomainProcessor.Proof[] memory _proofs) external;\n function getDomainId(string memory _domainName) external pure returns (bytes32);\n function getDomainOwner(bytes32 _domainId) external view returns (address);\n}\n" + "content": "//SPDX-License-Identifier: MIT\n\nimport { IVerifyDomainProcessor } from \"./IVerifyDomainProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ninterface IVerifiedDomainRegistry {\n\n struct Domain {\n address owner;\n string name;\n uint256 expiryTime;\n address exchange;\n uint256 listingId;\n }\n\n struct DomainWithId {\n bytes32 domainId;\n Domain domain;\n }\n\n function verifyDomains(IVerifyDomainProcessor.Proof[] memory _proofs) external;\n \n function getDomainId(string memory _domainName) external pure returns (bytes32);\n function getDomainOwner(bytes32 _domainId) external view returns (address);\n function getDomain(bytes32 _domainId) external view returns (DomainWithId memory);\n function getDomains(bytes32[] memory _domainId) external view returns (DomainWithId[] memory);\n \n function setDomainListing(bytes32 _domainId, uint256 _listingId) external;\n function removeDomainListing(bytes32 _domainId) external;\n function updateDomainOnSale(bytes32 _domainId, address _newOwner) external;\n}\n" }, "contracts/interfaces/IVerifyDomainProcessor.sol": { "content": "//SPDX-License-Identifier: MIT\nimport { IProxyBaseProcessor } from \"../external/interfaces/IProxyBaseProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ninterface IVerifyDomainProcessor is IProxyBaseProcessor {\n \n struct DomainRaw {\n string name;\n uint256 expiryTime;\n }\n\n function verifyProofs(\n Proof[] memory _proofs\n ) \n external \n returns (DomainRaw[] memory domains);\n}" }, + "contracts/mocks/DomainExchangeMock.sol": { + "content": "// SPDX-License-Identifier: MIT\nimport \"../interfaces/IDomainExchange.sol\";\nimport \"../interfaces/IVerifiedDomainRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract DomainExchangeMock is IDomainExchange {\n \n mapping(uint256 => bool) public listingActive;\n IVerifiedDomainRegistry public verifiedDomainRegistry;\n\n constructor(\n IVerifiedDomainRegistry _verifiedDomainRegistry\n ) {\n verifiedDomainRegistry = _verifiedDomainRegistry;\n }\n\n function createListing(bytes32 _domainId, uint256 _listingId) public {\n listingActive[_listingId] = true;\n verifiedDomainRegistry.setDomainListing(_domainId, _listingId);\n }\n\n function registryRemoveListing(uint256 _listingId) external override {\n listingActive[_listingId] = false;\n }\n}\n" + }, "contracts/mocks/TransferDomainProcessorMock.sol": { "content": "// SPDX-License-Identifier: MIT\n\nimport { ITransferDomainProcessor } from \"../interfaces/ITransferDomainProcessor.sol\";\nimport { StringUtils } from \"@zk-email/contracts/utils/StringUtils.sol\";\n\n\npragma solidity ^0.8.18;\n\ncontract TransferDomainProcessorMock is ITransferDomainProcessor {\n\n using StringUtils for uint256;\n\n /* ============ State Variables ============ */\n string storedDomainName;\n\n /* ============ Constructor ============ */\n constructor() {}\n\n /* ============ External Functions ============ */\n\n function setDomainName(string memory _domainName) external {\n storedDomainName = _domainName;\n }\n\n function processProof(TransferProof memory _proof)\n external\n view\n override\n returns (bytes32 dkimKeyHash, bytes32 hashedReceiverId, string memory domainName, uint256 bidId)\n {\n dkimKeyHash = bytes32(_proof.signals[0]);\n hashedReceiverId = bytes32(_proof.signals[1]);\n domainName = storedDomainName;\n bidId = _proof.signals[3];\n }\n}\n\n\n" }, @@ -119,7 +125,7 @@ "content": "// SPDX-License-Identifier: MIT\n\nimport { StringUtils } from \"@zk-email/contracts/utils/StringUtils.sol\";\n\nimport { EmailBaseProcessor } from \"./external/processors/EmailBaseProcessor.sol\";\nimport { INullifierRegistry } from \"./external/interfaces/INullifierRegistry.sol\";\nimport { StringConversionUtils } from \"./external/lib/StringConversionUtils.sol\";\n\nimport { Groth16Verifier } from \"./verifiers/namecheap_transfer_verifier.sol\";\nimport { ITransferDomainProcessor } from \"./interfaces/ITransferDomainProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract TransferDomainProcessor is Groth16Verifier, ITransferDomainProcessor, EmailBaseProcessor {\n \n using StringUtils for uint256[];\n using StringConversionUtils for string;\n\n /* ============ Constants ============ */\n uint256 constant PACK_SIZE = 31;\n\n /* ============ Constructor ============ */\n constructor(\n address _exchange,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Groth16Verifier()\n EmailBaseProcessor(\n _exchange,\n _nullifierRegistry,\n _emailFromAddress,\n _timestampBuffer\n )\n {}\n \n /* ============ External Functions ============ */\n\n function processProof(\n TransferProof calldata _proof\n )\n external\n override\n onlyExchange\n returns (\n bytes32 dkimKeyHash,\n bytes32 hashedReceiverId,\n string memory domainName, \n uint256 bidId\n )\n {\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \"Invalid Proof\");\n\n // Signal [0] is the DKIM key hash\n dkimKeyHash = bytes32(_proof.signals[0]);\n\n // Signals [1:2] are the packed from email address\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 2);\n require(\n keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \n \"Invalid email from address\"\n );\n \n // Signals [2:7] are packed domain name\n domainName = _parseSignalArray(_proof.signals, 2, 7);\n\n // Signal [7] is packed hashed namecheap id to which domain was transferred\n hashedReceiverId = bytes32(_proof.signals[7]);\n\n // Check if email has been used previously, if not nullify it so it can't be used again\n _validateAndAddNullifier(bytes32(_proof.signals[8]));\n\n // Signal [9] is bidId\n bidId = _proof.signals[9];\n }\n \n /* ============ Internal Functions ============ */\n\n function _parseSignalArray(uint256[10] calldata _signals, uint8 _from, uint8 _to) \n internal \n pure \n returns (string memory) \n {\n uint256[] memory signalArray = new uint256[](_to - _from);\n for (uint256 i = _from; i < _to; i++) {\n signalArray[i - _from] = _signals[i];\n }\n\n return signalArray.convertPackedBytesToString(signalArray.length * PACK_SIZE, PACK_SIZE);\n }\n}\n" }, "contracts/VerifiedDomainRegistry.sol": { - "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport { Bytes32ArrayUtils } from \"./external/lib/Bytes32ArrayUtils.sol\";\n\nimport { IVerifiedDomainRegistry } from \"./interfaces/IVerifiedDomainRegistry.sol\";\nimport { IVerifyDomainProcessor } from \"./interfaces/IVerifyDomainProcessor.sol\";\n\n\npragma solidity ^0.8.18;\n\ncontract VerifiedDomainRegistry is IVerifiedDomainRegistry, Ownable {\n\n using Bytes32ArrayUtils for bytes32[];\n\n /* ============ Events ============ */\n event DomainVerified(\n bytes32 indexed domainId,\n address indexed owner,\n string domainName,\n uint256 expiryTime\n );\n\n event VerifyDomainProcessorUpdated(\n IVerifyDomainProcessor indexed newVerifyDomainProcessor\n );\n\n /* ============ Modifiers ============ */\n modifier onlyInitialized() {\n require(isInitialized, \"Contract must be initialized\");\n _;\n }\n\n /* ============ Public Variables ============ */\n IVerifyDomainProcessor public verifyDomainProcessor;\n\n bool public isInitialized;\n\n mapping(bytes32 => Domain) public domains;\n mapping(address => bytes32[]) public userDomains;\n\n /* ============ Constructor ============ */\n \n constructor() Ownable() {}\n\n /* ============ Public Functions ============ */\n\n /**\n * @notice Verify domains and add them to the registry. If domain is transferred off-chain to another party \n * then they can re-verify the domain and claim ownership of the domain and previous ownership is removed.\n * The existing owner can re-verify the domain, say after the domain has expired to update the expiry time on\n * the domain. Function reverts if:\n * - Domain ownership TLS proofs are invalid\n * \n * @param _proofs Array of domain ownership TLS proofs\n */\n function verifyDomains(IVerifyDomainProcessor.Proof[] memory _proofs) external override\n onlyInitialized\n {\n IVerifyDomainProcessor.DomainRaw[] memory rawDomains = verifyDomainProcessor.verifyProofs(\n _proofs\n );\n\n for (uint256 i = 0; i < rawDomains.length; i++) {\n IVerifyDomainProcessor.DomainRaw memory rawDomain = rawDomains[i];\n bytes32 domainId = getDomainId(rawDomain.name);\n\n Domain storage domain = domains[domainId];\n if (domain.owner == address(0)) {\n // Case 1.1: Domain has no owner\n // Add caller as owner\n userDomains[msg.sender].push(domainId);\n } else {\n // Case 2: Domain has owner\n // Case 2.1: Caller is owner; skip\n // Case 2.2: Caller is NOT owner\n if (domain.owner != msg.sender) {\n // Remove ownership from old owner and add caller as new owner\n userDomains[domain.owner].removeStorage(domainId);\n userDomains[msg.sender].push(domainId);\n }\n }\n\n domains[domainId] = Domain({\n owner: msg.sender,\n name: rawDomain.name,\n expiryTime: rawDomain.expiryTime\n });\n \n emit DomainVerified(domainId, msg.sender, rawDomain.name, rawDomain.expiryTime);\n }\n }\n\n /* ============ Admin Functions ============ */\n\n /**\n * @notice ONLY OWNER: Initialize the contract with the VerifyDomainProcessor and exchange contracts.\n * This can only be called once.\n *\n * @param _verifyDomainProcessor Address of the VerifyDomainProcessor contract\n */\n function initialize(\n IVerifyDomainProcessor _verifyDomainProcessor\n )\n external\n onlyOwner\n {\n require(!isInitialized, \"Already initialized\");\n\n verifyDomainProcessor = _verifyDomainProcessor;\n\n isInitialized = true;\n\n emit VerifyDomainProcessorUpdated(_verifyDomainProcessor);\n }\n\n /**\n * @notice ONLY OWNER: Update the verify domain processor\n *\n * @param _verifyDomainProcessor Address of the new VerifyDomainProcessor contract\n */\n function updateVerifyDomainProcessor(IVerifyDomainProcessor _verifyDomainProcessor) external onlyOwner {\n require(address(_verifyDomainProcessor) != address(0), \"Invalid address\");\n\n verifyDomainProcessor = _verifyDomainProcessor;\n emit VerifyDomainProcessorUpdated(_verifyDomainProcessor);\n }\n\n /* ============ View Functions ============ */\n\n function getDomainId(string memory _domainName) public pure override returns (bytes32) {\n return keccak256(abi.encodePacked(_domainName));\n }\n\n function getDomainOwner(bytes32 _domainId) external view override returns (address) { \n return domains[_domainId].owner;\n }\n\n function getUserDomains(address _user) external view returns (DomainWithId[] memory domainInfo) {\n bytes32[] memory domainIds = userDomains[_user];\n \n domainInfo = new DomainWithId[](domainIds.length);\n for (uint256 i = 0; i < domainIds.length; i++) {\n bytes32 domainId = domainIds[i];\n domainInfo[i] = DomainWithId({\n domainId: domainId,\n domain: domains[domainId]\n });\n }\n }\n\n function getDomains(bytes32[] memory _domains) external view returns (DomainWithId[] memory domainInfo) {\n domainInfo = new DomainWithId[](_domains.length);\n for (uint256 i = 0; i < _domains.length; i++) {\n bytes32 domainId = _domains[i];\n domainInfo[i] = DomainWithId({\n domainId: domainId,\n domain: domains[domainId]\n });\n }\n }\n}" + "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport { Bytes32ArrayUtils } from \"./external/lib/Bytes32ArrayUtils.sol\";\nimport { AddressArrayUtils } from \"./external/lib/AddressArrayUtils.sol\";\n\nimport { IDomainExchange } from \"./interfaces/IDomainExchange.sol\";\nimport { IVerifiedDomainRegistry } from \"./interfaces/IVerifiedDomainRegistry.sol\";\nimport { IVerifyDomainProcessor } from \"./interfaces/IVerifyDomainProcessor.sol\";\n\n\npragma solidity ^0.8.18;\n\ncontract VerifiedDomainRegistry is IVerifiedDomainRegistry, Ownable {\n\n using Bytes32ArrayUtils for bytes32[];\n using AddressArrayUtils for address[];\n\n /* ============ Events ============ */\n event DomainVerified(\n bytes32 indexed domainId,\n address indexed owner,\n string domainName,\n uint256 expiryTime\n );\n\n event DomainListed(\n bytes32 indexed domainId,\n address indexed exchange,\n uint256 indexed listingId\n );\n\n event DomainListingRemoved(\n bytes32 indexed domainId,\n address indexed exchange\n );\n\n event DomainTransferred(\n bytes32 indexed domainId,\n address indexed oldOwner,\n address indexed newOwner\n );\n\n\n event VerifyDomainProcessorUpdated(\n IVerifyDomainProcessor indexed newVerifyDomainProcessor\n );\n\n event ExchangeAdded(address indexed exchange);\n event ExchangeRemoved(address indexed exchange);\n\n /* ============ Modifiers ============ */\n modifier onlyExchange() {\n require(isExchange[msg.sender], \"Caller must be exchange\");\n _;\n }\n\n modifier onlyInitialized() {\n require(isInitialized, \"Contract must be initialized\");\n _;\n }\n\n /* ============ Public Variables ============ */\n IVerifyDomainProcessor public verifyDomainProcessor;\n address[] public exchanges;\n mapping(address=>bool) public isExchange;\n\n bool public isInitialized;\n\n mapping(bytes32 => Domain) public domains;\n mapping(address => bytes32[]) public userDomains;\n\n /* ============ Constructor ============ */\n \n constructor() Ownable() {}\n\n /* ============ Public Functions ============ */\n\n /**\n * @notice Verify domains and add them to the registry. If domain is transferred off-chain to another party \n * then they can re-verify the domain and claim ownership of the domain and previous ownership is removed.\n * The existing owner can re-verify the domain, say after the domain has expired to update the expiry time on\n * the domain. Function reverts if:\n * - Domain ownership TLS proofs are invalid\n * \n * @param _proofs Array of domain ownership TLS proofs\n */\n function verifyDomains(IVerifyDomainProcessor.Proof[] memory _proofs) external override\n onlyInitialized\n {\n IVerifyDomainProcessor.DomainRaw[] memory rawDomains = verifyDomainProcessor.verifyProofs(\n _proofs\n );\n\n for (uint256 i = 0; i < rawDomains.length; i++) {\n IVerifyDomainProcessor.DomainRaw memory rawDomain = rawDomains[i];\n bytes32 domainId = getDomainId(rawDomain.name);\n\n Domain storage domain = domains[domainId];\n if (domain.owner == address(0)) {\n // Case 1.1: Domain has no owner\n // Add caller as owner\n userDomains[msg.sender].push(domainId);\n\n // Set domain details\n domains[domainId] = Domain({\n owner: msg.sender,\n name: rawDomain.name,\n expiryTime: rawDomain.expiryTime,\n exchange: address(0),\n listingId: 0\n });\n } else {\n // Case 2: Domain has owner\n // Case 2.1: Caller is owner; skip\n if (domain.owner == msg.sender) {\n // No updates to userDomains\n\n // Update domain details; Only expiry time can change\n // Owner and domain name cannot change\n // Exchange and listingId are kept as is\n domain.expiryTime = rawDomain.expiryTime;\n }\n // Case 2.2: Caller is NOT owner\n if (domain.owner != msg.sender) {\n // Remove ownership from old owner\n userDomains[domain.owner].removeStorage(domainId);\n\n // Remove listing on exchange if it exists\n if (domain.exchange != address(0)) {\n IDomainExchange(domain.exchange).registryRemoveListing(domain.listingId);\n }\n\n // Add domain to new owner\n userDomains[msg.sender].push(domainId);\n\n // Set domain details except for domain name as it cannot change\n domain.owner = msg.sender;\n domain.expiryTime = rawDomain.expiryTime;\n domain.exchange = address(0);\n domain.listingId = 0;\n }\n }\n\n emit DomainVerified(domainId, msg.sender, rawDomain.name, rawDomain.expiryTime);\n }\n }\n\n // Todo: Add function for relinquishing ownership of domain\n\n /**\n * @notice ONLY EXCHANGE: Add a listing status to domain. We check that the domain has been verified and is\n * listed on the calling exchange. This sets the exchange and listingId of the domain.\n * \n * @param _domainId Domain to set listed status for\n * @param _listingId Listing Id of domain on calling exchange\n */\n function setDomainListing(bytes32 _domainId, uint256 _listingId)\n external\n override\n onlyInitialized\n onlyExchange\n {\n Domain storage domain = domains[_domainId];\n\n require(domain.owner != address(0), \"Domain must be verified\");\n require(domain.exchange == address(0), \"Domain already listed on another exchange\");\n\n domain.exchange = msg.sender;\n domain.listingId = _listingId;\n\n emit DomainListed(_domainId, msg.sender, _listingId);\n }\n\n /**\n * @notice ONLY EXCHANGE: Remove a listing status from domain. We check that the calling exchange is the one\n * that the domain is listed on. This removes the exchange and listingId from the domain.\n * \n * @param _domainId Domain ID to update listing status for\n */\n function removeDomainListing(bytes32 _domainId) external override onlyInitialized onlyExchange {\n Domain storage domain = domains[_domainId];\n require(domain.exchange == msg.sender, \"Domain not listed on calling exchange\");\n\n _removeDomainListing(domain);\n\n emit DomainListingRemoved(_domainId, msg.sender);\n }\n\n /**\n * @notice ONLY EXCHANGE: Update domain on sale. We check that the calling exchange is the one that the domain\n * is listed on. This updates the ownership of the domain to the new owner as well as removes the listing status\n * from the domain.\n * \n * @param _domainId Domain ID to update listing status for\n * @param _newOwner New owner of the domain\n */\n function updateDomainOnSale(bytes32 _domainId, address _newOwner) \n external \n override \n onlyInitialized \n onlyExchange \n {\n Domain storage domain = domains[_domainId];\n require(domain.exchange == msg.sender, \"Domain not listed on calling exchange\");\n\n _removeDomainListing(domain);\n\n // Update ownership\n address oldOwner = domain.owner;\n domain.owner = _newOwner;\n userDomains[oldOwner].removeStorage(_domainId);\n userDomains[_newOwner].push(_domainId);\n\n emit DomainTransferred(_domainId, oldOwner, _newOwner);\n }\n\n /* ============ Admin Functions ============ */\n\n /**\n * @notice ONLY OWNER: Initialize the contract with the VerifyDomainProcessor and exchange contracts.\n * This can only be called once.\n *\n * @param _verifyDomainProcessor Address of the VerifyDomainProcessor contract\n */\n function initialize(\n IVerifyDomainProcessor _verifyDomainProcessor\n )\n external\n onlyOwner\n {\n require(!isInitialized, \"Already initialized\");\n\n verifyDomainProcessor = _verifyDomainProcessor;\n\n isInitialized = true;\n\n emit VerifyDomainProcessorUpdated(_verifyDomainProcessor);\n }\n\n /**\n * @notice ONLY OWNER: Add an exchange to the registry. This can only be called after the contract has been initialized.\n * Exchange must not already exist in the registry.\n * \n * @param _exchange Address of the exchange contract\n */\n function addExchange(address _exchange) external onlyOwner onlyInitialized {\n require(!isExchange[_exchange], \"Duplicate exchange\");\n\n isExchange[_exchange] = true;\n exchanges.push(_exchange);\n\n emit ExchangeAdded(_exchange);\n }\n\n /**\n * @notice ONLY OWNER: Remove an exchange from the registry. Exchange must exist in the registry.\n * \n * @param _exchange Address of the exchange contract\n */\n function removeExchange(address _exchange) external onlyOwner onlyInitialized {\n require(isExchange[_exchange], \"Exchange does not exist\");\n\n isExchange[_exchange] = false;\n exchanges.removeStorage(_exchange);\n\n emit ExchangeRemoved(_exchange);\n }\n\n /**\n * @notice ONLY OWNER: Update the verify domain processor\n *\n * @param _verifyDomainProcessor Address of the new VerifyDomainProcessor contract\n */\n function updateVerifyDomainProcessor(IVerifyDomainProcessor _verifyDomainProcessor) external onlyOwner {\n require(address(_verifyDomainProcessor) != address(0), \"Invalid address\");\n\n verifyDomainProcessor = _verifyDomainProcessor;\n emit VerifyDomainProcessorUpdated(_verifyDomainProcessor);\n }\n\n /* ============ View Functions ============ */\n\n function getDomainId(string memory _domainName) public pure override returns (bytes32) {\n return keccak256(abi.encodePacked(_domainName));\n }\n\n function getDomainOwner(bytes32 _domainId) external view override returns (address) { \n return domains[_domainId].owner;\n }\n\n function getUserDomains(address _user) external view returns (DomainWithId[] memory domainInfo) {\n bytes32[] memory domainIds = userDomains[_user];\n \n domainInfo = new DomainWithId[](domainIds.length);\n for (uint256 i = 0; i < domainIds.length; i++) {\n bytes32 domainId = domainIds[i];\n domainInfo[i] = DomainWithId({\n domainId: domainId,\n domain: domains[domainId]\n });\n }\n }\n\n function getDomain(bytes32 _domainId) external view override returns (DomainWithId memory domainInfo) {\n return DomainWithId({\n domainId: _domainId,\n domain: domains[_domainId]\n });\n }\n\n function getDomains(bytes32[] memory _domains) external view returns (DomainWithId[] memory domainInfo) {\n domainInfo = new DomainWithId[](_domains.length);\n for (uint256 i = 0; i < _domains.length; i++) {\n bytes32 domainId = _domains[i];\n domainInfo[i] = DomainWithId({\n domainId: domainId,\n domain: domains[domainId]\n });\n }\n }\n\n function getExchanges() external view returns (address[] memory) {\n return exchanges;\n }\n\n /* ============ Internal Functions ============ */\n\n function _removeDomainListing(Domain storage _domain) internal {\n delete _domain.exchange;\n delete _domain.listingId;\n }\n}" }, "contracts/verifiers/namecheap_transfer_verifier.sol": { "content": "// SPDX-License-Identifier: GPL-3.0\n/*\n Copyright 2021 0KIMS association.\n\n This file is generated with [snarkJS](https://github.com/iden3/snarkjs).\n\n snarkJS is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n snarkJS is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with snarkJS. If not, see .\n*/\n\npragma solidity >=0.7.0 <0.9.0;\n\ncontract Groth16Verifier {\n // Scalar field size\n uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n // Base field size\n uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\n\n // Verification Key data\n uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042;\n uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958;\n uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132;\n uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731;\n uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679;\n uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856;\n uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\n uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\n uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\n uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\n uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\n uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\n uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\n uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\n\n\n uint256 constant IC0x = 12140764414809439171579073747096628005611143888739021778142114438725209856911;\n uint256 constant IC0y = 18380664008722994554410246598515713804368408809139402801410617352473294938101;\n\n uint256 constant IC1x = 16287270730688090110441256630912972881096977102957363147237538512209615075930;\n uint256 constant IC1y = 2449016754858987854593324887044687327196932594716827949199487058237499016691;\n\n uint256 constant IC2x = 12290000746054008145532172012836689239677528072347882111559847558608807494030;\n uint256 constant IC2y = 14308358318183304542626969831757608989020288980497492892592599563043422576641;\n\n uint256 constant IC3x = 17109205409157997740951972967816433882944148152574672952222919864324056429618;\n uint256 constant IC3y = 9961558237149244928391169779496769511791942854258198694890294984589871243856;\n\n uint256 constant IC4x = 12885622983359679040345794541760667584938087103345731492334670493606961282700;\n uint256 constant IC4y = 18397333374263242470546340955330845415543534978510188436756186606821028634481;\n\n uint256 constant IC5x = 8251971901226176941314060074725743834337466028961811325874949093602610929902;\n uint256 constant IC5y = 16257777857146800480589260332284762827173712873310789777823130626151679328406;\n\n uint256 constant IC6x = 7755902890727928430969631143079950108469618570373249456222008624592630122217;\n uint256 constant IC6y = 10757977250154075642155615103618917172698106635999924885067022788329148453826;\n\n uint256 constant IC7x = 9229565613389027758694089669374665969186485724568040364429447974425840672975;\n uint256 constant IC7y = 8522685561456236376873601057738356653321521861001626828091657280469196217906;\n\n uint256 constant IC8x = 21276732369738095771663301979590133243106197446584260397744418605720907267683;\n uint256 constant IC8y = 7293000518568388677473960035761983204180608786522452828815102825735261508468;\n\n uint256 constant IC9x = 9116173570523657214485637140779662063231707742648921986441734490858993965489;\n uint256 constant IC9y = 20125316561678768525824986864877835211109013619593406972323904438419789772526;\n\n uint256 constant IC10x = 14220475398513461434883329515056365002533036699993990374428625877488131891870;\n uint256 constant IC10y = 12173247053801606963174627761051371553685163525039542034195810636700588930659;\n\n\n // Memory data\n uint16 constant pVk = 0;\n uint16 constant pPairing = 128;\n\n uint16 constant pLastMem = 896;\n\n function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[10] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, r)) {\n mstore(0, 0)\n return(0, 0x20)\n }\n }\n\n // G1 function to multiply a G1 value(x,y) to value in an address\n function g1_mulAccC(pR, x, y, s) {\n let success\n let mIn := mload(0x40)\n mstore(mIn, x)\n mstore(add(mIn, 32), y)\n mstore(add(mIn, 64), s)\n\n success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)\n\n if iszero(success) {\n mstore(0, 0)\n return(0, 0x20)\n }\n\n mstore(add(mIn, 64), mload(pR))\n mstore(add(mIn, 96), mload(add(pR, 32)))\n\n success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)\n\n if iszero(success) {\n mstore(0, 0)\n return(0, 0x20)\n }\n }\n\n function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {\n let _pPairing := add(pMem, pPairing)\n let _pVk := add(pMem, pVk)\n\n mstore(_pVk, IC0x)\n mstore(add(_pVk, 32), IC0y)\n\n // Compute the linear combination vk_x\n\n g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))\n\n g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))\n\n g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))\n\n g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))\n\n g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))\n\n g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)))\n\n g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)))\n\n g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)))\n\n g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)))\n\n g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288)))\n\n\n // -A\n mstore(_pPairing, calldataload(pA))\n mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q))\n\n // B\n mstore(add(_pPairing, 64), calldataload(pB))\n mstore(add(_pPairing, 96), calldataload(add(pB, 32)))\n mstore(add(_pPairing, 128), calldataload(add(pB, 64)))\n mstore(add(_pPairing, 160), calldataload(add(pB, 96)))\n\n // alpha1\n mstore(add(_pPairing, 192), alphax)\n mstore(add(_pPairing, 224), alphay)\n\n // beta2\n mstore(add(_pPairing, 256), betax1)\n mstore(add(_pPairing, 288), betax2)\n mstore(add(_pPairing, 320), betay1)\n mstore(add(_pPairing, 352), betay2)\n\n // vk_x\n mstore(add(_pPairing, 384), mload(add(pMem, pVk)))\n mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))\n\n\n // gamma2\n mstore(add(_pPairing, 448), gammax1)\n mstore(add(_pPairing, 480), gammax2)\n mstore(add(_pPairing, 512), gammay1)\n mstore(add(_pPairing, 544), gammay2)\n\n // C\n mstore(add(_pPairing, 576), calldataload(pC))\n mstore(add(_pPairing, 608), calldataload(add(pC, 32)))\n\n // delta2\n mstore(add(_pPairing, 640), deltax1)\n mstore(add(_pPairing, 672), deltax2)\n mstore(add(_pPairing, 704), deltay1)\n mstore(add(_pPairing, 736), deltay2)\n\n\n let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20)\n\n isOk := and(success, mload(_pPairing))\n }\n\n let pMem := mload(0x40)\n mstore(0x40, add(pMem, pLastMem))\n\n // Validate that all evaluations ∈ F\n\n checkField(calldataload(add(_pubSignals, 0)))\n\n checkField(calldataload(add(_pubSignals, 32)))\n\n checkField(calldataload(add(_pubSignals, 64)))\n\n checkField(calldataload(add(_pubSignals, 96)))\n\n checkField(calldataload(add(_pubSignals, 128)))\n\n checkField(calldataload(add(_pubSignals, 160)))\n\n checkField(calldataload(add(_pubSignals, 192)))\n\n checkField(calldataload(add(_pubSignals, 224)))\n\n checkField(calldataload(add(_pubSignals, 256)))\n\n checkField(calldataload(add(_pubSignals, 288)))\n\n checkField(calldataload(add(_pubSignals, 320)))\n\n\n // Validate all evaluations\n let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)\n\n mstore(0, isValid)\n return(0, 0x20)\n }\n }\n }" diff --git a/contracts-domain/deployments/base_staging/ClaimVerifier.json b/contracts-domain/deployments/base_staging/ClaimVerifier.json index ba970b659..5b5a45e57 100644 --- a/contracts-domain/deployments/base_staging/ClaimVerifier.json +++ b/contracts-domain/deployments/base_staging/ClaimVerifier.json @@ -1,5 +1,5 @@ { - "address": "0x1cB3888556cfeE16361EDdb3F8EB1BfD75Af3807", + "address": "0x5B8F92B8afA5Db7078703294D646908F0fc00D87", "abi": [ { "inputs": [ @@ -79,19 +79,19 @@ "type": "function" } ], - "transactionHash": "0x5695299496a628b5073b14180e589de197bbdc74e3fcef7b2ef79926e3166cd2", + "transactionHash": "0x44020458ec7bb4ce9f805af25ab9ce4f6069cdb01df081c2efa6c407847d3144", "receipt": { "to": null, "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "contractAddress": "0x1cB3888556cfeE16361EDdb3F8EB1BfD75Af3807", - "transactionIndex": 84, + "contractAddress": "0x5B8F92B8afA5Db7078703294D646908F0fc00D87", + "transactionIndex": 77, "gasUsed": "925596", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x2ddfe4e25f78ba34e12ec570752115fc66e27621398429dac33f58ba60821d2e", - "transactionHash": "0x5695299496a628b5073b14180e589de197bbdc74e3fcef7b2ef79926e3166cd2", + "blockHash": "0x92c221abb89001ddc036e19c514ef1b529d8cad1ae1ca3a27ad45b49ebebbb17", + "transactionHash": "0x44020458ec7bb4ce9f805af25ab9ce4f6069cdb01df081c2efa6c407847d3144", "logs": [], - "blockNumber": 19860243, - "cumulativeGasUsed": "8982010", + "blockNumber": 20165437, + "cumulativeGasUsed": "11506813", "status": 1, "byzantium": true }, diff --git a/contracts-domain/deployments/base_staging/DomainExchange.json b/contracts-domain/deployments/base_staging/DomainExchange.json index 5efc9f41b..fd7738e51 100644 --- a/contracts-domain/deployments/base_staging/DomainExchange.json +++ b/contracts-domain/deployments/base_staging/DomainExchange.json @@ -1,5 +1,5 @@ { - "address": "0xF2A66ec90C07f51cc29F67f99A43aCc92255d7dd", + "address": "0xe4148B108Fe4D7421853FE8cFfd35bDc2c0d95Ec", "abi": [ { "inputs": [ @@ -1574,54 +1574,54 @@ "type": "function" } ], - "transactionHash": "0x10962050a014fc6870c855e7f503e0768aac19cdc4e925590869e908c7262581", + "transactionHash": "0xbcb8774a29f9ee6705a04fa43b73c2a8b68521dea7d15e2ae837a93b5d012d1c", "receipt": { "to": null, "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "contractAddress": "0xF2A66ec90C07f51cc29F67f99A43aCc92255d7dd", - "transactionIndex": 62, - "gasUsed": "4978179", - "logsBloom": "0x00000000000000000000000000000000000000020000004000800000000000000000000000000000000000000000000000000400010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000800000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x97edd0de214fb0e026514f93038d17cac9d0cd7cfc455502cc9ffcedc090a31d", - "transactionHash": "0x10962050a014fc6870c855e7f503e0768aac19cdc4e925590869e908c7262581", + "contractAddress": "0xe4148B108Fe4D7421853FE8cFfd35bDc2c0d95Ec", + "transactionIndex": 75, + "gasUsed": "4978191", + "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000020000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000001000000000000000000000000000004000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xfaddcc67c766e4f37de27d1b9a20f68dbcb25dd87dd211b39bc570830592cc8e", + "transactionHash": "0xbcb8774a29f9ee6705a04fa43b73c2a8b68521dea7d15e2ae837a93b5d012d1c", "logs": [ { - "transactionIndex": 62, - "blockNumber": 19860226, - "transactionHash": "0x10962050a014fc6870c855e7f503e0768aac19cdc4e925590869e908c7262581", - "address": "0xF2A66ec90C07f51cc29F67f99A43aCc92255d7dd", + "transactionIndex": 75, + "blockNumber": 20165420, + "transactionHash": "0xbcb8774a29f9ee6705a04fa43b73c2a8b68521dea7d15e2ae837a93b5d012d1c", + "address": "0xe4148B108Fe4D7421853FE8cFfd35bDc2c0d95Ec", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" ], "data": "0x", - "logIndex": 146, - "blockHash": "0x97edd0de214fb0e026514f93038d17cac9d0cd7cfc455502cc9ffcedc090a31d" + "logIndex": 256, + "blockHash": "0xfaddcc67c766e4f37de27d1b9a20f68dbcb25dd87dd211b39bc570830592cc8e" }, { - "transactionIndex": 62, - "blockNumber": 19860226, - "transactionHash": "0x10962050a014fc6870c855e7f503e0768aac19cdc4e925590869e908c7262581", - "address": "0xF2A66ec90C07f51cc29F67f99A43aCc92255d7dd", + "transactionIndex": 75, + "blockNumber": 20165420, + "transactionHash": "0xbcb8774a29f9ee6705a04fa43b73c2a8b68521dea7d15e2ae837a93b5d012d1c", + "address": "0xe4148B108Fe4D7421853FE8cFfd35bDc2c0d95Ec", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" ], "data": "0x", - "logIndex": 147, - "blockHash": "0x97edd0de214fb0e026514f93038d17cac9d0cd7cfc455502cc9ffcedc090a31d" + "logIndex": 257, + "blockHash": "0xfaddcc67c766e4f37de27d1b9a20f68dbcb25dd87dd211b39bc570830592cc8e" } ], - "blockNumber": 19860226, - "cumulativeGasUsed": "17217820", + "blockNumber": 20165420, + "cumulativeGasUsed": "17749613", "status": 1, "byzantium": true }, "args": [ "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "20000000000000000", + "25000000000000000", "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", "86400", "86400", diff --git a/contracts-domain/deployments/base_staging/NamecheapManagedKeyHashAdapter.json b/contracts-domain/deployments/base_staging/NamecheapManagedKeyHashAdapter.json index 0e5e822aa..90cae8c2b 100644 --- a/contracts-domain/deployments/base_staging/NamecheapManagedKeyHashAdapter.json +++ b/contracts-domain/deployments/base_staging/NamecheapManagedKeyHashAdapter.json @@ -1,5 +1,5 @@ { - "address": "0x5Fb325174fAFb22C46f7796Ca129980aA16F3405", + "address": "0x7E537F3A9329a0c29F386E6B0c30257AfbE7883f", "abi": [ { "inputs": [ @@ -168,34 +168,34 @@ "type": "function" } ], - "transactionHash": "0xfc63e1003c998e5d45542289607d2062afe890da3a45630f0bce2dfa8477679b", + "transactionHash": "0xcf6ff6f8d07359e4c6050f9a65c1f50fcaa7cb50e2ae986ae8222288b5d8d97c", "receipt": { "to": null, "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "contractAddress": "0x5Fb325174fAFb22C46f7796Ca129980aA16F3405", - "transactionIndex": 87, + "contractAddress": "0x7E537F3A9329a0c29F386E6B0c30257AfbE7883f", + "transactionIndex": 131, "gasUsed": "766431", - "logsBloom": "0x00000000000000000000000000000000000000000000004080800000000000000000000000000000040000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000010000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x31c6edd47ee4e3328422b70e6f2c26108999f752f3cf160f265828fc68692f9a", - "transactionHash": "0xfc63e1003c998e5d45542289607d2062afe890da3a45630f0bce2dfa8477679b", + "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000000000000000000000000000000000010000000800000000000000000000000000000000000000000000000001000002000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xf67d637664866723bd9586717cae07608fd23a1814c34b8af62cb25270413d49", + "transactionHash": "0xcf6ff6f8d07359e4c6050f9a65c1f50fcaa7cb50e2ae986ae8222288b5d8d97c", "logs": [ { - "transactionIndex": 87, - "blockNumber": 19860230, - "transactionHash": "0xfc63e1003c998e5d45542289607d2062afe890da3a45630f0bce2dfa8477679b", - "address": "0x5Fb325174fAFb22C46f7796Ca129980aA16F3405", + "transactionIndex": 131, + "blockNumber": 20165425, + "transactionHash": "0xcf6ff6f8d07359e4c6050f9a65c1f50fcaa7cb50e2ae986ae8222288b5d8d97c", + "address": "0x7E537F3A9329a0c29F386E6B0c30257AfbE7883f", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" ], "data": "0x", - "logIndex": 203, - "blockHash": "0x31c6edd47ee4e3328422b70e6f2c26108999f752f3cf160f265828fc68692f9a" + "logIndex": 525, + "blockHash": "0xf67d637664866723bd9586717cae07608fd23a1814c34b8af62cb25270413d49" } ], - "blockNumber": 19860230, - "cumulativeGasUsed": "11265186", + "blockNumber": 20165425, + "cumulativeGasUsed": "28926133", "status": 1, "byzantium": true }, diff --git a/contracts-domain/deployments/base_staging/NullifierRegistry.json b/contracts-domain/deployments/base_staging/NullifierRegistry.json index e82bc8984..5193e86a8 100644 --- a/contracts-domain/deployments/base_staging/NullifierRegistry.json +++ b/contracts-domain/deployments/base_staging/NullifierRegistry.json @@ -1,5 +1,5 @@ { - "address": "0x6992997BEe56d0Bd552397885eED681fD704D1ed", + "address": "0x2b68bFd2b44a6a9E8dC7b414550457B091ECB5fB", "abi": [ { "inputs": [], @@ -213,34 +213,34 @@ "type": "function" } ], - "transactionHash": "0x2be4cabf4f1a991a0f4c1cfde3ebb02c183e5a0be055b93096e555bda00d37dd", + "transactionHash": "0x87f20e411e6d177934f552e975dc2f04fe0f35faad81e4c960e2af734f314755", "receipt": { "to": null, "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "contractAddress": "0x6992997BEe56d0Bd552397885eED681fD704D1ed", - "transactionIndex": 80, + "contractAddress": "0x2b68bFd2b44a6a9E8dC7b414550457B091ECB5fB", + "transactionIndex": 152, "gasUsed": "782784", - "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000400000000000000000000000000200000000000000000000000000000000", - "blockHash": "0x7a4ac5167459d517b7c508b8faa863ab0250fcec1f1471ff995e0d38624e1f80", - "transactionHash": "0x2be4cabf4f1a991a0f4c1cfde3ebb02c183e5a0be055b93096e555bda00d37dd", + "logsBloom": "0x00000000000000000400000000000000000000000000004000800000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000004000000", + "blockHash": "0x4df87558b6876d88f79453532297a1e8fbba9defce045ceb06323a4606d63ebb", + "transactionHash": "0x87f20e411e6d177934f552e975dc2f04fe0f35faad81e4c960e2af734f314755", "logs": [ { - "transactionIndex": 80, - "blockNumber": 19860235, - "transactionHash": "0x2be4cabf4f1a991a0f4c1cfde3ebb02c183e5a0be055b93096e555bda00d37dd", - "address": "0x6992997BEe56d0Bd552397885eED681fD704D1ed", + "transactionIndex": 152, + "blockNumber": 20165428, + "transactionHash": "0x87f20e411e6d177934f552e975dc2f04fe0f35faad81e4c960e2af734f314755", + "address": "0x2b68bFd2b44a6a9E8dC7b414550457B091ECB5fB", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" ], "data": "0x", - "logIndex": 221, - "blockHash": "0x7a4ac5167459d517b7c508b8faa863ab0250fcec1f1471ff995e0d38624e1f80" + "logIndex": 465, + "blockHash": "0x4df87558b6876d88f79453532297a1e8fbba9defce045ceb06323a4606d63ebb" } ], - "blockNumber": 19860235, - "cumulativeGasUsed": "11158264", + "blockNumber": 20165428, + "cumulativeGasUsed": "26152924", "status": 1, "byzantium": true }, diff --git a/contracts-domain/deployments/base_staging/TransferDomainProcessor.json b/contracts-domain/deployments/base_staging/TransferDomainProcessor.json index 5b6612834..1ec79653e 100644 --- a/contracts-domain/deployments/base_staging/TransferDomainProcessor.json +++ b/contracts-domain/deployments/base_staging/TransferDomainProcessor.json @@ -1,5 +1,5 @@ { - "address": "0x120F2AC79c5921f8CFAe530Ceac5E635DC6972b5", + "address": "0x54c92a8828A393C5A6D1DfbB71d0e9e97329b39C", "abi": [ { "inputs": [ @@ -261,48 +261,48 @@ "type": "function" } ], - "transactionHash": "0xe453eda87e9f23ecddf9d9efcef4a8095c3b7c835365785fd0c53aacc2e056b4", + "transactionHash": "0x54b9a71b575bba275ca7c650689d0fe28e9f503f82aa338111667bda0f1803fc", "receipt": { "to": null, "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "contractAddress": "0x120F2AC79c5921f8CFAe530Ceac5E635DC6972b5", - "transactionIndex": 45, - "gasUsed": "1844230", - "logsBloom": "0x00000000002000000000000000000000000000000000004000800000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x92fc3435c576c59c564008e044d57af11d877692884cc570476873bf7002da9b", - "transactionHash": "0xe453eda87e9f23ecddf9d9efcef4a8095c3b7c835365785fd0c53aacc2e056b4", + "contractAddress": "0x54c92a8828A393C5A6D1DfbB71d0e9e97329b39C", + "transactionIndex": 88, + "gasUsed": "1844254", + "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000800000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x7ccf2b2538c1a818048d022079b5c4b432054e48251bb86659f6d5b2ddfbe6a6", + "transactionHash": "0x54b9a71b575bba275ca7c650689d0fe28e9f503f82aa338111667bda0f1803fc", "logs": [ { - "transactionIndex": 45, - "blockNumber": 19860239, - "transactionHash": "0xe453eda87e9f23ecddf9d9efcef4a8095c3b7c835365785fd0c53aacc2e056b4", - "address": "0x120F2AC79c5921f8CFAe530Ceac5E635DC6972b5", + "transactionIndex": 88, + "blockNumber": 20165433, + "transactionHash": "0x54b9a71b575bba275ca7c650689d0fe28e9f503f82aa338111667bda0f1803fc", + "address": "0x54c92a8828A393C5A6D1DfbB71d0e9e97329b39C", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" ], "data": "0x", - "logIndex": 106, - "blockHash": "0x92fc3435c576c59c564008e044d57af11d877692884cc570476873bf7002da9b" + "logIndex": 197, + "blockHash": "0x7ccf2b2538c1a818048d022079b5c4b432054e48251bb86659f6d5b2ddfbe6a6" } ], - "blockNumber": 19860239, - "cumulativeGasUsed": "6395817", + "blockNumber": 20165433, + "cumulativeGasUsed": "14659692", "status": 1, "byzantium": true }, "args": [ - "0xF2A66ec90C07f51cc29F67f99A43aCc92255d7dd", - "0x6992997BEe56d0Bd552397885eED681fD704D1ed", + "0xe4148B108Fe4D7421853FE8cFfd35bDc2c0d95Ec", + "0x2b68bFd2b44a6a9E8dC7b414550457B091ECB5fB", "support@namecheap.com", "0" ], "numDeployments": 1, - "solcInputHash": "d865a6f49eab8c58036d78b72f5cb448", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_exchange\",\"type\":\"address\"},{\"internalType\":\"contract INullifierRegistry\",\"name\":\"_nullifierRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_emailFromAddress\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_timestampBuffer\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"emailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"exchange\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEmailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nullifierRegistry\",\"outputs\":[{\"internalType\":\"contract INullifierRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"a\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"b\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"c\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[10]\",\"name\":\"signals\",\"type\":\"uint256[10]\"}],\"internalType\":\"struct ITransferDomainProcessor.TransferProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"processProof\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"dkimKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"hashedReceiverId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"domainName\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_emailFromAddress\",\"type\":\"string\"}],\"name\":\"setEmailFromAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_timestampBuffer\",\"type\":\"uint256\"}],\"name\":\"setTimestampBuffer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timestampBuffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"_pA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"_pB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"_pC\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[10]\",\"name\":\"_pubSignals\",\"type\":\"uint256[10]\"}],\"name\":\"verifyProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setEmailFromAddress(string)\":{\"params\":{\"_emailFromAddress\":\"The from email address for validated emails, MUST BE PROPERLY PADDED\"}},\"setTimestampBuffer(uint256)\":{\"params\":{\"_timestampBuffer\":\"The timestamp buffer for validated emails\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"setEmailFromAddress(string)\":{\"notice\":\"ONLY OWNER: Sets the from email address for validated emails. Check that email address is properly padded (if necessary). Padding will be dependent on if unpacking functions cut trailing 0s or not.\"},\"setTimestampBuffer(uint256)\":{\"notice\":\"ONLY OWNER: Sets the timestamp buffer for validated emails. This is the amount of time in seconds that the timestamp can be off by and still be considered valid. Necessary to build in flexibility with L2 timestamps.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TransferDomainProcessor.sol\":\"TransferDomainProcessor\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@zk-email/contracts/utils/StringUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.7.6;\\n\\n// https://github.com/nalinbhardwaj/ethdosnumber/blob/main/ethdos-contracts/src/HexStrings.sol\\nlibrary StringUtils {\\n bytes16 internal constant ALPHABET = \\\"0123456789abcdef\\\";\\n uint256 internal constant DEFAULT_PACK_SIZE = 31;\\n\\n /// @notice Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n /// @dev Credit to Open Zeppelin under MIT license https://github.com/OpenZeppelin/openzeppelin-contracts/blob/243adff49ce1700e0ecb99fe522fb16cff1d1ddc/contracts/utils/Strings.sol#L55\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = ALPHABET[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n function toHexStringNoPrefix(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length);\\n for (uint256 i = buffer.length; i > 0; i--) {\\n buffer[i - 1] = ALPHABET[value & 0xf];\\n value >>= 4;\\n }\\n return string(buffer);\\n }\\n\\n function toString(uint256 value) internal pure returns (string memory) {\\n return toString(abi.encodePacked(value));\\n }\\n\\n function toString(bytes32 value) internal pure returns (string memory) {\\n return toString(abi.encodePacked(value));\\n }\\n\\n function toString(address account) internal pure returns (string memory) {\\n return toString(abi.encodePacked(account));\\n }\\n\\n function stringEq(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));\\n }\\n\\n function toString(bytes memory data) internal pure returns (string memory) {\\n bytes memory alphabet = \\\"0123456789abcdef\\\";\\n\\n bytes memory str = new bytes(2 + data.length * 2);\\n str[0] = \\\"0\\\";\\n str[1] = \\\"x\\\";\\n for (uint256 i = 0; i < data.length; i++) {\\n str[2 + i * 2] = alphabet[uint256(uint8(data[i] >> 4))];\\n str[3 + i * 2] = alphabet[uint256(uint8(data[i] & 0x0f))];\\n }\\n return string(str);\\n }\\n\\n // 1 packed byte = packSize (usually 31) normal bytes, all in one 255/256-bit value\\n // Note that this is not 32 due to the field modulus of circom\\n function convertPackedByteToString(uint256 packedByte, uint256 packSize)\\n internal\\n pure\\n returns (string memory extractedString)\\n {\\n uint256[] memory packedBytes = new uint256[](1);\\n packedBytes[0] = packedByte;\\n return convertPackedBytesToString(packedBytes, packSize, packSize);\\n }\\n\\n // Note: This convenience function removes the max string length check, which may cause misalignment with the circom\\n // If using this, then the circom needs to rangecheck packed length in the circuit itself\\n // This defaults to 31 bytes per packed byte\\n function convertPackedBytesToString(uint256[] memory packedBytes) \\n internal\\n pure\\n returns (string memory extractedString)\\n {\\n return convertPackedBytesToString(packedBytes, packedBytes.length * DEFAULT_PACK_SIZE, DEFAULT_PACK_SIZE);\\n }\\n\\n // Unpacks uint256s into bytes and then extracts the non-zero characters\\n // Only extracts contiguous non-zero characters and ensures theres only 1 such state\\n // Note that unpackedLen may be more than packedBytes.length * 8 since there may be 0s\\n // signals is the total number of signals (i.e. bytes) packed into the packedBytes. it defaults to packedBytes.length * packSize\\n function convertPackedBytesToString(uint256[] memory packedBytes, uint256 signals, uint256 packSize)\\n internal\\n pure\\n returns (string memory extractedString)\\n {\\n uint8 state = 0;\\n // bytes: 0 0 0 0 y u s h _ g 0 0 0\\n // state: 0 0 0 0 1 1 1 1 1 1 2 2 2\\n bytes memory nonzeroBytesArray = new bytes(packedBytes.length * packSize);\\n uint256 nonzeroBytesArrayIndex = 0;\\n for (uint16 i = 0; i < packedBytes.length; i++) {\\n uint256 packedByte = packedBytes[i];\\n uint8[] memory unpackedBytes = new uint8[](packSize);\\n for (uint256 j = 0; j < packSize; j++) {\\n unpackedBytes[j] = uint8(packedByte >> (j * 8));\\n }\\n for (uint256 j = 0; j < packSize; j++) {\\n uint256 unpackedByte = unpackedBytes[j]; //unpackedBytes[j];\\n if (unpackedByte != 0) {\\n nonzeroBytesArray[nonzeroBytesArrayIndex] = bytes1(uint8(unpackedByte));\\n nonzeroBytesArrayIndex++;\\n if (state % 2 == 0) {\\n state += 1;\\n }\\n } else {\\n if (state % 2 == 1) {\\n state += 1;\\n }\\n }\\n packedByte = packedByte >> 8;\\n }\\n }\\n // TODO: You might want to assert that the state is exactly 1 or 2\\n // If not, that means empty bytse have been removed from the middle and things have been concatenated.\\n // We removed due to some tests failing, but this is not ideal and the require should be uncommented as soon as tests pass with it.\\n\\n // require(state == 1 || state == 2, \\\"Invalid final state of packed bytes in email; more than two non-zero regions found!\\\");\\n require(state >= 1, \\\"No packed bytes found! Invalid final state of packed bytes in email; value is likely 0!\\\");\\n require(nonzeroBytesArrayIndex <= signals, \\\"Packed bytes more than allowed max number of signals!\\\");\\n string memory returnValue = removeTrailingZeros(string(nonzeroBytesArray));\\n return returnValue;\\n // Have to end at the end of the email -- state cannot be 1 since there should be an email footer\\n }\\n\\n function bytes32ToString(bytes32 input) internal pure returns (string memory) {\\n uint256 i;\\n for (i = 0; i < 32 && input[i] != 0; i++) {}\\n bytes memory resultBytes = new bytes(i);\\n for (i = 0; i < 32 && input[i] != 0; i++) {\\n resultBytes[i] = input[i];\\n }\\n return string(resultBytes);\\n }\\n\\n // sliceArray is used to slice an array of uint256s from start-end into a new array of uint256s\\n function sliceArray(uint256[] memory input, uint256 start, uint256 end) internal pure returns (uint256[] memory) {\\n require(start <= end && end <= input.length, \\\"Invalid slice indices\\\");\\n uint256[] memory result = new uint256[](end - start);\\n for (uint256 i = start; i < end; i++) {\\n result[i - start] = input[i];\\n }\\n return result;\\n }\\n\\n // stringToUint is used to convert a string like \\\"45\\\" to a uint256 4\\n function stringToUint(string memory s) internal pure returns (uint256) {\\n bytes memory b = bytes(s);\\n uint256 result = 0;\\n for (uint256 i = 0; i < b.length; i++) {\\n if (b[i] >= 0x30 && b[i] <= 0x39) {\\n result = result * 10 + (uint256(uint8(b[i])) - 48);\\n }\\n\\n // TODO: Currently truncates decimals\\n if (b[i] == 0x2E) {\\n return result;\\n }\\n }\\n return result;\\n }\\n\\n // getDomainFromEmail is used to extract the domain from an email i.e. the part after the @\\n function getDomainFromEmail(string memory fromEmail) internal pure returns (string memory) {\\n bytes memory emailBytes = bytes(fromEmail);\\n uint256 atIndex;\\n for (uint256 i = 0; i < emailBytes.length; i++) {\\n if (emailBytes[i] == \\\"@\\\") {\\n atIndex = i;\\n break;\\n }\\n }\\n\\n bytes memory domainBytes = new bytes(emailBytes.length - atIndex - 1);\\n for (uint256 j = 0; j < domainBytes.length; j++) {\\n domainBytes[j] = emailBytes[atIndex + 1 + j];\\n }\\n return bytes32ToString(bytes32(bytes(domainBytes)));\\n }\\n\\n function removeTrailingZeros(string memory input) public pure returns (string memory) {\\n bytes memory inputBytes = bytes(input);\\n uint256 endIndex = inputBytes.length;\\n\\n for (uint256 i = 0; i < inputBytes.length; i++) {\\n if (inputBytes[i] == 0) {\\n endIndex = i;\\n break;\\n }\\n }\\n\\n bytes memory resultBytes = new bytes(endIndex);\\n for (uint256 i = 0; i < endIndex; i++) {\\n resultBytes[i] = inputBytes[i];\\n }\\n\\n return string(resultBytes);\\n }\\n\\n // Upper/lower string utils from https://github.com/willitscale/solidity-util/blob/master/lib/Strings.sol\\n /**\\n * Upper\\n *\\n * Converts all the values of a string to their corresponding upper case\\n * value.\\n *\\n * @param _base When being used for a data type this is the extended object\\n * otherwise this is the string base to convert to upper case\\n * @return string\\n */\\n function upper(string memory _base) public pure returns (string memory) {\\n bytes memory _baseBytes = bytes(_base);\\n for (uint256 i = 0; i < _baseBytes.length; i++) {\\n _baseBytes[i] = _upper(_baseBytes[i]);\\n }\\n return string(_baseBytes);\\n }\\n\\n /**\\n * Lower\\n *\\n * Converts all the values of a string to their corresponding lower case\\n * value.\\n *\\n * @param _base When being used for a data type this is the extended object\\n * otherwise this is the string base to convert to lower case\\n * @return string\\n */\\n function lower(string memory _base) public pure returns (string memory) {\\n bytes memory _baseBytes = bytes(_base);\\n for (uint256 i = 0; i < _baseBytes.length; i++) {\\n _baseBytes[i] = _lower(_baseBytes[i]);\\n }\\n return string(_baseBytes);\\n }\\n\\n /**\\n * Upper\\n *\\n * Convert an alphabetic character to upper case and return the original\\n * value when not alphabetic\\n *\\n * @param _b1 The byte to be converted to upper case\\n * @return bytes1 The converted value if the passed value was alphabetic\\n * and in a lower case otherwise returns the original value\\n */\\n function _upper(bytes1 _b1) private pure returns (bytes1) {\\n if (_b1 >= 0x61 && _b1 <= 0x7A) {\\n return bytes1(uint8(_b1) - 32);\\n }\\n\\n return _b1;\\n }\\n\\n /**\\n * Lower\\n *\\n * Convert an alphabetic character to lower case and return the original\\n * value when not alphabetic\\n *\\n * @param _b1 The byte to be converted to lower case\\n * @return bytes1 The converted value if the passed value was alphabetic\\n * and in a upper case otherwise returns the original value\\n */\\n function _lower(bytes1 _b1) private pure returns (bytes1) {\\n if (_b1 >= 0x41 && _b1 <= 0x5A) {\\n return bytes1(uint8(_b1) + 32);\\n }\\n\\n return _b1;\\n }\\n}\\n\",\"keccak256\":\"0x8c5b56494116a0c056c63e28fe892eea9bee5b056b09efa6aba1c9a82dc26c18\",\"license\":\"MIT\"},\"contracts/TransferDomainProcessor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\nimport { StringUtils } from \\\"@zk-email/contracts/utils/StringUtils.sol\\\";\\n\\nimport { EmailBaseProcessor } from \\\"./external/processors/EmailBaseProcessor.sol\\\";\\nimport { INullifierRegistry } from \\\"./external/interfaces/INullifierRegistry.sol\\\";\\nimport { StringConversionUtils } from \\\"./external/lib/StringConversionUtils.sol\\\";\\n\\nimport { Groth16Verifier } from \\\"./verifiers/namecheap_transfer_verifier.sol\\\";\\nimport { ITransferDomainProcessor } from \\\"./interfaces/ITransferDomainProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract TransferDomainProcessor is Groth16Verifier, ITransferDomainProcessor, EmailBaseProcessor {\\n \\n using StringUtils for uint256[];\\n using StringConversionUtils for string;\\n\\n /* ============ Constants ============ */\\n uint256 constant PACK_SIZE = 31;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _exchange,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Groth16Verifier()\\n EmailBaseProcessor(\\n _exchange,\\n _nullifierRegistry,\\n _emailFromAddress,\\n _timestampBuffer\\n )\\n {}\\n \\n /* ============ External Functions ============ */\\n\\n function processProof(\\n TransferProof calldata _proof\\n )\\n external\\n override\\n onlyExchange\\n returns (\\n bytes32 dkimKeyHash,\\n bytes32 hashedReceiverId,\\n string memory domainName, \\n uint256 bidId\\n )\\n {\\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \\\"Invalid Proof\\\");\\n\\n // Signal [0] is the DKIM key hash\\n dkimKeyHash = bytes32(_proof.signals[0]);\\n\\n // Signals [1:2] are the packed from email address\\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 2);\\n require(\\n keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \\n \\\"Invalid email from address\\\"\\n );\\n \\n // Signals [2:7] are packed domain name\\n domainName = _parseSignalArray(_proof.signals, 2, 7);\\n\\n // Signal [7] is packed hashed namecheap id to which domain was transferred\\n hashedReceiverId = bytes32(_proof.signals[7]);\\n\\n // Check if email has been used previously, if not nullify it so it can't be used again\\n _validateAndAddNullifier(bytes32(_proof.signals[8]));\\n\\n // Signal [9] is bidId\\n bidId = _proof.signals[9];\\n }\\n \\n /* ============ Internal Functions ============ */\\n\\n function _parseSignalArray(uint256[10] calldata _signals, uint8 _from, uint8 _to) \\n internal \\n pure \\n returns (string memory) \\n {\\n uint256[] memory signalArray = new uint256[](_to - _from);\\n for (uint256 i = _from; i < _to; i++) {\\n signalArray[i - _from] = _signals[i];\\n }\\n\\n return signalArray.convertPackedBytesToString(signalArray.length * PACK_SIZE, PACK_SIZE);\\n }\\n}\\n\",\"keccak256\":\"0x27e7d34dbe222f5a865d0b34f276eac82f3888f00e9816c398ee5fe9cf18bb2c\",\"license\":\"MIT\"},\"contracts/external/interfaces/IKeyHashAdapterV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IKeyHashAdapterV2 {\\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function getMailServerKeyHashes() external view returns (bytes32[] memory);\\n function isMailServerKeyHash(bytes32 _mailserverKeyHash) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc849f2dc34e4463550b8e0a16541bde429cb1adf43776b2c4179e9d4e4e656a2\",\"license\":\"MIT\"},\"contracts/external/interfaces/INullifierRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface INullifierRegistry {\\n function addNullifier(bytes32 _nullifier) external;\\n function isNullified(bytes32 _nullifier) external view returns(bool);\\n}\\n\",\"keccak256\":\"0x107164bc9a320938b513305878163b7fa884da4cdae58d0c8e81bfbb00c97c5e\",\"license\":\"MIT\"},\"contracts/external/lib/StringConversionUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\n// Building on zk-email's StringUtils library we add the ability to handle decimals when\\n// converting from string to Uint\\nlibrary StringConversionUtils {\\n \\n /**\\n * @notice Function that parses numbers returned as strings including floating point numbers. Returned floating point\\n * numbers are to have the desired amount of decimal specified. If the stringified version of the floating point\\n * number has more decimal places than desired then the function will revert in order to be maximally safe. If\\n * the returned number has multiple floating points then the function will revert.\\n *\\n * Examples: _s = \\\"12.34\\\", _expectedDecimals = 6 => 12340000\\n * _s = \\\"12.34\\\", _expectedDecimals = 2 => 1234\\n * _s = \\\"12.34\\\", _expectedDecimals = 1 => REVERT (we never want loss of precision only addition)\\n * _s = \\\"12.34.56\\\", _expectedDecimals = 6 => REVERT (Invalid number)\\n *\\n * @param _s String being processed\\n * @param _desiredDecimals Desired amount of decimal places\\n */\\n function stringToUint(string memory _s, uint256 _desiredDecimals) internal pure returns (uint256) {\\n return stringToUint(_s, 0x2E, _desiredDecimals);\\n }\\n\\n function stringToUint(\\n string memory _s,\\n bytes1 _decimalCharacter,\\n uint256 _desiredDecimals\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n bytes memory b = bytes(_s);\\n\\n uint256 result = 0;\\n uint256 decimalPlaces = 0;\\n\\n bool decimals = false;\\n for (uint256 i = 0; i < b.length; i++) {\\n if (b[i] >= 0x30 && b[i] <= 0x39) {\\n result = result * 10 + (uint256(uint8(b[i])) - 48);\\n }\\n\\n if (decimals) {\\n decimalPlaces++;\\n }\\n\\n if (b[i] == _decimalCharacter) {\\n require(decimals == false, \\\"String has multiple decimals\\\");\\n decimals = true;\\n }\\n }\\n\\n require(decimalPlaces <= _desiredDecimals, \\\"String has too many decimal places\\\");\\n return result * (10 ** (_desiredDecimals - decimalPlaces));\\n }\\n\\n /**\\n * @notice Function that returns a substring from _startIndex to _endIndex (non-inclusive).\\n *\\n * @param _str String being processed\\n * @param _startIndex Index to start parsing from\\n * @param _endIndex Index to stop parsing at (index not included in result)\\n */\\n function substring(string memory _str, uint _startIndex, uint _endIndex) internal pure returns (string memory ) {\\n bytes memory strBytes = bytes(_str);\\n bytes memory result = new bytes(_endIndex-_startIndex);\\n for(uint i = _startIndex; i < _endIndex; i++) {\\n result[i-_startIndex] = strBytes[i];\\n }\\n return string(result);\\n }\\n\\n function replaceString(\\n string memory _str,\\n string memory _lookupValue,\\n string memory _replaceValue\\n )\\n internal\\n pure\\n returns (string memory)\\n {\\n bytes memory strBytes = bytes(_str);\\n bytes memory lookupBytes = bytes(_lookupValue);\\n\\n uint256 lookupIndex = indexOf(_str, _lookupValue);\\n if (lookupIndex == type(uint256).max) {\\n return _str;\\n }\\n\\n // Split the original string into two parts: before and after the keyword\\n string memory beforeKeyword = substring(_str, 0, lookupIndex);\\n string memory afterKeyword = substring(_str, lookupIndex + lookupBytes.length, strBytes.length);\\n \\n return string.concat(beforeKeyword, _replaceValue, afterKeyword);\\n }\\n\\n function indexOf(string memory str, string memory substr) internal pure returns (uint) {\\n bytes memory strBytes = bytes(str);\\n bytes memory substrBytes = bytes(substr);\\n \\n if (strBytes.length < substrBytes.length) return type(uint256).max;\\n \\n for (uint i = 0; i <= strBytes.length - substrBytes.length; i++) {\\n bool found = true;\\n for (uint j = 0; j < substrBytes.length; j++) {\\n if (strBytes[i + j] != substrBytes[j]) {\\n found = false;\\n break;\\n }\\n }\\n if (found) return i;\\n }\\n \\n return type(uint256).max;\\n }\\n\\n function stringComparison(string memory _a, string memory _b) internal pure returns (bool) {\\n return (keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b)));\\n }\\n}\\n\",\"keccak256\":\"0xfcdfb3c2c8d5a6b7f480f827049782a70fb98f8b3838dcad0e0bb95237b94a0c\",\"license\":\"MIT\"},\"contracts/external/processors/EmailBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"../interfaces/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"../interfaces/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract EmailBaseProcessor is Ownable {\\n\\n /* ============ Modifiers ============ */\\n modifier onlyExchange() {\\n require(msg.sender == exchange, \\\"Only exchange can call this function\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n address public immutable exchange;\\n INullifierRegistry public nullifierRegistry;\\n bytes public emailFromAddress;\\n uint256 public timestampBuffer;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _exchange,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Ownable()\\n {\\n exchange = _exchange;\\n nullifierRegistry = _nullifierRegistry;\\n emailFromAddress = bytes(_emailFromAddress);\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice ONLY OWNER: Sets the from email address for validated emails. Check that email address is properly\\n * padded (if necessary). Padding will be dependent on if unpacking functions cut trailing 0s or not.\\n *\\n * @param _emailFromAddress The from email address for validated emails, MUST BE PROPERLY PADDED\\n */\\n function setEmailFromAddress(string memory _emailFromAddress) external onlyOwner {\\n emailFromAddress = bytes(_emailFromAddress);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Sets the timestamp buffer for validated emails. This is the amount of time in seconds\\n * that the timestamp can be off by and still be considered valid. Necessary to build in flexibility with L2\\n * timestamps.\\n *\\n * @param _timestampBuffer The timestamp buffer for validated emails\\n */\\n function setTimestampBuffer(uint256 _timestampBuffer) external onlyOwner {\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Getters ============ */\\n\\n function getEmailFromAddress() external view returns (bytes memory) {\\n return emailFromAddress;\\n }\\n\\n\\n /* ============ Internal Functions ============ */\\n\\n function _validateAndAddNullifier(bytes32 _nullifier) internal {\\n require(!nullifierRegistry.isNullified(_nullifier), \\\"Nullifier has already been used\\\");\\n nullifierRegistry.addNullifier(_nullifier);\\n }\\n}\\n\",\"keccak256\":\"0xe210c8e937a457c2d2aff798f3696f04ce1d011470294f02fb1169006a385f07\",\"license\":\"MIT\"},\"contracts/interfaces/ITransferDomainProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.18;\\n\\n\\ninterface ITransferDomainProcessor {\\n\\n struct TransferProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[10] signals;\\n }\\n\\n function processProof(\\n TransferProof calldata _proof\\n ) \\n external \\n returns (\\n bytes32 dkimKeyHash, \\n bytes32 hashedReceiverId, \\n string memory domainName, \\n uint256 bidId\\n );\\n}\",\"keccak256\":\"0x9cf5f1b070d7bad73d8ae57f7b20d449853f96fcbb5df1a443723df41c91339d\",\"license\":\"MIT\"},\"contracts/verifiers/namecheap_transfer_verifier.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n/*\\n Copyright 2021 0KIMS association.\\n\\n This file is generated with [snarkJS](https://github.com/iden3/snarkjs).\\n\\n snarkJS is a free software: you can redistribute it and/or modify it\\n under the terms of the GNU General Public License as published by\\n the Free Software Foundation, either version 3 of the License, or\\n (at your option) any later version.\\n\\n snarkJS is distributed in the hope that it will be useful, but WITHOUT\\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\\n License for more details.\\n\\n You should have received a copy of the GNU General Public License\\n along with snarkJS. If not, see .\\n*/\\n\\npragma solidity >=0.7.0 <0.9.0;\\n\\ncontract Groth16Verifier {\\n // Scalar field size\\n uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n // Base field size\\n uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\\n\\n // Verification Key data\\n uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042;\\n uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958;\\n uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132;\\n uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731;\\n uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679;\\n uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856;\\n uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n\\n\\n uint256 constant IC0x = 12140764414809439171579073747096628005611143888739021778142114438725209856911;\\n uint256 constant IC0y = 18380664008722994554410246598515713804368408809139402801410617352473294938101;\\n\\n uint256 constant IC1x = 16287270730688090110441256630912972881096977102957363147237538512209615075930;\\n uint256 constant IC1y = 2449016754858987854593324887044687327196932594716827949199487058237499016691;\\n\\n uint256 constant IC2x = 12290000746054008145532172012836689239677528072347882111559847558608807494030;\\n uint256 constant IC2y = 14308358318183304542626969831757608989020288980497492892592599563043422576641;\\n\\n uint256 constant IC3x = 17109205409157997740951972967816433882944148152574672952222919864324056429618;\\n uint256 constant IC3y = 9961558237149244928391169779496769511791942854258198694890294984589871243856;\\n\\n uint256 constant IC4x = 12885622983359679040345794541760667584938087103345731492334670493606961282700;\\n uint256 constant IC4y = 18397333374263242470546340955330845415543534978510188436756186606821028634481;\\n\\n uint256 constant IC5x = 8251971901226176941314060074725743834337466028961811325874949093602610929902;\\n uint256 constant IC5y = 16257777857146800480589260332284762827173712873310789777823130626151679328406;\\n\\n uint256 constant IC6x = 7755902890727928430969631143079950108469618570373249456222008624592630122217;\\n uint256 constant IC6y = 10757977250154075642155615103618917172698106635999924885067022788329148453826;\\n\\n uint256 constant IC7x = 9229565613389027758694089669374665969186485724568040364429447974425840672975;\\n uint256 constant IC7y = 8522685561456236376873601057738356653321521861001626828091657280469196217906;\\n\\n uint256 constant IC8x = 21276732369738095771663301979590133243106197446584260397744418605720907267683;\\n uint256 constant IC8y = 7293000518568388677473960035761983204180608786522452828815102825735261508468;\\n\\n uint256 constant IC9x = 9116173570523657214485637140779662063231707742648921986441734490858993965489;\\n uint256 constant IC9y = 20125316561678768525824986864877835211109013619593406972323904438419789772526;\\n\\n uint256 constant IC10x = 14220475398513461434883329515056365002533036699993990374428625877488131891870;\\n uint256 constant IC10y = 12173247053801606963174627761051371553685163525039542034195810636700588930659;\\n\\n\\n // Memory data\\n uint16 constant pVk = 0;\\n uint16 constant pPairing = 128;\\n\\n uint16 constant pLastMem = 896;\\n\\n function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[10] calldata _pubSignals) public view returns (bool) {\\n assembly {\\n function checkField(v) {\\n if iszero(lt(v, r)) {\\n mstore(0, 0)\\n return(0, 0x20)\\n }\\n }\\n\\n // G1 function to multiply a G1 value(x,y) to value in an address\\n function g1_mulAccC(pR, x, y, s) {\\n let success\\n let mIn := mload(0x40)\\n mstore(mIn, x)\\n mstore(add(mIn, 32), y)\\n mstore(add(mIn, 64), s)\\n\\n success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)\\n\\n if iszero(success) {\\n mstore(0, 0)\\n return(0, 0x20)\\n }\\n\\n mstore(add(mIn, 64), mload(pR))\\n mstore(add(mIn, 96), mload(add(pR, 32)))\\n\\n success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)\\n\\n if iszero(success) {\\n mstore(0, 0)\\n return(0, 0x20)\\n }\\n }\\n\\n function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {\\n let _pPairing := add(pMem, pPairing)\\n let _pVk := add(pMem, pVk)\\n\\n mstore(_pVk, IC0x)\\n mstore(add(_pVk, 32), IC0y)\\n\\n // Compute the linear combination vk_x\\n\\n g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))\\n\\n g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))\\n\\n g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))\\n\\n g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))\\n\\n g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))\\n\\n g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)))\\n\\n g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)))\\n\\n g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)))\\n\\n g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)))\\n\\n g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288)))\\n\\n\\n // -A\\n mstore(_pPairing, calldataload(pA))\\n mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q))\\n\\n // B\\n mstore(add(_pPairing, 64), calldataload(pB))\\n mstore(add(_pPairing, 96), calldataload(add(pB, 32)))\\n mstore(add(_pPairing, 128), calldataload(add(pB, 64)))\\n mstore(add(_pPairing, 160), calldataload(add(pB, 96)))\\n\\n // alpha1\\n mstore(add(_pPairing, 192), alphax)\\n mstore(add(_pPairing, 224), alphay)\\n\\n // beta2\\n mstore(add(_pPairing, 256), betax1)\\n mstore(add(_pPairing, 288), betax2)\\n mstore(add(_pPairing, 320), betay1)\\n mstore(add(_pPairing, 352), betay2)\\n\\n // vk_x\\n mstore(add(_pPairing, 384), mload(add(pMem, pVk)))\\n mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))\\n\\n\\n // gamma2\\n mstore(add(_pPairing, 448), gammax1)\\n mstore(add(_pPairing, 480), gammax2)\\n mstore(add(_pPairing, 512), gammay1)\\n mstore(add(_pPairing, 544), gammay2)\\n\\n // C\\n mstore(add(_pPairing, 576), calldataload(pC))\\n mstore(add(_pPairing, 608), calldataload(add(pC, 32)))\\n\\n // delta2\\n mstore(add(_pPairing, 640), deltax1)\\n mstore(add(_pPairing, 672), deltax2)\\n mstore(add(_pPairing, 704), deltay1)\\n mstore(add(_pPairing, 736), deltay2)\\n\\n\\n let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20)\\n\\n isOk := and(success, mload(_pPairing))\\n }\\n\\n let pMem := mload(0x40)\\n mstore(0x40, add(pMem, pLastMem))\\n\\n // Validate that all evaluations \\u2208 F\\n\\n checkField(calldataload(add(_pubSignals, 0)))\\n\\n checkField(calldataload(add(_pubSignals, 32)))\\n\\n checkField(calldataload(add(_pubSignals, 64)))\\n\\n checkField(calldataload(add(_pubSignals, 96)))\\n\\n checkField(calldataload(add(_pubSignals, 128)))\\n\\n checkField(calldataload(add(_pubSignals, 160)))\\n\\n checkField(calldataload(add(_pubSignals, 192)))\\n\\n checkField(calldataload(add(_pubSignals, 224)))\\n\\n checkField(calldataload(add(_pubSignals, 256)))\\n\\n checkField(calldataload(add(_pubSignals, 288)))\\n\\n checkField(calldataload(add(_pubSignals, 320)))\\n\\n\\n // Validate all evaluations\\n let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)\\n\\n mstore(0, isValid)\\n return(0, 0x20)\\n }\\n }\\n }\",\"keccak256\":\"0x55848d7bd571fc2f3c2bfe5a219bfad381731ac46a791e45737b8b36ef8d482f\",\"license\":\"GPL-3.0\"}},\"version\":1}", - "bytecode": "0x60a06040523462000044576200002262000018620001f4565b929190916200021d565b604051611eb66200054c82396080518181816104da01526109460152611eb690f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200008157604052565b62000049565b906200009e6200009660405190565b92836200005f565b565b6001600160a01b031690565b90565b6001600160a01b0381165b036200004457565b905051906200009e82620000af565b6001600160a01b038116620000ba565b905051906200009e82620000d1565b6001600160401b0381116200008157602090601f01601f19160190565b60005b838110620001215750506000910152565b818101518382015260200162000110565b909291926200014b6200014582620000f0565b62000087565b9381855260208501908284011162000044576200009e926200010d565b9080601f8301121562000044578151620000ac9260200162000132565b80620000ba565b905051906200009e8262000185565b6080818303126200004457620001b28282620000c2565b92620001c28360208401620000e1565b604083015190936001600160401b0382116200004457620001ea81620000ac93860162000168565b936060016200018c565b6200021762002402803803806200020b8162000087565b9283398101906200019b565b90919293565b906200009e939291620004ab565b906001600160a01b03905b9181191691161790565b620000ac90620000a0906001600160a01b031682565b620000ac9062000240565b620000ac9062000256565b9062000280620000ac620002889262000261565b82546200022b565b9055565b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015620002c5575b6020831014620002bf57565b6200028c565b91607f1691620002b3565b9160001960089290920291821b911b62000236565b620000ac620000ac620000ac9290565b91906200030a620000ac6200028893620002e5565b908354620002d0565b6200009e91600091620002f5565b8181106200032d575050565b806200033d600060019362000313565b0162000321565b9190601f81116200035457505050565b620003686200009e93600052602060002090565b906020601f8401819004830193106200038c575b6020601f90910104019062000321565b90915081906200037c565b90620003a1815190565b906001600160401b0382116200008157620003c982620003c28554620002a2565b8562000344565b602090601f8311600114620004085762000288929160009183620003fc575b5050600019600883021c1916906002021790565b015190503880620003e8565b601f198316916200041e85600052602060002090565b9260005b8181106200045f5750916002939185600196941062000445575b50505002019055565b01516000196008601f8516021c191690553880806200043c565b9193602060018192878701518155019501920162000422565b906200009e9162000397565b906000199062000236565b90620004a3620000ac6200028892620002e5565b825462000484565b6200009e9392620000ac620004dc93620004d493620004c9620004e4565b60805260016200026c565b600262000478565b60036200048f565b6200009e336000546001600160a01b031690620005038160006200026c565b6200053a620005337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09362000261565b9162000261565b916200054560405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c806365cd296c146100d2578063715018a6146100cd5780638da5cb5b146100c8578063b2a3fda4146100c3578063b870676c146100be578063c0d05fed146100b9578063ced1e978146100b4578063d2f7265a146100af578063dbac5821146100aa578063f2fde38b146100a5578063f3bb70f6146100a05763f6c7226b036100e6576106bf565b6105f9565b61057b565b610520565b6104c5565b6104aa565b610483565b6102e7565b610265565b610206565b6101dd565b61019d565b90816102409103126100e65790565b600080fd5b90610240828203126100e657610100916100d7565b90565b9052565b60005b83811061011a5750506000910152565b818101518382015260200161010a565b61014b61015460209361015e9361013f815190565b80835293849260200190565b95869101610107565b601f01601f191690565b0190565b94939160609161019b946101896101969361018260808b019460008c0152565b60208a0152565b878203604089015261012a565b940152565b565b346100e6576101ce6101b86101b33660046100eb565b610d21565b906101c594929460405190565b94859485610162565b0390f35b60009103126100e657565b346100e6576101ed3660046101d2565b6101f561072c565b604051005b6001600160a01b031690565b346100e6576102163660046101d2565b6101ce6102216106ea565b604051918291826001600160a01b03909116815260200190565b805b036100e657565b9050359061019b8261023b565b906020828203126100e65761010091610244565b346100e6576101f5610278366004610251565b6115da565b610100916008021c6001600160a01b031690565b90610100915461027d565b61010060006001610291565b610100906101fa906001600160a01b031682565b610100906102a8565b610100906102bc565b610103906102c5565b60208101929161019b91906102ce565b346100e6576102f73660046101d2565b6101ce61030261029c565b604051918291826102d7565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561035a575b602083101461035557565b610324565b91607f169161034a565b805460009392916103816103778361033a565b8085529360200190565b91600181169081156103d3575060011461039a57505050565b6103ad9192939450600052602060002090565b916000925b8184106103bf5750500190565b8054848401526020909301926001016103b2565b92949550505060ff1916825215156020020190565b9061010091610364565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761042a57604052565b6103f2565b9061019b6104499261044060405190565b938480926103e8565b0383610408565b90600010610461576101009061042f565b61030e565b61010060006002610450565b60208082526101009291019061012a565b346100e6576104933660046101d2565b6101ce61049e610466565b60405191829182610472565b346100e6576104ba3660046101d2565b6101ce61049e6115e3565b346100e6576104d53660046101d2565b6101ce7f0000000000000000000000000000000000000000000000000000000000000000610221565b610100916008021c81565b9061010091546104fe565b61010060006003610509565b346100e6576105303660046101d2565b6101ce61053b610514565b6040519182918290815260200190565b6001600160a01b03811661023d565b9050359061019b8261054b565b906020828203126100e6576101009161055a565b346100e6576101f561058e366004610567565b610843565b919060408301116100e657565b919060808301116100e657565b91906101408301116100e657565b610240818303126100e6576105d08282610593565b926101006105e184604085016105a0565b936105ef8160c08601610593565b93610100016105ad565b346100e6576106093660046105bb565b92919091611dc5565b9061019b61061f60405190565b9283610408565b67ffffffffffffffff811161042a57602090601f01601f19160190565b90826000939282370152565b9092919261066461065f82610626565b610612565b938185526020850190828401116100e65761019b92610643565b9080601f830112156100e6578160206101009335910161064f565b906020828203126100e657813567ffffffffffffffff81116100e657610100920161067e565b346100e6576101f56106d2366004610699565b611594565b610100906101fa565b61010090546106d7565b61010060006106e0565b6106fc610788565b61019b61071a565b6101fa6101006101009290565b61010090610704565b61019b6107276000610711565b61087c565b61019b6106f4565b1561073b57565b60405162461bcd60e51b815280610784600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b61019b6107936106ea565b6107ac61079f336101fa565b916001600160a01b031690565b14610734565b61019b906107be610788565b61081e565b156107ca57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61019b906107276108326101fa6000610711565b6001600160a01b03831614156107c3565b61019b906107b2565b906001600160a01b03905b9181191691161790565b90610871610100610878926102c5565b825461084c565b9055565b61088660006106e0565b90610892816000610861565b6108c56108bf7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936102c5565b916102c5565b916108cf60405190565b600090a3565b156108dc57565b60405162461bcd60e51b8152602060048201526024808201527f4f6e6c792065786368616e67652063616e2063616c6c20746869732066756e636044820152633a34b7b760e11b6064820152608490fd5b61097694939291906109713361096b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661079f565b146108d5565b610b73565b90919293565b80151561023d565b9050519061019b8261097c565b906020828203126100e65761010091610984565b9037565b61019b916040916109a5565b9061015e816040936109a9565b6109d26109ce60029390565b9190565b806000925b8484106109e5575050505050565b610a016109fa6001926109f58690565b6109b5565b9360400190565b930192916109d7565b61019b91610140916109a5565b610a4f61019b94610a4561010094989795610a3b61024086019a60008701906109a9565b60408501906109c2565b60c08301906109a9565b0190610a0a565b6040513d6000823e3d90fd5b15610a6957565b60405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606490fd5b634e487b7160e01b600052603260045260246000fd5b90600a811015610ac5576020020190565b610a9e565b6101006101006101009290565b356101008161023b565b610aee6101006101009290565b60ff1690565b61015e610b0c92602092610b06815190565b94859290565b93849101610107565b61010091610af4565b6101009061042f565b15610b2e57565b60405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606490fd5b50505050610b80306102c5565b602063f3bb70f6916000840190610bb96040860194610bc461010060c0890198018098610bac60405190565b9889978896879660e01b90565b865260048601610a17565b03915afa8015610d1c57610be091600091610cee575b50610a62565b610c03610bfe610bf9610bf36000610aca565b84610ab4565b610ad7565b610aca565b91600290610c88610c146001610ae1565b92610c826109ce610c73610c32610c2a85610ae1565b80988a610e1c565b610c5a610c3e60405190565b8092610c4e602083019182610b15565b90810382520382610408565b610c6c610c65825190565b9160200190565b2093610b1e565b610c7e610c65825190565b2090565b14610b27565b610100610bf9610cbc610bfe610bf9610cb6610cb0600798610ca98a610ae1565b908b610e1c565b97610aca565b88610ab4565b94610cde610cd9610bfe610bf9610cd36008610aca565b85610ab4565b611639565b610ce86009610aca565b90610ab4565b610d0f915060203d8111610d15575b610d078183610408565b810190610991565b38610bda565b503d610cfd565b610a56565b6109769060006060818061092d565b634e487b7160e01b600052601160045260246000fd5b610d559060ff165b9160ff1690565b90039060ff8211610d6257565b610d30565b6101006101006101009260ff1690565b67ffffffffffffffff811161042a5760208091020190565b90610d9c61065f83610d77565b918252565b369037565b9061019b610dbc610db684610d8f565b93610d77565b601f190160208401610da1565b6000198114610d625760010190565b91908203918211610d6257565b90610dee825190565b811015610ac5576020809102010190565b610100601f610aca565b81810292918115918404141715610d6257565b909290610e39610e34610e2f8686610d46565b610d67565b610da6565b91610e4385610d67565b610e4c85610d67565b811015610e9457610e8d81610e88610e6a610bf9610e4c9588610ab4565b610e85610e7f610e798c610d67565b85610dd8565b89610de5565b52565b610dc9565b9050610e43565b509350506101009150610ea5815190565b90610eb8610eb1610dff565b8093610e09565b906110c9565b90610d9c61065f83610626565b9061019b610dbc610edb84610ebe565b93610626565b610eee6101006101009290565b61ffff1690565b61ffff1661ffff8114610d625760010190565b6101006101006101009261ffff1690565b61010090610f2a6109ce6101009490565b901c90565b634e487b7160e01b600052601260045260246000fd5b610f519060ff16610d4e565b908115610f5c570690565b610f2f565b610f6d9060ff16610d4e565b019060ff8211610d6257565b610f8f610f896101009260ff1690565b60f81b90565b6001600160f81b03191690565b90610fa5825190565b811015610ac5570160200190565b61010090610f2a6109ce6101009460ff1690565b15610fce57565b60405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a490fd5b1561106657565b60405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608490fd5b926000926110d684610ae1565b6110ef6110ea836110e5895190565b610e09565b610ecb565b946110f981610aca565b9561110382610ee1565b965b6111106101008a5190565b61111989610f08565b10156112e75761113861113461112e8a610f08565b8b610de5565b5190565b98899661114487610da6565b9861114e86610aca565b8881101561119b5780610e888c8f6111969461118861118361118e9361117d6111776008610aca565b85610e09565b90610f19565b610ae1565b92610de5565b9060ff169052565b61114e565b5091909a50989295989793969194976111b388610aca565b955b8a8710156112c6576111d4610e2f6111cd8989610de5565b5160ff1690565b6111dd8a610aca565b811461127957906111f86111f361120a93610ae1565b610f79565b8a1a611204828b610f9c565b53610dc9565b9261121e6112186002610ae1565b8b610f45565b61122a610d4e8b610ae1565b14611255575b61124861124e915b6112426008610ae1565b90610fb3565b96610dc9565b95926111b5565b9861124861127061124e9261126a6001610ae1565b90610f61565b9a915050611230565b50926112886112186002610ae1565b600190611297610d4e83610ae1565b146112aa575b5061124861124e91611238565b6112be61124e929b61126a61124893610ae1565b9a915061129d565b989550935097949598916112da9150610ef5565b9695979197949094611105565b926109ce919598506101009750610100945061131a92509561010061132197611313610d4e6001610ae1565b1015610fc7565b111561105f565b611333565b610f8f610f896101009290565b80519060009261134284610aca565b61134d610100845190565b8110156113ef5761136f6113618285610f9c565b516001600160f81b03191690565b61138961137b87611326565b916001600160f81b03191690565b1461139c5761139790610dc9565b611342565b9250905b6113a983610ecb565b916113b385610aca565b845b8110156113e3576113dc816113d06113616113b59487610f9c565b881a6112048288610f9c565b90506113b3565b50935050610100915090565b50906113a0565b61019b90611402610788565b611589565b9160001960089290920291821b911b610857565b919061142c61010061087893610aca565b908354611407565b61019b9160009161141b565b81811061144b575050565b806114596000600193611434565b01611440565b9190601f811161146e57505050565b61148061019b93600052602060002090565b906020601f8401819004830193106114a2575b6020601f909101040190611440565b9091508190611493565b906114b5815190565b9067ffffffffffffffff821161042a576114d9826114d3855461033a565b8561145f565b602090601f831160011461151457610878929160009183611509575b5050600019600883021c1916906002021790565b0151905038806114f5565b601f1983169161152985600052602060002090565b9260005b8181106115675750916002939185600196941061154e575b50505002019055565b01516000196008601f8516021c19169055388080611545565b9193602060018192878701518155019501920161152d565b9061019b916114ac565b61019b90600261157f565b61019b906113f6565b61019b906115a9610788565b6115cf565b9060001990610857565b906115c861010061087892610aca565b82546115ae565b61019b9060036115b8565b61019b9061159d565b6101006002610b1e565b156115f457565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b611668602061165061164b60016106e0565b6102c5565b63169394bb9061165f60405190565b93849260e01b90565b82526004820185905260249082905afa908115610d1c57611698916116939160009161170b57501590565b6115ed565b6116a561164b60016106e0565b90635bd4df3290823b156100e6576116e2926116d4600080946116c760405190565b9687958694859360e01b90565b835260048301526024820190565b03925af18015610d1c576116f35750565b61019b9060006117038183610408565b8101906101d2565b611723915060203d8111610d1557610d078183610408565b1590565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561175057565b6000805260206000f35b919290926040519384526020840152604083015260408260608160076107d05a03fa156117505760806040928251848201526020830151606082015260066107d05a03fa1561175057565b93909260606020947f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47866080860198611b4061012060008901977f1ad76ddc6a22025c3aed93a2ecb7959a46cc41d238ec4fa18423c68b65669b8f89527f28a3164ff2e0c9468f0179ac2f0dff75b6ec8dc89312e675ffe12f126abc1ff5858a015261187760008201357f056a18281a43ab963f0c5a58b6e66002c17db2946ccf61b5d6a45ebccfea85f37f240244bfb8c78a8f6285c53b3ec73f814299bb5d1a92ffe50d78549341c53a5a8c61175a565b6118c6858201357f1fa23e6accea51843090b5191a0a7a7be6bfb7ace978534a3c0148fcf067a0017f1b2be4d79798243ced7d220b271ec81cdf295fa20a0cc07790b383bba107818e8c61175a565b61191660408201357f16060acad62ea556a4f729b2e590cc567fc5e7da1a10f455c6f1b1433ae562507f25d377935ec79e99aa9d9e5ae28d9cb6c4ada889612fdd69683e3c8e80a834328c61175a565b611965888201357f28ac858d14a4f2c21d2c922d1435d04ee21d923026f083495095ad80a7e39f717f1c7d011040cfb2aec801eaa384048e03933e7a3fc8769abdee473ff37610fe8c8c61175a565b6119b560808201357f23f193803e0d0f5c2d38baac0b934a3ccf5e6703aa81317e26585c01345500967f123e735950330f217eec135908fb77e047a140443955131bf6c99d7a71c060ee8c61175a565b611a0560a08201357f17c8cca1da2e449f38869f18dadef181eaf21fbd61da70d84319351bfa3713c27f1125af7b1070f92c587c112a2a5d534f78165566d27978f4493fa82b4ac506e98c61175a565b611a5560c08201357f12d7ab490c9dd82226d7eb92187f9965edeb4e0bf8efd86f141998071c4a1e327f1467bfbf69dedff0004714c315ee8976a2b23452ddbc2808ab9da798dec560cf8c61175a565b611aa560e08201357f101fb127cded6f2ebe972c71d467a3eb0082e5093c0fa0b34e4ae35de8e3d3747f2f0a3429b93f9e693fa44aec6203bcd33ec5cfa9937c1a77906f0ade6c5fbe638c61175a565b611af66101008201357f2c7e8687c0484be0586fe253c7ab55258a0421bd6fe80c353b4c4a166574f6ee7f14279246c9032b4cf9597db6e67afb3d2a45699c02c4186618d09eb93d9f59b18c61175a565b01357f1ae9d04c753e792e4b6a4bb10f0c4ac42817580c171130e23093425e4ceb76637f1f7080fc237ec1ce5953ed7c4d0fbcd36bffa16a825e5686151e283ac7f3e29e8961175a565b80358a5201358103068688015280356040880152858101358288015260408101356080880152013560a08601527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08601527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08601527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008601527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208601527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408601527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160860152516101808501528260000101516101a08401527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08401527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08401527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008401527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220840152803561024084015201356102608201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26102808201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6102a08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102c08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa6102e08201526020816103008160086107d05a03fa90511690565b91611e779391611dd3600090565b50604051936103808501604052611ded6000850135611727565b611dfa6020850135611727565b611e076040850135611727565b611e146060850135611727565b611e216080850135611727565b611e2e60a0850135611727565b611e3b60c0850135611727565b611e4860e0850135611727565b611e56610100850135611727565b611e64610120850135611727565b611e72610140850135611727565b6117a5565b60005260206000f3fea2646970667358221220fd7a7e5f5c2e3f82b4fc3045adcf8f4ebac68b16422547b3377c1acbedc4ea3264736f6c63430008120033", - "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806365cd296c146100d2578063715018a6146100cd5780638da5cb5b146100c8578063b2a3fda4146100c3578063b870676c146100be578063c0d05fed146100b9578063ced1e978146100b4578063d2f7265a146100af578063dbac5821146100aa578063f2fde38b146100a5578063f3bb70f6146100a05763f6c7226b036100e6576106bf565b6105f9565b61057b565b610520565b6104c5565b6104aa565b610483565b6102e7565b610265565b610206565b6101dd565b61019d565b90816102409103126100e65790565b600080fd5b90610240828203126100e657610100916100d7565b90565b9052565b60005b83811061011a5750506000910152565b818101518382015260200161010a565b61014b61015460209361015e9361013f815190565b80835293849260200190565b95869101610107565b601f01601f191690565b0190565b94939160609161019b946101896101969361018260808b019460008c0152565b60208a0152565b878203604089015261012a565b940152565b565b346100e6576101ce6101b86101b33660046100eb565b610d21565b906101c594929460405190565b94859485610162565b0390f35b60009103126100e657565b346100e6576101ed3660046101d2565b6101f561072c565b604051005b6001600160a01b031690565b346100e6576102163660046101d2565b6101ce6102216106ea565b604051918291826001600160a01b03909116815260200190565b805b036100e657565b9050359061019b8261023b565b906020828203126100e65761010091610244565b346100e6576101f5610278366004610251565b6115da565b610100916008021c6001600160a01b031690565b90610100915461027d565b61010060006001610291565b610100906101fa906001600160a01b031682565b610100906102a8565b610100906102bc565b610103906102c5565b60208101929161019b91906102ce565b346100e6576102f73660046101d2565b6101ce61030261029c565b604051918291826102d7565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561035a575b602083101461035557565b610324565b91607f169161034a565b805460009392916103816103778361033a565b8085529360200190565b91600181169081156103d3575060011461039a57505050565b6103ad9192939450600052602060002090565b916000925b8184106103bf5750500190565b8054848401526020909301926001016103b2565b92949550505060ff1916825215156020020190565b9061010091610364565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761042a57604052565b6103f2565b9061019b6104499261044060405190565b938480926103e8565b0383610408565b90600010610461576101009061042f565b61030e565b61010060006002610450565b60208082526101009291019061012a565b346100e6576104933660046101d2565b6101ce61049e610466565b60405191829182610472565b346100e6576104ba3660046101d2565b6101ce61049e6115e3565b346100e6576104d53660046101d2565b6101ce7f0000000000000000000000000000000000000000000000000000000000000000610221565b610100916008021c81565b9061010091546104fe565b61010060006003610509565b346100e6576105303660046101d2565b6101ce61053b610514565b6040519182918290815260200190565b6001600160a01b03811661023d565b9050359061019b8261054b565b906020828203126100e6576101009161055a565b346100e6576101f561058e366004610567565b610843565b919060408301116100e657565b919060808301116100e657565b91906101408301116100e657565b610240818303126100e6576105d08282610593565b926101006105e184604085016105a0565b936105ef8160c08601610593565b93610100016105ad565b346100e6576106093660046105bb565b92919091611dc5565b9061019b61061f60405190565b9283610408565b67ffffffffffffffff811161042a57602090601f01601f19160190565b90826000939282370152565b9092919261066461065f82610626565b610612565b938185526020850190828401116100e65761019b92610643565b9080601f830112156100e6578160206101009335910161064f565b906020828203126100e657813567ffffffffffffffff81116100e657610100920161067e565b346100e6576101f56106d2366004610699565b611594565b610100906101fa565b61010090546106d7565b61010060006106e0565b6106fc610788565b61019b61071a565b6101fa6101006101009290565b61010090610704565b61019b6107276000610711565b61087c565b61019b6106f4565b1561073b57565b60405162461bcd60e51b815280610784600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b61019b6107936106ea565b6107ac61079f336101fa565b916001600160a01b031690565b14610734565b61019b906107be610788565b61081e565b156107ca57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61019b906107276108326101fa6000610711565b6001600160a01b03831614156107c3565b61019b906107b2565b906001600160a01b03905b9181191691161790565b90610871610100610878926102c5565b825461084c565b9055565b61088660006106e0565b90610892816000610861565b6108c56108bf7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936102c5565b916102c5565b916108cf60405190565b600090a3565b156108dc57565b60405162461bcd60e51b8152602060048201526024808201527f4f6e6c792065786368616e67652063616e2063616c6c20746869732066756e636044820152633a34b7b760e11b6064820152608490fd5b61097694939291906109713361096b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661079f565b146108d5565b610b73565b90919293565b80151561023d565b9050519061019b8261097c565b906020828203126100e65761010091610984565b9037565b61019b916040916109a5565b9061015e816040936109a9565b6109d26109ce60029390565b9190565b806000925b8484106109e5575050505050565b610a016109fa6001926109f58690565b6109b5565b9360400190565b930192916109d7565b61019b91610140916109a5565b610a4f61019b94610a4561010094989795610a3b61024086019a60008701906109a9565b60408501906109c2565b60c08301906109a9565b0190610a0a565b6040513d6000823e3d90fd5b15610a6957565b60405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606490fd5b634e487b7160e01b600052603260045260246000fd5b90600a811015610ac5576020020190565b610a9e565b6101006101006101009290565b356101008161023b565b610aee6101006101009290565b60ff1690565b61015e610b0c92602092610b06815190565b94859290565b93849101610107565b61010091610af4565b6101009061042f565b15610b2e57565b60405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606490fd5b50505050610b80306102c5565b602063f3bb70f6916000840190610bb96040860194610bc461010060c0890198018098610bac60405190565b9889978896879660e01b90565b865260048601610a17565b03915afa8015610d1c57610be091600091610cee575b50610a62565b610c03610bfe610bf9610bf36000610aca565b84610ab4565b610ad7565b610aca565b91600290610c88610c146001610ae1565b92610c826109ce610c73610c32610c2a85610ae1565b80988a610e1c565b610c5a610c3e60405190565b8092610c4e602083019182610b15565b90810382520382610408565b610c6c610c65825190565b9160200190565b2093610b1e565b610c7e610c65825190565b2090565b14610b27565b610100610bf9610cbc610bfe610bf9610cb6610cb0600798610ca98a610ae1565b908b610e1c565b97610aca565b88610ab4565b94610cde610cd9610bfe610bf9610cd36008610aca565b85610ab4565b611639565b610ce86009610aca565b90610ab4565b610d0f915060203d8111610d15575b610d078183610408565b810190610991565b38610bda565b503d610cfd565b610a56565b6109769060006060818061092d565b634e487b7160e01b600052601160045260246000fd5b610d559060ff165b9160ff1690565b90039060ff8211610d6257565b610d30565b6101006101006101009260ff1690565b67ffffffffffffffff811161042a5760208091020190565b90610d9c61065f83610d77565b918252565b369037565b9061019b610dbc610db684610d8f565b93610d77565b601f190160208401610da1565b6000198114610d625760010190565b91908203918211610d6257565b90610dee825190565b811015610ac5576020809102010190565b610100601f610aca565b81810292918115918404141715610d6257565b909290610e39610e34610e2f8686610d46565b610d67565b610da6565b91610e4385610d67565b610e4c85610d67565b811015610e9457610e8d81610e88610e6a610bf9610e4c9588610ab4565b610e85610e7f610e798c610d67565b85610dd8565b89610de5565b52565b610dc9565b9050610e43565b509350506101009150610ea5815190565b90610eb8610eb1610dff565b8093610e09565b906110c9565b90610d9c61065f83610626565b9061019b610dbc610edb84610ebe565b93610626565b610eee6101006101009290565b61ffff1690565b61ffff1661ffff8114610d625760010190565b6101006101006101009261ffff1690565b61010090610f2a6109ce6101009490565b901c90565b634e487b7160e01b600052601260045260246000fd5b610f519060ff16610d4e565b908115610f5c570690565b610f2f565b610f6d9060ff16610d4e565b019060ff8211610d6257565b610f8f610f896101009260ff1690565b60f81b90565b6001600160f81b03191690565b90610fa5825190565b811015610ac5570160200190565b61010090610f2a6109ce6101009460ff1690565b15610fce57565b60405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a490fd5b1561106657565b60405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608490fd5b926000926110d684610ae1565b6110ef6110ea836110e5895190565b610e09565b610ecb565b946110f981610aca565b9561110382610ee1565b965b6111106101008a5190565b61111989610f08565b10156112e75761113861113461112e8a610f08565b8b610de5565b5190565b98899661114487610da6565b9861114e86610aca565b8881101561119b5780610e888c8f6111969461118861118361118e9361117d6111776008610aca565b85610e09565b90610f19565b610ae1565b92610de5565b9060ff169052565b61114e565b5091909a50989295989793969194976111b388610aca565b955b8a8710156112c6576111d4610e2f6111cd8989610de5565b5160ff1690565b6111dd8a610aca565b811461127957906111f86111f361120a93610ae1565b610f79565b8a1a611204828b610f9c565b53610dc9565b9261121e6112186002610ae1565b8b610f45565b61122a610d4e8b610ae1565b14611255575b61124861124e915b6112426008610ae1565b90610fb3565b96610dc9565b95926111b5565b9861124861127061124e9261126a6001610ae1565b90610f61565b9a915050611230565b50926112886112186002610ae1565b600190611297610d4e83610ae1565b146112aa575b5061124861124e91611238565b6112be61124e929b61126a61124893610ae1565b9a915061129d565b989550935097949598916112da9150610ef5565b9695979197949094611105565b926109ce919598506101009750610100945061131a92509561010061132197611313610d4e6001610ae1565b1015610fc7565b111561105f565b611333565b610f8f610f896101009290565b80519060009261134284610aca565b61134d610100845190565b8110156113ef5761136f6113618285610f9c565b516001600160f81b03191690565b61138961137b87611326565b916001600160f81b03191690565b1461139c5761139790610dc9565b611342565b9250905b6113a983610ecb565b916113b385610aca565b845b8110156113e3576113dc816113d06113616113b59487610f9c565b881a6112048288610f9c565b90506113b3565b50935050610100915090565b50906113a0565b61019b90611402610788565b611589565b9160001960089290920291821b911b610857565b919061142c61010061087893610aca565b908354611407565b61019b9160009161141b565b81811061144b575050565b806114596000600193611434565b01611440565b9190601f811161146e57505050565b61148061019b93600052602060002090565b906020601f8401819004830193106114a2575b6020601f909101040190611440565b9091508190611493565b906114b5815190565b9067ffffffffffffffff821161042a576114d9826114d3855461033a565b8561145f565b602090601f831160011461151457610878929160009183611509575b5050600019600883021c1916906002021790565b0151905038806114f5565b601f1983169161152985600052602060002090565b9260005b8181106115675750916002939185600196941061154e575b50505002019055565b01516000196008601f8516021c19169055388080611545565b9193602060018192878701518155019501920161152d565b9061019b916114ac565b61019b90600261157f565b61019b906113f6565b61019b906115a9610788565b6115cf565b9060001990610857565b906115c861010061087892610aca565b82546115ae565b61019b9060036115b8565b61019b9061159d565b6101006002610b1e565b156115f457565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b611668602061165061164b60016106e0565b6102c5565b63169394bb9061165f60405190565b93849260e01b90565b82526004820185905260249082905afa908115610d1c57611698916116939160009161170b57501590565b6115ed565b6116a561164b60016106e0565b90635bd4df3290823b156100e6576116e2926116d4600080946116c760405190565b9687958694859360e01b90565b835260048301526024820190565b03925af18015610d1c576116f35750565b61019b9060006117038183610408565b8101906101d2565b611723915060203d8111610d1557610d078183610408565b1590565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561175057565b6000805260206000f35b919290926040519384526020840152604083015260408260608160076107d05a03fa156117505760806040928251848201526020830151606082015260066107d05a03fa1561175057565b93909260606020947f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47866080860198611b4061012060008901977f1ad76ddc6a22025c3aed93a2ecb7959a46cc41d238ec4fa18423c68b65669b8f89527f28a3164ff2e0c9468f0179ac2f0dff75b6ec8dc89312e675ffe12f126abc1ff5858a015261187760008201357f056a18281a43ab963f0c5a58b6e66002c17db2946ccf61b5d6a45ebccfea85f37f240244bfb8c78a8f6285c53b3ec73f814299bb5d1a92ffe50d78549341c53a5a8c61175a565b6118c6858201357f1fa23e6accea51843090b5191a0a7a7be6bfb7ace978534a3c0148fcf067a0017f1b2be4d79798243ced7d220b271ec81cdf295fa20a0cc07790b383bba107818e8c61175a565b61191660408201357f16060acad62ea556a4f729b2e590cc567fc5e7da1a10f455c6f1b1433ae562507f25d377935ec79e99aa9d9e5ae28d9cb6c4ada889612fdd69683e3c8e80a834328c61175a565b611965888201357f28ac858d14a4f2c21d2c922d1435d04ee21d923026f083495095ad80a7e39f717f1c7d011040cfb2aec801eaa384048e03933e7a3fc8769abdee473ff37610fe8c8c61175a565b6119b560808201357f23f193803e0d0f5c2d38baac0b934a3ccf5e6703aa81317e26585c01345500967f123e735950330f217eec135908fb77e047a140443955131bf6c99d7a71c060ee8c61175a565b611a0560a08201357f17c8cca1da2e449f38869f18dadef181eaf21fbd61da70d84319351bfa3713c27f1125af7b1070f92c587c112a2a5d534f78165566d27978f4493fa82b4ac506e98c61175a565b611a5560c08201357f12d7ab490c9dd82226d7eb92187f9965edeb4e0bf8efd86f141998071c4a1e327f1467bfbf69dedff0004714c315ee8976a2b23452ddbc2808ab9da798dec560cf8c61175a565b611aa560e08201357f101fb127cded6f2ebe972c71d467a3eb0082e5093c0fa0b34e4ae35de8e3d3747f2f0a3429b93f9e693fa44aec6203bcd33ec5cfa9937c1a77906f0ade6c5fbe638c61175a565b611af66101008201357f2c7e8687c0484be0586fe253c7ab55258a0421bd6fe80c353b4c4a166574f6ee7f14279246c9032b4cf9597db6e67afb3d2a45699c02c4186618d09eb93d9f59b18c61175a565b01357f1ae9d04c753e792e4b6a4bb10f0c4ac42817580c171130e23093425e4ceb76637f1f7080fc237ec1ce5953ed7c4d0fbcd36bffa16a825e5686151e283ac7f3e29e8961175a565b80358a5201358103068688015280356040880152858101358288015260408101356080880152013560a08601527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08601527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08601527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008601527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208601527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408601527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160860152516101808501528260000101516101a08401527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08401527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08401527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008401527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220840152803561024084015201356102608201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26102808201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6102a08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102c08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa6102e08201526020816103008160086107d05a03fa90511690565b91611e779391611dd3600090565b50604051936103808501604052611ded6000850135611727565b611dfa6020850135611727565b611e076040850135611727565b611e146060850135611727565b611e216080850135611727565b611e2e60a0850135611727565b611e3b60c0850135611727565b611e4860e0850135611727565b611e56610100850135611727565b611e64610120850135611727565b611e72610140850135611727565b6117a5565b60005260206000f3fea2646970667358221220fd7a7e5f5c2e3f82b4fc3045adcf8f4ebac68b16422547b3377c1acbedc4ea3264736f6c63430008120033", + "solcInputHash": "a43d75c8fa53cbd70612f5013c5d17a2", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_exchange\",\"type\":\"address\"},{\"internalType\":\"contract INullifierRegistry\",\"name\":\"_nullifierRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_emailFromAddress\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_timestampBuffer\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"emailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"exchange\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEmailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nullifierRegistry\",\"outputs\":[{\"internalType\":\"contract INullifierRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"a\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"b\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"c\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[10]\",\"name\":\"signals\",\"type\":\"uint256[10]\"}],\"internalType\":\"struct ITransferDomainProcessor.TransferProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"processProof\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"dkimKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"hashedReceiverId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"domainName\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_emailFromAddress\",\"type\":\"string\"}],\"name\":\"setEmailFromAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_timestampBuffer\",\"type\":\"uint256\"}],\"name\":\"setTimestampBuffer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timestampBuffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"_pA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"_pB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"_pC\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[10]\",\"name\":\"_pubSignals\",\"type\":\"uint256[10]\"}],\"name\":\"verifyProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setEmailFromAddress(string)\":{\"params\":{\"_emailFromAddress\":\"The from email address for validated emails, MUST BE PROPERLY PADDED\"}},\"setTimestampBuffer(uint256)\":{\"params\":{\"_timestampBuffer\":\"The timestamp buffer for validated emails\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"setEmailFromAddress(string)\":{\"notice\":\"ONLY OWNER: Sets the from email address for validated emails. Check that email address is properly padded (if necessary). Padding will be dependent on if unpacking functions cut trailing 0s or not.\"},\"setTimestampBuffer(uint256)\":{\"notice\":\"ONLY OWNER: Sets the timestamp buffer for validated emails. This is the amount of time in seconds that the timestamp can be off by and still be considered valid. Necessary to build in flexibility with L2 timestamps.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TransferDomainProcessor.sol\":\"TransferDomainProcessor\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@zk-email/contracts/utils/StringUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.7.6;\\n\\n// https://github.com/nalinbhardwaj/ethdosnumber/blob/main/ethdos-contracts/src/HexStrings.sol\\nlibrary StringUtils {\\n bytes16 internal constant ALPHABET = \\\"0123456789abcdef\\\";\\n uint256 internal constant DEFAULT_PACK_SIZE = 31;\\n\\n /// @notice Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n /// @dev Credit to Open Zeppelin under MIT license https://github.com/OpenZeppelin/openzeppelin-contracts/blob/243adff49ce1700e0ecb99fe522fb16cff1d1ddc/contracts/utils/Strings.sol#L55\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = ALPHABET[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n function toHexStringNoPrefix(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length);\\n for (uint256 i = buffer.length; i > 0; i--) {\\n buffer[i - 1] = ALPHABET[value & 0xf];\\n value >>= 4;\\n }\\n return string(buffer);\\n }\\n\\n function toString(uint256 value) internal pure returns (string memory) {\\n return toString(abi.encodePacked(value));\\n }\\n\\n function toString(bytes32 value) internal pure returns (string memory) {\\n return toString(abi.encodePacked(value));\\n }\\n\\n function toString(address account) internal pure returns (string memory) {\\n return toString(abi.encodePacked(account));\\n }\\n\\n function stringEq(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));\\n }\\n\\n function toString(bytes memory data) internal pure returns (string memory) {\\n bytes memory alphabet = \\\"0123456789abcdef\\\";\\n\\n bytes memory str = new bytes(2 + data.length * 2);\\n str[0] = \\\"0\\\";\\n str[1] = \\\"x\\\";\\n for (uint256 i = 0; i < data.length; i++) {\\n str[2 + i * 2] = alphabet[uint256(uint8(data[i] >> 4))];\\n str[3 + i * 2] = alphabet[uint256(uint8(data[i] & 0x0f))];\\n }\\n return string(str);\\n }\\n\\n // 1 packed byte = packSize (usually 31) normal bytes, all in one 255/256-bit value\\n // Note that this is not 32 due to the field modulus of circom\\n function convertPackedByteToString(uint256 packedByte, uint256 packSize)\\n internal\\n pure\\n returns (string memory extractedString)\\n {\\n uint256[] memory packedBytes = new uint256[](1);\\n packedBytes[0] = packedByte;\\n return convertPackedBytesToString(packedBytes, packSize, packSize);\\n }\\n\\n // Note: This convenience function removes the max string length check, which may cause misalignment with the circom\\n // If using this, then the circom needs to rangecheck packed length in the circuit itself\\n // This defaults to 31 bytes per packed byte\\n function convertPackedBytesToString(uint256[] memory packedBytes) \\n internal\\n pure\\n returns (string memory extractedString)\\n {\\n return convertPackedBytesToString(packedBytes, packedBytes.length * DEFAULT_PACK_SIZE, DEFAULT_PACK_SIZE);\\n }\\n\\n // Unpacks uint256s into bytes and then extracts the non-zero characters\\n // Only extracts contiguous non-zero characters and ensures theres only 1 such state\\n // Note that unpackedLen may be more than packedBytes.length * 8 since there may be 0s\\n // signals is the total number of signals (i.e. bytes) packed into the packedBytes. it defaults to packedBytes.length * packSize\\n function convertPackedBytesToString(uint256[] memory packedBytes, uint256 signals, uint256 packSize)\\n internal\\n pure\\n returns (string memory extractedString)\\n {\\n uint8 state = 0;\\n // bytes: 0 0 0 0 y u s h _ g 0 0 0\\n // state: 0 0 0 0 1 1 1 1 1 1 2 2 2\\n bytes memory nonzeroBytesArray = new bytes(packedBytes.length * packSize);\\n uint256 nonzeroBytesArrayIndex = 0;\\n for (uint16 i = 0; i < packedBytes.length; i++) {\\n uint256 packedByte = packedBytes[i];\\n uint8[] memory unpackedBytes = new uint8[](packSize);\\n for (uint256 j = 0; j < packSize; j++) {\\n unpackedBytes[j] = uint8(packedByte >> (j * 8));\\n }\\n for (uint256 j = 0; j < packSize; j++) {\\n uint256 unpackedByte = unpackedBytes[j]; //unpackedBytes[j];\\n if (unpackedByte != 0) {\\n nonzeroBytesArray[nonzeroBytesArrayIndex] = bytes1(uint8(unpackedByte));\\n nonzeroBytesArrayIndex++;\\n if (state % 2 == 0) {\\n state += 1;\\n }\\n } else {\\n if (state % 2 == 1) {\\n state += 1;\\n }\\n }\\n packedByte = packedByte >> 8;\\n }\\n }\\n // TODO: You might want to assert that the state is exactly 1 or 2\\n // If not, that means empty bytse have been removed from the middle and things have been concatenated.\\n // We removed due to some tests failing, but this is not ideal and the require should be uncommented as soon as tests pass with it.\\n\\n // require(state == 1 || state == 2, \\\"Invalid final state of packed bytes in email; more than two non-zero regions found!\\\");\\n require(state >= 1, \\\"No packed bytes found! Invalid final state of packed bytes in email; value is likely 0!\\\");\\n require(nonzeroBytesArrayIndex <= signals, \\\"Packed bytes more than allowed max number of signals!\\\");\\n string memory returnValue = removeTrailingZeros(string(nonzeroBytesArray));\\n return returnValue;\\n // Have to end at the end of the email -- state cannot be 1 since there should be an email footer\\n }\\n\\n function bytes32ToString(bytes32 input) internal pure returns (string memory) {\\n uint256 i;\\n for (i = 0; i < 32 && input[i] != 0; i++) {}\\n bytes memory resultBytes = new bytes(i);\\n for (i = 0; i < 32 && input[i] != 0; i++) {\\n resultBytes[i] = input[i];\\n }\\n return string(resultBytes);\\n }\\n\\n // sliceArray is used to slice an array of uint256s from start-end into a new array of uint256s\\n function sliceArray(uint256[] memory input, uint256 start, uint256 end) internal pure returns (uint256[] memory) {\\n require(start <= end && end <= input.length, \\\"Invalid slice indices\\\");\\n uint256[] memory result = new uint256[](end - start);\\n for (uint256 i = start; i < end; i++) {\\n result[i - start] = input[i];\\n }\\n return result;\\n }\\n\\n // stringToUint is used to convert a string like \\\"45\\\" to a uint256 4\\n function stringToUint(string memory s) internal pure returns (uint256) {\\n bytes memory b = bytes(s);\\n uint256 result = 0;\\n for (uint256 i = 0; i < b.length; i++) {\\n if (b[i] >= 0x30 && b[i] <= 0x39) {\\n result = result * 10 + (uint256(uint8(b[i])) - 48);\\n }\\n\\n // TODO: Currently truncates decimals\\n if (b[i] == 0x2E) {\\n return result;\\n }\\n }\\n return result;\\n }\\n\\n // getDomainFromEmail is used to extract the domain from an email i.e. the part after the @\\n function getDomainFromEmail(string memory fromEmail) internal pure returns (string memory) {\\n bytes memory emailBytes = bytes(fromEmail);\\n uint256 atIndex;\\n for (uint256 i = 0; i < emailBytes.length; i++) {\\n if (emailBytes[i] == \\\"@\\\") {\\n atIndex = i;\\n break;\\n }\\n }\\n\\n bytes memory domainBytes = new bytes(emailBytes.length - atIndex - 1);\\n for (uint256 j = 0; j < domainBytes.length; j++) {\\n domainBytes[j] = emailBytes[atIndex + 1 + j];\\n }\\n return bytes32ToString(bytes32(bytes(domainBytes)));\\n }\\n\\n function removeTrailingZeros(string memory input) public pure returns (string memory) {\\n bytes memory inputBytes = bytes(input);\\n uint256 endIndex = inputBytes.length;\\n\\n for (uint256 i = 0; i < inputBytes.length; i++) {\\n if (inputBytes[i] == 0) {\\n endIndex = i;\\n break;\\n }\\n }\\n\\n bytes memory resultBytes = new bytes(endIndex);\\n for (uint256 i = 0; i < endIndex; i++) {\\n resultBytes[i] = inputBytes[i];\\n }\\n\\n return string(resultBytes);\\n }\\n\\n // Upper/lower string utils from https://github.com/willitscale/solidity-util/blob/master/lib/Strings.sol\\n /**\\n * Upper\\n *\\n * Converts all the values of a string to their corresponding upper case\\n * value.\\n *\\n * @param _base When being used for a data type this is the extended object\\n * otherwise this is the string base to convert to upper case\\n * @return string\\n */\\n function upper(string memory _base) public pure returns (string memory) {\\n bytes memory _baseBytes = bytes(_base);\\n for (uint256 i = 0; i < _baseBytes.length; i++) {\\n _baseBytes[i] = _upper(_baseBytes[i]);\\n }\\n return string(_baseBytes);\\n }\\n\\n /**\\n * Lower\\n *\\n * Converts all the values of a string to their corresponding lower case\\n * value.\\n *\\n * @param _base When being used for a data type this is the extended object\\n * otherwise this is the string base to convert to lower case\\n * @return string\\n */\\n function lower(string memory _base) public pure returns (string memory) {\\n bytes memory _baseBytes = bytes(_base);\\n for (uint256 i = 0; i < _baseBytes.length; i++) {\\n _baseBytes[i] = _lower(_baseBytes[i]);\\n }\\n return string(_baseBytes);\\n }\\n\\n /**\\n * Upper\\n *\\n * Convert an alphabetic character to upper case and return the original\\n * value when not alphabetic\\n *\\n * @param _b1 The byte to be converted to upper case\\n * @return bytes1 The converted value if the passed value was alphabetic\\n * and in a lower case otherwise returns the original value\\n */\\n function _upper(bytes1 _b1) private pure returns (bytes1) {\\n if (_b1 >= 0x61 && _b1 <= 0x7A) {\\n return bytes1(uint8(_b1) - 32);\\n }\\n\\n return _b1;\\n }\\n\\n /**\\n * Lower\\n *\\n * Convert an alphabetic character to lower case and return the original\\n * value when not alphabetic\\n *\\n * @param _b1 The byte to be converted to lower case\\n * @return bytes1 The converted value if the passed value was alphabetic\\n * and in a upper case otherwise returns the original value\\n */\\n function _lower(bytes1 _b1) private pure returns (bytes1) {\\n if (_b1 >= 0x41 && _b1 <= 0x5A) {\\n return bytes1(uint8(_b1) + 32);\\n }\\n\\n return _b1;\\n }\\n}\\n\",\"keccak256\":\"0x8c5b56494116a0c056c63e28fe892eea9bee5b056b09efa6aba1c9a82dc26c18\",\"license\":\"MIT\"},\"contracts/TransferDomainProcessor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\nimport { StringUtils } from \\\"@zk-email/contracts/utils/StringUtils.sol\\\";\\n\\nimport { EmailBaseProcessor } from \\\"./external/processors/EmailBaseProcessor.sol\\\";\\nimport { INullifierRegistry } from \\\"./external/interfaces/INullifierRegistry.sol\\\";\\nimport { StringConversionUtils } from \\\"./external/lib/StringConversionUtils.sol\\\";\\n\\nimport { Groth16Verifier } from \\\"./verifiers/namecheap_transfer_verifier.sol\\\";\\nimport { ITransferDomainProcessor } from \\\"./interfaces/ITransferDomainProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract TransferDomainProcessor is Groth16Verifier, ITransferDomainProcessor, EmailBaseProcessor {\\n \\n using StringUtils for uint256[];\\n using StringConversionUtils for string;\\n\\n /* ============ Constants ============ */\\n uint256 constant PACK_SIZE = 31;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _exchange,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Groth16Verifier()\\n EmailBaseProcessor(\\n _exchange,\\n _nullifierRegistry,\\n _emailFromAddress,\\n _timestampBuffer\\n )\\n {}\\n \\n /* ============ External Functions ============ */\\n\\n function processProof(\\n TransferProof calldata _proof\\n )\\n external\\n override\\n onlyExchange\\n returns (\\n bytes32 dkimKeyHash,\\n bytes32 hashedReceiverId,\\n string memory domainName, \\n uint256 bidId\\n )\\n {\\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \\\"Invalid Proof\\\");\\n\\n // Signal [0] is the DKIM key hash\\n dkimKeyHash = bytes32(_proof.signals[0]);\\n\\n // Signals [1:2] are the packed from email address\\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 2);\\n require(\\n keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \\n \\\"Invalid email from address\\\"\\n );\\n \\n // Signals [2:7] are packed domain name\\n domainName = _parseSignalArray(_proof.signals, 2, 7);\\n\\n // Signal [7] is packed hashed namecheap id to which domain was transferred\\n hashedReceiverId = bytes32(_proof.signals[7]);\\n\\n // Check if email has been used previously, if not nullify it so it can't be used again\\n _validateAndAddNullifier(bytes32(_proof.signals[8]));\\n\\n // Signal [9] is bidId\\n bidId = _proof.signals[9];\\n }\\n \\n /* ============ Internal Functions ============ */\\n\\n function _parseSignalArray(uint256[10] calldata _signals, uint8 _from, uint8 _to) \\n internal \\n pure \\n returns (string memory) \\n {\\n uint256[] memory signalArray = new uint256[](_to - _from);\\n for (uint256 i = _from; i < _to; i++) {\\n signalArray[i - _from] = _signals[i];\\n }\\n\\n return signalArray.convertPackedBytesToString(signalArray.length * PACK_SIZE, PACK_SIZE);\\n }\\n}\\n\",\"keccak256\":\"0x27e7d34dbe222f5a865d0b34f276eac82f3888f00e9816c398ee5fe9cf18bb2c\",\"license\":\"MIT\"},\"contracts/external/interfaces/IKeyHashAdapterV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IKeyHashAdapterV2 {\\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function getMailServerKeyHashes() external view returns (bytes32[] memory);\\n function isMailServerKeyHash(bytes32 _mailserverKeyHash) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc849f2dc34e4463550b8e0a16541bde429cb1adf43776b2c4179e9d4e4e656a2\",\"license\":\"MIT\"},\"contracts/external/interfaces/INullifierRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface INullifierRegistry {\\n function addNullifier(bytes32 _nullifier) external;\\n function isNullified(bytes32 _nullifier) external view returns(bool);\\n}\\n\",\"keccak256\":\"0x107164bc9a320938b513305878163b7fa884da4cdae58d0c8e81bfbb00c97c5e\",\"license\":\"MIT\"},\"contracts/external/lib/StringConversionUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\n// Building on zk-email's StringUtils library we add the ability to handle decimals when\\n// converting from string to Uint\\nlibrary StringConversionUtils {\\n \\n /**\\n * @notice Function that parses numbers returned as strings including floating point numbers. Returned floating point\\n * numbers are to have the desired amount of decimal specified. If the stringified version of the floating point\\n * number has more decimal places than desired then the function will revert in order to be maximally safe. If\\n * the returned number has multiple floating points then the function will revert.\\n *\\n * Examples: _s = \\\"12.34\\\", _expectedDecimals = 6 => 12340000\\n * _s = \\\"12.34\\\", _expectedDecimals = 2 => 1234\\n * _s = \\\"12.34\\\", _expectedDecimals = 1 => REVERT (we never want loss of precision only addition)\\n * _s = \\\"12.34.56\\\", _expectedDecimals = 6 => REVERT (Invalid number)\\n *\\n * @param _s String being processed\\n * @param _desiredDecimals Desired amount of decimal places\\n */\\n function stringToUint(string memory _s, uint256 _desiredDecimals) internal pure returns (uint256) {\\n return stringToUint(_s, 0x2E, _desiredDecimals);\\n }\\n\\n function stringToUint(\\n string memory _s,\\n bytes1 _decimalCharacter,\\n uint256 _desiredDecimals\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n bytes memory b = bytes(_s);\\n\\n uint256 result = 0;\\n uint256 decimalPlaces = 0;\\n\\n bool decimals = false;\\n for (uint256 i = 0; i < b.length; i++) {\\n if (b[i] >= 0x30 && b[i] <= 0x39) {\\n result = result * 10 + (uint256(uint8(b[i])) - 48);\\n }\\n\\n if (decimals) {\\n decimalPlaces++;\\n }\\n\\n if (b[i] == _decimalCharacter) {\\n require(decimals == false, \\\"String has multiple decimals\\\");\\n decimals = true;\\n }\\n }\\n\\n require(decimalPlaces <= _desiredDecimals, \\\"String has too many decimal places\\\");\\n return result * (10 ** (_desiredDecimals - decimalPlaces));\\n }\\n\\n /**\\n * @notice Function that returns a substring from _startIndex to _endIndex (non-inclusive).\\n *\\n * @param _str String being processed\\n * @param _startIndex Index to start parsing from\\n * @param _endIndex Index to stop parsing at (index not included in result)\\n */\\n function substring(string memory _str, uint _startIndex, uint _endIndex) internal pure returns (string memory ) {\\n bytes memory strBytes = bytes(_str);\\n bytes memory result = new bytes(_endIndex-_startIndex);\\n for(uint i = _startIndex; i < _endIndex; i++) {\\n result[i-_startIndex] = strBytes[i];\\n }\\n return string(result);\\n }\\n\\n function replaceString(\\n string memory _str,\\n string memory _lookupValue,\\n string memory _replaceValue\\n )\\n internal\\n pure\\n returns (string memory)\\n {\\n bytes memory strBytes = bytes(_str);\\n bytes memory lookupBytes = bytes(_lookupValue);\\n\\n uint256 lookupIndex = indexOf(_str, _lookupValue);\\n if (lookupIndex == type(uint256).max) {\\n return _str;\\n }\\n\\n // Split the original string into two parts: before and after the keyword\\n string memory beforeKeyword = substring(_str, 0, lookupIndex);\\n string memory afterKeyword = substring(_str, lookupIndex + lookupBytes.length, strBytes.length);\\n \\n return string.concat(beforeKeyword, _replaceValue, afterKeyword);\\n }\\n\\n function indexOf(string memory str, string memory substr) internal pure returns (uint) {\\n bytes memory strBytes = bytes(str);\\n bytes memory substrBytes = bytes(substr);\\n \\n if (strBytes.length < substrBytes.length) return type(uint256).max;\\n \\n for (uint i = 0; i <= strBytes.length - substrBytes.length; i++) {\\n bool found = true;\\n for (uint j = 0; j < substrBytes.length; j++) {\\n if (strBytes[i + j] != substrBytes[j]) {\\n found = false;\\n break;\\n }\\n }\\n if (found) return i;\\n }\\n \\n return type(uint256).max;\\n }\\n\\n function stringComparison(string memory _a, string memory _b) internal pure returns (bool) {\\n return (keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b)));\\n }\\n}\\n\",\"keccak256\":\"0xfcdfb3c2c8d5a6b7f480f827049782a70fb98f8b3838dcad0e0bb95237b94a0c\",\"license\":\"MIT\"},\"contracts/external/processors/EmailBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"../interfaces/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"../interfaces/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract EmailBaseProcessor is Ownable {\\n\\n /* ============ Modifiers ============ */\\n modifier onlyExchange() {\\n require(msg.sender == exchange, \\\"Only exchange can call this function\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n address public immutable exchange;\\n INullifierRegistry public nullifierRegistry;\\n bytes public emailFromAddress;\\n uint256 public timestampBuffer;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _exchange,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Ownable()\\n {\\n exchange = _exchange;\\n nullifierRegistry = _nullifierRegistry;\\n emailFromAddress = bytes(_emailFromAddress);\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice ONLY OWNER: Sets the from email address for validated emails. Check that email address is properly\\n * padded (if necessary). Padding will be dependent on if unpacking functions cut trailing 0s or not.\\n *\\n * @param _emailFromAddress The from email address for validated emails, MUST BE PROPERLY PADDED\\n */\\n function setEmailFromAddress(string memory _emailFromAddress) external onlyOwner {\\n emailFromAddress = bytes(_emailFromAddress);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Sets the timestamp buffer for validated emails. This is the amount of time in seconds\\n * that the timestamp can be off by and still be considered valid. Necessary to build in flexibility with L2\\n * timestamps.\\n *\\n * @param _timestampBuffer The timestamp buffer for validated emails\\n */\\n function setTimestampBuffer(uint256 _timestampBuffer) external onlyOwner {\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Getters ============ */\\n\\n function getEmailFromAddress() external view returns (bytes memory) {\\n return emailFromAddress;\\n }\\n\\n\\n /* ============ Internal Functions ============ */\\n\\n function _validateAndAddNullifier(bytes32 _nullifier) internal {\\n require(!nullifierRegistry.isNullified(_nullifier), \\\"Nullifier has already been used\\\");\\n nullifierRegistry.addNullifier(_nullifier);\\n }\\n}\\n\",\"keccak256\":\"0xe210c8e937a457c2d2aff798f3696f04ce1d011470294f02fb1169006a385f07\",\"license\":\"MIT\"},\"contracts/interfaces/ITransferDomainProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.18;\\n\\n\\ninterface ITransferDomainProcessor {\\n\\n struct TransferProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[10] signals;\\n }\\n\\n function processProof(\\n TransferProof calldata _proof\\n ) \\n external \\n returns (\\n bytes32 dkimKeyHash, \\n bytes32 hashedReceiverId, \\n string memory domainName, \\n uint256 bidId\\n );\\n}\",\"keccak256\":\"0x9cf5f1b070d7bad73d8ae57f7b20d449853f96fcbb5df1a443723df41c91339d\",\"license\":\"MIT\"},\"contracts/verifiers/namecheap_transfer_verifier.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n/*\\n Copyright 2021 0KIMS association.\\n\\n This file is generated with [snarkJS](https://github.com/iden3/snarkjs).\\n\\n snarkJS is a free software: you can redistribute it and/or modify it\\n under the terms of the GNU General Public License as published by\\n the Free Software Foundation, either version 3 of the License, or\\n (at your option) any later version.\\n\\n snarkJS is distributed in the hope that it will be useful, but WITHOUT\\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\\n License for more details.\\n\\n You should have received a copy of the GNU General Public License\\n along with snarkJS. If not, see .\\n*/\\n\\npragma solidity >=0.7.0 <0.9.0;\\n\\ncontract Groth16Verifier {\\n // Scalar field size\\n uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n // Base field size\\n uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\\n\\n // Verification Key data\\n uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042;\\n uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958;\\n uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132;\\n uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731;\\n uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679;\\n uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856;\\n uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n\\n \\n uint256 constant IC0x = 12718791721466586474772975178991944367361898681403889293050590835735829974174;\\n uint256 constant IC0y = 6579614210328804738196110281777440845203538387714672921854127346802897741731;\\n \\n uint256 constant IC1x = 15050971342023334328313633330499885418161248915553086390701402242486225179368;\\n uint256 constant IC1y = 5024764877577619588829734526990256704181621131776349449360023481477820279987;\\n \\n uint256 constant IC2x = 7494265978725599958916265753653166549633529129800692658333846839504191651648;\\n uint256 constant IC2y = 6331829577874431053631060489192183034310045972687441697179743819760334117448;\\n \\n uint256 constant IC3x = 19001722242244131321371144536562173279385056519981716838131699446018662048085;\\n uint256 constant IC3y = 8148711952593941450664988855383229951630582602775661040234820121548658879338;\\n \\n uint256 constant IC4x = 3624352076627862068761560802183636400416483488844158805038644908873200708814;\\n uint256 constant IC4y = 20894074159790604892251457333772898092352374489464929653588484093719978460605;\\n \\n uint256 constant IC5x = 2098287694939727519558784139808406325855172668407809961967029546183317335265;\\n uint256 constant IC5y = 5659241113472526955215440521431168972841548603376846026887752206139550832697;\\n \\n uint256 constant IC6x = 17054571586962694690567468783102453574497782768524521043534058966826398455175;\\n uint256 constant IC6y = 4087439525418017845490176926142509334113265173570304433911881676407144081865;\\n \\n uint256 constant IC7x = 7441928267847731392209447389119131741297268634643246304512516729270550734194;\\n uint256 constant IC7y = 15714253901405577134617988311525363228461039013850912155558149694323922788327;\\n \\n uint256 constant IC8x = 11989172231499636764423272601594485978016807201316866170676011918612131765820;\\n uint256 constant IC8y = 15918479982497737545158513843427772249925445687882255296587424450200131669618;\\n \\n uint256 constant IC9x = 19827744545534206076315711984525184804508732918768894016552346430789516516368;\\n uint256 constant IC9y = 16361460611570894490152793347002588479282989223552655286979659973731335376509;\\n \\n uint256 constant IC10x = 10898965818757221383985300751768263931593441442012024286290119328446015154272;\\n uint256 constant IC10y = 6989418820395701171656324073128354251482680955655018162117108617053607002569;\\n \\n \\n // Memory data\\n uint16 constant pVk = 0;\\n uint16 constant pPairing = 128;\\n\\n uint16 constant pLastMem = 896;\\n\\n function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[10] calldata _pubSignals) public view returns (bool) {\\n assembly {\\n function checkField(v) {\\n if iszero(lt(v, r)) {\\n mstore(0, 0)\\n return(0, 0x20)\\n }\\n }\\n \\n // G1 function to multiply a G1 value(x,y) to value in an address\\n function g1_mulAccC(pR, x, y, s) {\\n let success\\n let mIn := mload(0x40)\\n mstore(mIn, x)\\n mstore(add(mIn, 32), y)\\n mstore(add(mIn, 64), s)\\n\\n success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)\\n\\n if iszero(success) {\\n mstore(0, 0)\\n return(0, 0x20)\\n }\\n\\n mstore(add(mIn, 64), mload(pR))\\n mstore(add(mIn, 96), mload(add(pR, 32)))\\n\\n success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)\\n\\n if iszero(success) {\\n mstore(0, 0)\\n return(0, 0x20)\\n }\\n }\\n\\n function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {\\n let _pPairing := add(pMem, pPairing)\\n let _pVk := add(pMem, pVk)\\n\\n mstore(_pVk, IC0x)\\n mstore(add(_pVk, 32), IC0y)\\n\\n // Compute the linear combination vk_x\\n \\n g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))\\n \\n g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))\\n \\n g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))\\n \\n g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))\\n \\n g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))\\n \\n g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)))\\n \\n g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)))\\n \\n g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)))\\n \\n g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)))\\n \\n g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288)))\\n \\n\\n // -A\\n mstore(_pPairing, calldataload(pA))\\n mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q))\\n\\n // B\\n mstore(add(_pPairing, 64), calldataload(pB))\\n mstore(add(_pPairing, 96), calldataload(add(pB, 32)))\\n mstore(add(_pPairing, 128), calldataload(add(pB, 64)))\\n mstore(add(_pPairing, 160), calldataload(add(pB, 96)))\\n\\n // alpha1\\n mstore(add(_pPairing, 192), alphax)\\n mstore(add(_pPairing, 224), alphay)\\n\\n // beta2\\n mstore(add(_pPairing, 256), betax1)\\n mstore(add(_pPairing, 288), betax2)\\n mstore(add(_pPairing, 320), betay1)\\n mstore(add(_pPairing, 352), betay2)\\n\\n // vk_x\\n mstore(add(_pPairing, 384), mload(add(pMem, pVk)))\\n mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))\\n\\n\\n // gamma2\\n mstore(add(_pPairing, 448), gammax1)\\n mstore(add(_pPairing, 480), gammax2)\\n mstore(add(_pPairing, 512), gammay1)\\n mstore(add(_pPairing, 544), gammay2)\\n\\n // C\\n mstore(add(_pPairing, 576), calldataload(pC))\\n mstore(add(_pPairing, 608), calldataload(add(pC, 32)))\\n\\n // delta2\\n mstore(add(_pPairing, 640), deltax1)\\n mstore(add(_pPairing, 672), deltax2)\\n mstore(add(_pPairing, 704), deltay1)\\n mstore(add(_pPairing, 736), deltay2)\\n\\n\\n let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20)\\n\\n isOk := and(success, mload(_pPairing))\\n }\\n\\n let pMem := mload(0x40)\\n mstore(0x40, add(pMem, pLastMem))\\n\\n // Validate that all evaluations \\u2208 F\\n \\n checkField(calldataload(add(_pubSignals, 0)))\\n \\n checkField(calldataload(add(_pubSignals, 32)))\\n \\n checkField(calldataload(add(_pubSignals, 64)))\\n \\n checkField(calldataload(add(_pubSignals, 96)))\\n \\n checkField(calldataload(add(_pubSignals, 128)))\\n \\n checkField(calldataload(add(_pubSignals, 160)))\\n \\n checkField(calldataload(add(_pubSignals, 192)))\\n \\n checkField(calldataload(add(_pubSignals, 224)))\\n \\n checkField(calldataload(add(_pubSignals, 256)))\\n \\n checkField(calldataload(add(_pubSignals, 288)))\\n \\n checkField(calldataload(add(_pubSignals, 320)))\\n \\n\\n // Validate all evaluations\\n let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)\\n\\n mstore(0, isValid)\\n return(0, 0x20)\\n }\\n }\\n }\\n\",\"keccak256\":\"0x8217154b5c54e3ae008197fcd5f09c15c539d7026ac0fcb2d80e19810edeee7e\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60a06040523462000044576200002262000018620001f4565b929190916200021d565b604051611eb66200054c82396080518181816104da01526109460152611eb690f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200008157604052565b62000049565b906200009e6200009660405190565b92836200005f565b565b6001600160a01b031690565b90565b6001600160a01b0381165b036200004457565b905051906200009e82620000af565b6001600160a01b038116620000ba565b905051906200009e82620000d1565b6001600160401b0381116200008157602090601f01601f19160190565b60005b838110620001215750506000910152565b818101518382015260200162000110565b909291926200014b6200014582620000f0565b62000087565b9381855260208501908284011162000044576200009e926200010d565b9080601f8301121562000044578151620000ac9260200162000132565b80620000ba565b905051906200009e8262000185565b6080818303126200004457620001b28282620000c2565b92620001c28360208401620000e1565b604083015190936001600160401b0382116200004457620001ea81620000ac93860162000168565b936060016200018c565b6200021762002402803803806200020b8162000087565b9283398101906200019b565b90919293565b906200009e939291620004ab565b906001600160a01b03905b9181191691161790565b620000ac90620000a0906001600160a01b031682565b620000ac9062000240565b620000ac9062000256565b9062000280620000ac620002889262000261565b82546200022b565b9055565b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015620002c5575b6020831014620002bf57565b6200028c565b91607f1691620002b3565b9160001960089290920291821b911b62000236565b620000ac620000ac620000ac9290565b91906200030a620000ac6200028893620002e5565b908354620002d0565b6200009e91600091620002f5565b8181106200032d575050565b806200033d600060019362000313565b0162000321565b9190601f81116200035457505050565b620003686200009e93600052602060002090565b906020601f8401819004830193106200038c575b6020601f90910104019062000321565b90915081906200037c565b90620003a1815190565b906001600160401b0382116200008157620003c982620003c28554620002a2565b8562000344565b602090601f8311600114620004085762000288929160009183620003fc575b5050600019600883021c1916906002021790565b015190503880620003e8565b601f198316916200041e85600052602060002090565b9260005b8181106200045f5750916002939185600196941062000445575b50505002019055565b01516000196008601f8516021c191690553880806200043c565b9193602060018192878701518155019501920162000422565b906200009e9162000397565b906000199062000236565b90620004a3620000ac6200028892620002e5565b825462000484565b6200009e9392620000ac620004dc93620004d493620004c9620004e4565b60805260016200026c565b600262000478565b60036200048f565b6200009e336000546001600160a01b031690620005038160006200026c565b6200053a620005337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09362000261565b9162000261565b916200054560405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c806365cd296c146100d2578063715018a6146100cd5780638da5cb5b146100c8578063b2a3fda4146100c3578063b870676c146100be578063c0d05fed146100b9578063ced1e978146100b4578063d2f7265a146100af578063dbac5821146100aa578063f2fde38b146100a5578063f3bb70f6146100a05763f6c7226b036100e6576106bf565b6105f9565b61057b565b610520565b6104c5565b6104aa565b610483565b6102e7565b610265565b610206565b6101dd565b61019d565b90816102409103126100e65790565b600080fd5b90610240828203126100e657610100916100d7565b90565b9052565b60005b83811061011a5750506000910152565b818101518382015260200161010a565b61014b61015460209361015e9361013f815190565b80835293849260200190565b95869101610107565b601f01601f191690565b0190565b94939160609161019b946101896101969361018260808b019460008c0152565b60208a0152565b878203604089015261012a565b940152565b565b346100e6576101ce6101b86101b33660046100eb565b610d21565b906101c594929460405190565b94859485610162565b0390f35b60009103126100e657565b346100e6576101ed3660046101d2565b6101f561072c565b604051005b6001600160a01b031690565b346100e6576102163660046101d2565b6101ce6102216106ea565b604051918291826001600160a01b03909116815260200190565b805b036100e657565b9050359061019b8261023b565b906020828203126100e65761010091610244565b346100e6576101f5610278366004610251565b6115da565b610100916008021c6001600160a01b031690565b90610100915461027d565b61010060006001610291565b610100906101fa906001600160a01b031682565b610100906102a8565b610100906102bc565b610103906102c5565b60208101929161019b91906102ce565b346100e6576102f73660046101d2565b6101ce61030261029c565b604051918291826102d7565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561035a575b602083101461035557565b610324565b91607f169161034a565b805460009392916103816103778361033a565b8085529360200190565b91600181169081156103d3575060011461039a57505050565b6103ad9192939450600052602060002090565b916000925b8184106103bf5750500190565b8054848401526020909301926001016103b2565b92949550505060ff1916825215156020020190565b9061010091610364565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761042a57604052565b6103f2565b9061019b6104499261044060405190565b938480926103e8565b0383610408565b90600010610461576101009061042f565b61030e565b61010060006002610450565b60208082526101009291019061012a565b346100e6576104933660046101d2565b6101ce61049e610466565b60405191829182610472565b346100e6576104ba3660046101d2565b6101ce61049e6115e3565b346100e6576104d53660046101d2565b6101ce7f0000000000000000000000000000000000000000000000000000000000000000610221565b610100916008021c81565b9061010091546104fe565b61010060006003610509565b346100e6576105303660046101d2565b6101ce61053b610514565b6040519182918290815260200190565b6001600160a01b03811661023d565b9050359061019b8261054b565b906020828203126100e6576101009161055a565b346100e6576101f561058e366004610567565b610843565b919060408301116100e657565b919060808301116100e657565b91906101408301116100e657565b610240818303126100e6576105d08282610593565b926101006105e184604085016105a0565b936105ef8160c08601610593565b93610100016105ad565b346100e6576106093660046105bb565b92919091611dc5565b9061019b61061f60405190565b9283610408565b67ffffffffffffffff811161042a57602090601f01601f19160190565b90826000939282370152565b9092919261066461065f82610626565b610612565b938185526020850190828401116100e65761019b92610643565b9080601f830112156100e6578160206101009335910161064f565b906020828203126100e657813567ffffffffffffffff81116100e657610100920161067e565b346100e6576101f56106d2366004610699565b611594565b610100906101fa565b61010090546106d7565b61010060006106e0565b6106fc610788565b61019b61071a565b6101fa6101006101009290565b61010090610704565b61019b6107276000610711565b61087c565b61019b6106f4565b1561073b57565b60405162461bcd60e51b815280610784600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b61019b6107936106ea565b6107ac61079f336101fa565b916001600160a01b031690565b14610734565b61019b906107be610788565b61081e565b156107ca57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61019b906107276108326101fa6000610711565b6001600160a01b03831614156107c3565b61019b906107b2565b906001600160a01b03905b9181191691161790565b90610871610100610878926102c5565b825461084c565b9055565b61088660006106e0565b90610892816000610861565b6108c56108bf7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936102c5565b916102c5565b916108cf60405190565b600090a3565b156108dc57565b60405162461bcd60e51b8152602060048201526024808201527f4f6e6c792065786368616e67652063616e2063616c6c20746869732066756e636044820152633a34b7b760e11b6064820152608490fd5b61097694939291906109713361096b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661079f565b146108d5565b610b73565b90919293565b80151561023d565b9050519061019b8261097c565b906020828203126100e65761010091610984565b9037565b61019b916040916109a5565b9061015e816040936109a9565b6109d26109ce60029390565b9190565b806000925b8484106109e5575050505050565b610a016109fa6001926109f58690565b6109b5565b9360400190565b930192916109d7565b61019b91610140916109a5565b610a4f61019b94610a4561010094989795610a3b61024086019a60008701906109a9565b60408501906109c2565b60c08301906109a9565b0190610a0a565b6040513d6000823e3d90fd5b15610a6957565b60405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606490fd5b634e487b7160e01b600052603260045260246000fd5b90600a811015610ac5576020020190565b610a9e565b6101006101006101009290565b356101008161023b565b610aee6101006101009290565b60ff1690565b61015e610b0c92602092610b06815190565b94859290565b93849101610107565b61010091610af4565b6101009061042f565b15610b2e57565b60405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606490fd5b50505050610b80306102c5565b602063f3bb70f6916000840190610bb96040860194610bc461010060c0890198018098610bac60405190565b9889978896879660e01b90565b865260048601610a17565b03915afa8015610d1c57610be091600091610cee575b50610a62565b610c03610bfe610bf9610bf36000610aca565b84610ab4565b610ad7565b610aca565b91600290610c88610c146001610ae1565b92610c826109ce610c73610c32610c2a85610ae1565b80988a610e1c565b610c5a610c3e60405190565b8092610c4e602083019182610b15565b90810382520382610408565b610c6c610c65825190565b9160200190565b2093610b1e565b610c7e610c65825190565b2090565b14610b27565b610100610bf9610cbc610bfe610bf9610cb6610cb0600798610ca98a610ae1565b908b610e1c565b97610aca565b88610ab4565b94610cde610cd9610bfe610bf9610cd36008610aca565b85610ab4565b611639565b610ce86009610aca565b90610ab4565b610d0f915060203d8111610d15575b610d078183610408565b810190610991565b38610bda565b503d610cfd565b610a56565b6109769060006060818061092d565b634e487b7160e01b600052601160045260246000fd5b610d559060ff165b9160ff1690565b90039060ff8211610d6257565b610d30565b6101006101006101009260ff1690565b67ffffffffffffffff811161042a5760208091020190565b90610d9c61065f83610d77565b918252565b369037565b9061019b610dbc610db684610d8f565b93610d77565b601f190160208401610da1565b6000198114610d625760010190565b91908203918211610d6257565b90610dee825190565b811015610ac5576020809102010190565b610100601f610aca565b81810292918115918404141715610d6257565b909290610e39610e34610e2f8686610d46565b610d67565b610da6565b91610e4385610d67565b610e4c85610d67565b811015610e9457610e8d81610e88610e6a610bf9610e4c9588610ab4565b610e85610e7f610e798c610d67565b85610dd8565b89610de5565b52565b610dc9565b9050610e43565b509350506101009150610ea5815190565b90610eb8610eb1610dff565b8093610e09565b906110c9565b90610d9c61065f83610626565b9061019b610dbc610edb84610ebe565b93610626565b610eee6101006101009290565b61ffff1690565b61ffff1661ffff8114610d625760010190565b6101006101006101009261ffff1690565b61010090610f2a6109ce6101009490565b901c90565b634e487b7160e01b600052601260045260246000fd5b610f519060ff16610d4e565b908115610f5c570690565b610f2f565b610f6d9060ff16610d4e565b019060ff8211610d6257565b610f8f610f896101009260ff1690565b60f81b90565b6001600160f81b03191690565b90610fa5825190565b811015610ac5570160200190565b61010090610f2a6109ce6101009460ff1690565b15610fce57565b60405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a490fd5b1561106657565b60405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608490fd5b926000926110d684610ae1565b6110ef6110ea836110e5895190565b610e09565b610ecb565b946110f981610aca565b9561110382610ee1565b965b6111106101008a5190565b61111989610f08565b10156112e75761113861113461112e8a610f08565b8b610de5565b5190565b98899661114487610da6565b9861114e86610aca565b8881101561119b5780610e888c8f6111969461118861118361118e9361117d6111776008610aca565b85610e09565b90610f19565b610ae1565b92610de5565b9060ff169052565b61114e565b5091909a50989295989793969194976111b388610aca565b955b8a8710156112c6576111d4610e2f6111cd8989610de5565b5160ff1690565b6111dd8a610aca565b811461127957906111f86111f361120a93610ae1565b610f79565b8a1a611204828b610f9c565b53610dc9565b9261121e6112186002610ae1565b8b610f45565b61122a610d4e8b610ae1565b14611255575b61124861124e915b6112426008610ae1565b90610fb3565b96610dc9565b95926111b5565b9861124861127061124e9261126a6001610ae1565b90610f61565b9a915050611230565b50926112886112186002610ae1565b600190611297610d4e83610ae1565b146112aa575b5061124861124e91611238565b6112be61124e929b61126a61124893610ae1565b9a915061129d565b989550935097949598916112da9150610ef5565b9695979197949094611105565b926109ce919598506101009750610100945061131a92509561010061132197611313610d4e6001610ae1565b1015610fc7565b111561105f565b611333565b610f8f610f896101009290565b80519060009261134284610aca565b61134d610100845190565b8110156113ef5761136f6113618285610f9c565b516001600160f81b03191690565b61138961137b87611326565b916001600160f81b03191690565b1461139c5761139790610dc9565b611342565b9250905b6113a983610ecb565b916113b385610aca565b845b8110156113e3576113dc816113d06113616113b59487610f9c565b881a6112048288610f9c565b90506113b3565b50935050610100915090565b50906113a0565b61019b90611402610788565b611589565b9160001960089290920291821b911b610857565b919061142c61010061087893610aca565b908354611407565b61019b9160009161141b565b81811061144b575050565b806114596000600193611434565b01611440565b9190601f811161146e57505050565b61148061019b93600052602060002090565b906020601f8401819004830193106114a2575b6020601f909101040190611440565b9091508190611493565b906114b5815190565b9067ffffffffffffffff821161042a576114d9826114d3855461033a565b8561145f565b602090601f831160011461151457610878929160009183611509575b5050600019600883021c1916906002021790565b0151905038806114f5565b601f1983169161152985600052602060002090565b9260005b8181106115675750916002939185600196941061154e575b50505002019055565b01516000196008601f8516021c19169055388080611545565b9193602060018192878701518155019501920161152d565b9061019b916114ac565b61019b90600261157f565b61019b906113f6565b61019b906115a9610788565b6115cf565b9060001990610857565b906115c861010061087892610aca565b82546115ae565b61019b9060036115b8565b61019b9061159d565b6101006002610b1e565b156115f457565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b611668602061165061164b60016106e0565b6102c5565b63169394bb9061165f60405190565b93849260e01b90565b82526004820185905260249082905afa908115610d1c57611698916116939160009161170b57501590565b6115ed565b6116a561164b60016106e0565b90635bd4df3290823b156100e6576116e2926116d4600080946116c760405190565b9687958694859360e01b90565b835260048301526024820190565b03925af18015610d1c576116f35750565b61019b9060006117038183610408565b8101906101d2565b611723915060203d8111610d1557610d078183610408565b1590565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561175057565b6000805260206000f35b919290926040519384526020840152604083015260408260608160076107d05a03fa156117505760806040928251848201526020830151606082015260066107d05a03fa1561175057565b93909260606020947f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47866080860198611b4061012060008901977f1c1e94bcd36515d96e435f61ee4fa0dc859f4090dcd5430374ced5e4ba688c9e89527f0e8bedfefb241a5448eac861c9f80086b6607f3082ace30b718ad164db3867a3858a015261187760008201357f0b1bea87e58d7f9b1df1b6e6530258dc6bf8354ee1e0287efbcde5faf0876cb37f21468c42c1abfe13be4583929db42dc4b6f1a3feb44d8e1336bbd6337b9992e88c61175a565b6118c6858201357f0dffb044274ff4d10fbf5545d248655f5203dca9161a6fd6ad5308d4ad2d9a487f10919aaea1bb570dabdefb8f9328f924ab0d33a21482584e6dbe5cc23d707f408c61175a565b61191660408201357f120401ecf289d3509044f33e1aab31e9cc9242ca08b56fe495beb5bf63dcab6a7f2a0297fa255705f360180d052e0f129394b63fedbf85496d1f61e4c335d5a1558c61175a565b611965888201357f2e31a07bdd388f34a6d84d0472485df1348189472b2f0119f41660d3c22045bd7f08034f82261ae61a6d5991ff892682a8d3117745585fea2279e9baf22f982cce8c61175a565b6119b560808201357f0c8304577691476e7b57b48d30630acc74c9b52baf12c6ef8bc1e28cc78798397f04a396b83d64f44cb37262119ef21df828153f3e5b22833520b2892c83752ce18c61175a565b611a0560a08201357f090968a6484d95f390fc636cfe1613f6ee8dac2b288485a2cf277886982669c97f25b48ba246ea1a991339587df4a62b88be3279d0b3b1d326cf9521a33d7b15878c61175a565b611a5560c08201357f22bdf3d83eddebc573238bb59aabc778011e095a196740f3ac64f69991275fe77f1073fb6d0a6ed98484e814d7d7cc0382850f5e66ff79e3215e470ccdbc3925728c61175a565b611aa560e08201357f23318a569b541a09f38bb1b3d2dec411fd8c6650abe56326b4abc7cdf5fd0e727f1a81a189d3c977a50f37f8fb6442804d25dced44e296159c9d9a1a313ea45e3c8c61175a565b611af66101008201357f242c422f58c0818ce1bc402140ef550d2ce6f537f7b97990b6c853d772818e7d7f2bd61b1039bd486ebd25c9866b7a34429b9d05f3ada0d35090b2b5a04c03dc108c61175a565b01357f0f73def0c88e50c35c62db1ac618eceec4f44d1d0666468a9c28cd8c8cbf81c97f1818989682bac795f6357e1a3d405e82b9a3bdbc86f5eb980be62287b25d28608961175a565b80358a5201358103068688015280356040880152858101358288015260408101356080880152013560a08601527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08601527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08601527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008601527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208601527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408601527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160860152516101808501528260000101516101a08401527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08401527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08401527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008401527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220840152803561024084015201356102608201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26102808201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6102a08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102c08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa6102e08201526020816103008160086107d05a03fa90511690565b91611e779391611dd3600090565b50604051936103808501604052611ded6000850135611727565b611dfa6020850135611727565b611e076040850135611727565b611e146060850135611727565b611e216080850135611727565b611e2e60a0850135611727565b611e3b60c0850135611727565b611e4860e0850135611727565b611e56610100850135611727565b611e64610120850135611727565b611e72610140850135611727565b6117a5565b60005260206000f3fea2646970667358221220b070e387d647569a745b0f851caaf898e12804e32149ebe4dcfc527f1e24f21e64736f6c63430008120033", + "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806365cd296c146100d2578063715018a6146100cd5780638da5cb5b146100c8578063b2a3fda4146100c3578063b870676c146100be578063c0d05fed146100b9578063ced1e978146100b4578063d2f7265a146100af578063dbac5821146100aa578063f2fde38b146100a5578063f3bb70f6146100a05763f6c7226b036100e6576106bf565b6105f9565b61057b565b610520565b6104c5565b6104aa565b610483565b6102e7565b610265565b610206565b6101dd565b61019d565b90816102409103126100e65790565b600080fd5b90610240828203126100e657610100916100d7565b90565b9052565b60005b83811061011a5750506000910152565b818101518382015260200161010a565b61014b61015460209361015e9361013f815190565b80835293849260200190565b95869101610107565b601f01601f191690565b0190565b94939160609161019b946101896101969361018260808b019460008c0152565b60208a0152565b878203604089015261012a565b940152565b565b346100e6576101ce6101b86101b33660046100eb565b610d21565b906101c594929460405190565b94859485610162565b0390f35b60009103126100e657565b346100e6576101ed3660046101d2565b6101f561072c565b604051005b6001600160a01b031690565b346100e6576102163660046101d2565b6101ce6102216106ea565b604051918291826001600160a01b03909116815260200190565b805b036100e657565b9050359061019b8261023b565b906020828203126100e65761010091610244565b346100e6576101f5610278366004610251565b6115da565b610100916008021c6001600160a01b031690565b90610100915461027d565b61010060006001610291565b610100906101fa906001600160a01b031682565b610100906102a8565b610100906102bc565b610103906102c5565b60208101929161019b91906102ce565b346100e6576102f73660046101d2565b6101ce61030261029c565b604051918291826102d7565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561035a575b602083101461035557565b610324565b91607f169161034a565b805460009392916103816103778361033a565b8085529360200190565b91600181169081156103d3575060011461039a57505050565b6103ad9192939450600052602060002090565b916000925b8184106103bf5750500190565b8054848401526020909301926001016103b2565b92949550505060ff1916825215156020020190565b9061010091610364565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761042a57604052565b6103f2565b9061019b6104499261044060405190565b938480926103e8565b0383610408565b90600010610461576101009061042f565b61030e565b61010060006002610450565b60208082526101009291019061012a565b346100e6576104933660046101d2565b6101ce61049e610466565b60405191829182610472565b346100e6576104ba3660046101d2565b6101ce61049e6115e3565b346100e6576104d53660046101d2565b6101ce7f0000000000000000000000000000000000000000000000000000000000000000610221565b610100916008021c81565b9061010091546104fe565b61010060006003610509565b346100e6576105303660046101d2565b6101ce61053b610514565b6040519182918290815260200190565b6001600160a01b03811661023d565b9050359061019b8261054b565b906020828203126100e6576101009161055a565b346100e6576101f561058e366004610567565b610843565b919060408301116100e657565b919060808301116100e657565b91906101408301116100e657565b610240818303126100e6576105d08282610593565b926101006105e184604085016105a0565b936105ef8160c08601610593565b93610100016105ad565b346100e6576106093660046105bb565b92919091611dc5565b9061019b61061f60405190565b9283610408565b67ffffffffffffffff811161042a57602090601f01601f19160190565b90826000939282370152565b9092919261066461065f82610626565b610612565b938185526020850190828401116100e65761019b92610643565b9080601f830112156100e6578160206101009335910161064f565b906020828203126100e657813567ffffffffffffffff81116100e657610100920161067e565b346100e6576101f56106d2366004610699565b611594565b610100906101fa565b61010090546106d7565b61010060006106e0565b6106fc610788565b61019b61071a565b6101fa6101006101009290565b61010090610704565b61019b6107276000610711565b61087c565b61019b6106f4565b1561073b57565b60405162461bcd60e51b815280610784600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b61019b6107936106ea565b6107ac61079f336101fa565b916001600160a01b031690565b14610734565b61019b906107be610788565b61081e565b156107ca57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61019b906107276108326101fa6000610711565b6001600160a01b03831614156107c3565b61019b906107b2565b906001600160a01b03905b9181191691161790565b90610871610100610878926102c5565b825461084c565b9055565b61088660006106e0565b90610892816000610861565b6108c56108bf7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936102c5565b916102c5565b916108cf60405190565b600090a3565b156108dc57565b60405162461bcd60e51b8152602060048201526024808201527f4f6e6c792065786368616e67652063616e2063616c6c20746869732066756e636044820152633a34b7b760e11b6064820152608490fd5b61097694939291906109713361096b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661079f565b146108d5565b610b73565b90919293565b80151561023d565b9050519061019b8261097c565b906020828203126100e65761010091610984565b9037565b61019b916040916109a5565b9061015e816040936109a9565b6109d26109ce60029390565b9190565b806000925b8484106109e5575050505050565b610a016109fa6001926109f58690565b6109b5565b9360400190565b930192916109d7565b61019b91610140916109a5565b610a4f61019b94610a4561010094989795610a3b61024086019a60008701906109a9565b60408501906109c2565b60c08301906109a9565b0190610a0a565b6040513d6000823e3d90fd5b15610a6957565b60405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606490fd5b634e487b7160e01b600052603260045260246000fd5b90600a811015610ac5576020020190565b610a9e565b6101006101006101009290565b356101008161023b565b610aee6101006101009290565b60ff1690565b61015e610b0c92602092610b06815190565b94859290565b93849101610107565b61010091610af4565b6101009061042f565b15610b2e57565b60405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606490fd5b50505050610b80306102c5565b602063f3bb70f6916000840190610bb96040860194610bc461010060c0890198018098610bac60405190565b9889978896879660e01b90565b865260048601610a17565b03915afa8015610d1c57610be091600091610cee575b50610a62565b610c03610bfe610bf9610bf36000610aca565b84610ab4565b610ad7565b610aca565b91600290610c88610c146001610ae1565b92610c826109ce610c73610c32610c2a85610ae1565b80988a610e1c565b610c5a610c3e60405190565b8092610c4e602083019182610b15565b90810382520382610408565b610c6c610c65825190565b9160200190565b2093610b1e565b610c7e610c65825190565b2090565b14610b27565b610100610bf9610cbc610bfe610bf9610cb6610cb0600798610ca98a610ae1565b908b610e1c565b97610aca565b88610ab4565b94610cde610cd9610bfe610bf9610cd36008610aca565b85610ab4565b611639565b610ce86009610aca565b90610ab4565b610d0f915060203d8111610d15575b610d078183610408565b810190610991565b38610bda565b503d610cfd565b610a56565b6109769060006060818061092d565b634e487b7160e01b600052601160045260246000fd5b610d559060ff165b9160ff1690565b90039060ff8211610d6257565b610d30565b6101006101006101009260ff1690565b67ffffffffffffffff811161042a5760208091020190565b90610d9c61065f83610d77565b918252565b369037565b9061019b610dbc610db684610d8f565b93610d77565b601f190160208401610da1565b6000198114610d625760010190565b91908203918211610d6257565b90610dee825190565b811015610ac5576020809102010190565b610100601f610aca565b81810292918115918404141715610d6257565b909290610e39610e34610e2f8686610d46565b610d67565b610da6565b91610e4385610d67565b610e4c85610d67565b811015610e9457610e8d81610e88610e6a610bf9610e4c9588610ab4565b610e85610e7f610e798c610d67565b85610dd8565b89610de5565b52565b610dc9565b9050610e43565b509350506101009150610ea5815190565b90610eb8610eb1610dff565b8093610e09565b906110c9565b90610d9c61065f83610626565b9061019b610dbc610edb84610ebe565b93610626565b610eee6101006101009290565b61ffff1690565b61ffff1661ffff8114610d625760010190565b6101006101006101009261ffff1690565b61010090610f2a6109ce6101009490565b901c90565b634e487b7160e01b600052601260045260246000fd5b610f519060ff16610d4e565b908115610f5c570690565b610f2f565b610f6d9060ff16610d4e565b019060ff8211610d6257565b610f8f610f896101009260ff1690565b60f81b90565b6001600160f81b03191690565b90610fa5825190565b811015610ac5570160200190565b61010090610f2a6109ce6101009460ff1690565b15610fce57565b60405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a490fd5b1561106657565b60405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608490fd5b926000926110d684610ae1565b6110ef6110ea836110e5895190565b610e09565b610ecb565b946110f981610aca565b9561110382610ee1565b965b6111106101008a5190565b61111989610f08565b10156112e75761113861113461112e8a610f08565b8b610de5565b5190565b98899661114487610da6565b9861114e86610aca565b8881101561119b5780610e888c8f6111969461118861118361118e9361117d6111776008610aca565b85610e09565b90610f19565b610ae1565b92610de5565b9060ff169052565b61114e565b5091909a50989295989793969194976111b388610aca565b955b8a8710156112c6576111d4610e2f6111cd8989610de5565b5160ff1690565b6111dd8a610aca565b811461127957906111f86111f361120a93610ae1565b610f79565b8a1a611204828b610f9c565b53610dc9565b9261121e6112186002610ae1565b8b610f45565b61122a610d4e8b610ae1565b14611255575b61124861124e915b6112426008610ae1565b90610fb3565b96610dc9565b95926111b5565b9861124861127061124e9261126a6001610ae1565b90610f61565b9a915050611230565b50926112886112186002610ae1565b600190611297610d4e83610ae1565b146112aa575b5061124861124e91611238565b6112be61124e929b61126a61124893610ae1565b9a915061129d565b989550935097949598916112da9150610ef5565b9695979197949094611105565b926109ce919598506101009750610100945061131a92509561010061132197611313610d4e6001610ae1565b1015610fc7565b111561105f565b611333565b610f8f610f896101009290565b80519060009261134284610aca565b61134d610100845190565b8110156113ef5761136f6113618285610f9c565b516001600160f81b03191690565b61138961137b87611326565b916001600160f81b03191690565b1461139c5761139790610dc9565b611342565b9250905b6113a983610ecb565b916113b385610aca565b845b8110156113e3576113dc816113d06113616113b59487610f9c565b881a6112048288610f9c565b90506113b3565b50935050610100915090565b50906113a0565b61019b90611402610788565b611589565b9160001960089290920291821b911b610857565b919061142c61010061087893610aca565b908354611407565b61019b9160009161141b565b81811061144b575050565b806114596000600193611434565b01611440565b9190601f811161146e57505050565b61148061019b93600052602060002090565b906020601f8401819004830193106114a2575b6020601f909101040190611440565b9091508190611493565b906114b5815190565b9067ffffffffffffffff821161042a576114d9826114d3855461033a565b8561145f565b602090601f831160011461151457610878929160009183611509575b5050600019600883021c1916906002021790565b0151905038806114f5565b601f1983169161152985600052602060002090565b9260005b8181106115675750916002939185600196941061154e575b50505002019055565b01516000196008601f8516021c19169055388080611545565b9193602060018192878701518155019501920161152d565b9061019b916114ac565b61019b90600261157f565b61019b906113f6565b61019b906115a9610788565b6115cf565b9060001990610857565b906115c861010061087892610aca565b82546115ae565b61019b9060036115b8565b61019b9061159d565b6101006002610b1e565b156115f457565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b611668602061165061164b60016106e0565b6102c5565b63169394bb9061165f60405190565b93849260e01b90565b82526004820185905260249082905afa908115610d1c57611698916116939160009161170b57501590565b6115ed565b6116a561164b60016106e0565b90635bd4df3290823b156100e6576116e2926116d4600080946116c760405190565b9687958694859360e01b90565b835260048301526024820190565b03925af18015610d1c576116f35750565b61019b9060006117038183610408565b8101906101d2565b611723915060203d8111610d1557610d078183610408565b1590565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561175057565b6000805260206000f35b919290926040519384526020840152604083015260408260608160076107d05a03fa156117505760806040928251848201526020830151606082015260066107d05a03fa1561175057565b93909260606020947f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47866080860198611b4061012060008901977f1c1e94bcd36515d96e435f61ee4fa0dc859f4090dcd5430374ced5e4ba688c9e89527f0e8bedfefb241a5448eac861c9f80086b6607f3082ace30b718ad164db3867a3858a015261187760008201357f0b1bea87e58d7f9b1df1b6e6530258dc6bf8354ee1e0287efbcde5faf0876cb37f21468c42c1abfe13be4583929db42dc4b6f1a3feb44d8e1336bbd6337b9992e88c61175a565b6118c6858201357f0dffb044274ff4d10fbf5545d248655f5203dca9161a6fd6ad5308d4ad2d9a487f10919aaea1bb570dabdefb8f9328f924ab0d33a21482584e6dbe5cc23d707f408c61175a565b61191660408201357f120401ecf289d3509044f33e1aab31e9cc9242ca08b56fe495beb5bf63dcab6a7f2a0297fa255705f360180d052e0f129394b63fedbf85496d1f61e4c335d5a1558c61175a565b611965888201357f2e31a07bdd388f34a6d84d0472485df1348189472b2f0119f41660d3c22045bd7f08034f82261ae61a6d5991ff892682a8d3117745585fea2279e9baf22f982cce8c61175a565b6119b560808201357f0c8304577691476e7b57b48d30630acc74c9b52baf12c6ef8bc1e28cc78798397f04a396b83d64f44cb37262119ef21df828153f3e5b22833520b2892c83752ce18c61175a565b611a0560a08201357f090968a6484d95f390fc636cfe1613f6ee8dac2b288485a2cf277886982669c97f25b48ba246ea1a991339587df4a62b88be3279d0b3b1d326cf9521a33d7b15878c61175a565b611a5560c08201357f22bdf3d83eddebc573238bb59aabc778011e095a196740f3ac64f69991275fe77f1073fb6d0a6ed98484e814d7d7cc0382850f5e66ff79e3215e470ccdbc3925728c61175a565b611aa560e08201357f23318a569b541a09f38bb1b3d2dec411fd8c6650abe56326b4abc7cdf5fd0e727f1a81a189d3c977a50f37f8fb6442804d25dced44e296159c9d9a1a313ea45e3c8c61175a565b611af66101008201357f242c422f58c0818ce1bc402140ef550d2ce6f537f7b97990b6c853d772818e7d7f2bd61b1039bd486ebd25c9866b7a34429b9d05f3ada0d35090b2b5a04c03dc108c61175a565b01357f0f73def0c88e50c35c62db1ac618eceec4f44d1d0666468a9c28cd8c8cbf81c97f1818989682bac795f6357e1a3d405e82b9a3bdbc86f5eb980be62287b25d28608961175a565b80358a5201358103068688015280356040880152858101358288015260408101356080880152013560a08601527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08601527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08601527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008601527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208601527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408601527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160860152516101808501528260000101516101a08401527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08401527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08401527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008401527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220840152803561024084015201356102608201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26102808201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6102a08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102c08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa6102e08201526020816103008160086107d05a03fa90511690565b91611e779391611dd3600090565b50604051936103808501604052611ded6000850135611727565b611dfa6020850135611727565b611e076040850135611727565b611e146060850135611727565b611e216080850135611727565b611e2e60a0850135611727565b611e3b60c0850135611727565b611e4860e0850135611727565b611e56610100850135611727565b611e64610120850135611727565b611e72610140850135611727565b6117a5565b60005260206000f3fea2646970667358221220b070e387d647569a745b0f851caaf898e12804e32149ebe4dcfc527f1e24f21e64736f6c63430008120033", "devdoc": { "kind": "dev", "methods": { @@ -351,15 +351,15 @@ "type": "t_address" }, { - "astId": 11214, + "astId": 1862, "contract": "contracts/TransferDomainProcessor.sol:TransferDomainProcessor", "label": "nullifierRegistry", "offset": 0, "slot": "1", - "type": "t_contract(INullifierRegistry)9610" + "type": "t_contract(INullifierRegistry)1450" }, { - "astId": 11216, + "astId": 1864, "contract": "contracts/TransferDomainProcessor.sol:TransferDomainProcessor", "label": "emailFromAddress", "offset": 0, @@ -367,7 +367,7 @@ "type": "t_bytes_storage" }, { - "astId": 11218, + "astId": 1866, "contract": "contracts/TransferDomainProcessor.sol:TransferDomainProcessor", "label": "timestampBuffer", "offset": 0, @@ -386,7 +386,7 @@ "label": "bytes", "numberOfBytes": "32" }, - "t_contract(INullifierRegistry)9610": { + "t_contract(INullifierRegistry)1450": { "encoding": "inplace", "label": "contract INullifierRegistry", "numberOfBytes": "20" diff --git a/contracts-domain/deployments/base_staging/VerifiedDomainRegistry.json b/contracts-domain/deployments/base_staging/VerifiedDomainRegistry.json index cbf777d0a..1e837f788 100644 --- a/contracts-domain/deployments/base_staging/VerifiedDomainRegistry.json +++ b/contracts-domain/deployments/base_staging/VerifiedDomainRegistry.json @@ -1,5 +1,5 @@ { - "address": "0x17463cb89A62c7b4A5ecD949aFDEDBD0Aa047ad1", + "address": "0xbCbE5B3F85ffAFa46960272a581A2662c257EF57", "abi": [ { "inputs": [], @@ -727,34 +727,34 @@ "type": "function" } ], - "transactionHash": "0x20831fe1e2c5761fcaf8b6b494f781f015dcf8be3d9b61459d6f74c9843f6374", + "transactionHash": "0x3fa5a245b20f7f7f8b7ce98d33f111661f6de6707bbaa2b0433f8fb85592b368", "receipt": { "to": null, "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "contractAddress": "0x17463cb89A62c7b4A5ecD949aFDEDBD0Aa047ad1", - "transactionIndex": 88, + "contractAddress": "0xbCbE5B3F85ffAFa46960272a581A2662c257EF57", + "transactionIndex": 71, "gasUsed": "2387918", - "logsBloom": "0x00000000000000000000000000000000000000000000004000810000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000020000000000000000000000000000000080", - "blockHash": "0xb52fa8b37e24afa1478def86cb3b37bf96c2304ad238d845bdfd82169e25fce4", - "transactionHash": "0x20831fe1e2c5761fcaf8b6b494f781f015dcf8be3d9b61459d6f74c9843f6374", + "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000000000000000000000000000000000010000000008000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000200000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x3db4f380616b21de29d52daa06addf36351aea583c6b1ec6cb2374fac2f634f1", + "transactionHash": "0x3fa5a245b20f7f7f8b7ce98d33f111661f6de6707bbaa2b0433f8fb85592b368", "logs": [ { - "transactionIndex": 88, - "blockNumber": 19860247, - "transactionHash": "0x20831fe1e2c5761fcaf8b6b494f781f015dcf8be3d9b61459d6f74c9843f6374", - "address": "0x17463cb89A62c7b4A5ecD949aFDEDBD0Aa047ad1", + "transactionIndex": 71, + "blockNumber": 20165442, + "transactionHash": "0x3fa5a245b20f7f7f8b7ce98d33f111661f6de6707bbaa2b0433f8fb85592b368", + "address": "0xbCbE5B3F85ffAFa46960272a581A2662c257EF57", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" ], "data": "0x", - "logIndex": 147, - "blockHash": "0xb52fa8b37e24afa1478def86cb3b37bf96c2304ad238d845bdfd82169e25fce4" + "logIndex": 172, + "blockHash": "0x3db4f380616b21de29d52daa06addf36351aea583c6b1ec6cb2374fac2f634f1" } ], - "blockNumber": 19860247, - "cumulativeGasUsed": "16943032", + "blockNumber": 20165442, + "cumulativeGasUsed": "15121884", "status": 1, "byzantium": true }, diff --git a/contracts-domain/deployments/base_staging/VerifyDomainProcessor.json b/contracts-domain/deployments/base_staging/VerifyDomainProcessor.json index 09eb00717..009b702cd 100644 --- a/contracts-domain/deployments/base_staging/VerifyDomainProcessor.json +++ b/contracts-domain/deployments/base_staging/VerifyDomainProcessor.json @@ -1,5 +1,5 @@ { - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "abi": [ { "inputs": [ @@ -483,280 +483,1240 @@ "type": "function" } ], - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", "receipt": { "to": null, "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "contractAddress": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", - "transactionIndex": 68, - "gasUsed": "5529318", - "logsBloom": "0x00000000000000000000000000002000000000000000004000800000000000000000000000000000000000000000000000000000010000000000040000000000000000000000000000000000002000000001000000000000000000000000000000000000020000010000000040000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c", - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", + "contractAddress": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "transactionIndex": 79, + "gasUsed": "15020436", + "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000000000000000000000000000000000010000000000040000000000000000000000000000000000202000000001000000000000000000000000000000000000020000010000000000000800001000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af", + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", "logs": [ { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" ], "data": "0x", - "logIndex": 159, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 315, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307866643436323230333962653365343238366464333238356433366437373261373164353830613961666130613137313861376536343335333963393532636639000000000000000000000000000000000000000000000000000000000000", - "logIndex": 160, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 316, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839306136343839656666333831343036383961313531333366623538393036613765383437636331383237316166303336393336633865646139316464636338000000000000000000000000000000000000000000000000000000000000", - "logIndex": 161, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 317, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307831346432366430326233616539663236663965363261346438643736656266666630636434613464343632396330386339303961663939656330656234316437000000000000000000000000000000000000000000000000000000000000", - "logIndex": 162, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 318, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836343535386234333633633466386434653763316565316137356534643832663866613736363430653137346230366434656433346533623436656263316137000000000000000000000000000000000000000000000000000000000000", - "logIndex": 163, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 319, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865346163393363663332613538353839376233303065656330643232666464616564373031363539343866376161666431633434333634383035383133303537000000000000000000000000000000000000000000000000000000000000", - "logIndex": 164, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 320, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834613236366664363366353530646236623739313732333235663333343139646636643564383762663932346231373564386231383137663031306132316366000000000000000000000000000000000000000000000000000000000000", - "logIndex": 165, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 321, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864633065363637323466636633386538353139633761623333616239653661303437633735386462333532303462316430383635303066653530333333663731000000000000000000000000000000000000000000000000000000000000", - "logIndex": 166, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 322, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835313561383265333332366239383563613037336435386133626139323930653834666638643032316430373265376234323066643036313662633630396537000000000000000000000000000000000000000000000000000000000000", - "logIndex": 167, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 323, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307862343161353133666464336532623761366238653063303266386137313461613361636131303163643332333635646536636261633930666165333038653036000000000000000000000000000000000000000000000000000000000000", - "logIndex": 168, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 324, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307831666463343733386233323364346333386266363537613333663734663935363138626331313933336663633463653665396633663763393366356134393265000000000000000000000000000000000000000000000000000000000000", - "logIndex": 169, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 325, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835663135323331653537613266613836663565316562316332616264626435343835313039616461363562623633626564383763373234323564636138323835000000000000000000000000000000000000000000000000000000000000", - "logIndex": 170, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 326, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835343539656262656136343664316134613063393339343465363836303063396533353539313861393062333664333532613132393162613535376535353663000000000000000000000000000000000000000000000000000000000000", - "logIndex": 171, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 327, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307866663636633765633166376338316663383333626166623935323263633135626534656635363436323236376338393837393531303530316331626337376664000000000000000000000000000000000000000000000000000000000000", - "logIndex": 172, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 328, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835666161353135303039636137393238303562646630336439353164373533616232343163333231303636653366306362633065653866346330396563623332000000000000000000000000000000000000000000000000000000000000", - "logIndex": 173, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 329, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838303438313862323836653663323034623366313832383262316637613061343062316235353562633339646366323536333432653062346463336632393932000000000000000000000000000000000000000000000000000000000000", - "logIndex": 174, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 330, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835666631363933333461383162386239386261396537626562316566326533383630663739663134386366303735323635323465383239656366366436653564000000000000000000000000000000000000000000000000000000000000", - "logIndex": 175, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 331, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833383938393332396535636564353835396536353039646133396631316636333434633130353232633031393363306362353733653738336539373466626430000000000000000000000000000000000000000000000000000000000000", - "logIndex": 176, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 332, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307861633434316436643165393936326562306162636263383139323331653438363134373836633137393530376664306661616563346361643062356431653062000000000000000000000000000000000000000000000000000000000000", - "logIndex": 177, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 333, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865363265363332396162656664656532346663656366333763613535623131326661396430616261636232633939636437663863306461366337626134366138000000000000000000000000000000000000000000000000000000000000", - "logIndex": 178, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 334, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" }, { - "transactionIndex": 68, - "blockNumber": 19860249, - "transactionHash": "0xe671d61cd43e7671584d4e226732121d4f9123debf84ce061a5d279c9a0621f2", - "address": "0x15EF83EBB422B4AC8e3b8393d016Ed076dc50CB7", + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830393962363732366465313338323336666137643339313766313763616566343265626431396661393364653936623162316661666663373133323635643330000000000000000000000000000000000000000000000000000000000000", - "logIndex": 179, - "blockHash": "0xabc7509e7b23daeecb7b78a25b77653546d80ba9964052a3af64371f280e799c" + "logIndex": 335, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864653165333763626232383737306131623165643730643461363833376530656537323739323630363965653866613136333366303365346465326333356364000000000000000000000000000000000000000000000000000000000000", + "logIndex": 336, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836633065306232333432346437356336313931323039343837613237626463623965653966373438656330356638373262346166643536616636366333366335000000000000000000000000000000000000000000000000000000000000", + "logIndex": 337, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839663736613234346237333164373235376434636338343666336461393837613632303338363261333261626535643337393738356462656364323335643161000000000000000000000000000000000000000000000000000000000000", + "logIndex": 338, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865663633656237643064613538303830373761663661386539633136303431366361363664623136373739656633306534393439643331656464373062663039000000000000000000000000000000000000000000000000000000000000", + "logIndex": 339, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307832623564623037663538386264323764333739353238316336343066643566666536646531313134353033613237653531306134616134626439643030346434000000000000000000000000000000000000000000000000000000000000", + "logIndex": 340, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837313839393430303730623035613731326663363330353365396337373138373730633536326364376466303834653530613934313636396636383030393061000000000000000000000000000000000000000000000000000000000000", + "logIndex": 341, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307831363537666161633934646435356530363333363264646662366639356335613664323165373966663735386336613864363037393531306230303462653332000000000000000000000000000000000000000000000000000000000000", + "logIndex": 342, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836306131386639623861663430356463623930623531653637313966633134623763373932376135393631343434636439376562386563666663376563626439000000000000000000000000000000000000000000000000000000000000", + "logIndex": 343, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830343066626536386539316134353735616439316437646362393030373766636663313736323765663261313239336635396431373732393539636361656437000000000000000000000000000000000000000000000000000000000000", + "logIndex": 344, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865326631396633633931643961353930636661663235663436353531623461303233396162343532656635663633386162313732636366626430613063363137000000000000000000000000000000000000000000000000000000000000", + "logIndex": 345, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837306138633062353630623436353563336137633638633062623736636639666334323438346133626237336335666564303261356662343239373936356236000000000000000000000000000000000000000000000000000000000000", + "logIndex": 346, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835366338313264636364383436323032393261313861383239313538626132306665663439653532656661353739346335386437643237383031343866633233000000000000000000000000000000000000000000000000000000000000", + "logIndex": 347, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837326162373032333736383634646261316562373631613639333761623164396664303265363037303433643764363433346262336633343262323230613733000000000000000000000000000000000000000000000000000000000000", + "logIndex": 348, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864373865353566303964653963313836393036343133353830376331353134623262376639303562323039636335373065636435326530346230333635386561000000000000000000000000000000000000000000000000000000000000", + "logIndex": 349, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837353263313535376134656461613734663963366464376331363665643931656663653134656439303634373136343133373366326137623032383463316464000000000000000000000000000000000000000000000000000000000000", + "logIndex": 350, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830613664393963386535306238363535366162376362383466353133653130303432316662663330626665633637636464313863653732303235353331393933000000000000000000000000000000000000000000000000000000000000", + "logIndex": 351, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836383133626466356532346536623564626137626634336461383933623839326237373265646536326664343464643262363461333131373333376262663166000000000000000000000000000000000000000000000000000000000000", + "logIndex": 352, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833646534326637353832333662666237393464663139396439653834353833373964333731326432656336383865326535666633633364663566393538666131000000000000000000000000000000000000000000000000000000000000", + "logIndex": 353, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307863336464313363656166326639646531323563623233366133646263663739633063316637353861623631383763656461363834653338343535646636316433000000000000000000000000000000000000000000000000000000000000", + "logIndex": 354, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864393333356236396430613939313235353765316139656465313235313038393331626361623661656536383734663235666633386264376634653135623533000000000000000000000000000000000000000000000000000000000000", + "logIndex": 355, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307832386634643661313032613432356633323361623039623364663739323435636331303761663132373530333539613361626666363834656461386363616234000000000000000000000000000000000000000000000000000000000000", + "logIndex": 356, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839366533313166366463373838303933386138333264383137643963376266353336326462316331316231616135633734373730323965633161363766646462000000000000000000000000000000000000000000000000000000000000", + "logIndex": 357, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836303830343636663738326437396366356533363964376464623964666164306131386433333035663931373566356464613966303138333739646661303962000000000000000000000000000000000000000000000000000000000000", + "logIndex": 358, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830326530306532323831343432376532353464386633383634653363326663376434646638663561383830613032616364343533653765643236366433346633000000000000000000000000000000000000000000000000000000000000", + "logIndex": 359, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837323237643039306465353233306239346262313237366233663766383836333763356638316361373836313164643638386162616164386634343466393934000000000000000000000000000000000000000000000000000000000000", + "logIndex": 360, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833356539383462353539383263356666303532613535366634323232643638633834313862333066656632613439326135346664633239333264333764393232000000000000000000000000000000000000000000000000000000000000", + "logIndex": 361, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837313338653064646261626330613630616364343562656162326465336233353862353364653734663432333266333964653130376536333835393438353734000000000000000000000000000000000000000000000000000000000000", + "logIndex": 362, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838653564363532323035343333373561373837383731626637356664393761633565393261623139653465333936366638636431306536323661326136306137000000000000000000000000000000000000000000000000000000000000", + "logIndex": 363, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839333336386338316131623561653762646461356636643434333861343638643032313437336262383766323439376661393138323931396461346230633934000000000000000000000000000000000000000000000000000000000000", + "logIndex": 364, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834343237313533343837353339616537333065663865666561383038633037626232303438373432353466316332313232633130303631663435623966336336000000000000000000000000000000000000000000000000000000000000", + "logIndex": 365, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834333563313132303261633631383562323162386462346662363131323339663838623135613966616264353932383831646364633865316435363939623166000000000000000000000000000000000000000000000000000000000000", + "logIndex": 366, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307862643839303664306265666436656530303264646535363137383433393135393264383737303064356530353666656235356564656566333739623038313865000000000000000000000000000000000000000000000000000000000000", + "logIndex": 367, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838623265386330333365363535326663383430393739353937353864323832666566656639316231666231346166343033303030306239623963306534303032000000000000000000000000000000000000000000000000000000000000", + "logIndex": 368, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307862306263653434636639373735333937613531363538363662613330626433653038643830333336316530376463643133383336623065366261633930313135000000000000000000000000000000000000000000000000000000000000", + "logIndex": 369, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834643439386665386135633034316135623764623736313933653764386238393266303637316535316365393634323863656231303666663331363961376334000000000000000000000000000000000000000000000000000000000000", + "logIndex": 370, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833313564383433666231373131363230393163306234386263646639653762366364353031653565376239353933393030383330376531353238666534376239000000000000000000000000000000000000000000000000000000000000", + "logIndex": 371, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864376466666532633632663535303536346562333963333662636630643663356534326138316234363535383864323133306630656138303639613730333265000000000000000000000000000000000000000000000000000000000000", + "logIndex": 372, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865393262303463363864353833323938663363346237626363323935306531656238376331663037633364316562623838326635386231633835393536396434000000000000000000000000000000000000000000000000000000000000", + "logIndex": 373, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838643366306165313535363063363236303230303362336165336163333135323235636533656663356238663130393566383739383734633537333134626261000000000000000000000000000000000000000000000000000000000000", + "logIndex": 374, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835383638343263353434623236353532356132376632663639623234653865613865303464343439663564613362383338326637376239616266666136653230000000000000000000000000000000000000000000000000000000000000", + "logIndex": 375, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830396138623230623364653233623866363631653338386536353431616134653138623339656466376532663039323665346233373633633832666565316532000000000000000000000000000000000000000000000000000000000000", + "logIndex": 376, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307862373930353632383564376436323731386439623166313930383763663234366636666134626435346235396665666236653533363734656230333638313966000000000000000000000000000000000000000000000000000000000000", + "logIndex": 377, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839313062636330386565636134356631313539336665376233616138303832313361313434646463633935326264343634383065626338323731303064656632000000000000000000000000000000000000000000000000000000000000", + "logIndex": 378, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307862323336353536616164396539323363343535306665653862626138316334316337353336383533333534656264363764663264663339643038303564626331000000000000000000000000000000000000000000000000000000000000", + "logIndex": 379, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834663437333835353334643834343336356439656331363432333133373133646637623530323030643139333466663835303066303231613465353066306531000000000000000000000000000000000000000000000000000000000000", + "logIndex": 380, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307863323334653761616137306633353338316363653465643631656235666464656262383661316362303064656434336461366266363065316461373566666535000000000000000000000000000000000000000000000000000000000000", + "logIndex": 381, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307832636334633339623732373466383430373139633037613635663630303461343361323835343530353266623739363131353638623934663866323836323436000000000000000000000000000000000000000000000000000000000000", + "logIndex": 382, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830646465343061356238613634353961393033613639633338306538646431663565323230343833346462373235376439313964303563663566623562363065000000000000000000000000000000000000000000000000000000000000", + "logIndex": 383, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830393437373132623835333464316339346463393962656234343731623566663861383239313436616338303561383438393935313662613763326239323162000000000000000000000000000000000000000000000000000000000000", + "logIndex": 384, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838396561636431663063646462383862376565663565323966623465633032656332633138303931653033326130633637383138336635323565393632653162000000000000000000000000000000000000000000000000000000000000", + "logIndex": 385, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833633935646532623935396566313034663532333765376337643832376338346237363039653163363533643535386438376330643235393139343830633262000000000000000000000000000000000000000000000000000000000000", + "logIndex": 386, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838343239336165343230633236396433633663313534356139323564653831313061323638326430353538306330323930386562353939643933653838393333000000000000000000000000000000000000000000000000000000000000", + "logIndex": 387, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835313761656530623465623536383365613265653665656137316162313138356130643966636266646633323633356662376533613030623433656436313035000000000000000000000000000000000000000000000000000000000000", + "logIndex": 388, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837646165653239343961633835643266336463626134633264343561343834316334666635336336663932383066303136323765393731323066646665396461000000000000000000000000000000000000000000000000000000000000", + "logIndex": 389, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865653933306431383732623332376466333836306563643733323330663934376536663538306163366430646164633638326137346463386134393832646339000000000000000000000000000000000000000000000000000000000000", + "logIndex": 390, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833303264643966623138643765623432616536666233333838356664323964313966363939346666666364636239616566326437636437333661643632343937000000000000000000000000000000000000000000000000000000000000", + "logIndex": 391, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307863613662353732636331343639323935336261633261633361313232626238323564656532313764326663303661333662343563613235393839663730303139000000000000000000000000000000000000000000000000000000000000", + "logIndex": 392, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307831316463376138623231336262353836353764383464613064356133636466663837336464653138626531396232623634346366306233653131356236366431000000000000000000000000000000000000000000000000000000000000", + "logIndex": 393, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838353030643233373239343732663063333232363432373930383162656536356536333263393333636463386638636635356537363333373566323035666462000000000000000000000000000000000000000000000000000000000000", + "logIndex": 394, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830316264323736666133343535383361666536393030646430616463613031316632343033363938373733623838353935396239613032396630356233633537000000000000000000000000000000000000000000000000000000000000", + "logIndex": 395, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307832643861376637353466393036316535393365306363306332383337636363633338356235663862373863303232396330626462393839366438386234343333000000000000000000000000000000000000000000000000000000000000", + "logIndex": 396, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837616261623931313531323366396535373431616561333865613036376337346466613862363039326338353332646263633839383966376138643833613932000000000000000000000000000000000000000000000000000000000000", + "logIndex": 397, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834373262323532373933323536393563383138363066653064363461633862373034326431633834656138653835396339376534616362613964353836393235000000000000000000000000000000000000000000000000000000000000", + "logIndex": 398, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836303666366135643831346136666530653139653039326231356164613333343438653862346165376465393731393364333966623838623565323261326263000000000000000000000000000000000000000000000000000000000000", + "logIndex": 399, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830323636323063323736353737313534326632626265343364646531626263643139363164376361343261656538373862373030336264353866626364666135000000000000000000000000000000000000000000000000000000000000", + "logIndex": 400, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307861376235653462633438663430636332653665373133366564353333356231653731346233313038626661336533386261313133333732363062636334613131000000000000000000000000000000000000000000000000000000000000", + "logIndex": 401, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838343530616230336262363864636566386130326465303739656134333038353964386665366236373664323736366432643065396235316566393864656233000000000000000000000000000000000000000000000000000000000000", + "logIndex": 402, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307866346361646164326265326162393039613637663634653630393263616138303735386236633730356336393439393366653735316336306134333965313934000000000000000000000000000000000000000000000000000000000000", + "logIndex": 403, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838353366646635396233653064396438666139643035393038646633643231306434653061636538393632336438633064323633646634653263323864323965000000000000000000000000000000000000000000000000000000000000", + "logIndex": 404, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307863663837396337656439336665643366666533323839366132663066343762303462303631613335353362316132393133373838356532633263653839313337000000000000000000000000000000000000000000000000000000000000", + "logIndex": 405, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839306565333836623438633166333865643462643738393266373962343330356139386633663766643664336236666630383637333764636632376363353764000000000000000000000000000000000000000000000000000000000000", + "logIndex": 406, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307861396261653735316666666636623364326336616666313037366133613865633833663939336639633130336337383363353962633664393934663930336166000000000000000000000000000000000000000000000000000000000000", + "logIndex": 407, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307866326261343837646666383661646364623364653534376662333739633736633532396433653238316166386334663061343130373738626438326431363637000000000000000000000000000000000000000000000000000000000000", + "logIndex": 408, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307861323035393836346462363537643837336230313433643364376430303833353739316565616437316264353162336139663535353265656334323232623465000000000000000000000000000000000000000000000000000000000000", + "logIndex": 409, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830313135313863326462343936636137616164313164383532623037353034373033393235666135653036386466393030323438306166343962623561396366000000000000000000000000000000000000000000000000000000000000", + "logIndex": 410, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307861393435323661326665633162306661643035636262623830396237353732663434383966616432366562313836393030663032396239313331373334353837000000000000000000000000000000000000000000000000000000000000", + "logIndex": 411, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830613163386561343632333431356130303565303163326239623764313632626539623939396237356133636137633235623931396265363361353635336537000000000000000000000000000000000000000000000000000000000000", + "logIndex": 412, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833386433393064666361373435633964333230333264623834356334353530653637666232373130363562303432373738636330346339346435383864336565000000000000000000000000000000000000000000000000000000000000", + "logIndex": 413, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864623335373565363265646233303332626264616565343561376136356432323866633766356363613263356237616130393535636339646638613039656362000000000000000000000000000000000000000000000000000000000000", + "logIndex": 414, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" + }, + { + "transactionIndex": 79, + "blockNumber": 20165451, + "transactionHash": "0x3b5403e8c6f48aacdbfe1c559564a06226052687ae0032489de90f82b9714db6", + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "topics": [ + "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307863323764353138666435613639663266373931373938383136326533623730376235326534633137313433666630373733376131353866313964323732383139000000000000000000000000000000000000000000000000000000000000", + "logIndex": 415, + "blockHash": "0x44005ff4e4a0f5eb0d3f24938b361963e593beb61ab5df7432627bc0d865d8af" } ], - "blockNumber": 19860249, - "cumulativeGasUsed": "13162062", + "blockNumber": 20165451, + "cumulativeGasUsed": "29256511", "status": 1, "byzantium": true }, "args": [ - "0x17463cb89A62c7b4A5ecD949aFDEDBD0Aa047ad1", - "0x6992997BEe56d0Bd552397885eED681fD704D1ed", + "0xbCbE5B3F85ffAFa46960272a581A2662c257EF57", + "0x2b68bFd2b44a6a9E8dC7b414550457B091ECB5fB", [ "0xfd4622039be3e4286dd3285d36d772a71d580a9afa0a1718a7e643539c952cf9", "0x90a6489eff38140689a15133fb58906a7e847cc18271af036936c8eda91ddcc8", @@ -777,16 +1737,96 @@ "0x38989329e5ced5859e6509da39f11f6344c10522c0193c0cb573e783e974fbd0", "0xac441d6d1e9962eb0abcbc819231e48614786c179507fd0faaec4cad0b5d1e0b", "0xe62e6329abefdee24fcecf37ca55b112fa9d0abacb2c99cd7f8c0da6c7ba46a8", - "0x099b6726de138236fa7d3917f17caef42ebd19fa93de96b1b1faffc713265d30" + "0x099b6726de138236fa7d3917f17caef42ebd19fa93de96b1b1faffc713265d30", + "0xde1e37cbb28770a1b1ed70d4a6837e0ee727926069ee8fa1633f03e4de2c35cd", + "0x6c0e0b23424d75c6191209487a27bdcb9ee9f748ec05f872b4afd56af66c36c5", + "0x9f76a244b731d7257d4cc846f3da987a6203862a32abe5d379785dbecd235d1a", + "0xef63eb7d0da5808077af6a8e9c160416ca66db16779ef30e4949d31edd70bf09", + "0x2b5db07f588bd27d3795281c640fd5ffe6de1114503a27e510a4aa4bd9d004d4", + "0x7189940070b05a712fc63053e9c7718770c562cd7df084e50a941669f680090a", + "0x1657faac94dd55e063362ddfb6f95c5a6d21e79ff758c6a8d6079510b004be32", + "0x60a18f9b8af405dcb90b51e6719fc14b7c7927a5961444cd97eb8ecffc7ecbd9", + "0x040fbe68e91a4575ad91d7dcb90077fcfc17627ef2a1293f59d1772959ccaed7", + "0xe2f19f3c91d9a590cfaf25f46551b4a0239ab452ef5f638ab172ccfbd0a0c617", + "0x70a8c0b560b4655c3a7c68c0bb76cf9fc42484a3bb73c5fed02a5fb4297965b6", + "0x56c812dccd84620292a18a829158ba20fef49e52efa5794c58d7d2780148fc23", + "0x72ab702376864dba1eb761a6937ab1d9fd02e607043d7d6434bb3f342b220a73", + "0xd78e55f09de9c1869064135807c1514b2b7f905b209cc570ecd52e04b03658ea", + "0x752c1557a4edaa74f9c6dd7c166ed91efce14ed906471641373f2a7b0284c1dd", + "0x0a6d99c8e50b86556ab7cb84f513e100421fbf30bfec67cdd18ce72025531993", + "0x6813bdf5e24e6b5dba7bf43da893b892b772ede62fd44dd2b64a3117337bbf1f", + "0x3de42f758236bfb794df199d9e8458379d3712d2ec688e2e5ff3c3df5f958fa1", + "0xc3dd13ceaf2f9de125cb236a3dbcf79c0c1f758ab6187ceda684e38455df61d3", + "0xd9335b69d0a9912557e1a9ede125108931bcab6aee6874f25ff38bd7f4e15b53", + "0x28f4d6a102a425f323ab09b3df79245cc107af12750359a3abff684eda8ccab4", + "0x96e311f6dc7880938a832d817d9c7bf5362db1c11b1aa5c7477029ec1a67fddb", + "0x6080466f782d79cf5e369d7ddb9dfad0a18d3305f9175f5dda9f018379dfa09b", + "0x02e00e22814427e254d8f3864e3c2fc7d4df8f5a880a02acd453e7ed266d34f3", + "0x7227d090de5230b94bb1276b3f7f88637c5f81ca78611dd688abaad8f444f994", + "0x35e984b55982c5ff052a556f4222d68c8418b30fef2a492a54fdc2932d37d922", + "0x7138e0ddbabc0a60acd45beab2de3b358b53de74f4232f39de107e6385948574", + "0x8e5d65220543375a787871bf75fd97ac5e92ab19e4e3966f8cd10e626a2a60a7", + "0x93368c81a1b5ae7bdda5f6d4438a468d021473bb87f2497fa9182919da4b0c94", + "0x4427153487539ae730ef8efea808c07bb204874254f1c2122c10061f45b9f3c6", + "0x435c11202ac6185b21b8db4fb611239f88b15a9fabd592881dcdc8e1d5699b1f", + "0xbd8906d0befd6ee002dde561784391592d87700d5e056feb55edeef379b0818e", + "0x8b2e8c033e6552fc84097959758d282fefef91b1fb14af4030000b9b9c0e4002", + "0xb0bce44cf9775397a5165866ba30bd3e08d803361e07dcd13836b0e6bac90115", + "0x4d498fe8a5c041a5b7db76193e7d8b892f0671e51ce96428ceb106ff3169a7c4", + "0x315d843fb171162091c0b48bcdf9e7b6cd501e5e7b95939008307e1528fe47b9", + "0xd7dffe2c62f550564eb39c36bcf0d6c5e42a81b465588d2130f0ea8069a7032e", + "0xe92b04c68d583298f3c4b7bcc2950e1eb87c1f07c3d1ebb882f58b1c859569d4", + "0x8d3f0ae15560c62602003b3ae3ac315225ce3efc5b8f1095f879874c57314bba", + "0x586842c544b265525a27f2f69b24e8ea8e04d449f5da3b8382f77b9abffa6e20", + "0x09a8b20b3de23b8f661e388e6541aa4e18b39edf7e2f0926e4b3763c82fee1e2", + "0xb79056285d7d62718d9b1f19087cf246f6fa4bd54b59fefb6e53674eb036819f", + "0x910bcc08eeca45f11593fe7b3aa808213a144ddcc952bd46480ebc827100def2", + "0xb236556aad9e923c4550fee8bba81c41c7536853354ebd67df2df39d0805dbc1", + "0x4f47385534d844365d9ec1642313713df7b50200d1934ff8500f021a4e50f0e1", + "0xc234e7aaa70f35381cce4ed61eb5fddebb86a1cb00ded43da6bf60e1da75ffe5", + "0x2cc4c39b7274f840719c07a65f6004a43a28545052fb79611568b94f8f286246", + "0x0dde40a5b8a6459a903a69c380e8dd1f5e2204834db7257d919d05cf5fb5b60e", + "0x0947712b8534d1c94dc99beb4471b5ff8a829146ac805a84899516ba7c2b921b", + "0x89eacd1f0cddb88b7eef5e29fb4ec02ec2c18091e032a0c678183f525e962e1b", + "0x3c95de2b959ef104f5237e7c7d827c84b7609e1c653d558d87c0d25919480c2b", + "0x84293ae420c269d3c6c1545a925de8110a2682d05580c02908eb599d93e88933", + "0x517aee0b4eb5683ea2ee6eea71ab1185a0d9fcbfdf32635fb7e3a00b43ed6105", + "0x7daee2949ac85d2f3dcba4c2d45a4841c4ff53c6f9280f01627e97120fdfe9da", + "0xee930d1872b327df3860ecd73230f947e6f580ac6d0dadc682a74dc8a4982dc9", + "0x302dd9fb18d7eb42ae6fb33885fd29d19f6994fffcdcb9aef2d7cd736ad62497", + "0xca6b572cc14692953bac2ac3a122bb825dee217d2fc06a36b45ca25989f70019", + "0x11dc7a8b213bb58657d84da0d5a3cdff873dde18be19b2b644cf0b3e115b66d1", + "0x8500d23729472f0c32264279081bee65e632c933cdc8f8cf55e763375f205fdb", + "0x01bd276fa345583afe6900dd0adca011f2403698773b885959b9a029f05b3c57", + "0x2d8a7f754f9061e593e0cc0c2837cccc385b5f8b78c0229c0bdb9896d88b4433", + "0x7abab9115123f9e5741aea38ea067c74dfa8b6092c8532dbcc8989f7a8d83a92", + "0x472b25279325695c81860fe0d64ac8b7042d1c84ea8e859c97e4acba9d586925", + "0x606f6a5d814a6fe0e19e092b15ada33448e8b4ae7de97193d39fb88b5e22a2bc", + "0x026620c2765771542f2bbe43dde1bbcd1961d7ca42aee878b7003bd58fbcdfa5", + "0xa7b5e4bc48f40cc2e6e7136ed5335b1e714b3108bfa3e38ba11337260bcc4a11", + "0x8450ab03bb68dcef8a02de079ea430859d8fe6b676d2766d2d0e9b51ef98deb3", + "0xf4cadad2be2ab909a67f64e6092caa80758b6c705c694993fe751c60a439e194", + "0x853fdf59b3e0d9d8fa9d05908df3d210d4e0ace89623d8c0d263df4e2c28d29e", + "0xcf879c7ed93fed3ffe32896a2f0f47b04b061a3553b1a29137885e2c2ce89137", + "0x90ee386b48c1f38ed4bd7892f79b4305a98f3f7fd6d3b6ff086737dcf27cc57d", + "0xa9bae751ffff6b3d2c6aff1076a3a8ec83f993f9c103c783c59bc6d994f903af", + "0xf2ba487dff86adcdb3de547fb379c76c529d3e281af8c4f0a410778bd82d1667", + "0xa2059864db657d873b0143d3d7d00835791eead71bd51b3a9f5552eec4222b4e", + "0x011518c2db496ca7aad11d852b07504703925fa5e068df9002480af49bb5a9cf", + "0xa94526a2fec1b0fad05cbbb809b7572f4489fad26eb186900f029b9131734587", + "0x0a1c8ea4623415a005e01c2b9b7d162be9b999b75a3ca7c25b919be63a5653e7", + "0x38d390dfca745c9d32032db845c4550e67fb271065b042778cc04c94d588d3ee", + "0xdb3575e62edb3032bbdaee45a7a65d228fc7f5cca2c5b7aa0955cc9df8a09ecb", + "0xc27d518fd5a69f2f7917988162e3b707b52e4c17143ff07737a158f19d272819" ] ], "numDeployments": 1, "solcInputHash": "d865a6f49eab8c58036d78b72f5cb448", "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_registry\",\"type\":\"address\"},{\"internalType\":\"contract INullifierRegistry\",\"name\":\"_nullifierRegistry\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"_providerHashes\",\"type\":\"string[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"providerHash\",\"type\":\"string\"}],\"name\":\"ProviderHashAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"providerHash\",\"type\":\"string\"}],\"name\":\"ProviderHashRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"witness\",\"type\":\"address\"}],\"name\":\"WitnessAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"witness\",\"type\":\"address\"}],\"name\":\"WitnessRemoved\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_newProviderHash\",\"type\":\"string\"}],\"name\":\"addProviderHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newWitness\",\"type\":\"address\"}],\"name\":\"addWitness\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProviderHashes\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWitnesses\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"isProviderHash\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isWitness\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nullifierRegistry\",\"outputs\":[{\"internalType\":\"contract INullifierRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"providerHashes\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_removeProviderHash\",\"type\":\"string\"}],\"name\":\"removeProviderHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_removeWitness\",\"type\":\"address\"}],\"name\":\"removeWitness\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"provider\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"parameters\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"context\",\"type\":\"string\"}],\"internalType\":\"struct Claims.ClaimInfo\",\"name\":\"claimInfo\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"identifier\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampS\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"internalType\":\"struct Claims.CompleteClaimData\",\"name\":\"claim\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"internalType\":\"struct Claims.SignedClaim\",\"name\":\"signedClaim\",\"type\":\"tuple\"}],\"internalType\":\"struct IProxyBaseProcessor.Proof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"name\":\"verifyProofSignatures\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"provider\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"parameters\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"context\",\"type\":\"string\"}],\"internalType\":\"struct Claims.ClaimInfo\",\"name\":\"claimInfo\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"identifier\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampS\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"internalType\":\"struct Claims.CompleteClaimData\",\"name\":\"claim\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"internalType\":\"struct Claims.SignedClaim\",\"name\":\"signedClaim\",\"type\":\"tuple\"}],\"internalType\":\"struct IProxyBaseProcessor.Proof[]\",\"name\":\"_proofs\",\"type\":\"tuple[]\"}],\"name\":\"verifyProofs\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"expiryTime\",\"type\":\"uint256\"}],\"internalType\":\"struct IVerifyDomainProcessor.DomainRaw[]\",\"name\":\"domains\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"witnesses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addProviderHash(string)\":{\"params\":{\"_newProviderHash\":\"New provider hash to be added\"}},\"addWitness(address)\":{\"params\":{\"_newWitness\":\"Address of the new witness\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"removeProviderHash(string)\":{\"params\":{\"_removeProviderHash\":\"Provider hash to be removed\"}},\"removeWitness(address)\":{\"params\":{\"_removeWitness\":\"Address of witness to be removed\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"verifyProofSignatures(((string,string,string),((bytes32,address,uint32,uint32),bytes[])))\":{\"params\":{\"proof\":\"Proof to be verified\"}},\"verifyProofs(((string,string,string),((bytes32,address,uint32,uint32),bytes[]))[])\":{\"params\":{\"_proofs\":\"Proofs to be verified\"},\"returns\":{\"domains\":\" Array of Domain structs\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addProviderHash(string)\":{\"notice\":\"ONLY OWNER: Add provider hash string. Provider hash must not have been previously added.\"},\"addWitness(address)\":{\"notice\":\"ONLY OWNER: Add witness address. Witness must not have been previously added.\"},\"removeProviderHash(string)\":{\"notice\":\"ONLY OWNER: Remove provider hash string. Provider hash must have been previously added.\"},\"removeWitness(address)\":{\"notice\":\"ONLY OWNER: Remove witness address. Witness must have been previously added.\"},\"verifyProofSignatures(((string,string,string),((bytes32,address,uint32,uint32),bytes[])))\":{\"notice\":\"Verify proof generated by witnesses. Claim is constructed by hashing claimInfo (provider, context, parameters) to get the identifier. And then signing on (identifier, owner, timestamp, epoch) to get claim signature. This function verifies a claim by performing the following checks on the claim - Calculates the hash of the claimInfo and checks if it matches the identifier in the claim - Checks if the signatures are valid and from the witnesses This function reverts if - No signatures are found on the proof - Number of signatures is not equal to the number of witnesses - ClaimInfo hash does not match the identifier in the claim - Signatures are invalid (not from the witnesses) DEV NOTE: This function does NOT validate that the claim provider hash is valid. That is the responsibility of the caller. Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code \"},\"verifyProofs(((string,string,string),((bytes32,address,uint32,uint32),bytes[]))[])\":{\"notice\":\"ONLY REGISTRY: Verifies proofs. Extracts values and formats them into Domain structs.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/VerifyDomainProcessor.sol\":\"VerifyDomainProcessor\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\")\\n mstore(0x1c, hash)\\n message := keccak256(0x00, 0x3c)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40)\\n mstore(ptr, \\\"\\\\x19\\\\x01\\\")\\n mstore(add(ptr, 0x02), domainSeparator)\\n mstore(add(ptr, 0x22), structHash)\\n data := keccak256(ptr, 0x42)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\\n * `validator` and `data` according to the version 0 of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x00\\\", validator, data));\\n }\\n}\\n\",\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"./StringUtils.sol\\\";\\n\\n/**\\n * Library to assist with requesting,\\n * serialising & verifying credentials\\n */\\nlibrary Claims {\\n\\t/** Data required to describe a claim */\\n\\tstruct CompleteClaimData {\\n\\t\\tbytes32 identifier;\\n\\t\\taddress owner;\\n\\t\\tuint32 timestampS;\\n\\t\\tuint32 epoch;\\n\\t}\\n\\n\\tstruct ClaimInfo {\\n\\t\\tstring provider;\\n\\t\\tstring parameters;\\n\\t\\tstring context;\\n\\t}\\n\\n\\t/** Claim with signatures & signer */\\n\\tstruct SignedClaim {\\n\\t\\tCompleteClaimData claim;\\n\\t\\tbytes[] signatures;\\n\\t}\\n\\n\\t/**\\n\\t * Asserts that the claim is signed by the expected witnesses\\n\\t */\\n\\tfunction assertValidSignedClaim(\\n\\t\\tSignedClaim memory self,\\n\\t\\taddress[] memory expectedWitnessAddresses\\n\\t) internal pure {\\n\\t\\trequire(self.signatures.length > 0, \\\"No signatures\\\");\\n\\t\\taddress[] memory signedWitnesses = recoverSignersOfSignedClaim(self);\\n\\t\\tfor (uint256 i = 0; i < expectedWitnessAddresses.length; i++) {\\n\\t\\t\\tbool found = false;\\n\\t\\t\\tfor (uint256 j = 0; j < signedWitnesses.length; j++) {\\n\\t\\t\\t\\tif (signedWitnesses[j] == expectedWitnessAddresses[i]) {\\n\\t\\t\\t\\t\\tfound = true;\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\trequire(found, \\\"Missing witness signature\\\");\\n\\t\\t}\\n\\t}\\n\\n\\t/**\\n\\t * @dev recovers the signer of the claim\\n\\t */\\n\\tfunction recoverSignersOfSignedClaim(\\n\\t\\tSignedClaim memory self\\n\\t) internal pure returns (address[] memory) {\\n\\t\\tbytes memory serialised = serialise(self.claim);\\n\\t\\taddress[] memory signers = new address[](self.signatures.length);\\n\\t\\tfor (uint256 i = 0; i < self.signatures.length; i++) {\\n\\t\\t\\tsigners[i] = verifySignature(serialised, self.signatures[i]);\\n\\t\\t}\\n\\n\\t\\treturn signers;\\n\\t}\\n\\n\\t/**\\n\\t * @dev serialises the credential into a string;\\n\\t * the string is used to verify the signature\\n\\t *\\n\\t * the serialisation is the same as done by the TS library\\n\\t */\\n\\tfunction serialise(\\n\\t\\tCompleteClaimData memory self\\n\\t) internal pure returns (bytes memory) {\\n\\t\\treturn\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\tStringUtils.bytes2str(abi.encodePacked(self.identifier)),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.address2str(self.owner),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.timestampS),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.epoch)\\n\\t\\t\\t);\\n\\t}\\n\\n\\t/**\\n\\t * @dev returns the address of the user that generated the signature\\n\\t */\\n\\tfunction verifySignature(\\n\\t\\tbytes memory content,\\n\\t\\tbytes memory signature\\n\\t) internal pure returns (address signer) {\\n\\t\\tbytes32 signedHash = keccak256(\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\t\\\"\\\\x19Ethereum Signed Message:\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(content.length),\\n\\t\\t\\t\\tcontent\\n\\t\\t\\t)\\n\\t\\t);\\n\\t\\treturn ECDSA.recover(signedHash, signature);\\n\\t}\\n\\n\\tfunction hashClaimInfo(ClaimInfo memory claimInfo) internal pure returns (bytes32) {\\n\\t\\tbytes memory serialised = abi.encodePacked(\\n\\t\\t\\tclaimInfo.provider,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.parameters,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.context\\n\\t\\t);\\n\\t\\treturn keccak256(serialised);\\n\\t}\\n}\\n\",\"keccak256\":\"0x87a41e75d358e86798456ad45e03446cde8f1519c8af17905f6c8b852a5f2da7\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/StringUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/**\\n * Utilities for string manipulation & conversion\\n */\\nlibrary StringUtils {\\n\\tfunction address2str(address x) internal pure returns (string memory) {\\n\\t\\tbytes memory s = new bytes(40);\\n\\t\\tfor (uint i = 0; i < 20; i++) {\\n\\t\\t\\tbytes1 b = bytes1(uint8(uint(uint160(x)) / (2 ** (8 * (19 - i)))));\\n\\t\\t\\tbytes1 hi = bytes1(uint8(b) / 16);\\n\\t\\t\\tbytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));\\n\\t\\t\\ts[2 * i] = getChar(hi);\\n\\t\\t\\ts[2 * i + 1] = getChar(lo);\\n\\t\\t}\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", s));\\n\\t}\\n\\n\\tfunction bytes2str(bytes memory buffer) internal pure returns (string memory) {\\n\\t\\t// Fixed buffer size for hexadecimal convertion\\n\\t\\tbytes memory converted = new bytes(buffer.length * 2);\\n\\t\\tbytes memory _base = \\\"0123456789abcdef\\\";\\n\\n\\t\\tfor (uint256 i = 0; i < buffer.length; i++) {\\n\\t\\t\\tconverted[i * 2] = _base[uint8(buffer[i]) / _base.length];\\n\\t\\t\\tconverted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length];\\n\\t\\t}\\n\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", converted));\\n\\t}\\n\\n\\tfunction getChar(bytes1 b) internal pure returns (bytes1 c) {\\n\\t\\tif (uint8(b) < 10) return bytes1(uint8(b) + 0x30);\\n\\t\\telse return bytes1(uint8(b) + 0x57);\\n\\t}\\n\\n\\tfunction bool2str(bool _b) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_b) {\\n\\t\\t\\treturn \\\"true\\\";\\n\\t\\t} else {\\n\\t\\t\\treturn \\\"false\\\";\\n\\t\\t}\\n\\t}\\n\\n\\tfunction uint2str(uint _i) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_i == 0) {\\n\\t\\t\\treturn \\\"0\\\";\\n\\t\\t}\\n\\t\\tuint j = _i;\\n\\t\\tuint len;\\n\\t\\twhile (j != 0) {\\n\\t\\t\\tlen++;\\n\\t\\t\\tj /= 10;\\n\\t\\t}\\n\\t\\tbytes memory bstr = new bytes(len);\\n\\t\\tuint k = len;\\n\\t\\twhile (_i != 0) {\\n\\t\\t\\tk = k - 1;\\n\\t\\t\\tuint8 temp = (48 + uint8(_i - (_i / 10) * 10));\\n\\t\\t\\tbytes1 b1 = bytes1(temp);\\n\\t\\t\\tbstr[k] = b1;\\n\\t\\t\\t_i /= 10;\\n\\t\\t}\\n\\t\\treturn string(bstr);\\n\\t}\\n\\n\\tfunction areEqual(\\n\\t\\tstring calldata _a,\\n\\t\\tstring storage _b\\n\\t) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction areEqual(string memory _a, string memory _b) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction toLower(string memory str) internal pure returns (string memory) {\\n\\t\\tbytes memory bStr = bytes(str);\\n\\t\\tbytes memory bLower = new bytes(bStr.length);\\n\\t\\tfor (uint i = 0; i < bStr.length; i++) {\\n\\t\\t\\t// Uppercase character...\\n\\t\\t\\tif ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {\\n\\t\\t\\t\\t// So we add 32 to make it lowercase\\n\\t\\t\\t\\tbLower[i] = bytes1(uint8(bStr[i]) + 32);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tbLower[i] = bStr[i];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn string(bLower);\\n\\t}\\n\\n\\tfunction substring(\\n\\t\\tstring memory str,\\n\\t\\tuint startIndex,\\n\\t\\tuint endIndex\\n\\t) internal pure returns (string memory) {\\n\\t\\tbytes memory strBytes = bytes(str);\\n\\t\\tbytes memory result = new bytes(endIndex - startIndex);\\n\\t\\tfor (uint i = startIndex; i < endIndex; i++) {\\n\\t\\t\\tresult[i - startIndex] = strBytes[i];\\n\\t\\t}\\n\\t\\treturn string(result);\\n\\t}\\n}\\n\",\"keccak256\":\"0x15feebafef16d4c74c043b39e652ddae0e121987ceca74b663f6a2d2d7ba8b4b\",\"license\":\"MIT\"},\"contracts/VerifyDomainProcessor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\nimport { ClaimVerifier } from \\\"./external/ClaimVerifier.sol\\\";\\nimport { INullifierRegistry } from \\\"./external/interfaces/INullifierRegistry.sol\\\";\\nimport { ProxyBaseProcessor } from \\\"./external/processors/ProxyBaseProcessor.sol\\\";\\nimport { StringConversionUtils } from \\\"./external/lib/StringConversionUtils.sol\\\";\\nimport { TicketmasterDataParsing } from \\\"./external/TicketmasterDataParsing.sol\\\";\\n\\nimport { IVerifyDomainProcessor } from \\\"./interfaces/IVerifyDomainProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\n\\ncontract VerifyDomainProcessor is IVerifyDomainProcessor, ProxyBaseProcessor {\\n\\n using StringConversionUtils for string;\\n\\n /* ============ Constants ============ */\\n uint8 constant MAX_EXTRACT_VALUES = 5;\\n\\n /* ============ State Variables ============ */\\n address public immutable registry;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _registry,\\n INullifierRegistry _nullifierRegistry,\\n string[] memory _providerHashes\\n ) \\n ProxyBaseProcessor(_nullifierRegistry, _providerHashes)\\n {\\n registry = _registry;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * ONLY REGISTRY: Verifies proofs. Extracts values and formats them into Domain structs.\\n *\\n * @param _proofs Proofs to be verified\\n * @return domains Array of Domain structs\\n */\\n function verifyProofs(\\n Proof[] memory _proofs\\n ) \\n external \\n override\\n returns (DomainRaw[] memory domains)\\n {\\n require(msg.sender == registry, \\\"Only registry can call\\\");\\n\\n domains = new DomainRaw[](_proofs.length);\\n\\n for (uint256 i = 0; i < _proofs.length; i++) {\\n Proof memory proof = _proofs[i];\\n\\n verifyProofSignatures(proof);\\n\\n (\\n string memory domainName,\\n string memory expiryTimeStr,\\n string memory providerHash\\n ) = _extractValues(proof);\\n\\n // Check provider hash\\n require(_validateProviderHash(providerHash), \\\"No valid providerHash\\\");\\n\\n _validateAndAddNullifier(proof.signedClaim.signatures);\\n\\n domains[i] = DomainRaw({\\n name: domainName,\\n // The TicketmasterDataParsing library's date parsing logic is pretty generic, and works for domain \\n // expiry dates as well. Similar to Ticketmaster dates, the expiry time is of the format \\\"YYYY-MM-DDTHH:MM:SS\\\"\\n // and returns UTC timestamps.\\n expiryTime: TicketmasterDataParsing._dateStringToTimestamp(expiryTimeStr)\\n });\\n }\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n /**\\n * Extracts all values from the proof context.\\n *\\n * @param _proof The proof containing the context to extract values from.\\n */\\n function _extractValues(Proof memory _proof) internal pure returns (\\n string memory domainName,\\n string memory expiryTime,\\n string memory providerHash\\n ) {\\n string[] memory values = ClaimVerifier.extractAllFromContext(\\n _proof.claimInfo.context, \\n MAX_EXTRACT_VALUES, \\n true\\n );\\n\\n return (\\n values[0], // domainName\\n values[1], // expiryTime\\n values[2] // providerHash\\n );\\n }\\n}\\n\",\"keccak256\":\"0x34c84f99070a4b76cca1d63b5d8eee8edd8a0e98ace63cca4681d71327f4c18a\",\"license\":\"MIT\"},\"contracts/external/ClaimVerifier.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Claims } from \\\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\nlibrary ClaimVerifier {\\n\\n /**\\n * Find the end index of target string in the data string. Returns the end index + 1 if\\n * the target string in the data string if found. Returns type(uint256).max if:\\n * - Target is longer than data\\n * - Target is not found\\n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\\n */\\n function findSubstringEndIndex(\\n string memory data,\\n string memory target\\n ) public pure returns (uint256) {\\n bytes memory dataBytes = bytes(data);\\n bytes memory targetBytes = bytes(target);\\n\\n if (dataBytes.length < targetBytes.length) {\\n return type(uint256).max;\\n }\\n\\n // Find start of target\\n for (uint i = 0; i <= dataBytes.length - targetBytes.length; i++) {\\n bool isMatch = true;\\n\\n for (uint j = 0; j < targetBytes.length && isMatch; j++) {\\n if (dataBytes[i + j] != targetBytes[j]) {\\n isMatch = false;\\n break;\\n }\\n }\\n\\n if (isMatch) {\\n return i + targetBytes.length; // Return end index + 1\\n }\\n }\\n\\n return type(uint256).max;\\n }\\n\\n /**\\n * Extracts given target field value from context in claims. Extracts only ONE value.\\n * Pass prefix formatted with quotes, for example '\\\"providerHash\\\\\\\":\\\\\\\"'\\n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\\n *\\n * @param data Context string from which target value needs to be extracted\\n * @param prefix Prefix of the target value that needs to be extracted \\n */\\n function extractFieldFromContext(\\n string memory data,\\n string memory prefix\\n ) public pure returns (string memory) {\\n // Find end index of prefix; which is the start index of the value\\n uint256 start = findSubstringEndIndex(data, prefix);\\n\\n bytes memory dataBytes = bytes(data);\\n if (start == dataBytes.length) {\\n return \\\"\\\"; // Prefix not found. Malformed or missing message\\n }\\n \\n // Find the end of the VALUE, assuming it ends with a quote not preceded by a backslash\\n uint256 end = start;\\n while (\\n end < dataBytes.length &&\\n !(dataBytes[end] == '\\\"' && dataBytes[end - 1] != \\\"\\\\\\\\\\\")\\n ) {\\n end++;\\n }\\n if (end <= start) {\\n return \\\"\\\"; // Malformed or missing message\\n }\\n bytes memory contextMessage = new bytes(end - start);\\n for (uint i = start; i < end; i++) {\\n contextMessage[i - start] = dataBytes[i];\\n }\\n return string(contextMessage);\\n }\\n\\n\\n /**\\n * Extracts ALL values from context in a single pass. Context is stored as serialized JSON string with \\n * two keys: extractedParameters and providerHash. ExtractedParameters itself is a JSON string with \\n * key-value pairs. This function returns extracted individual values from extractedParameters along \\n * with providerHash (if extractProviderHash is true). Use maxValues to limit the number of expected values\\n * to be extracted from extractedParameters. In most cases, one would need to extract all values from\\n * extractedParameters and providerHash, hence use this function over calling extractFieldFromContext \\n * multiple times.\\n * \\n * @param data Context string from which target value needs to be extracted\\n * @param maxValues Maximum number of values to be extracted from extractedParameters\\n * @param extractProviderHash Extracts and returns providerHash if true\\n */\\n function extractAllFromContext(\\n string memory data,\\n uint8 maxValues,\\n bool extractProviderHash\\n ) public pure returns (string[] memory) {\\n \\n require(maxValues > 0, \\\"Max values must be greater than 0\\\");\\n\\n bytes memory dataBytes = bytes(data);\\n uint index = 0;\\n\\n bytes memory extractedParametersBytes = bytes('{\\\\\\\"extractedParameters\\\\\\\":{\\\\\\\"');\\n for (uint i = 0; i < extractedParametersBytes.length; i++) {\\n require(dataBytes[index + i] == extractedParametersBytes[i], \\\"Extraction failed. Malformed extractedParameters\\\");\\n }\\n index += extractedParametersBytes.length;\\n\\n bool isValue = false; // starts with a key right after '{\\\\\\\"extractedParameters\\\\\\\":{\\\\\\\"'\\n uint valuesFound = 0;\\n \\n uint[] memory valueIndices = new uint[](extractProviderHash ? 2 * (maxValues + 1): 2 * maxValues);\\n\\n while (\\n index < dataBytes.length\\n ) {\\n // Keep incrementing until '\\\"', escaped quotes are not considered\\n if (!(dataBytes[index] == '\\\"' && dataBytes[index - 1] != \\\"\\\\\\\\\\\")) {\\n index++;\\n continue;\\n }\\n\\n if (!isValue) {\\n // \\\\\\\":\\\\\\\" (3 chars)\\n require(dataBytes[index + 1] == \\\":\\\" && dataBytes[index + 2] == '\\\\\\\"', \\\"Extraction failed. Malformed data 1\\\");\\n index += 3; // move it after \\\\\\\"\\n isValue = true;\\n valueIndices[2 * valuesFound] = index; // start index\\n } else {\\n // \\\\\\\",\\\\\\\" (3 chars) or \\\\\\\"}, (3 chars)\\n // \\\\\\\"}} is not supported, there should always be a providerHash\\n require(\\n dataBytes[index + 1] == \\\",\\\" && dataBytes[index + 2] == '\\\\\\\"' || \\n dataBytes[index + 1] == '}' && dataBytes[index + 2] == \\\",\\\",\\n \\\"Extraction failed. Malformed data 2\\\"\\n );\\n valueIndices[2 * valuesFound + 1] = index; // end index\\n valuesFound++;\\n\\n if (dataBytes[index + 1] == \\\",\\\") {\\n // Revert if valuesFound == maxValues and next char is a comma as there will be more values\\n require(valuesFound != maxValues, \\\"Extraction failed. Exceeded max values\\\");\\n index += 3;\\n isValue = false;\\n } else { // index + 1 = \\\"}\\\"\\n index += 3;\\n break; // end of extractedParameters\\n }\\n }\\n }\\n\\n if (extractProviderHash) {\\n bytes memory providerHashParamBytes = bytes(\\\"\\\\\\\"providerHash\\\\\\\":\\\\\\\"\\\");\\n for (uint i = 0; i < providerHashParamBytes.length; i++) {\\n require(dataBytes[index + i] == providerHashParamBytes[i], \\\"Extraction failed. Malformed providerHash\\\");\\n }\\n index += providerHashParamBytes.length;\\n \\n // final indices tuple in valueIndices will be for star and end indices of provider hash\\n valueIndices[2 * valuesFound] = index;\\n // Keep incrementing until '\\\"'\\n while (\\n index < dataBytes.length && dataBytes[index] != '\\\"'\\n ) {\\n index++;\\n }\\n valueIndices[2 * valuesFound + 1] = index;\\n valuesFound++;\\n } \\n \\n string[] memory values = new string[](valuesFound);\\n \\n for (uint i = 0; i < valuesFound; i++) {\\n uint startIndex = valueIndices[2 * i];\\n uint endIndex = valueIndices[2 * i + 1];\\n bytes memory contextValue = new bytes(endIndex - startIndex);\\n for (uint j = startIndex; j < endIndex; j++) {\\n contextValue[j - startIndex] = dataBytes[j];\\n }\\n values[i] = string(contextValue);\\n }\\n\\n return values;\\n }\\n}\\n\",\"keccak256\":\"0xac6a8d456c3b2c5ab5a475279a2f0f103faff3cb2d6abb2ce2029cd4265b904e\",\"license\":\"MIT\"},\"contracts/external/TicketmasterDataParsing.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { DateTime } from \\\"./lib/DateTime.sol\\\";\\n\\nimport { StringConversionUtils } from \\\"./lib/StringConversionUtils.sol\\\";\\nimport { ClaimVerifier } from \\\"./ClaimVerifier.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\nlibrary TicketmasterDataParsing {\\n \\n using StringConversionUtils for string;\\n\\n /**\\n * @notice Iterates through every character in the date string and splits the string at each dash, \\\"T\\\", or colon. Function will revert\\n * if there are not 6 substrings formed from the split. The substrings are then converted to uints and passed to the DateTime lib\\n * to get the unix timestamp. This function is SPECIFIC TO THE DATE FORMAT USED BY Ticketmaster, not suitable for use with other date\\n * formats. Ticketmaster date format is: \\\"YYYY-MM-DDTHH:MM:SS\\\" and returns UTC timestamps.\\n *\\n * @param _dateString Date string to be converted to a UTC timestamp\\n */\\n function _dateStringToTimestamp(string memory _dateString) internal pure returns (uint256 utcTimestamp) {\\n string[6] memory extractedStrings;\\n uint256 breakCounter;\\n uint256 lastBreak;\\n for (uint256 i = 0; i < bytes(_dateString).length; i++) {\\n if (bytes(_dateString)[i] == 0x2d || bytes(_dateString)[i] == 0x3a || bytes(_dateString)[i] == 0x54) {\\n extractedStrings[breakCounter] = _dateString.substring(lastBreak, i);\\n lastBreak = i + 1;\\n breakCounter++;\\n }\\n }\\n // Add last substring to array\\n extractedStrings[breakCounter] = _dateString.substring(lastBreak, bytes(_dateString).length);\\n\\n // Check that exactly 6 substrings were found (string is split at 5 different places)\\n require(breakCounter == 5, \\\"Invalid date string\\\");\\n\\n utcTimestamp = DateTime.timestampFromDateTime(\\n extractedStrings[0].stringToUint(0), // year\\n extractedStrings[1].stringToUint(0), // month\\n extractedStrings[2].stringToUint(0), // day\\n extractedStrings[3].stringToUint(0), // hour\\n extractedStrings[4].stringToUint(0), // minute\\n 0 // we don't need to the second granularity\\n );\\n }\\n\\n /**\\n * Extract event ID from URL by finding the last slash and taking the substring after it. We assume the\\n * URL is formulated something like: {domainRoot}/.../event/EVENT_ID\\n *\\n * @param _url URL to extract event ID from\\n * @return Event ID extracted from URL\\n */\\n function _extractEventIdFromUrl(string memory _url) internal pure returns (string memory) {\\n string memory prefix = \\\"event/\\\";\\n bytes memory urlBytes = bytes(_url);\\n uint256 urlLength = urlBytes.length;\\n\\n uint256 startIndex = ClaimVerifier.findSubstringEndIndex(_url, prefix);\\n // If the start index is the max value or the URL length, then the event ID was not found\\n if (startIndex == type(uint256).max || startIndex == urlLength) {\\n revert(\\\"Event ID not found in URL\\\");\\n }\\n\\n bytes memory contextMessage = new bytes(urlLength - startIndex);\\n for (uint i = startIndex; i < urlLength; i++) {\\n contextMessage[i - startIndex] = urlBytes[i];\\n }\\n return string(contextMessage);\\n }\\n\\n /**\\n * Parse tickets out of a ticket string of the format: '[\\\"ticket1\\\", \\\"ticket2\\\", \\\"ticket3\\\"]'.\\n * We start by getting the number of tickets in a string by counting the number of commas and adding 1.\\n * Then we iterate through the string and find the ticket IDs by looking for the quotes. We need to extract\\n * from quote to quote so we look for all even-numbered quotes then extract the string between that and the\\n * previous quote index.\\n *\\n * @param _ticketString Stringified array of tickets\\n */\\n function _parseTicketString(string memory _ticketString) internal pure returns (string[] memory ticketIds) {\\n // Assume there is at least one ticket (which means array would not have a comma)\\n // If there is no ticket then the transaction will end up reverting\\n uint256 ticketCount = 1;\\n for (uint256 i = 0; i < bytes(_ticketString).length; i++) {\\n if (bytes(_ticketString)[i] == 0x2C) {\\n ticketCount++;\\n }\\n }\\n\\n ticketIds = new string[](ticketCount);\\n uint256 breakCounter;\\n uint256 lastBreak;\\n for (uint256 i = 0; i < bytes(_ticketString).length; i++) {\\n if (bytes(_ticketString)[i] == 0x22) {\\n breakCounter++;\\n if (breakCounter % 2 == 0) {\\n ticketIds[(breakCounter/2)-1] = _ticketString.substring(lastBreak, i-1);\\n }\\n lastBreak = i + 1;\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x23a87b78bf72170f5e0cee6e4a8c59f68947c50971e00d183580ebe473a148c2\",\"license\":\"MIT\"},\"contracts/external/interfaces/INullifierRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface INullifierRegistry {\\n function addNullifier(bytes32 _nullifier) external;\\n function isNullified(bytes32 _nullifier) external view returns(bool);\\n}\\n\",\"keccak256\":\"0x107164bc9a320938b513305878163b7fa884da4cdae58d0c8e81bfbb00c97c5e\",\"license\":\"MIT\"},\"contracts/external/interfaces/IProxyBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Claims } from \\\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IProxyBaseProcessor {\\n \\n struct Proof {\\n Claims.ClaimInfo claimInfo;\\n Claims.SignedClaim signedClaim;\\n }\\n}\\n\",\"keccak256\":\"0x65aa00301110dfdf8333bd9bb71ebad241d66ea5840a2db3ac6d4f6037083cb8\",\"license\":\"MIT\"},\"contracts/external/lib/AddressArrayUtils.sol\":{\"content\":\"/*\\n Copyright 2020 Set Labs Inc.\\n\\n Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n you may not use this file except in compliance with the License.\\n You may obtain a copy of the License at\\n\\n http://www.apache.org/licenses/LICENSE-2.0\\n\\n Unless required by applicable law or agreed to in writing, software\\n distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n See the License for the specific language governing permissions and\\n limitations under the License.\\n\\n SPDX-License-Identifier: MIT\\n*/\\n\\npragma solidity ^0.8.17;\\n\\n/**\\n * @title AddressArrayUtils\\n * @author Set Protocol\\n *\\n * Utility functions to handle Address Arrays\\n *\\n * CHANGELOG:\\n * - 4/21/21: Added validatePairsWithArray methods\\n */\\nlibrary AddressArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(address[] memory A, address a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(address[] memory A, address a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns true if there are 2 elements that are the same in an array\\n * @param A The input array to search\\n * @return Returns boolean for the first occurrence of a duplicate\\n */\\n function hasDuplicate(address[] memory A) internal pure returns(bool) {\\n require(A.length > 0, \\\"A is empty\\\");\\n\\n for (uint256 i = 0; i < A.length - 1; i++) {\\n address current = A[i];\\n for (uint256 j = i + 1; j < A.length; j++) {\\n if (current == A[j]) {\\n return true;\\n }\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n * @return Returns the array with the object removed.\\n */\\n function remove(address[] memory A, address a)\\n internal\\n pure\\n returns (address[] memory)\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n (address[] memory _A,) = pop(A, index);\\n return _A;\\n }\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n */\\n function removeStorage(address[] storage A, address a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n\\n /**\\n * Removes specified index from array\\n * @param A The input array to search\\n * @param index The index to remove\\n * @return Returns the new array and the removed entry\\n */\\n function pop(address[] memory A, uint256 index)\\n internal\\n pure\\n returns (address[] memory, address)\\n {\\n uint256 length = A.length;\\n require(index < A.length, \\\"Index must be < A length\\\");\\n address[] memory newAddresses = new address[](length - 1);\\n for (uint256 i = 0; i < index; i++) {\\n newAddresses[i] = A[i];\\n }\\n for (uint256 j = index + 1; j < length; j++) {\\n newAddresses[j - 1] = A[j];\\n }\\n return (newAddresses, A[index]);\\n }\\n}\\n\",\"keccak256\":\"0x486f1a373f33aa167227600ac2d0bf95b37685413d98a3e745107188f00ae405\",\"license\":\"MIT\"},\"contracts/external/lib/DateTime.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// ----------------------------------------------------------------------------\\n// DateTime Library v2.0\\n//\\n// A gas-efficient Solidity date and time library\\n//\\n// https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary\\n//\\n// Tested date range 1970/01/01 to 2345/12/31\\n//\\n// Conventions:\\n// Unit | Range | Notes\\n// :-------- |:-------------:|:-----\\n// timestamp | >= 0 | Unix timestamp, number of seconds since 1970/01/01 00:00:00 UTC\\n// year | 1970 ... 2345 |\\n// month | 1 ... 12 |\\n// day | 1 ... 31 |\\n// hour | 0 ... 23 |\\n// minute | 0 ... 59 |\\n// second | 0 ... 59 |\\n// dayOfWeek | 1 ... 7 | 1 = Monday, ..., 7 = Sunday\\n//\\n//\\n// Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018-2019. The MIT Licence.\\n//\\n// NOTE: This library has been pruned to keep only functions needed by zkp2p\\n// ----------------------------------------------------------------------------\\n\\nlibrary DateTime {\\n uint256 constant SECONDS_PER_DAY = 24 * 60 * 60;\\n uint256 constant SECONDS_PER_HOUR = 60 * 60;\\n uint256 constant SECONDS_PER_MINUTE = 60;\\n int256 constant OFFSET19700101 = 2440588;\\n\\n uint256 constant DOW_MON = 1;\\n uint256 constant DOW_TUE = 2;\\n uint256 constant DOW_WED = 3;\\n uint256 constant DOW_THU = 4;\\n uint256 constant DOW_FRI = 5;\\n uint256 constant DOW_SAT = 6;\\n uint256 constant DOW_SUN = 7;\\n\\n // ------------------------------------------------------------------------\\n // Calculate the number of days from 1970/01/01 to year/month/day using\\n // the date conversion algorithm from\\n // http://aa.usno.navy.mil/faq/docs/JD_Formula.php\\n // and subtracting the offset 2440588 so that 1970/01/01 is day 0\\n //\\n // days = day\\n // - 32075\\n // + 1461 * (year + 4800 + (month - 14) / 12) / 4\\n // + 367 * (month - 2 - (month - 14) / 12 * 12) / 12\\n // - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4\\n // - offset\\n // ------------------------------------------------------------------------\\n function _daysFromDate(uint256 year, uint256 month, uint256 day) internal pure returns (uint256 _days) {\\n require(year >= 1970);\\n int256 _year = int256(year);\\n int256 _month = int256(month);\\n int256 _day = int256(day);\\n\\n int256 __days = _day - 32075 + (1461 * (_year + 4800 + (_month - 14) / 12)) / 4\\n + (367 * (_month - 2 - ((_month - 14) / 12) * 12)) / 12\\n - (3 * ((_year + 4900 + (_month - 14) / 12) / 100)) / 4 - OFFSET19700101;\\n\\n _days = uint256(__days);\\n }\\n\\n function timestampFromDateTime(\\n uint256 year,\\n uint256 month,\\n uint256 day,\\n uint256 hour,\\n uint256 minute,\\n uint256 second\\n )\\n internal\\n pure\\n returns (uint256 timestamp)\\n {\\n timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + hour * SECONDS_PER_HOUR\\n + minute * SECONDS_PER_MINUTE + second;\\n }\\n}\\n\",\"keccak256\":\"0x64f6113ad342f8bd3c2eb74fde279401d604faf77dd08f6c16c3912c3519f170\",\"license\":\"MIT\"},\"contracts/external/lib/StringArrayUtils.sol\":{\"content\":\"/*\\n Copyright 2020 Set Labs Inc.\\n\\n Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n you may not use this file except in compliance with the License.\\n You may obtain a copy of the License at\\n\\n http://www.apache.org/licenses/LICENSE-2.0\\n\\n Unless required by applicable law or agreed to in writing, software\\n distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n See the License for the specific language governing permissions and\\n limitations under the License.\\n\\n SPDX-License-Identifier: Apache-2.0\\n*/\\n\\npragma solidity ^0.8.18;\\n\\n/**\\n * @title StringArrayUtils\\n * @author Set Protocol\\n *\\n * Utility functions to handle String Arrays\\n */\\nlibrary StringArrayUtils {\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input string to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(string[] memory A, string memory a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (keccak256(bytes(A[i])) == keccak256(bytes(a))) {\\n return (i, true);\\n }\\n }\\n return (type(uint256).max, false);\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The string to remove\\n */\\n function removeStorage(string[] storage A, string memory a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"String not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n}\",\"keccak256\":\"0x249b6dc922e7e1602f3c2e77075d3b9d259d3badc744241ecf2ca2ee1cbcd56c\",\"license\":\"Apache-2.0\"},\"contracts/external/lib/StringConversionUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\n// Building on zk-email's StringUtils library we add the ability to handle decimals when\\n// converting from string to Uint\\nlibrary StringConversionUtils {\\n \\n /**\\n * @notice Function that parses numbers returned as strings including floating point numbers. Returned floating point\\n * numbers are to have the desired amount of decimal specified. If the stringified version of the floating point\\n * number has more decimal places than desired then the function will revert in order to be maximally safe. If\\n * the returned number has multiple floating points then the function will revert.\\n *\\n * Examples: _s = \\\"12.34\\\", _expectedDecimals = 6 => 12340000\\n * _s = \\\"12.34\\\", _expectedDecimals = 2 => 1234\\n * _s = \\\"12.34\\\", _expectedDecimals = 1 => REVERT (we never want loss of precision only addition)\\n * _s = \\\"12.34.56\\\", _expectedDecimals = 6 => REVERT (Invalid number)\\n *\\n * @param _s String being processed\\n * @param _desiredDecimals Desired amount of decimal places\\n */\\n function stringToUint(string memory _s, uint256 _desiredDecimals) internal pure returns (uint256) {\\n return stringToUint(_s, 0x2E, _desiredDecimals);\\n }\\n\\n function stringToUint(\\n string memory _s,\\n bytes1 _decimalCharacter,\\n uint256 _desiredDecimals\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n bytes memory b = bytes(_s);\\n\\n uint256 result = 0;\\n uint256 decimalPlaces = 0;\\n\\n bool decimals = false;\\n for (uint256 i = 0; i < b.length; i++) {\\n if (b[i] >= 0x30 && b[i] <= 0x39) {\\n result = result * 10 + (uint256(uint8(b[i])) - 48);\\n }\\n\\n if (decimals) {\\n decimalPlaces++;\\n }\\n\\n if (b[i] == _decimalCharacter) {\\n require(decimals == false, \\\"String has multiple decimals\\\");\\n decimals = true;\\n }\\n }\\n\\n require(decimalPlaces <= _desiredDecimals, \\\"String has too many decimal places\\\");\\n return result * (10 ** (_desiredDecimals - decimalPlaces));\\n }\\n\\n /**\\n * @notice Function that returns a substring from _startIndex to _endIndex (non-inclusive).\\n *\\n * @param _str String being processed\\n * @param _startIndex Index to start parsing from\\n * @param _endIndex Index to stop parsing at (index not included in result)\\n */\\n function substring(string memory _str, uint _startIndex, uint _endIndex) internal pure returns (string memory ) {\\n bytes memory strBytes = bytes(_str);\\n bytes memory result = new bytes(_endIndex-_startIndex);\\n for(uint i = _startIndex; i < _endIndex; i++) {\\n result[i-_startIndex] = strBytes[i];\\n }\\n return string(result);\\n }\\n\\n function replaceString(\\n string memory _str,\\n string memory _lookupValue,\\n string memory _replaceValue\\n )\\n internal\\n pure\\n returns (string memory)\\n {\\n bytes memory strBytes = bytes(_str);\\n bytes memory lookupBytes = bytes(_lookupValue);\\n\\n uint256 lookupIndex = indexOf(_str, _lookupValue);\\n if (lookupIndex == type(uint256).max) {\\n return _str;\\n }\\n\\n // Split the original string into two parts: before and after the keyword\\n string memory beforeKeyword = substring(_str, 0, lookupIndex);\\n string memory afterKeyword = substring(_str, lookupIndex + lookupBytes.length, strBytes.length);\\n \\n return string.concat(beforeKeyword, _replaceValue, afterKeyword);\\n }\\n\\n function indexOf(string memory str, string memory substr) internal pure returns (uint) {\\n bytes memory strBytes = bytes(str);\\n bytes memory substrBytes = bytes(substr);\\n \\n if (strBytes.length < substrBytes.length) return type(uint256).max;\\n \\n for (uint i = 0; i <= strBytes.length - substrBytes.length; i++) {\\n bool found = true;\\n for (uint j = 0; j < substrBytes.length; j++) {\\n if (strBytes[i + j] != substrBytes[j]) {\\n found = false;\\n break;\\n }\\n }\\n if (found) return i;\\n }\\n \\n return type(uint256).max;\\n }\\n\\n function stringComparison(string memory _a, string memory _b) internal pure returns (bool) {\\n return (keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b)));\\n }\\n}\\n\",\"keccak256\":\"0xfcdfb3c2c8d5a6b7f480f827049782a70fb98f8b3838dcad0e0bb95237b94a0c\",\"license\":\"MIT\"},\"contracts/external/processors/ProxyBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport { Claims } from \\\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\\\";\\n\\nimport { AddressArrayUtils } from \\\"../lib/AddressArrayUtils.sol\\\";\\nimport { StringArrayUtils } from \\\"../lib/StringArrayUtils.sol\\\";\\nimport { INullifierRegistry } from \\\"../interfaces/INullifierRegistry.sol\\\";\\nimport { IProxyBaseProcessor } from \\\"../interfaces/IProxyBaseProcessor.sol\\\";\\nimport { ClaimVerifier } from \\\"../ClaimVerifier.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract ProxyBaseProcessor is IProxyBaseProcessor, Ownable {\\n\\n using AddressArrayUtils for address[];\\n using StringArrayUtils for string[];\\n\\n /* ============ State Variables ============ */\\n mapping(address => bool) public isWitness;\\n address[] public witnesses;\\n mapping(string => bool) public isProviderHash;\\n string[] public providerHashes; // Set of provider hashes that these proofs should be for\\n INullifierRegistry public immutable nullifierRegistry;\\n\\n /* ============ Events ============ */\\n event WitnessAdded(address witness);\\n event WitnessRemoved(address witness);\\n event ProviderHashAdded(string providerHash);\\n event ProviderHashRemoved(string providerHash);\\n\\n /* ============ Constructor ============ */\\n constructor(\\n INullifierRegistry _nulliferRegistry,\\n string[] memory _providerHashes\\n )\\n Ownable()\\n {\\n nullifierRegistry = _nulliferRegistry;\\n\\n for (uint256 i = 0; i < _providerHashes.length; i++) {\\n require(!isProviderHash[_providerHashes[i]], \\\"Provider hash already added\\\");\\n isProviderHash[_providerHashes[i]] = true;\\n providerHashes.push(_providerHashes[i]);\\n\\n emit ProviderHashAdded(_providerHashes[i]);\\n }\\n }\\n\\n /* ============ Admin Functions ============ */\\n\\n /**\\n * ONLY OWNER: Add witness address. Witness must not have been previously added.\\n *\\n * @param _newWitness Address of the new witness\\n */\\n function addWitness(address _newWitness) external onlyOwner {\\n require(!isWitness[_newWitness], \\\"Address is already a witness\\\");\\n\\n isWitness[_newWitness] = true;\\n witnesses.push(_newWitness);\\n\\n emit WitnessAdded(_newWitness);\\n }\\n\\n /**\\n * ONLY OWNER: Remove witness address. Witness must have been previously added.\\n *\\n * @param _removeWitness Address of witness to be removed\\n */\\n function removeWitness(address _removeWitness) external onlyOwner {\\n require(isWitness[_removeWitness], \\\"Address is not a witness\\\");\\n\\n delete isWitness[_removeWitness];\\n witnesses.removeStorage(_removeWitness);\\n\\n emit WitnessRemoved(_removeWitness);\\n }\\n\\n /**\\n * ONLY OWNER: Add provider hash string. Provider hash must not have been previously added.\\n *\\n * @param _newProviderHash New provider hash to be added\\n */\\n function addProviderHash(string memory _newProviderHash) external onlyOwner {\\n require(!isProviderHash[_newProviderHash], \\\"Provider hash already added\\\");\\n\\n isProviderHash[_newProviderHash] = true;\\n providerHashes.push(_newProviderHash);\\n\\n emit ProviderHashAdded(_newProviderHash);\\n }\\n\\n /**\\n * ONLY OWNER: Remove provider hash string. Provider hash must have been previously added.\\n *\\n * @param _removeProviderHash Provider hash to be removed\\n */\\n function removeProviderHash(string memory _removeProviderHash) external onlyOwner {\\n require(isProviderHash[_removeProviderHash], \\\"Provider hash not found\\\");\\n\\n delete isProviderHash[_removeProviderHash];\\n providerHashes.removeStorage(_removeProviderHash);\\n\\n emit ProviderHashRemoved(_removeProviderHash);\\n }\\n\\n /* ============ Public Functions ============ */\\n \\n /**\\n * Verify proof generated by witnesses. Claim is constructed by hashing claimInfo (provider, context, parameters)\\n * to get the identifier. And then signing on (identifier, owner, timestamp, epoch) to get claim signature. \\n * This function verifies a claim by performing the following checks on the claim\\n * - Calculates the hash of the claimInfo and checks if it matches the identifier in the claim\\n * - Checks if the signatures are valid and from the witnesses\\n * This function reverts if\\n * - No signatures are found on the proof\\n * - Number of signatures is not equal to the number of witnesses\\n * - ClaimInfo hash does not match the identifier in the claim\\n * - Signatures are invalid (not from the witnesses)\\n * \\n * DEV NOTE: This function does NOT validate that the claim provider hash is valid. That is the \\n * responsibility of the caller.\\n * \\n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\\n * \\n * @param proof Proof to be verified\\n */\\n function verifyProofSignatures(Proof memory proof) public view returns (bool) {\\n\\n // create signed claim using claimData and signature.\\n require(proof.signedClaim.signatures.length > 0, \\\"No signatures\\\");\\n Claims.SignedClaim memory signed = Claims.SignedClaim(\\n proof.signedClaim.claim,\\n proof.signedClaim.signatures\\n );\\n\\n // check if the hash from the claimInfo is equal to the infoHash in the claimData\\n bytes32 hashed = Claims.hashClaimInfo(proof.claimInfo);\\n require(proof.signedClaim.claim.identifier == hashed, \\\"ClaimInfo hash doesn't match\\\");\\n\\n // Recover signers of the signed claim\\n address[] memory signedWitnesses = Claims.recoverSignersOfSignedClaim(signed);\\n\\n // check if the number of signatures is equal to the number of witnesses\\n require(\\n signedWitnesses.length == witnesses.length,\\n \\\"Number of signatures not equal to number of witnesses\\\"\\n );\\n\\n // Check signatures are from witnesses\\n for (uint256 i = 0; i < signed.signatures.length; i++) {\\n bool found = false;\\n for (uint j = 0; j < witnesses.length; j++) {\\n if (signedWitnesses[i] == witnesses[j]) {\\n found = true;\\n break;\\n }\\n }\\n require(found, \\\"Signature not appropriate\\\");\\n }\\n\\n return true;\\n }\\n\\n\\n /* ============ View Functions ============ */\\n\\n function getWitnesses() external view returns (address[] memory) {\\n return witnesses;\\n }\\n\\n function getProviderHashes() external view returns (string[] memory) {\\n return providerHashes;\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n function _validateProviderHash(string memory _providerHash) internal view returns (bool) {\\n return isProviderHash[_providerHash];\\n }\\n \\n function _validateAndAddNullifier(bytes[] memory _sigArray) internal {\\n bytes32 nullifier = keccak256(abi.encode(_sigArray));\\n require(!nullifierRegistry.isNullified(nullifier), \\\"Nullifier has already been used\\\");\\n nullifierRegistry.addNullifier(nullifier);\\n }\\n}\\n\",\"keccak256\":\"0xbfbe301dc003e40793876e36d29ac7da3b294031dc74d26f4e41fcdf3deb1144\",\"license\":\"MIT\"},\"contracts/interfaces/IVerifyDomainProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\nimport { IProxyBaseProcessor } from \\\"../external/interfaces/IProxyBaseProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IVerifyDomainProcessor is IProxyBaseProcessor {\\n \\n struct DomainRaw {\\n string name;\\n uint256 expiryTime;\\n }\\n\\n function verifyProofs(\\n Proof[] memory _proofs\\n ) \\n external \\n returns (DomainRaw[] memory domains);\\n}\",\"keccak256\":\"0xe66335a9d8fb3d03a9ee76bf44fbec775311aeed3f6666862f06124b6605a123\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60c06040523462000051576200001f620000186200027f565b91620002a7565b6040516136af620008888239608051818181610b4a015261357d015260a0518181816108a50152610fff01526136af90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200008e57604052565b62000056565b90620000ab620000a360405190565b92836200006c565b565b6001600160a01b031690565b90565b6001600160a01b0381165b036200005157565b90505190620000ab82620000bc565b6001600160a01b038116620000c7565b90505190620000ab82620000de565b6001600160401b0381116200008e5760208091020190565b6001600160401b0381116200008e57602090601f01601f19160190565b0190565b60005b8381106200014a5750506000910152565b818101518382015260200162000139565b90929192620001746200016e8262000115565b62000094565b938185526020850190828401116200005157620000ab9262000136565b9080601f8301121562000051578151620000b9926020016200015b565b929190620001c06200016e82620000fd565b9381855260208086019202810191838311620000515781905b838210620001e8575050505050565b81516001600160401b03811162000051576020916200020b878493870162000191565b815201910190620001d9565b9080601f8301121562000051578151620000b992602001620001ae565b9160608383031262000051576200024c8284620000cf565b926200025c8360208301620000ee565b60408201519093906001600160401b0381116200005157620000b9920162000217565b620002a262003f3780380380620002968162000094565b92833981019062000234565b909192565b91620002b391620006bb565b60a052565b620000b9620000b9620000b99290565b634e487b7160e01b600052601160045260246000fd5b6000198114620002ee5760010190565b620002c8565b634e487b7160e01b600052603260045260246000fd5b9062000314825190565b81101562000326576020809102010190565b620002f4565b62000132620003479260209262000341815190565b94859290565b9384910162000136565b620003646200013291602094936200032c565b918252565b620003816200037760405190565b9283928362000351565b03902090565b620000b99162000369565b156200039a57565b60405162461bcd60e51b815260206004820152601b60248201527f50726f7669646572206861736820616c726561647920616464656400000000006044820152606490fd5b9060ff905b9181191691161790565b9062000401620000b96200040992151590565b8254620003df565b9055565b8054821015620003265762000429600191600052602060002090565b91020190600090565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801562000481575b60208310146200047b57565b62000448565b91607f16916200046f565b9160001960089290920291821b911b620003e4565b9190620004b6620000b96200040993620002b8565b9083546200048c565b620000ab91600091620004a1565b818110620004d9575050565b80620004e96000600193620004bf565b01620004cd565b9190601f81116200050057505050565b62000514620000ab93600052602060002090565b906020601f84018190048301931062000538575b6020601f909101040190620004cd565b909150819062000528565b906200054d815190565b906001600160401b0382116200008e5762000575826200056e85546200045e565b85620004f0565b602090601f8311600114620005b45762000409929160009183620005a8575b5050600019600883021c1916906002021790565b01519050388062000594565b601f19831691620005ca85600052602060002090565b9260005b8181106200060b57509160029391856001969410620005f1575b50505002019055565b01516000196008601f8516021c19169055388080620005e8565b91936020600181928787015181550195019201620005ce565b91906200063657620000ab9162000543565b62000432565b90815491680100000000000000008310156200008e578262000668916001620000ab950181556200040d565b9062000624565b620006946200069e602093620001329362000688815190565b80835293849260200190565b9586910162000136565b601f01601f191690565b6020808252620000b9929101906200066f565b919091620006c8620007c2565b608052620006d76000620002b8565b620006e4620000b9845190565b811015620007bd57620007b7906200074d60036200072c62000726620007226200071b62000713878b6200030a565b518562000387565b5460ff1690565b1590565b62000392565b620007476001916200073f85896200030a565b519062000387565b620003ee565b6200076760046200075f83876200030a565b51906200063c565b6200077381856200030a565b51620007ae7fc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f409691620007a460405190565b91829182620006a8565b0390a1620002de565b620006d7565b509050565b620000ab3362000825565b906001600160a01b0390620003e4565b620000b990620000ad906001600160a01b031682565b620000b990620007dd565b620000b990620007f3565b906200081d620000b96200040992620007fe565b8254620007cd565b6000546001600160a01b0316906200083f81600062000809565b620008766200086f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093620007fe565b91620007fe565b916200088160405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c80631cba9bed146101225780632ca6927d1461011d57806350262c001461011857806357c6e12a1461011357806359e26be11461010e578063670a8cb714610109578063715018a6146101045780637b103999146100ff5780637de24fcf146100fa5780638da5cb5b146100f557806396d195bd146100f0578063b870676c146100eb578063bd6e7741146100e6578063c2107e73146100e1578063ee2f13cd146100dc578063f2fde38b146100d75763fa7643f4036101d457610c7e565b610c3c565b610c24565b610bfd565b610b6f565b610b31565b610acb565b610a40565b610a19565b610890565b610878565b610837565b6107d9565b61079d565b6105a6565b6102ef565b61021c565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761015e57604052565b610127565b9061017761017060405190565b928361013d565b565b6001600160401b03811161015e57602090601f01601f19160190565b0190565b90826000939282370152565b909291926101ba6101b582610179565b610163565b938185526020850190828401116101d45761017792610199565b600080fd5b9080601f830112156101d4578160206101f4933591016101a5565b90565b906020828203126101d45781356001600160401b0381116101d4576101f492016101d9565b346101d45761023461022f3660046101f7565b612392565b604051005b0390f35b60005b8381106102505750506000910152565b8181015183820152602001610240565b61019561027892602092610272815190565b94859290565b9384910161023d565b9052565b6102956101959160209493610260565b918252565b6102af6102a660405190565b92839283610285565b03902090565b6101f49161029a565b6101f4916008021c5b60ff1690565b906101f491546102be565b6101f4906102ea6003916000926102b5565b6102cd565b346101d45761023961030a6103053660046101f7565b6102d8565b60405191829182901515815260200190565b9190916060818403126101d4576103336060610163565b9281356001600160401b0381116101d457816103509184016101d9565b845260208201356001600160401b0381116101d457816103719184016101d9565b602085015260408201356001600160401b0381116101d45761039392016101d9565b6040830152565b805b036101d457565b905035906101778261039a565b6001600160a01b031690565b6001600160a01b03811661039c565b90503590610177826103bc565b63ffffffff811661039c565b90503590610177826103d8565b9190916080818403126101d45761044a61040b6080610163565b93600061041882856103a3565b90860152602061042a828286016103cb565b90860152604061043c828286016103e4565b9086015260608093016103e4565b90830152565b6001600160401b03811161015e5760208091020190565b9291906104766101b582610450565b93818552602080860192028101918383116101d45781905b83821061049c575050505050565b81356001600160401b0381116101d4576020916104bc87849387016101d9565b81520191019061048e565b9080601f830112156101d4578160206101f493359101610467565b91909160a0818403126101d4576104f96040610163565b92600061050682846103f1565b9085015260808201356001600160401b0381116101d45761052792016104c7565b6020830152565b9190916040818403126101d4576105456040610163565b9281356001600160401b0381116101d4578161056291840161031c565b845260208201356001600160401b0381116101d45761052792016104e2565b906020828203126101d45781356001600160401b0381116101d4576101f4920161052e565b346101d45761023961030a6105bc366004610581565b6128f5565b906020828203126101d4576101f4916103a3565b634e487b7160e01b600052603260045260246000fd5b805482101561060e57610605600191600052602060002090565b91020190600090565b6105d5565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561065f575b602083101461065a57565b610629565b91607f169161064f565b8054600093929161068661067c8361063f565b8085529360200190565b91600181169081156106d8575060011461069f57505050565b6106b29192939450600052602060002090565b916000925b8184106106c45750500190565b8054848401526020909301926001016106b7565b92949550505060ff1916825215156020020190565b906101f491610669565b906101776107119261070860405190565b938480926106ed565b038361013d565b90600010610729576101f4906106f7565b610613565b6004600061073a825490565b83101561075557506101f49161074f916105eb565b90610718565b80fd5b6107796107826020936101959361076d815190565b80835293849260200190565b9586910161023d565b601f01601f191690565b60208082526101f492910190610758565b346101d4576102396107b86107b33660046105c1565b61072e565b6040515b9182918261078c565b906020828203126101d4576101f4916103cb565b346101d4576102346107ec3660046107c5565b611d4f565b6101f4916008021c6001600160a01b031690565b906101f491546107f1565b6002600061081c825490565b83101561075557506101f491610831916105eb565b90610805565b346101d45761023961085261084d3660046105c1565b610810565b6040515b918291826001600160a01b03909116815260200190565b60009103126101d457565b346101d45761088836600461086d565b610234610cee565b346101d4576108a036600461086d565b6102397f0000000000000000000000000000000000000000000000000000000000000000610852565b9291906108d86101b582610450565b93818552602080860192028101918383116101d45781905b8382106108fe575050505050565b81356001600160401b0381116101d45760209161091e878493870161052e565b8152019101906108f0565b9080601f830112156101d4578160206101f4933591016108c9565b906020828203126101d45781356001600160401b0381116101d4576101f49201610929565b906101f49060208061098a6040840160008701518582036000870152610758565b940151910152565b906101f491610969565b906109b26109a8835190565b8083529160200190565b90816109c46020830284019460200190565b926000915b8383106109d857505050505090565b909192939460206109fb6109f483856001950387528951610992565b9760200190565b93019301919392906109c9565b60208082526101f49291019061099c565b346101d457610239610a34610a2f366004610944565b610fed565b60405191829182610a08565b346101d457610a5036600461086d565b610239610852610cac565b90610a7b610a74610a6a845190565b8084529260200190565b9260200190565b9060005b818110610a8c5750505090565b909192610ab2610aab60019286516001600160a01b0316815260200190565b9460200190565b929101610a7f565b60208082526101f492910190610a5b565b346101d457610adb36600461086d565b610239610ae66133e7565b60405191829182610aba565b6101f4906103b0906001600160a01b031682565b6101f490610af2565b6101f490610b06565b61028190610b0f565b6020810192916101779190610b18565b346101d457610b4136600461086d565b604051806102397f000000000000000000000000000000000000000000000000000000000000000082610b21565b346101d457610234610b823660046101f7565b6122ce565b906101f491610758565b90610b9d6109a8835190565b9081610baf6020830284019460200190565b926000915b838310610bc357505050505090565b90919293946020610bdf6109f483856001950387528951610b87565b9301930191939290610bb4565b60208082526101f492910190610b91565b346101d457610c0d36600461086d565b610239610c1861344e565b60405191829182610bec565b346101d457610234610c373660046107c5565b611e51565b346101d457610234610c4f3660046107c5565b610e05565b90610c5e90610b0f565b600052602052604060002090565b6101f4906102ea600191600092610c54565b346101d45761023961030a610c943660046107c5565b610c6c565b6101f4906103b0565b6101f49054610c99565b6101f46000610ca2565b610cbe610d4a565b610177610cdc565b6103b06101f46101f49290565b6101f490610cc6565b610177610ce96000610cd3565b610e3e565b610177610cb6565b15610cfd57565b60405162461bcd60e51b815280610d46600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b610177610d55610cac565b610d6e610d61336103b0565b916001600160a01b031690565b14610cf6565b61017790610d80610d4a565b610de0565b15610d8c57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61017790610ce9610df46103b06000610cd3565b6001600160a01b0383161415610d85565b61017790610d74565b906001600160a01b03905b9181191691161790565b90610e336101f4610e3a92610b0f565b8254610e0e565b9055565b610e486000610ca2565b90610e54816000610e23565b610e87610e817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610b0f565b91610b0f565b91610e9160405190565b600090a3565b15610e9e57565b60405162461bcd60e51b815260206004820152601660248201527513db9b1e481c9959da5cdd1c9e4818d85b8818d85b1b60521b6044820152606490fd5b906102956101b583610450565b6101f46040610163565b610efb610ee9565b906060825260006020830152565b6101f4610ef3565b60005b828110610f2057505050565b602090610f2b610f09565b8184015201610f14565b90610177610f4b610f4584610edc565b93610450565b601f190160208401610f11565b6101f46101f46101f49290565b634e487b7160e01b600052601160045260246000fd5b6000198114610f8a5760010190565b610f65565b90610f98825190565b81101561060e576020809102010190565b15610fb057565b60405162461bcd60e51b815260206004820152601560248201527409cde40ecc2d8d2c840e0e4deecd2c8cae490c2e6d605b1b6044820152606490fd5b9061102a336110246001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016610d61565b14610e97565b61103a611035835190565b610f35565b916000908361104883610f58565b6110536101f4845190565b8110156110de578061109e6110be6110ac6110996110a760208061107a6110d9998c610f8f565b51611084816128f5565b5061108e81611221565b999199969096613458565b610fa9565b01510151613550565b6113f1565b6105276110b7610ee9565b9389850152565b6110c88289610f8f565b526110d38188610f8f565b50610f7b565b611048565b5093505050565b6102c76101f46101f49290565b6101f460056110e5565b9092919261110c6101b582610179565b938185526020850190828401116101d4576101779261023d565b9080601f830112156101d45781516101f4926020016110fc565b92919061114f6101b582610450565b93818552602080860192028101918383116101d45781905b838210611175575050505050565b81516001600160401b0381116101d4576020916111958784938701611126565b815201910190611167565b9080601f830112156101d45781516101f492602001611140565b906020828203126101d45781516001600160401b0381116101d4576101f492016111a0565b60409061120d6112016101779597969460608401908482036000860152610758565b60ff9097166020830152565b019015159052565b6040513d6000823e3d90fd5b5160400151731cB3888556cfeE16361EDdb3F8EB1BfD75Af380791634be6d4f89160009061124d6110f2565b9461126e6001956112798761126160405190565b998a968795869560e01b90565b8552600485016111df565b03915af49283156112f2576000936112cf575b506112c86112b66112b06112a96112a36000610f58565b87610f8f565b5194610f58565b85610f8f565b51936112c26002610f58565b90610f8f565b5191929190565b6112eb91933d8091833e6112e3818361013d565b8101906111ba565b913861128c565b611215565b6001600160401b03811161015e5760200290565b6101b56101f4916112f7565b60005b82811061132657505050565b60608282015260200161131a565b9061017761134a6113448461130b565b936112f7565b83611317565b6101f46006611334565b90611363825190565b81101561060e570160200190565b61138461137e6101f49290565b60f81b90565b6001600160f81b03191690565b90600681101561060e576020020190565b91908201809211610f8a57565b156113b657565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206461746520737472696e6760681b6044820152606490fd5b906000916113fd611350565b8390600061140a81610f58565b846114166101f4825190565b82101561150a578161143961142b828461135a565b516001600160f81b03191690565b611454611446602d611371565b916001600160f81b03191690565b149182156114e7575b82156114c3575b5050611479575b61147490610f7b565b61140a565b9295836114869186611b86565b6114908784611391565b5261149b8683611391565b506114746114bb6114b56114af6001610f58565b866113a2565b97610f7b565b93905061146b565b6114d292509061142b9161135a565b6114df6114466054611371565b148138611464565b91506114f661142b828461135a565b611503611446603a611371565b149161145d565b5050929161152f61155c92936101f496976115296115258390565b5190565b91611b86565b6115398285611391565b526115448184611391565b506115566115526005610f58565b9190565b146113af565b61158261157b61157461156e85610f58565b84611391565b5193610f58565b8093611905565b9061159a8361159461156e6001610f58565b51611905565b6115b1846115946115ab6002610f58565b85611391565b906115e1856115946115d0826115946115ca6003610f58565b89611391565b956115db6004610f58565b90611391565b9361161b565b6101f462015180610f58565b81810292918115918404141715610f8a57565b6101f4610e10610f58565b6101f4603c610f58565b61166a9361165b6116526116446101f499989661165b966116619661163e600090565b50611712565b61164c6115e7565b906115f3565b9161164c611606565b906113a2565b9161164c611611565b6113a2565b156101d457565b91908083039260009091128015828513169184121617610f8a57565b919082810192600013801591841291821691151617610f8a57565b634e487b7160e01b600052601260045260246000fd5b81156116de57600160ff1b8114600019831416610f8a570590565b6116ad565b8181029291600160ff1b81146000831216610f8a578184051490151715610f8a57565b6101f462253d8c610f58565b61171d6107b2610f58565b8110156117299061166f565b61173290610f58565b9061173c90610f58565b9161174690610f58565b611751617d4b610f58565b61175a91611676565b906105b56117696112c0610f58565b6117739083611692565b600e9161177f83610f58565b6117899087611676565b91600c9261179684610f58565b61179f916116c3565b6117a891611692565b906117b290610f58565b906117bc916116e3565b936004946117c986610f58565b6117d2916116c3565b6117db91611692565b61016f6117e86002610f58565b6117f29088611676565b6117fb85610f58565b6118059089611676565b61180e85610f58565b611817916116c3565b61182085610f58565b611829916116e3565b61183291611676565b9061183c90610f58565b90611846916116e3565b61184f83610f58565b611858916116c3565b61186191611692565b94600393611870611324610f58565b61187991611692565b9261188390610f58565b61188c91611676565b9061189690610f58565b61189f916116c3565b6118a891611692565b6118b26064610f58565b6118bb916116c3565b906118c590610f58565b906118cf916116e3565b906118d990610f58565b6118e2916116c3565b6118eb91611676565b6118f3611706565b6118fc91611676565b6101f490610f58565b6101f49190611914602e611371565b90611a04565b6102c76101f46101f49260ff1690565b6101f49060f81c61191a565b6101f46101f46101f49260ff1690565b91908203918211610f8a57565b1561195a57565b60405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606490fd5b156119a657565b60405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608490fd5b604d8111610f8a57600a0a90565b92600091611a1183610f58565b808493815b611a216101f48a5190565b811015611b22578589611a3761142b848361135a565b603090611a4661144683611371565b101580611b00575b611ab6575b5050611aa6575b611a6761142b828b61135a565b611a7a6001600160f81b03198716611446565b14611a8e575b611a8990610f7b565b611a16565b94611a9e90151587151514611953565b600194611a80565b92611ab090610f7b565b92611a5a565b61165b90611af2611aec611ae7611ae261142b89611adc611af89a9d61164c600a610f58565b9861135a565b61192a565b611936565b91610f58565b90611946565b928938611a53565b50611b0e61142b858461135a565b611b1b6114466039611371565b1115611a4e565b509650935061164c9250611b4c91506101f494611b47611b3f8290565b83111561199f565b611946565b6119f6565b906102956101b583610179565b369037565b90610177611b79611b7384611b51565b93610179565b601f190160208401611b5e565b909290611b9b611b968585611946565b611b63565b91845b845b811015611be057611bd981611bbb61142b611ba0948761135a565b611bd3611bc88a84611946565b9160001a918861135a565b53610f7b565b9050611b9e565b509350506101f4915090565b61017790611bf8610d4a565b611cdc565b6101f4906102c7565b6101f49054611bfd565b15611c1757565b60405162461bcd60e51b815260206004820152601c60248201527f4164647265737320697320616c72656164792061207769746e657373000000006044820152606490fd5b9060ff90610e19565b90611c756101f4610e3a92151590565b8254611c5c565b916001600160a01b0360089290920291821b911b610e19565b921b90565b9190611cab6101f4610e3a93610b0f565b908354611c7c565b90815491600160401b83101561015e5782611cd6916001610177950181556105eb565b90611c9a565b611d116001611d02611cfd611cf9611cf48685610c54565b611c06565b1590565b611c10565b611d0c8382610c54565b611c65565b611d1c816002611cb3565b611d4a7ff5944521c155e80db583372b9992336b6616b14dfb924a5cf6ef97b256d280349161085660405190565b0390a1565b61017790611bec565b61017790611d64610d4a565b611dee565b15611d7057565b60405162461bcd60e51b815260206004820152601860248201527f41646472657373206973206e6f742061207769746e65737300000000000000006044820152606490fd5b91906008610e19910291611c9560ff841b90565b9190611dda6101f4610e3a93151590565b908354611db5565b61017791600091611dc9565b611e186000611e13836001611e0e611e09611cf48484610c54565b611d69565b610c54565b611de2565b611e23816002611f32565b611d4a7f8b5785dce93ca82765b1cc25cedcda1b501288cb23a1fd171c0091d83900f9bd9161085660405190565b61017790611d58565b90611e75611e69610a6a845490565b92600052602060002090565b9060005b818110611e865750505090565b909192611eb3611eac600192611e9b87610ca2565b6001600160a01b0316815260200190565b9460010190565b929101611e79565b906101f491611e5a565b9061017761071192611ed660405190565b93848092611ebb565b6101f490611ec5565b634e487b7160e01b600052603160045260246000fd5b61017791600091611c9a565b80548015611f2d576000190190611f2a611f2483836105eb565b90611efe565b55565b611ee8565b611f47611f4e92611f4283611edf565b611fe5565b9092901590565b15611f905760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b61017791611fa9611f9f835490565b611af26001610f58565b90818103611fb9575b5050611f0a565b611cd6611fcc610831611fd394866105eb565b91846105eb565b3880611fb2565b6101f4600019610f58565b91908251926000611ff581610f58565b855b81101561204c5761201861200b8285610f8f565b516001600160a01b031690565b61202a6001600160a01b038616610d61565b146120425761203b611ff791610f7b565b9050611ff5565b9450505050600190565b5093505050611552611fda565b61017790612065610d4a565b61226c565b1561207157565b60405162461bcd60e51b815260206004820152601b60248201527f50726f7669646572206861736820616c726561647920616464656400000000006044820152606490fd5b9160001960089290920291821b911b610e19565b91906120db6101f4610e3a93610f58565b9083546120b6565b610177916000916120ca565b8181106120fa575050565b8061210860006001936120e3565b016120ef565b9190601f811161211d57505050565b61212f61017793600052602060002090565b906020601f840181900483019310612152575b6020601f909101045b01906120ef565b9091508190612142565b600019600883021c1916906002021790565b90612177815190565b906001600160401b03821161015e5761219a82612194855461063f565b8561210e565b602090601f83116001146121c857610e3a9291600091836121bd575b505061215c565b0151905038806121b6565b601f198316916121dd85600052602060002090565b9260005b81811061221c57509160029391856001969410612202575b50505002019055565b01516000196008601f8516021c19165b90553880806121f9565b919360206001819287870151815501950192016121e1565b9190610729576101779161216e565b90815491600160401b83101561015e5782612266916001610177950181556105eb565b90612234565b6122956003612289612284611cf9611cf486856102b5565b61206a565b611d0c836001926102b5565b6122a0816004612243565b611d4a7fc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096916107bc60405190565b61017790612059565b610177906122e3610d4a565b612334565b156122ef57565b60405162461bcd60e51b815260206004820152601760248201527f50726f76696465722068617368206e6f7420666f756e640000000000000000006044820152606490fd5b6123596000611e1383600361235461234f611cf484846102b5565b6122e8565b6102b5565b6123648160046126aa565b611d4a7f6f594b4b4f0580c66aabba75218163a99fa1fe330a171cc9e2bfd8e167db22f8916107bc60405190565b610177906122d7565b6101f4906106f7565b906123ad825490565b6123b681610edc565b926123ca6020850191600052602060002090565b6000915b8383106123db5750505050565b6001602081926123ea8561239b565b8152019201920191906123ce565b6101f4906123a4565b6101f4905461063f565b908082146124da5761241c81612401565b906001600160401b03821161015e5761243982612194855461063f565b600090601f831160011461246657610e3a92916000918361245b57505061215c565b0154905038806121b6565b9061247b601f19841692600052602060002090565b9061248b85600052602060002090565b92815b8181106124c2575091600293918560019694106124ae5750505002019055565b01546000196008601f8516021c1916612212565b9193600180602092878701548155019501920161248e565b5050565b9190610729576101779161240b565b9061250090600019906020036008021c90565b8154169055565b9060009161252561251d82600052602060002090565b92835461215c565b905555565b919290602082101561258257601f841160011461254c57610e3a92935061215c565b509061257d61017793600161257461256985600052602060002090565b92601f602091010490565b820191016120ef565b612507565b506125bb8293612599600194600052602060002090565b61214b6020601f860104820192601f8616806125c3575b50601f602091010490565b600202179055565b6125cf908886036124ed565b386125b0565b929091600160401b821161015e576020111561261c5760208110156125fd57610e3a9161215c565b60019160ff191661261384600052602060002090565b55600202019055565b60019150600202019055565b9081546126348161063f565b9081831161265d575b81831061264b575b50505050565b6126549361252a565b38808080612645565b612669838383876125d5565b61263d565b600061017791612628565b90600003610729576101779061266e565b80548015611f2d576000190190611f2a6126a483836105eb565b90612679565b611f476126bf926126ba836123f8565b612744565b156127005760405162461bcd60e51b815260206004820152601460248201527329ba3934b733903737ba1034b71030b93930bc9760611b6044820152606490fd5b6101779161270f611f9f835490565b9081810361271f575b505061268a565b61273761272f61273d93856105eb565b5091846105eb565b906124de565b3880612718565b9190825192600061275481610f58565b855b8110156127ac5761276a6115258285610f8f565b61277c612775825190565b9160200190565b20612794611552865b612790612775825190565b2090565b14612042576127a561275691610f7b565b9050612754565b509350505081199190565b156127be57565b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b156127fa57565b60405162461bcd60e51b815260206004820152601c60248201527f436c61696d496e666f206861736820646f65736e2774206d61746368000000006044820152606490fd5b1561284657565b60405162461bcd60e51b815260206004820152603560248201527f4e756d626572206f66207369676e617475726573206e6f7420657175616c20746044820152746f206e756d626572206f66207769746e657373657360581b6064820152608490fd5b156128b057565b60405162461bcd60e51b815260206004820152601960248201527f5369676e6174757265206e6f7420617070726f707269617465000000000000006044820152606490fd5b906020820190815160200151612909905190565b9160009261291684610f58565b10612920906127b7565b828080808451015196845160200151612937610ee9565b98838a01906129439152565b6020890152015161295390612efe565b925101510161296190611525565b1461296b906127f3565b61297483612a5b565b805191600292612982845490565b1461298c9061283f565b61299584610f58565b935b6129a66101f460208801515190565b851015612a405780956129b882610f58565b6129c36101f4875490565b811015612a28576129d761200b8887610f8f565b6129ea610d616103b0610831858b6105eb565b146129fd576129f890610f7b565b6129b8565b50946129a69196506020612a1d6101f492612a1860016128a9565b610f7b565b969792505050612997565b50946020612a1d6101f492612a186129a6959a6128a9565b509350505050600190565b90610177611b79610f4584610edc565b6020612a6a6000830151612b2b565b910190612a7e612a7983515190565b612a4b565b91612a896000610f58565b612a956101f483515190565b811015612ad55780612a18612ab8612ab1612ad0948651610f8f565b5186612c02565b612ac28388610f8f565b906001600160a01b03169052565b612a89565b50505090565b610195816020939052565b6101f46101f46101f49263ffffffff1690565b92612b25612b18612b2594612b25612b186101f49998612b1897610260565b600560f91b815260010190565b90610260565b6101f4612b67612b3a83611525565b612b62612b4660405190565b8092612b56602083019182612adb565b9081038252038261013d565b613130565b612b83612b7e60208501516001600160a01b031690565b612fb9565b90612b56612bbf612bae612ba96060612bb3612bae612ba960408c015163ffffffff1690565b612ae6565b61329e565b98015163ffffffff1690565b604051958694602086019485612af9565b7f19457468657265756d205369676e6564204d6573736167653a0a00000000000081526101f49291612b2591601a0182565b90612b56612c326101f493612c15600090565b50612c21612bae825190565b604051938492602084019283612bd0565b612c3d612775825190565b206101f491612c4b91612dc1565b919091612c82565b634e487b7160e01b600052602160045260246000fd5b60051115612c7357565b612c53565b9061017782612c69565b612c8c6000612c78565b612c9582612c78565b03612c9d5750565b612ca76001612c78565b612cb082612c78565b03612cfa5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b612d046002612c78565b612d0d82612c78565b03612d575760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b612d6a612d646003612c78565b91612c78565b14612d7157565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b908051612dd16115526041610f58565b03612df757612df3916020820151906060604084015193015160001a90612e36565b9091565b5050612e036000610cd3565b90600290565b612e3261017794610393606094989795612e28608086019a6000870152565b60ff166020850152565b0152565b919291612e42836118fc565b612e6e6115527f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0610f58565b11612ed257612e8e600093602095612e8560405190565b94859485612e09565b838052039060015afa156112f25760005190600091612eac83610cd3565b6001600160a01b0381166001600160a01b03831614612eca57509190565b925050600190565b50505050612ee06000610cd3565b90600390565b6101f49392612b25612b18612b1893612b2595610260565b8051602082015160409283015192516127859290612b5690948593602085019384612ee6565b6101f49081906001600160a01b031681565b60ff8111610f8a5760020a90565b905b9081156116de570490565b61138461137e6101f49260ff1690565b612f469060ff165b9160ff1690565b612f7c9060ff16612f69565b029060ff8216918203610f8a57565b612f979060ff16612f69565b90039060ff8211610f8a57565b61060f60f31b81526101f49190600201612b25565b90612fc7611b966028610f58565b600092612fd384610f58565b612fdd6014610f58565b8110156130d45780613037611bd36130c56130bb6130cf956130376130b58c8b6130af613051611ae261304c8f61301e61301961304792610b06565b612f24565b61304161303c6008613037611aec8f611b476013610f58565b6115f3565b612f36565b90612f44565b6110e5565b612f51565b9261309a61309461304c60109661308e61307661304c6130708b6110e5565b84612f61565b986130896130838b61192a565b916110e5565b612f70565b90612f8b565b9461323a565b6130a78860029d8e610f58565b911a9261135a565b5361323a565b95610f58565b61165b6001610f58565b91881a918661135a565b612fd3565b50506101f49192506101f46130e860405190565b8092612b56602083019182612fa4565b6131026010611b51565b6f181899199a1a9b1b9c1cb0b131b232b360811b602082015290565b6101f46130f8565b81156116de570690565b90815191613146611b9660029461164c86610f58565b9061314f61311e565b60009161315b83610f58565b6131666101f4835190565b81101561320c57806131a661142b6131a061318a611ae261142b613207978961135a565b61319b613195895190565b91611936565b612f44565b8661135a565b6131c56131bb6131b58b610f58565b846115f3565b91871a918861135a565b536131ef61142b6131a06131df611ae261142b868961135a565b6131ea613195895190565b613126565b611bd36131bb6130bb6132018c610f58565b856115f3565b61315b565b505050506101f49192506101f46130e860405190565b61322e9060ff16612f69565b019060ff8211610f8a57565b6132439061192a565b61324d600a6110e5565b60ff8216101561326e5761304c6101f49161326860306110e5565b90613222565b61304c6101f49161326860576110e5565b6132896001611b51565b600360fc1b602082015290565b6101f461327f565b6000916132aa83610f58565b821461337257908060005b6132be85610f58565b83146132e1576132d06132db91610f7b565b92613041600a610f58565b916132b5565b91506132ec82611b63565b915b6132f785610f58565b82146133675761330e61336191611af26001610f58565b91613041600a8461335b61335261304c603061334d61308361304761334761333e6133388b610f58565b8d612f44565b61164c8b610f58565b8b611946565b613222565b8a1a918861135a565b53610f58565b906132ee565b50506101f491925090565b9150506101f4613296565b9061338c611e69610a6a845490565b9060005b81811061339d5750505090565b9091926133b2611eac600192611e9b87610ca2565b929101613390565b906101f49161337d565b90610177610711926133d560405190565b938480926133ba565b6101f4906133c4565b6101f460026133de565b906133fa825490565b61340381610edc565b926134176020850191600052602060002090565b6000915b8383106134285750505050565b6001602081926134378561239b565b81520192019201919061341b565b6101f4906133f1565b6101f46004613445565b611cf46101f491613467600090565b5060036102b5565b9061347b6109a8835190565b908161348d6020830284019460200190565b926000915b8383106134a157505050505090565b909192939460206134bd6109f483856001950387528951610b87565b9301930191939290613492565b60208082526101f49291019061346f565b80151561039c565b90505190610177826134db565b906020828203126101d4576101f4916134e3565b1561350b57565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b61356c61355c60405190565b8092612b566020830191826134ca565b613577612775825190565b206135a17f0000000000000000000000000000000000000000000000000000000000000000610b0f565b9063169394bb6135ba6135b360405190565b9160e01b90565b815260048101829052602081602481865afa9081156112f2576135ec916135e79160009161365157501590565b613504565b635bd4df3290823b156101d4576136289261361a6000809461360d60405190565b9687958694859360e01b90565b835260048301526024820190565b03925af180156112f2576136395750565b610177906000613649818361013d565b81019061086d565b611cf9915060203d8111613672575b61366a818361013d565b8101906134f0565b503d61366056fea2646970667358221220ac32ca16a78f612ec68240d59214076e1784464c21ff8fabfeff4b46fd239e1c64736f6c63430008120033", + "bytecode": "0x60c06040523462000051576200001f620000186200027f565b91620002a7565b6040516136af620008888239608051818181610b4a015261357d015260a0518181816108a50152610fff01526136af90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200008e57604052565b62000056565b90620000ab620000a360405190565b92836200006c565b565b6001600160a01b031690565b90565b6001600160a01b0381165b036200005157565b90505190620000ab82620000bc565b6001600160a01b038116620000c7565b90505190620000ab82620000de565b6001600160401b0381116200008e5760208091020190565b6001600160401b0381116200008e57602090601f01601f19160190565b0190565b60005b8381106200014a5750506000910152565b818101518382015260200162000139565b90929192620001746200016e8262000115565b62000094565b938185526020850190828401116200005157620000ab9262000136565b9080601f8301121562000051578151620000b9926020016200015b565b929190620001c06200016e82620000fd565b9381855260208086019202810191838311620000515781905b838210620001e8575050505050565b81516001600160401b03811162000051576020916200020b878493870162000191565b815201910190620001d9565b9080601f8301121562000051578151620000b992602001620001ae565b9160608383031262000051576200024c8284620000cf565b926200025c8360208301620000ee565b60408201519093906001600160401b0381116200005157620000b9920162000217565b620002a262003f3780380380620002968162000094565b92833981019062000234565b909192565b91620002b391620006bb565b60a052565b620000b9620000b9620000b99290565b634e487b7160e01b600052601160045260246000fd5b6000198114620002ee5760010190565b620002c8565b634e487b7160e01b600052603260045260246000fd5b9062000314825190565b81101562000326576020809102010190565b620002f4565b62000132620003479260209262000341815190565b94859290565b9384910162000136565b620003646200013291602094936200032c565b918252565b620003816200037760405190565b9283928362000351565b03902090565b620000b99162000369565b156200039a57565b60405162461bcd60e51b815260206004820152601b60248201527f50726f7669646572206861736820616c726561647920616464656400000000006044820152606490fd5b9060ff905b9181191691161790565b9062000401620000b96200040992151590565b8254620003df565b9055565b8054821015620003265762000429600191600052602060002090565b91020190600090565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801562000481575b60208310146200047b57565b62000448565b91607f16916200046f565b9160001960089290920291821b911b620003e4565b9190620004b6620000b96200040993620002b8565b9083546200048c565b620000ab91600091620004a1565b818110620004d9575050565b80620004e96000600193620004bf565b01620004cd565b9190601f81116200050057505050565b62000514620000ab93600052602060002090565b906020601f84018190048301931062000538575b6020601f909101040190620004cd565b909150819062000528565b906200054d815190565b906001600160401b0382116200008e5762000575826200056e85546200045e565b85620004f0565b602090601f8311600114620005b45762000409929160009183620005a8575b5050600019600883021c1916906002021790565b01519050388062000594565b601f19831691620005ca85600052602060002090565b9260005b8181106200060b57509160029391856001969410620005f1575b50505002019055565b01516000196008601f8516021c19169055388080620005e8565b91936020600181928787015181550195019201620005ce565b91906200063657620000ab9162000543565b62000432565b90815491680100000000000000008310156200008e578262000668916001620000ab950181556200040d565b9062000624565b620006946200069e602093620001329362000688815190565b80835293849260200190565b9586910162000136565b601f01601f191690565b6020808252620000b9929101906200066f565b919091620006c8620007c2565b608052620006d76000620002b8565b620006e4620000b9845190565b811015620007bd57620007b7906200074d60036200072c62000726620007226200071b62000713878b6200030a565b518562000387565b5460ff1690565b1590565b62000392565b620007476001916200073f85896200030a565b519062000387565b620003ee565b6200076760046200075f83876200030a565b51906200063c565b6200077381856200030a565b51620007ae7fc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f409691620007a460405190565b91829182620006a8565b0390a1620002de565b620006d7565b509050565b620000ab3362000825565b906001600160a01b0390620003e4565b620000b990620000ad906001600160a01b031682565b620000b990620007dd565b620000b990620007f3565b906200081d620000b96200040992620007fe565b8254620007cd565b6000546001600160a01b0316906200083f81600062000809565b620008766200086f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093620007fe565b91620007fe565b916200088160405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c80631cba9bed146101225780632ca6927d1461011d57806350262c001461011857806357c6e12a1461011357806359e26be11461010e578063670a8cb714610109578063715018a6146101045780637b103999146100ff5780637de24fcf146100fa5780638da5cb5b146100f557806396d195bd146100f0578063b870676c146100eb578063bd6e7741146100e6578063c2107e73146100e1578063ee2f13cd146100dc578063f2fde38b146100d75763fa7643f4036101d457610c7e565b610c3c565b610c24565b610bfd565b610b6f565b610b31565b610acb565b610a40565b610a19565b610890565b610878565b610837565b6107d9565b61079d565b6105a6565b6102ef565b61021c565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761015e57604052565b610127565b9061017761017060405190565b928361013d565b565b6001600160401b03811161015e57602090601f01601f19160190565b0190565b90826000939282370152565b909291926101ba6101b582610179565b610163565b938185526020850190828401116101d45761017792610199565b600080fd5b9080601f830112156101d4578160206101f4933591016101a5565b90565b906020828203126101d45781356001600160401b0381116101d4576101f492016101d9565b346101d45761023461022f3660046101f7565b612392565b604051005b0390f35b60005b8381106102505750506000910152565b8181015183820152602001610240565b61019561027892602092610272815190565b94859290565b9384910161023d565b9052565b6102956101959160209493610260565b918252565b6102af6102a660405190565b92839283610285565b03902090565b6101f49161029a565b6101f4916008021c5b60ff1690565b906101f491546102be565b6101f4906102ea6003916000926102b5565b6102cd565b346101d45761023961030a6103053660046101f7565b6102d8565b60405191829182901515815260200190565b9190916060818403126101d4576103336060610163565b9281356001600160401b0381116101d457816103509184016101d9565b845260208201356001600160401b0381116101d457816103719184016101d9565b602085015260408201356001600160401b0381116101d45761039392016101d9565b6040830152565b805b036101d457565b905035906101778261039a565b6001600160a01b031690565b6001600160a01b03811661039c565b90503590610177826103bc565b63ffffffff811661039c565b90503590610177826103d8565b9190916080818403126101d45761044a61040b6080610163565b93600061041882856103a3565b90860152602061042a828286016103cb565b90860152604061043c828286016103e4565b9086015260608093016103e4565b90830152565b6001600160401b03811161015e5760208091020190565b9291906104766101b582610450565b93818552602080860192028101918383116101d45781905b83821061049c575050505050565b81356001600160401b0381116101d4576020916104bc87849387016101d9565b81520191019061048e565b9080601f830112156101d4578160206101f493359101610467565b91909160a0818403126101d4576104f96040610163565b92600061050682846103f1565b9085015260808201356001600160401b0381116101d45761052792016104c7565b6020830152565b9190916040818403126101d4576105456040610163565b9281356001600160401b0381116101d4578161056291840161031c565b845260208201356001600160401b0381116101d45761052792016104e2565b906020828203126101d45781356001600160401b0381116101d4576101f4920161052e565b346101d45761023961030a6105bc366004610581565b6128f5565b906020828203126101d4576101f4916103a3565b634e487b7160e01b600052603260045260246000fd5b805482101561060e57610605600191600052602060002090565b91020190600090565b6105d5565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561065f575b602083101461065a57565b610629565b91607f169161064f565b8054600093929161068661067c8361063f565b8085529360200190565b91600181169081156106d8575060011461069f57505050565b6106b29192939450600052602060002090565b916000925b8184106106c45750500190565b8054848401526020909301926001016106b7565b92949550505060ff1916825215156020020190565b906101f491610669565b906101776107119261070860405190565b938480926106ed565b038361013d565b90600010610729576101f4906106f7565b610613565b6004600061073a825490565b83101561075557506101f49161074f916105eb565b90610718565b80fd5b6107796107826020936101959361076d815190565b80835293849260200190565b9586910161023d565b601f01601f191690565b60208082526101f492910190610758565b346101d4576102396107b86107b33660046105c1565b61072e565b6040515b9182918261078c565b906020828203126101d4576101f4916103cb565b346101d4576102346107ec3660046107c5565b611d4f565b6101f4916008021c6001600160a01b031690565b906101f491546107f1565b6002600061081c825490565b83101561075557506101f491610831916105eb565b90610805565b346101d45761023961085261084d3660046105c1565b610810565b6040515b918291826001600160a01b03909116815260200190565b60009103126101d457565b346101d45761088836600461086d565b610234610cee565b346101d4576108a036600461086d565b6102397f0000000000000000000000000000000000000000000000000000000000000000610852565b9291906108d86101b582610450565b93818552602080860192028101918383116101d45781905b8382106108fe575050505050565b81356001600160401b0381116101d45760209161091e878493870161052e565b8152019101906108f0565b9080601f830112156101d4578160206101f4933591016108c9565b906020828203126101d45781356001600160401b0381116101d4576101f49201610929565b906101f49060208061098a6040840160008701518582036000870152610758565b940151910152565b906101f491610969565b906109b26109a8835190565b8083529160200190565b90816109c46020830284019460200190565b926000915b8383106109d857505050505090565b909192939460206109fb6109f483856001950387528951610992565b9760200190565b93019301919392906109c9565b60208082526101f49291019061099c565b346101d457610239610a34610a2f366004610944565b610fed565b60405191829182610a08565b346101d457610a5036600461086d565b610239610852610cac565b90610a7b610a74610a6a845190565b8084529260200190565b9260200190565b9060005b818110610a8c5750505090565b909192610ab2610aab60019286516001600160a01b0316815260200190565b9460200190565b929101610a7f565b60208082526101f492910190610a5b565b346101d457610adb36600461086d565b610239610ae66133e7565b60405191829182610aba565b6101f4906103b0906001600160a01b031682565b6101f490610af2565b6101f490610b06565b61028190610b0f565b6020810192916101779190610b18565b346101d457610b4136600461086d565b604051806102397f000000000000000000000000000000000000000000000000000000000000000082610b21565b346101d457610234610b823660046101f7565b6122ce565b906101f491610758565b90610b9d6109a8835190565b9081610baf6020830284019460200190565b926000915b838310610bc357505050505090565b90919293946020610bdf6109f483856001950387528951610b87565b9301930191939290610bb4565b60208082526101f492910190610b91565b346101d457610c0d36600461086d565b610239610c1861344e565b60405191829182610bec565b346101d457610234610c373660046107c5565b611e51565b346101d457610234610c4f3660046107c5565b610e05565b90610c5e90610b0f565b600052602052604060002090565b6101f4906102ea600191600092610c54565b346101d45761023961030a610c943660046107c5565b610c6c565b6101f4906103b0565b6101f49054610c99565b6101f46000610ca2565b610cbe610d4a565b610177610cdc565b6103b06101f46101f49290565b6101f490610cc6565b610177610ce96000610cd3565b610e3e565b610177610cb6565b15610cfd57565b60405162461bcd60e51b815280610d46600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b610177610d55610cac565b610d6e610d61336103b0565b916001600160a01b031690565b14610cf6565b61017790610d80610d4a565b610de0565b15610d8c57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61017790610ce9610df46103b06000610cd3565b6001600160a01b0383161415610d85565b61017790610d74565b906001600160a01b03905b9181191691161790565b90610e336101f4610e3a92610b0f565b8254610e0e565b9055565b610e486000610ca2565b90610e54816000610e23565b610e87610e817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610b0f565b91610b0f565b91610e9160405190565b600090a3565b15610e9e57565b60405162461bcd60e51b815260206004820152601660248201527513db9b1e481c9959da5cdd1c9e4818d85b8818d85b1b60521b6044820152606490fd5b906102956101b583610450565b6101f46040610163565b610efb610ee9565b906060825260006020830152565b6101f4610ef3565b60005b828110610f2057505050565b602090610f2b610f09565b8184015201610f14565b90610177610f4b610f4584610edc565b93610450565b601f190160208401610f11565b6101f46101f46101f49290565b634e487b7160e01b600052601160045260246000fd5b6000198114610f8a5760010190565b610f65565b90610f98825190565b81101561060e576020809102010190565b15610fb057565b60405162461bcd60e51b815260206004820152601560248201527409cde40ecc2d8d2c840e0e4deecd2c8cae490c2e6d605b1b6044820152606490fd5b9061102a336110246001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016610d61565b14610e97565b61103a611035835190565b610f35565b916000908361104883610f58565b6110536101f4845190565b8110156110de578061109e6110be6110ac6110996110a760208061107a6110d9998c610f8f565b51611084816128f5565b5061108e81611221565b999199969096613458565b610fa9565b01510151613550565b6113f1565b6105276110b7610ee9565b9389850152565b6110c88289610f8f565b526110d38188610f8f565b50610f7b565b611048565b5093505050565b6102c76101f46101f49290565b6101f460056110e5565b9092919261110c6101b582610179565b938185526020850190828401116101d4576101779261023d565b9080601f830112156101d45781516101f4926020016110fc565b92919061114f6101b582610450565b93818552602080860192028101918383116101d45781905b838210611175575050505050565b81516001600160401b0381116101d4576020916111958784938701611126565b815201910190611167565b9080601f830112156101d45781516101f492602001611140565b906020828203126101d45781516001600160401b0381116101d4576101f492016111a0565b60409061120d6112016101779597969460608401908482036000860152610758565b60ff9097166020830152565b019015159052565b6040513d6000823e3d90fd5b5160400151735B8F92B8afA5Db7078703294D646908F0fc00D8791634be6d4f89160009061124d6110f2565b9461126e6001956112798761126160405190565b998a968795869560e01b90565b8552600485016111df565b03915af49283156112f2576000936112cf575b506112c86112b66112b06112a96112a36000610f58565b87610f8f565b5194610f58565b85610f8f565b51936112c26002610f58565b90610f8f565b5191929190565b6112eb91933d8091833e6112e3818361013d565b8101906111ba565b913861128c565b611215565b6001600160401b03811161015e5760200290565b6101b56101f4916112f7565b60005b82811061132657505050565b60608282015260200161131a565b9061017761134a6113448461130b565b936112f7565b83611317565b6101f46006611334565b90611363825190565b81101561060e570160200190565b61138461137e6101f49290565b60f81b90565b6001600160f81b03191690565b90600681101561060e576020020190565b91908201809211610f8a57565b156113b657565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206461746520737472696e6760681b6044820152606490fd5b906000916113fd611350565b8390600061140a81610f58565b846114166101f4825190565b82101561150a578161143961142b828461135a565b516001600160f81b03191690565b611454611446602d611371565b916001600160f81b03191690565b149182156114e7575b82156114c3575b5050611479575b61147490610f7b565b61140a565b9295836114869186611b86565b6114908784611391565b5261149b8683611391565b506114746114bb6114b56114af6001610f58565b866113a2565b97610f7b565b93905061146b565b6114d292509061142b9161135a565b6114df6114466054611371565b148138611464565b91506114f661142b828461135a565b611503611446603a611371565b149161145d565b5050929161152f61155c92936101f496976115296115258390565b5190565b91611b86565b6115398285611391565b526115448184611391565b506115566115526005610f58565b9190565b146113af565b61158261157b61157461156e85610f58565b84611391565b5193610f58565b8093611905565b9061159a8361159461156e6001610f58565b51611905565b6115b1846115946115ab6002610f58565b85611391565b906115e1856115946115d0826115946115ca6003610f58565b89611391565b956115db6004610f58565b90611391565b9361161b565b6101f462015180610f58565b81810292918115918404141715610f8a57565b6101f4610e10610f58565b6101f4603c610f58565b61166a9361165b6116526116446101f499989661165b966116619661163e600090565b50611712565b61164c6115e7565b906115f3565b9161164c611606565b906113a2565b9161164c611611565b6113a2565b156101d457565b91908083039260009091128015828513169184121617610f8a57565b919082810192600013801591841291821691151617610f8a57565b634e487b7160e01b600052601260045260246000fd5b81156116de57600160ff1b8114600019831416610f8a570590565b6116ad565b8181029291600160ff1b81146000831216610f8a578184051490151715610f8a57565b6101f462253d8c610f58565b61171d6107b2610f58565b8110156117299061166f565b61173290610f58565b9061173c90610f58565b9161174690610f58565b611751617d4b610f58565b61175a91611676565b906105b56117696112c0610f58565b6117739083611692565b600e9161177f83610f58565b6117899087611676565b91600c9261179684610f58565b61179f916116c3565b6117a891611692565b906117b290610f58565b906117bc916116e3565b936004946117c986610f58565b6117d2916116c3565b6117db91611692565b61016f6117e86002610f58565b6117f29088611676565b6117fb85610f58565b6118059089611676565b61180e85610f58565b611817916116c3565b61182085610f58565b611829916116e3565b61183291611676565b9061183c90610f58565b90611846916116e3565b61184f83610f58565b611858916116c3565b61186191611692565b94600393611870611324610f58565b61187991611692565b9261188390610f58565b61188c91611676565b9061189690610f58565b61189f916116c3565b6118a891611692565b6118b26064610f58565b6118bb916116c3565b906118c590610f58565b906118cf916116e3565b906118d990610f58565b6118e2916116c3565b6118eb91611676565b6118f3611706565b6118fc91611676565b6101f490610f58565b6101f49190611914602e611371565b90611a04565b6102c76101f46101f49260ff1690565b6101f49060f81c61191a565b6101f46101f46101f49260ff1690565b91908203918211610f8a57565b1561195a57565b60405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606490fd5b156119a657565b60405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608490fd5b604d8111610f8a57600a0a90565b92600091611a1183610f58565b808493815b611a216101f48a5190565b811015611b22578589611a3761142b848361135a565b603090611a4661144683611371565b101580611b00575b611ab6575b5050611aa6575b611a6761142b828b61135a565b611a7a6001600160f81b03198716611446565b14611a8e575b611a8990610f7b565b611a16565b94611a9e90151587151514611953565b600194611a80565b92611ab090610f7b565b92611a5a565b61165b90611af2611aec611ae7611ae261142b89611adc611af89a9d61164c600a610f58565b9861135a565b61192a565b611936565b91610f58565b90611946565b928938611a53565b50611b0e61142b858461135a565b611b1b6114466039611371565b1115611a4e565b509650935061164c9250611b4c91506101f494611b47611b3f8290565b83111561199f565b611946565b6119f6565b906102956101b583610179565b369037565b90610177611b79611b7384611b51565b93610179565b601f190160208401611b5e565b909290611b9b611b968585611946565b611b63565b91845b845b811015611be057611bd981611bbb61142b611ba0948761135a565b611bd3611bc88a84611946565b9160001a918861135a565b53610f7b565b9050611b9e565b509350506101f4915090565b61017790611bf8610d4a565b611cdc565b6101f4906102c7565b6101f49054611bfd565b15611c1757565b60405162461bcd60e51b815260206004820152601c60248201527f4164647265737320697320616c72656164792061207769746e657373000000006044820152606490fd5b9060ff90610e19565b90611c756101f4610e3a92151590565b8254611c5c565b916001600160a01b0360089290920291821b911b610e19565b921b90565b9190611cab6101f4610e3a93610b0f565b908354611c7c565b90815491600160401b83101561015e5782611cd6916001610177950181556105eb565b90611c9a565b611d116001611d02611cfd611cf9611cf48685610c54565b611c06565b1590565b611c10565b611d0c8382610c54565b611c65565b611d1c816002611cb3565b611d4a7ff5944521c155e80db583372b9992336b6616b14dfb924a5cf6ef97b256d280349161085660405190565b0390a1565b61017790611bec565b61017790611d64610d4a565b611dee565b15611d7057565b60405162461bcd60e51b815260206004820152601860248201527f41646472657373206973206e6f742061207769746e65737300000000000000006044820152606490fd5b91906008610e19910291611c9560ff841b90565b9190611dda6101f4610e3a93151590565b908354611db5565b61017791600091611dc9565b611e186000611e13836001611e0e611e09611cf48484610c54565b611d69565b610c54565b611de2565b611e23816002611f32565b611d4a7f8b5785dce93ca82765b1cc25cedcda1b501288cb23a1fd171c0091d83900f9bd9161085660405190565b61017790611d58565b90611e75611e69610a6a845490565b92600052602060002090565b9060005b818110611e865750505090565b909192611eb3611eac600192611e9b87610ca2565b6001600160a01b0316815260200190565b9460010190565b929101611e79565b906101f491611e5a565b9061017761071192611ed660405190565b93848092611ebb565b6101f490611ec5565b634e487b7160e01b600052603160045260246000fd5b61017791600091611c9a565b80548015611f2d576000190190611f2a611f2483836105eb565b90611efe565b55565b611ee8565b611f47611f4e92611f4283611edf565b611fe5565b9092901590565b15611f905760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b61017791611fa9611f9f835490565b611af26001610f58565b90818103611fb9575b5050611f0a565b611cd6611fcc610831611fd394866105eb565b91846105eb565b3880611fb2565b6101f4600019610f58565b91908251926000611ff581610f58565b855b81101561204c5761201861200b8285610f8f565b516001600160a01b031690565b61202a6001600160a01b038616610d61565b146120425761203b611ff791610f7b565b9050611ff5565b9450505050600190565b5093505050611552611fda565b61017790612065610d4a565b61226c565b1561207157565b60405162461bcd60e51b815260206004820152601b60248201527f50726f7669646572206861736820616c726561647920616464656400000000006044820152606490fd5b9160001960089290920291821b911b610e19565b91906120db6101f4610e3a93610f58565b9083546120b6565b610177916000916120ca565b8181106120fa575050565b8061210860006001936120e3565b016120ef565b9190601f811161211d57505050565b61212f61017793600052602060002090565b906020601f840181900483019310612152575b6020601f909101045b01906120ef565b9091508190612142565b600019600883021c1916906002021790565b90612177815190565b906001600160401b03821161015e5761219a82612194855461063f565b8561210e565b602090601f83116001146121c857610e3a9291600091836121bd575b505061215c565b0151905038806121b6565b601f198316916121dd85600052602060002090565b9260005b81811061221c57509160029391856001969410612202575b50505002019055565b01516000196008601f8516021c19165b90553880806121f9565b919360206001819287870151815501950192016121e1565b9190610729576101779161216e565b90815491600160401b83101561015e5782612266916001610177950181556105eb565b90612234565b6122956003612289612284611cf9611cf486856102b5565b61206a565b611d0c836001926102b5565b6122a0816004612243565b611d4a7fc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096916107bc60405190565b61017790612059565b610177906122e3610d4a565b612334565b156122ef57565b60405162461bcd60e51b815260206004820152601760248201527f50726f76696465722068617368206e6f7420666f756e640000000000000000006044820152606490fd5b6123596000611e1383600361235461234f611cf484846102b5565b6122e8565b6102b5565b6123648160046126aa565b611d4a7f6f594b4b4f0580c66aabba75218163a99fa1fe330a171cc9e2bfd8e167db22f8916107bc60405190565b610177906122d7565b6101f4906106f7565b906123ad825490565b6123b681610edc565b926123ca6020850191600052602060002090565b6000915b8383106123db5750505050565b6001602081926123ea8561239b565b8152019201920191906123ce565b6101f4906123a4565b6101f4905461063f565b908082146124da5761241c81612401565b906001600160401b03821161015e5761243982612194855461063f565b600090601f831160011461246657610e3a92916000918361245b57505061215c565b0154905038806121b6565b9061247b601f19841692600052602060002090565b9061248b85600052602060002090565b92815b8181106124c2575091600293918560019694106124ae5750505002019055565b01546000196008601f8516021c1916612212565b9193600180602092878701548155019501920161248e565b5050565b9190610729576101779161240b565b9061250090600019906020036008021c90565b8154169055565b9060009161252561251d82600052602060002090565b92835461215c565b905555565b919290602082101561258257601f841160011461254c57610e3a92935061215c565b509061257d61017793600161257461256985600052602060002090565b92601f602091010490565b820191016120ef565b612507565b506125bb8293612599600194600052602060002090565b61214b6020601f860104820192601f8616806125c3575b50601f602091010490565b600202179055565b6125cf908886036124ed565b386125b0565b929091600160401b821161015e576020111561261c5760208110156125fd57610e3a9161215c565b60019160ff191661261384600052602060002090565b55600202019055565b60019150600202019055565b9081546126348161063f565b9081831161265d575b81831061264b575b50505050565b6126549361252a565b38808080612645565b612669838383876125d5565b61263d565b600061017791612628565b90600003610729576101779061266e565b80548015611f2d576000190190611f2a6126a483836105eb565b90612679565b611f476126bf926126ba836123f8565b612744565b156127005760405162461bcd60e51b815260206004820152601460248201527329ba3934b733903737ba1034b71030b93930bc9760611b6044820152606490fd5b6101779161270f611f9f835490565b9081810361271f575b505061268a565b61273761272f61273d93856105eb565b5091846105eb565b906124de565b3880612718565b9190825192600061275481610f58565b855b8110156127ac5761276a6115258285610f8f565b61277c612775825190565b9160200190565b20612794611552865b612790612775825190565b2090565b14612042576127a561275691610f7b565b9050612754565b509350505081199190565b156127be57565b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b156127fa57565b60405162461bcd60e51b815260206004820152601c60248201527f436c61696d496e666f206861736820646f65736e2774206d61746368000000006044820152606490fd5b1561284657565b60405162461bcd60e51b815260206004820152603560248201527f4e756d626572206f66207369676e617475726573206e6f7420657175616c20746044820152746f206e756d626572206f66207769746e657373657360581b6064820152608490fd5b156128b057565b60405162461bcd60e51b815260206004820152601960248201527f5369676e6174757265206e6f7420617070726f707269617465000000000000006044820152606490fd5b906020820190815160200151612909905190565b9160009261291684610f58565b10612920906127b7565b828080808451015196845160200151612937610ee9565b98838a01906129439152565b6020890152015161295390612efe565b925101510161296190611525565b1461296b906127f3565b61297483612a5b565b805191600292612982845490565b1461298c9061283f565b61299584610f58565b935b6129a66101f460208801515190565b851015612a405780956129b882610f58565b6129c36101f4875490565b811015612a28576129d761200b8887610f8f565b6129ea610d616103b0610831858b6105eb565b146129fd576129f890610f7b565b6129b8565b50946129a69196506020612a1d6101f492612a1860016128a9565b610f7b565b969792505050612997565b50946020612a1d6101f492612a186129a6959a6128a9565b509350505050600190565b90610177611b79610f4584610edc565b6020612a6a6000830151612b2b565b910190612a7e612a7983515190565b612a4b565b91612a896000610f58565b612a956101f483515190565b811015612ad55780612a18612ab8612ab1612ad0948651610f8f565b5186612c02565b612ac28388610f8f565b906001600160a01b03169052565b612a89565b50505090565b610195816020939052565b6101f46101f46101f49263ffffffff1690565b92612b25612b18612b2594612b25612b186101f49998612b1897610260565b600560f91b815260010190565b90610260565b6101f4612b67612b3a83611525565b612b62612b4660405190565b8092612b56602083019182612adb565b9081038252038261013d565b613130565b612b83612b7e60208501516001600160a01b031690565b612fb9565b90612b56612bbf612bae612ba96060612bb3612bae612ba960408c015163ffffffff1690565b612ae6565b61329e565b98015163ffffffff1690565b604051958694602086019485612af9565b7f19457468657265756d205369676e6564204d6573736167653a0a00000000000081526101f49291612b2591601a0182565b90612b56612c326101f493612c15600090565b50612c21612bae825190565b604051938492602084019283612bd0565b612c3d612775825190565b206101f491612c4b91612dc1565b919091612c82565b634e487b7160e01b600052602160045260246000fd5b60051115612c7357565b612c53565b9061017782612c69565b612c8c6000612c78565b612c9582612c78565b03612c9d5750565b612ca76001612c78565b612cb082612c78565b03612cfa5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b612d046002612c78565b612d0d82612c78565b03612d575760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b612d6a612d646003612c78565b91612c78565b14612d7157565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b908051612dd16115526041610f58565b03612df757612df3916020820151906060604084015193015160001a90612e36565b9091565b5050612e036000610cd3565b90600290565b612e3261017794610393606094989795612e28608086019a6000870152565b60ff166020850152565b0152565b919291612e42836118fc565b612e6e6115527f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0610f58565b11612ed257612e8e600093602095612e8560405190565b94859485612e09565b838052039060015afa156112f25760005190600091612eac83610cd3565b6001600160a01b0381166001600160a01b03831614612eca57509190565b925050600190565b50505050612ee06000610cd3565b90600390565b6101f49392612b25612b18612b1893612b2595610260565b8051602082015160409283015192516127859290612b5690948593602085019384612ee6565b6101f49081906001600160a01b031681565b60ff8111610f8a5760020a90565b905b9081156116de570490565b61138461137e6101f49260ff1690565b612f469060ff165b9160ff1690565b612f7c9060ff16612f69565b029060ff8216918203610f8a57565b612f979060ff16612f69565b90039060ff8211610f8a57565b61060f60f31b81526101f49190600201612b25565b90612fc7611b966028610f58565b600092612fd384610f58565b612fdd6014610f58565b8110156130d45780613037611bd36130c56130bb6130cf956130376130b58c8b6130af613051611ae261304c8f61301e61301961304792610b06565b612f24565b61304161303c6008613037611aec8f611b476013610f58565b6115f3565b612f36565b90612f44565b6110e5565b612f51565b9261309a61309461304c60109661308e61307661304c6130708b6110e5565b84612f61565b986130896130838b61192a565b916110e5565b612f70565b90612f8b565b9461323a565b6130a78860029d8e610f58565b911a9261135a565b5361323a565b95610f58565b61165b6001610f58565b91881a918661135a565b612fd3565b50506101f49192506101f46130e860405190565b8092612b56602083019182612fa4565b6131026010611b51565b6f181899199a1a9b1b9c1cb0b131b232b360811b602082015290565b6101f46130f8565b81156116de570690565b90815191613146611b9660029461164c86610f58565b9061314f61311e565b60009161315b83610f58565b6131666101f4835190565b81101561320c57806131a661142b6131a061318a611ae261142b613207978961135a565b61319b613195895190565b91611936565b612f44565b8661135a565b6131c56131bb6131b58b610f58565b846115f3565b91871a918861135a565b536131ef61142b6131a06131df611ae261142b868961135a565b6131ea613195895190565b613126565b611bd36131bb6130bb6132018c610f58565b856115f3565b61315b565b505050506101f49192506101f46130e860405190565b61322e9060ff16612f69565b019060ff8211610f8a57565b6132439061192a565b61324d600a6110e5565b60ff8216101561326e5761304c6101f49161326860306110e5565b90613222565b61304c6101f49161326860576110e5565b6132896001611b51565b600360fc1b602082015290565b6101f461327f565b6000916132aa83610f58565b821461337257908060005b6132be85610f58565b83146132e1576132d06132db91610f7b565b92613041600a610f58565b916132b5565b91506132ec82611b63565b915b6132f785610f58565b82146133675761330e61336191611af26001610f58565b91613041600a8461335b61335261304c603061334d61308361304761334761333e6133388b610f58565b8d612f44565b61164c8b610f58565b8b611946565b613222565b8a1a918861135a565b53610f58565b906132ee565b50506101f491925090565b9150506101f4613296565b9061338c611e69610a6a845490565b9060005b81811061339d5750505090565b9091926133b2611eac600192611e9b87610ca2565b929101613390565b906101f49161337d565b90610177610711926133d560405190565b938480926133ba565b6101f4906133c4565b6101f460026133de565b906133fa825490565b61340381610edc565b926134176020850191600052602060002090565b6000915b8383106134285750505050565b6001602081926134378561239b565b81520192019201919061341b565b6101f4906133f1565b6101f46004613445565b611cf46101f491613467600090565b5060036102b5565b9061347b6109a8835190565b908161348d6020830284019460200190565b926000915b8383106134a157505050505090565b909192939460206134bd6109f483856001950387528951610b87565b9301930191939290613492565b60208082526101f49291019061346f565b80151561039c565b90505190610177826134db565b906020828203126101d4576101f4916134e3565b1561350b57565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b61356c61355c60405190565b8092612b566020830191826134ca565b613577612775825190565b206135a17f0000000000000000000000000000000000000000000000000000000000000000610b0f565b9063169394bb6135ba6135b360405190565b9160e01b90565b815260048101829052602081602481865afa9081156112f2576135ec916135e79160009161365157501590565b613504565b635bd4df3290823b156101d4576136289261361a6000809461360d60405190565b9687958694859360e01b90565b835260048301526024820190565b03925af180156112f2576136395750565b610177906000613649818361013d565b81019061086d565b611cf9915060203d8111613672575b61366a818361013d565b8101906134f0565b503d61366056fea2646970667358221220ac32ca16a78f612ec68240d59214076e1784464c21ff8fabfeff4b46fd239e1c64736f6c63430008120033", "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c80631cba9bed146101225780632ca6927d1461011d57806350262c001461011857806357c6e12a1461011357806359e26be11461010e578063670a8cb714610109578063715018a6146101045780637b103999146100ff5780637de24fcf146100fa5780638da5cb5b146100f557806396d195bd146100f0578063b870676c146100eb578063bd6e7741146100e6578063c2107e73146100e1578063ee2f13cd146100dc578063f2fde38b146100d75763fa7643f4036101d457610c7e565b610c3c565b610c24565b610bfd565b610b6f565b610b31565b610acb565b610a40565b610a19565b610890565b610878565b610837565b6107d9565b61079d565b6105a6565b6102ef565b61021c565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761015e57604052565b610127565b9061017761017060405190565b928361013d565b565b6001600160401b03811161015e57602090601f01601f19160190565b0190565b90826000939282370152565b909291926101ba6101b582610179565b610163565b938185526020850190828401116101d45761017792610199565b600080fd5b9080601f830112156101d4578160206101f4933591016101a5565b90565b906020828203126101d45781356001600160401b0381116101d4576101f492016101d9565b346101d45761023461022f3660046101f7565b612392565b604051005b0390f35b60005b8381106102505750506000910152565b8181015183820152602001610240565b61019561027892602092610272815190565b94859290565b9384910161023d565b9052565b6102956101959160209493610260565b918252565b6102af6102a660405190565b92839283610285565b03902090565b6101f49161029a565b6101f4916008021c5b60ff1690565b906101f491546102be565b6101f4906102ea6003916000926102b5565b6102cd565b346101d45761023961030a6103053660046101f7565b6102d8565b60405191829182901515815260200190565b9190916060818403126101d4576103336060610163565b9281356001600160401b0381116101d457816103509184016101d9565b845260208201356001600160401b0381116101d457816103719184016101d9565b602085015260408201356001600160401b0381116101d45761039392016101d9565b6040830152565b805b036101d457565b905035906101778261039a565b6001600160a01b031690565b6001600160a01b03811661039c565b90503590610177826103bc565b63ffffffff811661039c565b90503590610177826103d8565b9190916080818403126101d45761044a61040b6080610163565b93600061041882856103a3565b90860152602061042a828286016103cb565b90860152604061043c828286016103e4565b9086015260608093016103e4565b90830152565b6001600160401b03811161015e5760208091020190565b9291906104766101b582610450565b93818552602080860192028101918383116101d45781905b83821061049c575050505050565b81356001600160401b0381116101d4576020916104bc87849387016101d9565b81520191019061048e565b9080601f830112156101d4578160206101f493359101610467565b91909160a0818403126101d4576104f96040610163565b92600061050682846103f1565b9085015260808201356001600160401b0381116101d45761052792016104c7565b6020830152565b9190916040818403126101d4576105456040610163565b9281356001600160401b0381116101d4578161056291840161031c565b845260208201356001600160401b0381116101d45761052792016104e2565b906020828203126101d45781356001600160401b0381116101d4576101f4920161052e565b346101d45761023961030a6105bc366004610581565b6128f5565b906020828203126101d4576101f4916103a3565b634e487b7160e01b600052603260045260246000fd5b805482101561060e57610605600191600052602060002090565b91020190600090565b6105d5565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561065f575b602083101461065a57565b610629565b91607f169161064f565b8054600093929161068661067c8361063f565b8085529360200190565b91600181169081156106d8575060011461069f57505050565b6106b29192939450600052602060002090565b916000925b8184106106c45750500190565b8054848401526020909301926001016106b7565b92949550505060ff1916825215156020020190565b906101f491610669565b906101776107119261070860405190565b938480926106ed565b038361013d565b90600010610729576101f4906106f7565b610613565b6004600061073a825490565b83101561075557506101f49161074f916105eb565b90610718565b80fd5b6107796107826020936101959361076d815190565b80835293849260200190565b9586910161023d565b601f01601f191690565b60208082526101f492910190610758565b346101d4576102396107b86107b33660046105c1565b61072e565b6040515b9182918261078c565b906020828203126101d4576101f4916103cb565b346101d4576102346107ec3660046107c5565b611d4f565b6101f4916008021c6001600160a01b031690565b906101f491546107f1565b6002600061081c825490565b83101561075557506101f491610831916105eb565b90610805565b346101d45761023961085261084d3660046105c1565b610810565b6040515b918291826001600160a01b03909116815260200190565b60009103126101d457565b346101d45761088836600461086d565b610234610cee565b346101d4576108a036600461086d565b6102397f0000000000000000000000000000000000000000000000000000000000000000610852565b9291906108d86101b582610450565b93818552602080860192028101918383116101d45781905b8382106108fe575050505050565b81356001600160401b0381116101d45760209161091e878493870161052e565b8152019101906108f0565b9080601f830112156101d4578160206101f4933591016108c9565b906020828203126101d45781356001600160401b0381116101d4576101f49201610929565b906101f49060208061098a6040840160008701518582036000870152610758565b940151910152565b906101f491610969565b906109b26109a8835190565b8083529160200190565b90816109c46020830284019460200190565b926000915b8383106109d857505050505090565b909192939460206109fb6109f483856001950387528951610992565b9760200190565b93019301919392906109c9565b60208082526101f49291019061099c565b346101d457610239610a34610a2f366004610944565b610fed565b60405191829182610a08565b346101d457610a5036600461086d565b610239610852610cac565b90610a7b610a74610a6a845190565b8084529260200190565b9260200190565b9060005b818110610a8c5750505090565b909192610ab2610aab60019286516001600160a01b0316815260200190565b9460200190565b929101610a7f565b60208082526101f492910190610a5b565b346101d457610adb36600461086d565b610239610ae66133e7565b60405191829182610aba565b6101f4906103b0906001600160a01b031682565b6101f490610af2565b6101f490610b06565b61028190610b0f565b6020810192916101779190610b18565b346101d457610b4136600461086d565b604051806102397f000000000000000000000000000000000000000000000000000000000000000082610b21565b346101d457610234610b823660046101f7565b6122ce565b906101f491610758565b90610b9d6109a8835190565b9081610baf6020830284019460200190565b926000915b838310610bc357505050505090565b90919293946020610bdf6109f483856001950387528951610b87565b9301930191939290610bb4565b60208082526101f492910190610b91565b346101d457610c0d36600461086d565b610239610c1861344e565b60405191829182610bec565b346101d457610234610c373660046107c5565b611e51565b346101d457610234610c4f3660046107c5565b610e05565b90610c5e90610b0f565b600052602052604060002090565b6101f4906102ea600191600092610c54565b346101d45761023961030a610c943660046107c5565b610c6c565b6101f4906103b0565b6101f49054610c99565b6101f46000610ca2565b610cbe610d4a565b610177610cdc565b6103b06101f46101f49290565b6101f490610cc6565b610177610ce96000610cd3565b610e3e565b610177610cb6565b15610cfd57565b60405162461bcd60e51b815280610d46600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b610177610d55610cac565b610d6e610d61336103b0565b916001600160a01b031690565b14610cf6565b61017790610d80610d4a565b610de0565b15610d8c57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61017790610ce9610df46103b06000610cd3565b6001600160a01b0383161415610d85565b61017790610d74565b906001600160a01b03905b9181191691161790565b90610e336101f4610e3a92610b0f565b8254610e0e565b9055565b610e486000610ca2565b90610e54816000610e23565b610e87610e817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610b0f565b91610b0f565b91610e9160405190565b600090a3565b15610e9e57565b60405162461bcd60e51b815260206004820152601660248201527513db9b1e481c9959da5cdd1c9e4818d85b8818d85b1b60521b6044820152606490fd5b906102956101b583610450565b6101f46040610163565b610efb610ee9565b906060825260006020830152565b6101f4610ef3565b60005b828110610f2057505050565b602090610f2b610f09565b8184015201610f14565b90610177610f4b610f4584610edc565b93610450565b601f190160208401610f11565b6101f46101f46101f49290565b634e487b7160e01b600052601160045260246000fd5b6000198114610f8a5760010190565b610f65565b90610f98825190565b81101561060e576020809102010190565b15610fb057565b60405162461bcd60e51b815260206004820152601560248201527409cde40ecc2d8d2c840e0e4deecd2c8cae490c2e6d605b1b6044820152606490fd5b9061102a336110246001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016610d61565b14610e97565b61103a611035835190565b610f35565b916000908361104883610f58565b6110536101f4845190565b8110156110de578061109e6110be6110ac6110996110a760208061107a6110d9998c610f8f565b51611084816128f5565b5061108e81611221565b999199969096613458565b610fa9565b01510151613550565b6113f1565b6105276110b7610ee9565b9389850152565b6110c88289610f8f565b526110d38188610f8f565b50610f7b565b611048565b5093505050565b6102c76101f46101f49290565b6101f460056110e5565b9092919261110c6101b582610179565b938185526020850190828401116101d4576101779261023d565b9080601f830112156101d45781516101f4926020016110fc565b92919061114f6101b582610450565b93818552602080860192028101918383116101d45781905b838210611175575050505050565b81516001600160401b0381116101d4576020916111958784938701611126565b815201910190611167565b9080601f830112156101d45781516101f492602001611140565b906020828203126101d45781516001600160401b0381116101d4576101f492016111a0565b60409061120d6112016101779597969460608401908482036000860152610758565b60ff9097166020830152565b019015159052565b6040513d6000823e3d90fd5b516040015173__$5b71c94e19686701747fb081826a62a8ff$__91634be6d4f89160009061124d6110f2565b9461126e6001956112798761126160405190565b998a968795869560e01b90565b8552600485016111df565b03915af49283156112f2576000936112cf575b506112c86112b66112b06112a96112a36000610f58565b87610f8f565b5194610f58565b85610f8f565b51936112c26002610f58565b90610f8f565b5191929190565b6112eb91933d8091833e6112e3818361013d565b8101906111ba565b913861128c565b611215565b6001600160401b03811161015e5760200290565b6101b56101f4916112f7565b60005b82811061132657505050565b60608282015260200161131a565b9061017761134a6113448461130b565b936112f7565b83611317565b6101f46006611334565b90611363825190565b81101561060e570160200190565b61138461137e6101f49290565b60f81b90565b6001600160f81b03191690565b90600681101561060e576020020190565b91908201809211610f8a57565b156113b657565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206461746520737472696e6760681b6044820152606490fd5b906000916113fd611350565b8390600061140a81610f58565b846114166101f4825190565b82101561150a578161143961142b828461135a565b516001600160f81b03191690565b611454611446602d611371565b916001600160f81b03191690565b149182156114e7575b82156114c3575b5050611479575b61147490610f7b565b61140a565b9295836114869186611b86565b6114908784611391565b5261149b8683611391565b506114746114bb6114b56114af6001610f58565b866113a2565b97610f7b565b93905061146b565b6114d292509061142b9161135a565b6114df6114466054611371565b148138611464565b91506114f661142b828461135a565b611503611446603a611371565b149161145d565b5050929161152f61155c92936101f496976115296115258390565b5190565b91611b86565b6115398285611391565b526115448184611391565b506115566115526005610f58565b9190565b146113af565b61158261157b61157461156e85610f58565b84611391565b5193610f58565b8093611905565b9061159a8361159461156e6001610f58565b51611905565b6115b1846115946115ab6002610f58565b85611391565b906115e1856115946115d0826115946115ca6003610f58565b89611391565b956115db6004610f58565b90611391565b9361161b565b6101f462015180610f58565b81810292918115918404141715610f8a57565b6101f4610e10610f58565b6101f4603c610f58565b61166a9361165b6116526116446101f499989661165b966116619661163e600090565b50611712565b61164c6115e7565b906115f3565b9161164c611606565b906113a2565b9161164c611611565b6113a2565b156101d457565b91908083039260009091128015828513169184121617610f8a57565b919082810192600013801591841291821691151617610f8a57565b634e487b7160e01b600052601260045260246000fd5b81156116de57600160ff1b8114600019831416610f8a570590565b6116ad565b8181029291600160ff1b81146000831216610f8a578184051490151715610f8a57565b6101f462253d8c610f58565b61171d6107b2610f58565b8110156117299061166f565b61173290610f58565b9061173c90610f58565b9161174690610f58565b611751617d4b610f58565b61175a91611676565b906105b56117696112c0610f58565b6117739083611692565b600e9161177f83610f58565b6117899087611676565b91600c9261179684610f58565b61179f916116c3565b6117a891611692565b906117b290610f58565b906117bc916116e3565b936004946117c986610f58565b6117d2916116c3565b6117db91611692565b61016f6117e86002610f58565b6117f29088611676565b6117fb85610f58565b6118059089611676565b61180e85610f58565b611817916116c3565b61182085610f58565b611829916116e3565b61183291611676565b9061183c90610f58565b90611846916116e3565b61184f83610f58565b611858916116c3565b61186191611692565b94600393611870611324610f58565b61187991611692565b9261188390610f58565b61188c91611676565b9061189690610f58565b61189f916116c3565b6118a891611692565b6118b26064610f58565b6118bb916116c3565b906118c590610f58565b906118cf916116e3565b906118d990610f58565b6118e2916116c3565b6118eb91611676565b6118f3611706565b6118fc91611676565b6101f490610f58565b6101f49190611914602e611371565b90611a04565b6102c76101f46101f49260ff1690565b6101f49060f81c61191a565b6101f46101f46101f49260ff1690565b91908203918211610f8a57565b1561195a57565b60405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606490fd5b156119a657565b60405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608490fd5b604d8111610f8a57600a0a90565b92600091611a1183610f58565b808493815b611a216101f48a5190565b811015611b22578589611a3761142b848361135a565b603090611a4661144683611371565b101580611b00575b611ab6575b5050611aa6575b611a6761142b828b61135a565b611a7a6001600160f81b03198716611446565b14611a8e575b611a8990610f7b565b611a16565b94611a9e90151587151514611953565b600194611a80565b92611ab090610f7b565b92611a5a565b61165b90611af2611aec611ae7611ae261142b89611adc611af89a9d61164c600a610f58565b9861135a565b61192a565b611936565b91610f58565b90611946565b928938611a53565b50611b0e61142b858461135a565b611b1b6114466039611371565b1115611a4e565b509650935061164c9250611b4c91506101f494611b47611b3f8290565b83111561199f565b611946565b6119f6565b906102956101b583610179565b369037565b90610177611b79611b7384611b51565b93610179565b601f190160208401611b5e565b909290611b9b611b968585611946565b611b63565b91845b845b811015611be057611bd981611bbb61142b611ba0948761135a565b611bd3611bc88a84611946565b9160001a918861135a565b53610f7b565b9050611b9e565b509350506101f4915090565b61017790611bf8610d4a565b611cdc565b6101f4906102c7565b6101f49054611bfd565b15611c1757565b60405162461bcd60e51b815260206004820152601c60248201527f4164647265737320697320616c72656164792061207769746e657373000000006044820152606490fd5b9060ff90610e19565b90611c756101f4610e3a92151590565b8254611c5c565b916001600160a01b0360089290920291821b911b610e19565b921b90565b9190611cab6101f4610e3a93610b0f565b908354611c7c565b90815491600160401b83101561015e5782611cd6916001610177950181556105eb565b90611c9a565b611d116001611d02611cfd611cf9611cf48685610c54565b611c06565b1590565b611c10565b611d0c8382610c54565b611c65565b611d1c816002611cb3565b611d4a7ff5944521c155e80db583372b9992336b6616b14dfb924a5cf6ef97b256d280349161085660405190565b0390a1565b61017790611bec565b61017790611d64610d4a565b611dee565b15611d7057565b60405162461bcd60e51b815260206004820152601860248201527f41646472657373206973206e6f742061207769746e65737300000000000000006044820152606490fd5b91906008610e19910291611c9560ff841b90565b9190611dda6101f4610e3a93151590565b908354611db5565b61017791600091611dc9565b611e186000611e13836001611e0e611e09611cf48484610c54565b611d69565b610c54565b611de2565b611e23816002611f32565b611d4a7f8b5785dce93ca82765b1cc25cedcda1b501288cb23a1fd171c0091d83900f9bd9161085660405190565b61017790611d58565b90611e75611e69610a6a845490565b92600052602060002090565b9060005b818110611e865750505090565b909192611eb3611eac600192611e9b87610ca2565b6001600160a01b0316815260200190565b9460010190565b929101611e79565b906101f491611e5a565b9061017761071192611ed660405190565b93848092611ebb565b6101f490611ec5565b634e487b7160e01b600052603160045260246000fd5b61017791600091611c9a565b80548015611f2d576000190190611f2a611f2483836105eb565b90611efe565b55565b611ee8565b611f47611f4e92611f4283611edf565b611fe5565b9092901590565b15611f905760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b61017791611fa9611f9f835490565b611af26001610f58565b90818103611fb9575b5050611f0a565b611cd6611fcc610831611fd394866105eb565b91846105eb565b3880611fb2565b6101f4600019610f58565b91908251926000611ff581610f58565b855b81101561204c5761201861200b8285610f8f565b516001600160a01b031690565b61202a6001600160a01b038616610d61565b146120425761203b611ff791610f7b565b9050611ff5565b9450505050600190565b5093505050611552611fda565b61017790612065610d4a565b61226c565b1561207157565b60405162461bcd60e51b815260206004820152601b60248201527f50726f7669646572206861736820616c726561647920616464656400000000006044820152606490fd5b9160001960089290920291821b911b610e19565b91906120db6101f4610e3a93610f58565b9083546120b6565b610177916000916120ca565b8181106120fa575050565b8061210860006001936120e3565b016120ef565b9190601f811161211d57505050565b61212f61017793600052602060002090565b906020601f840181900483019310612152575b6020601f909101045b01906120ef565b9091508190612142565b600019600883021c1916906002021790565b90612177815190565b906001600160401b03821161015e5761219a82612194855461063f565b8561210e565b602090601f83116001146121c857610e3a9291600091836121bd575b505061215c565b0151905038806121b6565b601f198316916121dd85600052602060002090565b9260005b81811061221c57509160029391856001969410612202575b50505002019055565b01516000196008601f8516021c19165b90553880806121f9565b919360206001819287870151815501950192016121e1565b9190610729576101779161216e565b90815491600160401b83101561015e5782612266916001610177950181556105eb565b90612234565b6122956003612289612284611cf9611cf486856102b5565b61206a565b611d0c836001926102b5565b6122a0816004612243565b611d4a7fc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096916107bc60405190565b61017790612059565b610177906122e3610d4a565b612334565b156122ef57565b60405162461bcd60e51b815260206004820152601760248201527f50726f76696465722068617368206e6f7420666f756e640000000000000000006044820152606490fd5b6123596000611e1383600361235461234f611cf484846102b5565b6122e8565b6102b5565b6123648160046126aa565b611d4a7f6f594b4b4f0580c66aabba75218163a99fa1fe330a171cc9e2bfd8e167db22f8916107bc60405190565b610177906122d7565b6101f4906106f7565b906123ad825490565b6123b681610edc565b926123ca6020850191600052602060002090565b6000915b8383106123db5750505050565b6001602081926123ea8561239b565b8152019201920191906123ce565b6101f4906123a4565b6101f4905461063f565b908082146124da5761241c81612401565b906001600160401b03821161015e5761243982612194855461063f565b600090601f831160011461246657610e3a92916000918361245b57505061215c565b0154905038806121b6565b9061247b601f19841692600052602060002090565b9061248b85600052602060002090565b92815b8181106124c2575091600293918560019694106124ae5750505002019055565b01546000196008601f8516021c1916612212565b9193600180602092878701548155019501920161248e565b5050565b9190610729576101779161240b565b9061250090600019906020036008021c90565b8154169055565b9060009161252561251d82600052602060002090565b92835461215c565b905555565b919290602082101561258257601f841160011461254c57610e3a92935061215c565b509061257d61017793600161257461256985600052602060002090565b92601f602091010490565b820191016120ef565b612507565b506125bb8293612599600194600052602060002090565b61214b6020601f860104820192601f8616806125c3575b50601f602091010490565b600202179055565b6125cf908886036124ed565b386125b0565b929091600160401b821161015e576020111561261c5760208110156125fd57610e3a9161215c565b60019160ff191661261384600052602060002090565b55600202019055565b60019150600202019055565b9081546126348161063f565b9081831161265d575b81831061264b575b50505050565b6126549361252a565b38808080612645565b612669838383876125d5565b61263d565b600061017791612628565b90600003610729576101779061266e565b80548015611f2d576000190190611f2a6126a483836105eb565b90612679565b611f476126bf926126ba836123f8565b612744565b156127005760405162461bcd60e51b815260206004820152601460248201527329ba3934b733903737ba1034b71030b93930bc9760611b6044820152606490fd5b6101779161270f611f9f835490565b9081810361271f575b505061268a565b61273761272f61273d93856105eb565b5091846105eb565b906124de565b3880612718565b9190825192600061275481610f58565b855b8110156127ac5761276a6115258285610f8f565b61277c612775825190565b9160200190565b20612794611552865b612790612775825190565b2090565b14612042576127a561275691610f7b565b9050612754565b509350505081199190565b156127be57565b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b156127fa57565b60405162461bcd60e51b815260206004820152601c60248201527f436c61696d496e666f206861736820646f65736e2774206d61746368000000006044820152606490fd5b1561284657565b60405162461bcd60e51b815260206004820152603560248201527f4e756d626572206f66207369676e617475726573206e6f7420657175616c20746044820152746f206e756d626572206f66207769746e657373657360581b6064820152608490fd5b156128b057565b60405162461bcd60e51b815260206004820152601960248201527f5369676e6174757265206e6f7420617070726f707269617465000000000000006044820152606490fd5b906020820190815160200151612909905190565b9160009261291684610f58565b10612920906127b7565b828080808451015196845160200151612937610ee9565b98838a01906129439152565b6020890152015161295390612efe565b925101510161296190611525565b1461296b906127f3565b61297483612a5b565b805191600292612982845490565b1461298c9061283f565b61299584610f58565b935b6129a66101f460208801515190565b851015612a405780956129b882610f58565b6129c36101f4875490565b811015612a28576129d761200b8887610f8f565b6129ea610d616103b0610831858b6105eb565b146129fd576129f890610f7b565b6129b8565b50946129a69196506020612a1d6101f492612a1860016128a9565b610f7b565b969792505050612997565b50946020612a1d6101f492612a186129a6959a6128a9565b509350505050600190565b90610177611b79610f4584610edc565b6020612a6a6000830151612b2b565b910190612a7e612a7983515190565b612a4b565b91612a896000610f58565b612a956101f483515190565b811015612ad55780612a18612ab8612ab1612ad0948651610f8f565b5186612c02565b612ac28388610f8f565b906001600160a01b03169052565b612a89565b50505090565b610195816020939052565b6101f46101f46101f49263ffffffff1690565b92612b25612b18612b2594612b25612b186101f49998612b1897610260565b600560f91b815260010190565b90610260565b6101f4612b67612b3a83611525565b612b62612b4660405190565b8092612b56602083019182612adb565b9081038252038261013d565b613130565b612b83612b7e60208501516001600160a01b031690565b612fb9565b90612b56612bbf612bae612ba96060612bb3612bae612ba960408c015163ffffffff1690565b612ae6565b61329e565b98015163ffffffff1690565b604051958694602086019485612af9565b7f19457468657265756d205369676e6564204d6573736167653a0a00000000000081526101f49291612b2591601a0182565b90612b56612c326101f493612c15600090565b50612c21612bae825190565b604051938492602084019283612bd0565b612c3d612775825190565b206101f491612c4b91612dc1565b919091612c82565b634e487b7160e01b600052602160045260246000fd5b60051115612c7357565b612c53565b9061017782612c69565b612c8c6000612c78565b612c9582612c78565b03612c9d5750565b612ca76001612c78565b612cb082612c78565b03612cfa5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b612d046002612c78565b612d0d82612c78565b03612d575760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b612d6a612d646003612c78565b91612c78565b14612d7157565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b908051612dd16115526041610f58565b03612df757612df3916020820151906060604084015193015160001a90612e36565b9091565b5050612e036000610cd3565b90600290565b612e3261017794610393606094989795612e28608086019a6000870152565b60ff166020850152565b0152565b919291612e42836118fc565b612e6e6115527f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0610f58565b11612ed257612e8e600093602095612e8560405190565b94859485612e09565b838052039060015afa156112f25760005190600091612eac83610cd3565b6001600160a01b0381166001600160a01b03831614612eca57509190565b925050600190565b50505050612ee06000610cd3565b90600390565b6101f49392612b25612b18612b1893612b2595610260565b8051602082015160409283015192516127859290612b5690948593602085019384612ee6565b6101f49081906001600160a01b031681565b60ff8111610f8a5760020a90565b905b9081156116de570490565b61138461137e6101f49260ff1690565b612f469060ff165b9160ff1690565b612f7c9060ff16612f69565b029060ff8216918203610f8a57565b612f979060ff16612f69565b90039060ff8211610f8a57565b61060f60f31b81526101f49190600201612b25565b90612fc7611b966028610f58565b600092612fd384610f58565b612fdd6014610f58565b8110156130d45780613037611bd36130c56130bb6130cf956130376130b58c8b6130af613051611ae261304c8f61301e61301961304792610b06565b612f24565b61304161303c6008613037611aec8f611b476013610f58565b6115f3565b612f36565b90612f44565b6110e5565b612f51565b9261309a61309461304c60109661308e61307661304c6130708b6110e5565b84612f61565b986130896130838b61192a565b916110e5565b612f70565b90612f8b565b9461323a565b6130a78860029d8e610f58565b911a9261135a565b5361323a565b95610f58565b61165b6001610f58565b91881a918661135a565b612fd3565b50506101f49192506101f46130e860405190565b8092612b56602083019182612fa4565b6131026010611b51565b6f181899199a1a9b1b9c1cb0b131b232b360811b602082015290565b6101f46130f8565b81156116de570690565b90815191613146611b9660029461164c86610f58565b9061314f61311e565b60009161315b83610f58565b6131666101f4835190565b81101561320c57806131a661142b6131a061318a611ae261142b613207978961135a565b61319b613195895190565b91611936565b612f44565b8661135a565b6131c56131bb6131b58b610f58565b846115f3565b91871a918861135a565b536131ef61142b6131a06131df611ae261142b868961135a565b6131ea613195895190565b613126565b611bd36131bb6130bb6132018c610f58565b856115f3565b61315b565b505050506101f49192506101f46130e860405190565b61322e9060ff16612f69565b019060ff8211610f8a57565b6132439061192a565b61324d600a6110e5565b60ff8216101561326e5761304c6101f49161326860306110e5565b90613222565b61304c6101f49161326860576110e5565b6132896001611b51565b600360fc1b602082015290565b6101f461327f565b6000916132aa83610f58565b821461337257908060005b6132be85610f58565b83146132e1576132d06132db91610f7b565b92613041600a610f58565b916132b5565b91506132ec82611b63565b915b6132f785610f58565b82146133675761330e61336191611af26001610f58565b91613041600a8461335b61335261304c603061334d61308361304761334761333e6133388b610f58565b8d612f44565b61164c8b610f58565b8b611946565b613222565b8a1a918861135a565b53610f58565b906132ee565b50506101f491925090565b9150506101f4613296565b9061338c611e69610a6a845490565b9060005b81811061339d5750505090565b9091926133b2611eac600192611e9b87610ca2565b929101613390565b906101f49161337d565b90610177610711926133d560405190565b938480926133ba565b6101f4906133c4565b6101f460026133de565b906133fa825490565b61340381610edc565b926134176020850191600052602060002090565b6000915b8383106134285750505050565b6001602081926134378561239b565b81520192019201919061341b565b6101f4906133f1565b6101f46004613445565b611cf46101f491613467600090565b5060036102b5565b9061347b6109a8835190565b908161348d6020830284019460200190565b926000915b8383106134a157505050505090565b909192939460206134bd6109f483856001950387528951610b87565b9301930191939290613492565b60208082526101f49291019061346f565b80151561039c565b90505190610177826134db565b906020828203126101d4576101f4916134e3565b1561350b57565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b61356c61355c60405190565b8092612b566020830191826134ca565b613577612775825190565b206135a17f0000000000000000000000000000000000000000000000000000000000000000610b0f565b9063169394bb6135ba6135b360405190565b9160e01b90565b815260048101829052602081602481865afa9081156112f2576135ec916135e79160009161365157501590565b613504565b635bd4df3290823b156101d4576136289261361a6000809461360d60405190565b9687958694859360e01b90565b835260048301526024820190565b03925af180156112f2576136395750565b610177906000613649818361013d565b81019061086d565b611cf9915060203d8111613672575b61366a818361013d565b8101906134f0565b503d61366056fea2646970667358221220ac32ca16a78f612ec68240d59214076e1784464c21ff8fabfeff4b46fd239e1c64736f6c63430008120033", "libraries": { - "ClaimVerifier": "0x1cB3888556cfeE16361EDdb3F8EB1BfD75Af3807" + "ClaimVerifier": "0x5B8F92B8afA5Db7078703294D646908F0fc00D87" }, "devdoc": { "kind": "dev", diff --git a/contracts-domain/deployments/base_staging/solcInputs/a43d75c8fa53cbd70612f5013c5d17a2.json b/contracts-domain/deployments/base_staging/solcInputs/a43d75c8fa53cbd70612f5013c5d17a2.json new file mode 100644 index 000000000..0a9b68d56 --- /dev/null +++ b/contracts-domain/deployments/base_staging/solcInputs/a43d75c8fa53cbd70612f5013c5d17a2.json @@ -0,0 +1,68 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" + }, + "@zk-email/contracts/utils/StringUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.7.6;\n\n// https://github.com/nalinbhardwaj/ethdosnumber/blob/main/ethdos-contracts/src/HexStrings.sol\nlibrary StringUtils {\n bytes16 internal constant ALPHABET = \"0123456789abcdef\";\n uint256 internal constant DEFAULT_PACK_SIZE = 31;\n\n /// @notice Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n /// @dev Credit to Open Zeppelin under MIT license https://github.com/OpenZeppelin/openzeppelin-contracts/blob/243adff49ce1700e0ecb99fe522fb16cff1d1ddc/contracts/utils/Strings.sol#L55\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = ALPHABET[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n function toHexStringNoPrefix(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length);\n for (uint256 i = buffer.length; i > 0; i--) {\n buffer[i - 1] = ALPHABET[value & 0xf];\n value >>= 4;\n }\n return string(buffer);\n }\n\n function toString(uint256 value) internal pure returns (string memory) {\n return toString(abi.encodePacked(value));\n }\n\n function toString(bytes32 value) internal pure returns (string memory) {\n return toString(abi.encodePacked(value));\n }\n\n function toString(address account) internal pure returns (string memory) {\n return toString(abi.encodePacked(account));\n }\n\n function stringEq(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));\n }\n\n function toString(bytes memory data) internal pure returns (string memory) {\n bytes memory alphabet = \"0123456789abcdef\";\n\n bytes memory str = new bytes(2 + data.length * 2);\n str[0] = \"0\";\n str[1] = \"x\";\n for (uint256 i = 0; i < data.length; i++) {\n str[2 + i * 2] = alphabet[uint256(uint8(data[i] >> 4))];\n str[3 + i * 2] = alphabet[uint256(uint8(data[i] & 0x0f))];\n }\n return string(str);\n }\n\n // 1 packed byte = packSize (usually 31) normal bytes, all in one 255/256-bit value\n // Note that this is not 32 due to the field modulus of circom\n function convertPackedByteToString(uint256 packedByte, uint256 packSize)\n internal\n pure\n returns (string memory extractedString)\n {\n uint256[] memory packedBytes = new uint256[](1);\n packedBytes[0] = packedByte;\n return convertPackedBytesToString(packedBytes, packSize, packSize);\n }\n\n // Note: This convenience function removes the max string length check, which may cause misalignment with the circom\n // If using this, then the circom needs to rangecheck packed length in the circuit itself\n // This defaults to 31 bytes per packed byte\n function convertPackedBytesToString(uint256[] memory packedBytes) \n internal\n pure\n returns (string memory extractedString)\n {\n return convertPackedBytesToString(packedBytes, packedBytes.length * DEFAULT_PACK_SIZE, DEFAULT_PACK_SIZE);\n }\n\n // Unpacks uint256s into bytes and then extracts the non-zero characters\n // Only extracts contiguous non-zero characters and ensures theres only 1 such state\n // Note that unpackedLen may be more than packedBytes.length * 8 since there may be 0s\n // signals is the total number of signals (i.e. bytes) packed into the packedBytes. it defaults to packedBytes.length * packSize\n function convertPackedBytesToString(uint256[] memory packedBytes, uint256 signals, uint256 packSize)\n internal\n pure\n returns (string memory extractedString)\n {\n uint8 state = 0;\n // bytes: 0 0 0 0 y u s h _ g 0 0 0\n // state: 0 0 0 0 1 1 1 1 1 1 2 2 2\n bytes memory nonzeroBytesArray = new bytes(packedBytes.length * packSize);\n uint256 nonzeroBytesArrayIndex = 0;\n for (uint16 i = 0; i < packedBytes.length; i++) {\n uint256 packedByte = packedBytes[i];\n uint8[] memory unpackedBytes = new uint8[](packSize);\n for (uint256 j = 0; j < packSize; j++) {\n unpackedBytes[j] = uint8(packedByte >> (j * 8));\n }\n for (uint256 j = 0; j < packSize; j++) {\n uint256 unpackedByte = unpackedBytes[j]; //unpackedBytes[j];\n if (unpackedByte != 0) {\n nonzeroBytesArray[nonzeroBytesArrayIndex] = bytes1(uint8(unpackedByte));\n nonzeroBytesArrayIndex++;\n if (state % 2 == 0) {\n state += 1;\n }\n } else {\n if (state % 2 == 1) {\n state += 1;\n }\n }\n packedByte = packedByte >> 8;\n }\n }\n // TODO: You might want to assert that the state is exactly 1 or 2\n // If not, that means empty bytse have been removed from the middle and things have been concatenated.\n // We removed due to some tests failing, but this is not ideal and the require should be uncommented as soon as tests pass with it.\n\n // require(state == 1 || state == 2, \"Invalid final state of packed bytes in email; more than two non-zero regions found!\");\n require(state >= 1, \"No packed bytes found! Invalid final state of packed bytes in email; value is likely 0!\");\n require(nonzeroBytesArrayIndex <= signals, \"Packed bytes more than allowed max number of signals!\");\n string memory returnValue = removeTrailingZeros(string(nonzeroBytesArray));\n return returnValue;\n // Have to end at the end of the email -- state cannot be 1 since there should be an email footer\n }\n\n function bytes32ToString(bytes32 input) internal pure returns (string memory) {\n uint256 i;\n for (i = 0; i < 32 && input[i] != 0; i++) {}\n bytes memory resultBytes = new bytes(i);\n for (i = 0; i < 32 && input[i] != 0; i++) {\n resultBytes[i] = input[i];\n }\n return string(resultBytes);\n }\n\n // sliceArray is used to slice an array of uint256s from start-end into a new array of uint256s\n function sliceArray(uint256[] memory input, uint256 start, uint256 end) internal pure returns (uint256[] memory) {\n require(start <= end && end <= input.length, \"Invalid slice indices\");\n uint256[] memory result = new uint256[](end - start);\n for (uint256 i = start; i < end; i++) {\n result[i - start] = input[i];\n }\n return result;\n }\n\n // stringToUint is used to convert a string like \"45\" to a uint256 4\n function stringToUint(string memory s) internal pure returns (uint256) {\n bytes memory b = bytes(s);\n uint256 result = 0;\n for (uint256 i = 0; i < b.length; i++) {\n if (b[i] >= 0x30 && b[i] <= 0x39) {\n result = result * 10 + (uint256(uint8(b[i])) - 48);\n }\n\n // TODO: Currently truncates decimals\n if (b[i] == 0x2E) {\n return result;\n }\n }\n return result;\n }\n\n // getDomainFromEmail is used to extract the domain from an email i.e. the part after the @\n function getDomainFromEmail(string memory fromEmail) internal pure returns (string memory) {\n bytes memory emailBytes = bytes(fromEmail);\n uint256 atIndex;\n for (uint256 i = 0; i < emailBytes.length; i++) {\n if (emailBytes[i] == \"@\") {\n atIndex = i;\n break;\n }\n }\n\n bytes memory domainBytes = new bytes(emailBytes.length - atIndex - 1);\n for (uint256 j = 0; j < domainBytes.length; j++) {\n domainBytes[j] = emailBytes[atIndex + 1 + j];\n }\n return bytes32ToString(bytes32(bytes(domainBytes)));\n }\n\n function removeTrailingZeros(string memory input) public pure returns (string memory) {\n bytes memory inputBytes = bytes(input);\n uint256 endIndex = inputBytes.length;\n\n for (uint256 i = 0; i < inputBytes.length; i++) {\n if (inputBytes[i] == 0) {\n endIndex = i;\n break;\n }\n }\n\n bytes memory resultBytes = new bytes(endIndex);\n for (uint256 i = 0; i < endIndex; i++) {\n resultBytes[i] = inputBytes[i];\n }\n\n return string(resultBytes);\n }\n\n // Upper/lower string utils from https://github.com/willitscale/solidity-util/blob/master/lib/Strings.sol\n /**\n * Upper\n *\n * Converts all the values of a string to their corresponding upper case\n * value.\n *\n * @param _base When being used for a data type this is the extended object\n * otherwise this is the string base to convert to upper case\n * @return string\n */\n function upper(string memory _base) public pure returns (string memory) {\n bytes memory _baseBytes = bytes(_base);\n for (uint256 i = 0; i < _baseBytes.length; i++) {\n _baseBytes[i] = _upper(_baseBytes[i]);\n }\n return string(_baseBytes);\n }\n\n /**\n * Lower\n *\n * Converts all the values of a string to their corresponding lower case\n * value.\n *\n * @param _base When being used for a data type this is the extended object\n * otherwise this is the string base to convert to lower case\n * @return string\n */\n function lower(string memory _base) public pure returns (string memory) {\n bytes memory _baseBytes = bytes(_base);\n for (uint256 i = 0; i < _baseBytes.length; i++) {\n _baseBytes[i] = _lower(_baseBytes[i]);\n }\n return string(_baseBytes);\n }\n\n /**\n * Upper\n *\n * Convert an alphabetic character to upper case and return the original\n * value when not alphabetic\n *\n * @param _b1 The byte to be converted to upper case\n * @return bytes1 The converted value if the passed value was alphabetic\n * and in a lower case otherwise returns the original value\n */\n function _upper(bytes1 _b1) private pure returns (bytes1) {\n if (_b1 >= 0x61 && _b1 <= 0x7A) {\n return bytes1(uint8(_b1) - 32);\n }\n\n return _b1;\n }\n\n /**\n * Lower\n *\n * Convert an alphabetic character to lower case and return the original\n * value when not alphabetic\n *\n * @param _b1 The byte to be converted to lower case\n * @return bytes1 The converted value if the passed value was alphabetic\n * and in a upper case otherwise returns the original value\n */\n function _lower(bytes1 _b1) private pure returns (bytes1) {\n if (_b1 >= 0x41 && _b1 <= 0x5A) {\n return bytes1(uint8(_b1) + 32);\n }\n\n return _b1;\n }\n}\n" + }, + "contracts/external/interfaces/IKeyHashAdapterV2.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IKeyHashAdapterV2 {\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external;\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external;\n function getMailServerKeyHashes() external view returns (bytes32[] memory);\n function isMailServerKeyHash(bytes32 _mailserverKeyHash) external view returns (bool);\n}\n" + }, + "contracts/external/interfaces/INullifierRegistry.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface INullifierRegistry {\n function addNullifier(bytes32 _nullifier) external;\n function isNullified(bytes32 _nullifier) external view returns(bool);\n}\n" + }, + "contracts/external/lib/StringConversionUtils.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\n// Building on zk-email's StringUtils library we add the ability to handle decimals when\n// converting from string to Uint\nlibrary StringConversionUtils {\n \n /**\n * @notice Function that parses numbers returned as strings including floating point numbers. Returned floating point\n * numbers are to have the desired amount of decimal specified. If the stringified version of the floating point\n * number has more decimal places than desired then the function will revert in order to be maximally safe. If\n * the returned number has multiple floating points then the function will revert.\n *\n * Examples: _s = \"12.34\", _expectedDecimals = 6 => 12340000\n * _s = \"12.34\", _expectedDecimals = 2 => 1234\n * _s = \"12.34\", _expectedDecimals = 1 => REVERT (we never want loss of precision only addition)\n * _s = \"12.34.56\", _expectedDecimals = 6 => REVERT (Invalid number)\n *\n * @param _s String being processed\n * @param _desiredDecimals Desired amount of decimal places\n */\n function stringToUint(string memory _s, uint256 _desiredDecimals) internal pure returns (uint256) {\n return stringToUint(_s, 0x2E, _desiredDecimals);\n }\n\n function stringToUint(\n string memory _s,\n bytes1 _decimalCharacter,\n uint256 _desiredDecimals\n )\n internal\n pure\n returns (uint256)\n {\n bytes memory b = bytes(_s);\n\n uint256 result = 0;\n uint256 decimalPlaces = 0;\n\n bool decimals = false;\n for (uint256 i = 0; i < b.length; i++) {\n if (b[i] >= 0x30 && b[i] <= 0x39) {\n result = result * 10 + (uint256(uint8(b[i])) - 48);\n }\n\n if (decimals) {\n decimalPlaces++;\n }\n\n if (b[i] == _decimalCharacter) {\n require(decimals == false, \"String has multiple decimals\");\n decimals = true;\n }\n }\n\n require(decimalPlaces <= _desiredDecimals, \"String has too many decimal places\");\n return result * (10 ** (_desiredDecimals - decimalPlaces));\n }\n\n /**\n * @notice Function that returns a substring from _startIndex to _endIndex (non-inclusive).\n *\n * @param _str String being processed\n * @param _startIndex Index to start parsing from\n * @param _endIndex Index to stop parsing at (index not included in result)\n */\n function substring(string memory _str, uint _startIndex, uint _endIndex) internal pure returns (string memory ) {\n bytes memory strBytes = bytes(_str);\n bytes memory result = new bytes(_endIndex-_startIndex);\n for(uint i = _startIndex; i < _endIndex; i++) {\n result[i-_startIndex] = strBytes[i];\n }\n return string(result);\n }\n\n function replaceString(\n string memory _str,\n string memory _lookupValue,\n string memory _replaceValue\n )\n internal\n pure\n returns (string memory)\n {\n bytes memory strBytes = bytes(_str);\n bytes memory lookupBytes = bytes(_lookupValue);\n\n uint256 lookupIndex = indexOf(_str, _lookupValue);\n if (lookupIndex == type(uint256).max) {\n return _str;\n }\n\n // Split the original string into two parts: before and after the keyword\n string memory beforeKeyword = substring(_str, 0, lookupIndex);\n string memory afterKeyword = substring(_str, lookupIndex + lookupBytes.length, strBytes.length);\n \n return string.concat(beforeKeyword, _replaceValue, afterKeyword);\n }\n\n function indexOf(string memory str, string memory substr) internal pure returns (uint) {\n bytes memory strBytes = bytes(str);\n bytes memory substrBytes = bytes(substr);\n \n if (strBytes.length < substrBytes.length) return type(uint256).max;\n \n for (uint i = 0; i <= strBytes.length - substrBytes.length; i++) {\n bool found = true;\n for (uint j = 0; j < substrBytes.length; j++) {\n if (strBytes[i + j] != substrBytes[j]) {\n found = false;\n break;\n }\n }\n if (found) return i;\n }\n \n return type(uint256).max;\n }\n\n function stringComparison(string memory _a, string memory _b) internal pure returns (bool) {\n return (keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b)));\n }\n}\n" + }, + "contracts/external/processors/EmailBaseProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { IKeyHashAdapterV2 } from \"../interfaces/IKeyHashAdapterV2.sol\";\nimport { INullifierRegistry } from \"../interfaces/INullifierRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract EmailBaseProcessor is Ownable {\n\n /* ============ Modifiers ============ */\n modifier onlyExchange() {\n require(msg.sender == exchange, \"Only exchange can call this function\");\n _;\n }\n\n /* ============ State Variables ============ */\n address public immutable exchange;\n INullifierRegistry public nullifierRegistry;\n bytes public emailFromAddress;\n uint256 public timestampBuffer;\n\n /* ============ Constructor ============ */\n constructor(\n address _exchange,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Ownable()\n {\n exchange = _exchange;\n nullifierRegistry = _nullifierRegistry;\n emailFromAddress = bytes(_emailFromAddress);\n timestampBuffer = _timestampBuffer;\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice ONLY OWNER: Sets the from email address for validated emails. Check that email address is properly\n * padded (if necessary). Padding will be dependent on if unpacking functions cut trailing 0s or not.\n *\n * @param _emailFromAddress The from email address for validated emails, MUST BE PROPERLY PADDED\n */\n function setEmailFromAddress(string memory _emailFromAddress) external onlyOwner {\n emailFromAddress = bytes(_emailFromAddress);\n }\n\n /**\n * @notice ONLY OWNER: Sets the timestamp buffer for validated emails. This is the amount of time in seconds\n * that the timestamp can be off by and still be considered valid. Necessary to build in flexibility with L2\n * timestamps.\n *\n * @param _timestampBuffer The timestamp buffer for validated emails\n */\n function setTimestampBuffer(uint256 _timestampBuffer) external onlyOwner {\n timestampBuffer = _timestampBuffer;\n }\n\n /* ============ External Getters ============ */\n\n function getEmailFromAddress() external view returns (bytes memory) {\n return emailFromAddress;\n }\n\n\n /* ============ Internal Functions ============ */\n\n function _validateAndAddNullifier(bytes32 _nullifier) internal {\n require(!nullifierRegistry.isNullified(_nullifier), \"Nullifier has already been used\");\n nullifierRegistry.addNullifier(_nullifier);\n }\n}\n" + }, + "contracts/interfaces/ITransferDomainProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\n\ninterface ITransferDomainProcessor {\n\n struct TransferProof {\n uint256[2] a;\n uint256[2][2] b;\n uint256[2] c;\n uint256[10] signals;\n }\n\n function processProof(\n TransferProof calldata _proof\n ) \n external \n returns (\n bytes32 dkimKeyHash, \n bytes32 hashedReceiverId, \n string memory domainName, \n uint256 bidId\n );\n}" + }, + "contracts/TransferDomainProcessor.sol": { + "content": "// SPDX-License-Identifier: MIT\n\nimport { StringUtils } from \"@zk-email/contracts/utils/StringUtils.sol\";\n\nimport { EmailBaseProcessor } from \"./external/processors/EmailBaseProcessor.sol\";\nimport { INullifierRegistry } from \"./external/interfaces/INullifierRegistry.sol\";\nimport { StringConversionUtils } from \"./external/lib/StringConversionUtils.sol\";\n\nimport { Groth16Verifier } from \"./verifiers/namecheap_transfer_verifier.sol\";\nimport { ITransferDomainProcessor } from \"./interfaces/ITransferDomainProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract TransferDomainProcessor is Groth16Verifier, ITransferDomainProcessor, EmailBaseProcessor {\n \n using StringUtils for uint256[];\n using StringConversionUtils for string;\n\n /* ============ Constants ============ */\n uint256 constant PACK_SIZE = 31;\n\n /* ============ Constructor ============ */\n constructor(\n address _exchange,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Groth16Verifier()\n EmailBaseProcessor(\n _exchange,\n _nullifierRegistry,\n _emailFromAddress,\n _timestampBuffer\n )\n {}\n \n /* ============ External Functions ============ */\n\n function processProof(\n TransferProof calldata _proof\n )\n external\n override\n onlyExchange\n returns (\n bytes32 dkimKeyHash,\n bytes32 hashedReceiverId,\n string memory domainName, \n uint256 bidId\n )\n {\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \"Invalid Proof\");\n\n // Signal [0] is the DKIM key hash\n dkimKeyHash = bytes32(_proof.signals[0]);\n\n // Signals [1:2] are the packed from email address\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 2);\n require(\n keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \n \"Invalid email from address\"\n );\n \n // Signals [2:7] are packed domain name\n domainName = _parseSignalArray(_proof.signals, 2, 7);\n\n // Signal [7] is packed hashed namecheap id to which domain was transferred\n hashedReceiverId = bytes32(_proof.signals[7]);\n\n // Check if email has been used previously, if not nullify it so it can't be used again\n _validateAndAddNullifier(bytes32(_proof.signals[8]));\n\n // Signal [9] is bidId\n bidId = _proof.signals[9];\n }\n \n /* ============ Internal Functions ============ */\n\n function _parseSignalArray(uint256[10] calldata _signals, uint8 _from, uint8 _to) \n internal \n pure \n returns (string memory) \n {\n uint256[] memory signalArray = new uint256[](_to - _from);\n for (uint256 i = _from; i < _to; i++) {\n signalArray[i - _from] = _signals[i];\n }\n\n return signalArray.convertPackedBytesToString(signalArray.length * PACK_SIZE, PACK_SIZE);\n }\n}\n" + }, + "contracts/verifiers/namecheap_transfer_verifier.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n/*\n Copyright 2021 0KIMS association.\n\n This file is generated with [snarkJS](https://github.com/iden3/snarkjs).\n\n snarkJS is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n snarkJS is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with snarkJS. If not, see .\n*/\n\npragma solidity >=0.7.0 <0.9.0;\n\ncontract Groth16Verifier {\n // Scalar field size\n uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n // Base field size\n uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\n\n // Verification Key data\n uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042;\n uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958;\n uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132;\n uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731;\n uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679;\n uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856;\n uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\n uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\n uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\n uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\n uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\n uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\n uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\n uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\n\n \n uint256 constant IC0x = 12718791721466586474772975178991944367361898681403889293050590835735829974174;\n uint256 constant IC0y = 6579614210328804738196110281777440845203538387714672921854127346802897741731;\n \n uint256 constant IC1x = 15050971342023334328313633330499885418161248915553086390701402242486225179368;\n uint256 constant IC1y = 5024764877577619588829734526990256704181621131776349449360023481477820279987;\n \n uint256 constant IC2x = 7494265978725599958916265753653166549633529129800692658333846839504191651648;\n uint256 constant IC2y = 6331829577874431053631060489192183034310045972687441697179743819760334117448;\n \n uint256 constant IC3x = 19001722242244131321371144536562173279385056519981716838131699446018662048085;\n uint256 constant IC3y = 8148711952593941450664988855383229951630582602775661040234820121548658879338;\n \n uint256 constant IC4x = 3624352076627862068761560802183636400416483488844158805038644908873200708814;\n uint256 constant IC4y = 20894074159790604892251457333772898092352374489464929653588484093719978460605;\n \n uint256 constant IC5x = 2098287694939727519558784139808406325855172668407809961967029546183317335265;\n uint256 constant IC5y = 5659241113472526955215440521431168972841548603376846026887752206139550832697;\n \n uint256 constant IC6x = 17054571586962694690567468783102453574497782768524521043534058966826398455175;\n uint256 constant IC6y = 4087439525418017845490176926142509334113265173570304433911881676407144081865;\n \n uint256 constant IC7x = 7441928267847731392209447389119131741297268634643246304512516729270550734194;\n uint256 constant IC7y = 15714253901405577134617988311525363228461039013850912155558149694323922788327;\n \n uint256 constant IC8x = 11989172231499636764423272601594485978016807201316866170676011918612131765820;\n uint256 constant IC8y = 15918479982497737545158513843427772249925445687882255296587424450200131669618;\n \n uint256 constant IC9x = 19827744545534206076315711984525184804508732918768894016552346430789516516368;\n uint256 constant IC9y = 16361460611570894490152793347002588479282989223552655286979659973731335376509;\n \n uint256 constant IC10x = 10898965818757221383985300751768263931593441442012024286290119328446015154272;\n uint256 constant IC10y = 6989418820395701171656324073128354251482680955655018162117108617053607002569;\n \n \n // Memory data\n uint16 constant pVk = 0;\n uint16 constant pPairing = 128;\n\n uint16 constant pLastMem = 896;\n\n function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[10] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, r)) {\n mstore(0, 0)\n return(0, 0x20)\n }\n }\n \n // G1 function to multiply a G1 value(x,y) to value in an address\n function g1_mulAccC(pR, x, y, s) {\n let success\n let mIn := mload(0x40)\n mstore(mIn, x)\n mstore(add(mIn, 32), y)\n mstore(add(mIn, 64), s)\n\n success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)\n\n if iszero(success) {\n mstore(0, 0)\n return(0, 0x20)\n }\n\n mstore(add(mIn, 64), mload(pR))\n mstore(add(mIn, 96), mload(add(pR, 32)))\n\n success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)\n\n if iszero(success) {\n mstore(0, 0)\n return(0, 0x20)\n }\n }\n\n function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {\n let _pPairing := add(pMem, pPairing)\n let _pVk := add(pMem, pVk)\n\n mstore(_pVk, IC0x)\n mstore(add(_pVk, 32), IC0y)\n\n // Compute the linear combination vk_x\n \n g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))\n \n g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))\n \n g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))\n \n g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))\n \n g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))\n \n g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)))\n \n g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)))\n \n g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)))\n \n g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)))\n \n g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288)))\n \n\n // -A\n mstore(_pPairing, calldataload(pA))\n mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q))\n\n // B\n mstore(add(_pPairing, 64), calldataload(pB))\n mstore(add(_pPairing, 96), calldataload(add(pB, 32)))\n mstore(add(_pPairing, 128), calldataload(add(pB, 64)))\n mstore(add(_pPairing, 160), calldataload(add(pB, 96)))\n\n // alpha1\n mstore(add(_pPairing, 192), alphax)\n mstore(add(_pPairing, 224), alphay)\n\n // beta2\n mstore(add(_pPairing, 256), betax1)\n mstore(add(_pPairing, 288), betax2)\n mstore(add(_pPairing, 320), betay1)\n mstore(add(_pPairing, 352), betay2)\n\n // vk_x\n mstore(add(_pPairing, 384), mload(add(pMem, pVk)))\n mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))\n\n\n // gamma2\n mstore(add(_pPairing, 448), gammax1)\n mstore(add(_pPairing, 480), gammax2)\n mstore(add(_pPairing, 512), gammay1)\n mstore(add(_pPairing, 544), gammay2)\n\n // C\n mstore(add(_pPairing, 576), calldataload(pC))\n mstore(add(_pPairing, 608), calldataload(add(pC, 32)))\n\n // delta2\n mstore(add(_pPairing, 640), deltax1)\n mstore(add(_pPairing, 672), deltax2)\n mstore(add(_pPairing, 704), deltay1)\n mstore(add(_pPairing, 736), deltay2)\n\n\n let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20)\n\n isOk := and(success, mload(_pPairing))\n }\n\n let pMem := mload(0x40)\n mstore(0x40, add(pMem, pLastMem))\n\n // Validate that all evaluations ∈ F\n \n checkField(calldataload(add(_pubSignals, 0)))\n \n checkField(calldataload(add(_pubSignals, 32)))\n \n checkField(calldataload(add(_pubSignals, 64)))\n \n checkField(calldataload(add(_pubSignals, 96)))\n \n checkField(calldataload(add(_pubSignals, 128)))\n \n checkField(calldataload(add(_pubSignals, 160)))\n \n checkField(calldataload(add(_pubSignals, 192)))\n \n checkField(calldataload(add(_pubSignals, 224)))\n \n checkField(calldataload(add(_pubSignals, 256)))\n \n checkField(calldataload(add(_pubSignals, 288)))\n \n checkField(calldataload(add(_pubSignals, 320)))\n \n\n // Validate all evaluations\n let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)\n\n mstore(0, isValid)\n return(0, 0x20)\n }\n }\n }\n" + } + }, + "settings": { + "viaIR": true, + "optimizer": { + "enabled": true, + "runs": 200, + "details": { + "yulDetails": { + "optimizerSteps": "u" + } + } + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/contracts-domain/deployments/outputs/baseContracts.ts b/contracts-domain/deployments/outputs/baseContracts.ts new file mode 100644 index 000000000..f596da2f8 --- /dev/null +++ b/contracts-domain/deployments/outputs/baseContracts.ts @@ -0,0 +1,3532 @@ +export default { + "name": "base", + "chainId": "8453", + "contracts": { + "ClaimVerifier": { + "address": "0xBA4D6eA209c3C3A6B0B31fE136a5F0eFd9De2bd1", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "data", + "type": "string" + }, + { + "internalType": "uint8", + "name": "maxValues", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "extractProviderHash", + "type": "bool" + } + ], + "name": "extractAllFromContext", + "outputs": [ + { + "internalType": "string[]", + "name": "", + "type": "string[]" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "data", + "type": "string" + }, + { + "internalType": "string", + "name": "prefix", + "type": "string" + } + ], + "name": "extractFieldFromContext", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "data", + "type": "string" + }, + { + "internalType": "string", + "name": "target", + "type": "string" + } + ], + "name": "findSubstringEndIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ] + }, + "DomainExchange": { + "address": "0x054be4cFB6e951A7dE921A179FA323c5ea3fCf47", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "_feeRecipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_bidSettlementPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_bidRefundPeriod", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_allowedAddresses", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "allowedAddress", + "type": "address" + } + ], + "name": "AddressAddedToAllowlist", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "allowedAddress", + "type": "address" + } + ], + "name": "AddressRemovedFromAllowlist", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "AllowlistDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "AllowlistEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "BidCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newPrice", + "type": "uint256" + } + ], + "name": "BidPriceIncreased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newBidRefundPeriod", + "type": "uint256" + } + ], + "name": "BidRefundPeriodUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newBidSettlementPeriod", + "type": "uint256" + } + ], + "name": "BidSettlementPeriodUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BidWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newFeeRecipient", + "type": "address" + } + ], + "name": "FeeRecipientUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newFee", + "type": "uint256" + } + ], + "name": "FeeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "instantAccept", + "type": "bool" + } + ], + "name": "InstantAcceptUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "dkimKeyHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "askPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minBidPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "saleEthRecipient", + "type": "address" + } + ], + "name": "ListingCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "seller", + "type": "address" + } + ], + "name": "ListingDeleted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "name": "ListingDeletedByRegistry", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newAskPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "saleEthRecipient", + "type": "address" + } + ], + "name": "ListingUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IKeyHashAdapterV2", + "name": "newMailServerKeyHashAdapter", + "type": "address" + } + ], + "name": "MailServerKeyHashAdapterUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + } + ], + "name": "RefundInitiated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "priceNetFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "fees", + "type": "uint256" + } + ], + "name": "SaleFinalized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract ITransferDomainProcessor", + "name": "newTransferDomainProcessor", + "type": "address" + } + ], + "name": "TransferDomainProcessorUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_allowedAddresses", + "type": "address[]" + } + ], + "name": "addAddressesToAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "allowedAddresses", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bidCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bidRefundPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bidSettlementPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "bids", + "outputs": [ + { + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "encryptedBuyerId", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "buyerIdHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiryTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "refundInitiated", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_bidId", + "type": "uint256" + } + ], + "name": "buyerReleaseFunds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_listingId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "_buyerIdHash", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "_encryptedBuyerId", + "type": "string" + } + ], + "name": "createBid", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_askPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_minBidPrice", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "_saleEthRecipient", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_encryptionKey", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "_dkimKeyHash", + "type": "bytes32" + } + ], + "name": "createListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_listingId", + "type": "uint256" + } + ], + "name": "deleteListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableInstantAccept", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableInstantAccept", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "fee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "feeRecipient", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + }, + { + "internalType": "uint256[10]", + "name": "signals", + "type": "uint256[10]" + } + ], + "internalType": "struct ITransferDomainProcessor.TransferProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "finalizeSale", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getAllowedSellers", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_listingIds", + "type": "uint256[]" + } + ], + "name": "getListingBids", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "encryptedBuyerId", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "buyerIdHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiryTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "refundInitiated", + "type": "bool" + } + ], + "internalType": "struct DomainExchange.Bid", + "name": "bid", + "type": "tuple" + }, + { + "internalType": "bool", + "name": "buyerInstantAcceptEnabled", + "type": "bool" + } + ], + "internalType": "struct DomainExchange.BidDetailsWithId[][]", + "name": "bidInfo", + "type": "tuple[][]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_listingIds", + "type": "uint256[]" + } + ], + "name": "getListings", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "internalType": "address payable", + "name": "saleEthRecipient", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "dkimKeyHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "encryptionKey", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "askPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minBidPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "bids", + "type": "uint256[]" + } + ], + "internalType": "struct DomainExchange.Listing", + "name": "listing", + "type": "tuple" + } + ], + "internalType": "struct DomainExchange.ListingWithId[]", + "name": "listingInfo", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getUserBids", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "encryptedBuyerId", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "buyerIdHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiryTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "refundInitiated", + "type": "bool" + } + ], + "internalType": "struct DomainExchange.Bid", + "name": "bid", + "type": "tuple" + }, + { + "internalType": "bool", + "name": "buyerInstantAcceptEnabled", + "type": "bool" + } + ], + "internalType": "struct DomainExchange.BidDetailsWithId[]", + "name": "bidInfo", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getUserListings", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "internalType": "address payable", + "name": "saleEthRecipient", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "dkimKeyHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "encryptionKey", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "askPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minBidPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "bids", + "type": "uint256[]" + } + ], + "internalType": "struct DomainExchange.Listing", + "name": "listing", + "type": "tuple" + } + ], + "internalType": "struct DomainExchange.ListingWithId[]", + "name": "listingInfo", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_bidId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_newPrice", + "type": "uint256" + } + ], + "name": "increaseBidPrice", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransferDomainProcessor", + "name": "_transferDomainProcessor", + "type": "address" + }, + { + "internalType": "contract IVerifiedDomainRegistry", + "name": "_verifiedDomainRegistry", + "type": "address" + }, + { + "internalType": "contract IKeyHashAdapterV2", + "name": "_mailServerKeyHashAdapter", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_bidId", + "type": "uint256" + } + ], + "name": "initiateRefund", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "instantAcceptEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isAllowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isInitialized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "listingCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "listings", + "outputs": [ + { + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "internalType": "address payable", + "name": "saleEthRecipient", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "dkimKeyHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "encryptionKey", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "askPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minBidPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mailServerKeyHashAdapter", + "outputs": [ + { + "internalType": "contract IKeyHashAdapterV2", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pauseMarketplace", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_listingId", + "type": "uint256" + } + ], + "name": "registryRemoveListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_disallowedAddresses", + "type": "address[]" + } + ], + "name": "removeAddressesFromAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "transferDomainProcessor", + "outputs": [ + { + "internalType": "contract ITransferDomainProcessor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpauseMarketplace", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_newBidRefundPeriod", + "type": "uint256" + } + ], + "name": "updateBidRefundPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_newBidSettlementPeriod", + "type": "uint256" + } + ], + "name": "updateBidSettlementPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_newFee", + "type": "uint256" + } + ], + "name": "updateFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_newFeeRecipient", + "type": "address" + } + ], + "name": "updateFeeRecipient", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_listingId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_newAskPrice", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "_saleEthRecipient", + "type": "address" + } + ], + "name": "updateListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IKeyHashAdapterV2", + "name": "_mailServerKeyHashAdapter", + "type": "address" + } + ], + "name": "updateMailServerKeyHashAdapter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransferDomainProcessor", + "name": "_transferDomainProcessor", + "type": "address" + } + ], + "name": "updateTransferDomainProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "userBids", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "userListings", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "verifiedDomainRegistry", + "outputs": [ + { + "internalType": "contract IVerifiedDomainRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_bidId", + "type": "uint256" + } + ], + "name": "withdrawBid", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "NamecheapManagedKeyHashAdapter": { + "address": "0x6d00beaA1F921f22f10bAda079f2fb1bf0342e38", + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_mailServerKeyHashes", + "type": "bytes32[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "mailserverKeyHash", + "type": "bytes32" + } + ], + "name": "MailServerKeyHashAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "mailserverKeyHash", + "type": "bytes32" + } + ], + "name": "MailServerKeyHashRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_mailserverKeyHash", + "type": "bytes32" + } + ], + "name": "addMailServerKeyHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getMailServerKeyHashes", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "isMailServerKeyHash", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "mailServerKeyHashes", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_mailserverKeyHash", + "type": "bytes32" + } + ], + "name": "removeMailServerKeyHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "NullifierRegistry": { + "address": "0xcE4d0DE6589bF2b439d08dc9addD56428D76eC25", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "nullifier", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "writer", + "type": "address" + } + ], + "name": "NullifierAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "writer", + "type": "address" + } + ], + "name": "WriterAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "writer", + "type": "address" + } + ], + "name": "WriterRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_nullifier", + "type": "bytes32" + } + ], + "name": "addNullifier", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newWriter", + "type": "address" + } + ], + "name": "addWritePermission", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getWriters", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "isNullified", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isWriter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_removedWriter", + "type": "address" + } + ], + "name": "removeWritePermission", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "writers", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "TransferDomainProcessor": { + "address": "0x57C3C3880ca40a17d800FF9c42b5C0e2c026F45B", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_exchange", + "type": "address" + }, + { + "internalType": "contract INullifierRegistry", + "name": "_nullifierRegistry", + "type": "address" + }, + { + "internalType": "string", + "name": "_emailFromAddress", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_timestampBuffer", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "emailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "exchange", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getEmailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nullifierRegistry", + "outputs": [ + { + "internalType": "contract INullifierRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + }, + { + "internalType": "uint256[10]", + "name": "signals", + "type": "uint256[10]" + } + ], + "internalType": "struct ITransferDomainProcessor.TransferProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "processProof", + "outputs": [ + { + "internalType": "bytes32", + "name": "dkimKeyHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "hashedReceiverId", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "domainName", + "type": "string" + }, + { + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_emailFromAddress", + "type": "string" + } + ], + "name": "setEmailFromAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_timestampBuffer", + "type": "uint256" + } + ], + "name": "setTimestampBuffer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "timestampBuffer", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[2]", + "name": "_pA", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "_pB", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "_pC", + "type": "uint256[2]" + }, + { + "internalType": "uint256[10]", + "name": "_pubSignals", + "type": "uint256[10]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "VerifiedDomainRegistry": { + "address": "0x6206EB4c794c7fe58315f76ab088Ee3C17E0d9f5", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "exchange", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "name": "DomainListed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "exchange", + "type": "address" + } + ], + "name": "DomainListingRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "oldOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "DomainTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "domainName", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + } + ], + "name": "DomainVerified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "exchange", + "type": "address" + } + ], + "name": "ExchangeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "exchange", + "type": "address" + } + ], + "name": "ExchangeRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IVerifyDomainProcessor", + "name": "newVerifyDomainProcessor", + "type": "address" + } + ], + "name": "VerifyDomainProcessorUpdated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_exchange", + "type": "address" + } + ], + "name": "addExchange", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "domains", + "outputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + }, + { + "internalType": "address", + "name": "exchange", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "exchanges", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + } + ], + "name": "getDomain", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + }, + { + "internalType": "address", + "name": "exchange", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "internalType": "struct IVerifiedDomainRegistry.Domain", + "name": "domain", + "type": "tuple" + } + ], + "internalType": "struct IVerifiedDomainRegistry.DomainWithId", + "name": "domainInfo", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_domainName", + "type": "string" + } + ], + "name": "getDomainId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + } + ], + "name": "getDomainOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_domains", + "type": "bytes32[]" + } + ], + "name": "getDomains", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + }, + { + "internalType": "address", + "name": "exchange", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "internalType": "struct IVerifiedDomainRegistry.Domain", + "name": "domain", + "type": "tuple" + } + ], + "internalType": "struct IVerifiedDomainRegistry.DomainWithId[]", + "name": "domainInfo", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getExchanges", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getUserDomains", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + }, + { + "internalType": "address", + "name": "exchange", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "internalType": "struct IVerifiedDomainRegistry.Domain", + "name": "domain", + "type": "tuple" + } + ], + "internalType": "struct IVerifiedDomainRegistry.DomainWithId[]", + "name": "domainInfo", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVerifyDomainProcessor", + "name": "_verifyDomainProcessor", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isExchange", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isInitialized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + } + ], + "name": "removeDomainListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_exchange", + "type": "address" + } + ], + "name": "removeExchange", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_listingId", + "type": "uint256" + } + ], + "name": "setDomainListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_newOwner", + "type": "address" + } + ], + "name": "updateDomainOnSale", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVerifyDomainProcessor", + "name": "_verifyDomainProcessor", + "type": "address" + } + ], + "name": "updateVerifyDomainProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "userDomains", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "verifyDomainProcessor", + "outputs": [ + { + "internalType": "contract IVerifyDomainProcessor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "string", + "name": "provider", + "type": "string" + }, + { + "internalType": "string", + "name": "parameters", + "type": "string" + }, + { + "internalType": "string", + "name": "context", + "type": "string" + } + ], + "internalType": "struct Claims.ClaimInfo", + "name": "claimInfo", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "identifier", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint32", + "name": "timestampS", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "epoch", + "type": "uint32" + } + ], + "internalType": "struct Claims.CompleteClaimData", + "name": "claim", + "type": "tuple" + }, + { + "internalType": "bytes[]", + "name": "signatures", + "type": "bytes[]" + } + ], + "internalType": "struct Claims.SignedClaim", + "name": "signedClaim", + "type": "tuple" + } + ], + "internalType": "struct IProxyBaseProcessor.Proof[]", + "name": "_proofs", + "type": "tuple[]" + } + ], + "name": "verifyDomains", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "VerifyDomainProcessor": { + "address": "0x9eD28eBE190827fB8cfb2428C598f406d951Ac5e", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_registry", + "type": "address" + }, + { + "internalType": "contract INullifierRegistry", + "name": "_nullifierRegistry", + "type": "address" + }, + { + "internalType": "string[]", + "name": "_providerHashes", + "type": "string[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "providerHash", + "type": "string" + } + ], + "name": "ProviderHashAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "providerHash", + "type": "string" + } + ], + "name": "ProviderHashRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "witness", + "type": "address" + } + ], + "name": "WitnessAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "witness", + "type": "address" + } + ], + "name": "WitnessRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_newProviderHash", + "type": "string" + } + ], + "name": "addProviderHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newWitness", + "type": "address" + } + ], + "name": "addWitness", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getProviderHashes", + "outputs": [ + { + "internalType": "string[]", + "name": "", + "type": "string[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWitnesses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "isProviderHash", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isWitness", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nullifierRegistry", + "outputs": [ + { + "internalType": "contract INullifierRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "providerHashes", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "registry", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_removeProviderHash", + "type": "string" + } + ], + "name": "removeProviderHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_removeWitness", + "type": "address" + } + ], + "name": "removeWitness", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "string", + "name": "provider", + "type": "string" + }, + { + "internalType": "string", + "name": "parameters", + "type": "string" + }, + { + "internalType": "string", + "name": "context", + "type": "string" + } + ], + "internalType": "struct Claims.ClaimInfo", + "name": "claimInfo", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "identifier", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint32", + "name": "timestampS", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "epoch", + "type": "uint32" + } + ], + "internalType": "struct Claims.CompleteClaimData", + "name": "claim", + "type": "tuple" + }, + { + "internalType": "bytes[]", + "name": "signatures", + "type": "bytes[]" + } + ], + "internalType": "struct Claims.SignedClaim", + "name": "signedClaim", + "type": "tuple" + } + ], + "internalType": "struct IProxyBaseProcessor.Proof", + "name": "proof", + "type": "tuple" + } + ], + "name": "verifyProofSignatures", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "string", + "name": "provider", + "type": "string" + }, + { + "internalType": "string", + "name": "parameters", + "type": "string" + }, + { + "internalType": "string", + "name": "context", + "type": "string" + } + ], + "internalType": "struct Claims.ClaimInfo", + "name": "claimInfo", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "identifier", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint32", + "name": "timestampS", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "epoch", + "type": "uint32" + } + ], + "internalType": "struct Claims.CompleteClaimData", + "name": "claim", + "type": "tuple" + }, + { + "internalType": "bytes[]", + "name": "signatures", + "type": "bytes[]" + } + ], + "internalType": "struct Claims.SignedClaim", + "name": "signedClaim", + "type": "tuple" + } + ], + "internalType": "struct IProxyBaseProcessor.Proof[]", + "name": "_proofs", + "type": "tuple[]" + } + ], + "name": "verifyProofs", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + } + ], + "internalType": "struct IVerifyDomainProcessor.DomainRaw[]", + "name": "domains", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "witnesses", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + } + } +} as const; \ No newline at end of file diff --git a/contracts-domain/deployments/outputs/baseStagingContracts.ts b/contracts-domain/deployments/outputs/baseStagingContracts.ts new file mode 100644 index 000000000..1e6992a2e --- /dev/null +++ b/contracts-domain/deployments/outputs/baseStagingContracts.ts @@ -0,0 +1,3532 @@ +export default { + "name": "base_staging", + "chainId": "8453", + "contracts": { + "ClaimVerifier": { + "address": "0x5B8F92B8afA5Db7078703294D646908F0fc00D87", + "abi": [ + { + "inputs": [ + { + "internalType": "string", + "name": "data", + "type": "string" + }, + { + "internalType": "uint8", + "name": "maxValues", + "type": "uint8" + }, + { + "internalType": "bool", + "name": "extractProviderHash", + "type": "bool" + } + ], + "name": "extractAllFromContext", + "outputs": [ + { + "internalType": "string[]", + "name": "", + "type": "string[]" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "data", + "type": "string" + }, + { + "internalType": "string", + "name": "prefix", + "type": "string" + } + ], + "name": "extractFieldFromContext", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "data", + "type": "string" + }, + { + "internalType": "string", + "name": "target", + "type": "string" + } + ], + "name": "findSubstringEndIndex", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ] + }, + "DomainExchange": { + "address": "0xe4148B108Fe4D7421853FE8cFfd35bDc2c0d95Ec", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_owner", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_fee", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "_feeRecipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_bidSettlementPeriod", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_bidRefundPeriod", + "type": "uint256" + }, + { + "internalType": "address[]", + "name": "_allowedAddresses", + "type": "address[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "allowedAddress", + "type": "address" + } + ], + "name": "AddressAddedToAllowlist", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "allowedAddress", + "type": "address" + } + ], + "name": "AddressRemovedFromAllowlist", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "AllowlistDisabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "AllowlistEnabled", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "BidCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newPrice", + "type": "uint256" + } + ], + "name": "BidPriceIncreased", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newBidRefundPeriod", + "type": "uint256" + } + ], + "name": "BidRefundPeriodUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newBidSettlementPeriod", + "type": "uint256" + } + ], + "name": "BidSettlementPeriodUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "BidWithdrawn", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "newFeeRecipient", + "type": "address" + } + ], + "name": "FeeRecipientUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "newFee", + "type": "uint256" + } + ], + "name": "FeeUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "instantAccept", + "type": "bool" + } + ], + "name": "InstantAcceptUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "dkimKeyHash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "askPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "minBidPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "saleEthRecipient", + "type": "address" + } + ], + "name": "ListingCreated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "seller", + "type": "address" + } + ], + "name": "ListingDeleted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "name": "ListingDeletedByRegistry", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newAskPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "address", + "name": "saleEthRecipient", + "type": "address" + } + ], + "name": "ListingUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IKeyHashAdapterV2", + "name": "newMailServerKeyHashAdapter", + "type": "address" + } + ], + "name": "MailServerKeyHashAdapterUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + } + ], + "name": "RefundInitiated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "priceNetFees", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "fees", + "type": "uint256" + } + ], + "name": "SaleFinalized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract ITransferDomainProcessor", + "name": "newTransferDomainProcessor", + "type": "address" + } + ], + "name": "TransferDomainProcessorUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "Unpaused", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_allowedAddresses", + "type": "address[]" + } + ], + "name": "addAddressesToAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "allowedAddresses", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bidCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bidRefundPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "bidSettlementPeriod", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "bids", + "outputs": [ + { + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "encryptedBuyerId", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "buyerIdHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiryTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "refundInitiated", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_bidId", + "type": "uint256" + } + ], + "name": "buyerReleaseFunds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_listingId", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "_buyerIdHash", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "_encryptedBuyerId", + "type": "string" + } + ], + "name": "createBid", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_askPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_minBidPrice", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "_saleEthRecipient", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_encryptionKey", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "_dkimKeyHash", + "type": "bytes32" + } + ], + "name": "createListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_listingId", + "type": "uint256" + } + ], + "name": "deleteListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "disableInstantAccept", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "enableInstantAccept", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "fee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "feeRecipient", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + }, + { + "internalType": "uint256[10]", + "name": "signals", + "type": "uint256[10]" + } + ], + "internalType": "struct ITransferDomainProcessor.TransferProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "finalizeSale", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getAllowedSellers", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_listingIds", + "type": "uint256[]" + } + ], + "name": "getListingBids", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "encryptedBuyerId", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "buyerIdHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiryTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "refundInitiated", + "type": "bool" + } + ], + "internalType": "struct DomainExchange.Bid", + "name": "bid", + "type": "tuple" + }, + { + "internalType": "bool", + "name": "buyerInstantAcceptEnabled", + "type": "bool" + } + ], + "internalType": "struct DomainExchange.BidDetailsWithId[][]", + "name": "bidInfo", + "type": "tuple[][]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "_listingIds", + "type": "uint256[]" + } + ], + "name": "getListings", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "internalType": "address payable", + "name": "saleEthRecipient", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "dkimKeyHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "encryptionKey", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "askPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minBidPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "bids", + "type": "uint256[]" + } + ], + "internalType": "struct DomainExchange.Listing", + "name": "listing", + "type": "tuple" + } + ], + "internalType": "struct DomainExchange.ListingWithId[]", + "name": "listingInfo", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getUserBids", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "encryptedBuyerId", + "type": "string" + }, + { + "internalType": "bytes32", + "name": "buyerIdHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "expiryTimestamp", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "refundInitiated", + "type": "bool" + } + ], + "internalType": "struct DomainExchange.Bid", + "name": "bid", + "type": "tuple" + }, + { + "internalType": "bool", + "name": "buyerInstantAcceptEnabled", + "type": "bool" + } + ], + "internalType": "struct DomainExchange.BidDetailsWithId[]", + "name": "bidInfo", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getUserListings", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + }, + { + "components": [ + { + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "internalType": "address payable", + "name": "saleEthRecipient", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "dkimKeyHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "encryptionKey", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "askPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minBidPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + }, + { + "internalType": "uint256[]", + "name": "bids", + "type": "uint256[]" + } + ], + "internalType": "struct DomainExchange.Listing", + "name": "listing", + "type": "tuple" + } + ], + "internalType": "struct DomainExchange.ListingWithId[]", + "name": "listingInfo", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_bidId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_newPrice", + "type": "uint256" + } + ], + "name": "increaseBidPrice", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransferDomainProcessor", + "name": "_transferDomainProcessor", + "type": "address" + }, + { + "internalType": "contract IVerifiedDomainRegistry", + "name": "_verifiedDomainRegistry", + "type": "address" + }, + { + "internalType": "contract IKeyHashAdapterV2", + "name": "_mailServerKeyHashAdapter", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_bidId", + "type": "uint256" + } + ], + "name": "initiateRefund", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "instantAcceptEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isAllowed", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isInitialized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "listingCounter", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "listings", + "outputs": [ + { + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "internalType": "address payable", + "name": "saleEthRecipient", + "type": "address" + }, + { + "internalType": "bytes32", + "name": "dkimKeyHash", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "encryptionKey", + "type": "bytes" + }, + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "createdAt", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "askPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minBidPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "isActive", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "mailServerKeyHashAdapter", + "outputs": [ + { + "internalType": "contract IKeyHashAdapterV2", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pauseMarketplace", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "paused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_listingId", + "type": "uint256" + } + ], + "name": "registryRemoveListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "_disallowedAddresses", + "type": "address[]" + } + ], + "name": "removeAddressesFromAllowlist", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "transferDomainProcessor", + "outputs": [ + { + "internalType": "contract ITransferDomainProcessor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "unpauseMarketplace", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_newBidRefundPeriod", + "type": "uint256" + } + ], + "name": "updateBidRefundPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_newBidSettlementPeriod", + "type": "uint256" + } + ], + "name": "updateBidSettlementPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_newFee", + "type": "uint256" + } + ], + "name": "updateFee", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address payable", + "name": "_newFeeRecipient", + "type": "address" + } + ], + "name": "updateFeeRecipient", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_listingId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_newAskPrice", + "type": "uint256" + }, + { + "internalType": "address payable", + "name": "_saleEthRecipient", + "type": "address" + } + ], + "name": "updateListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IKeyHashAdapterV2", + "name": "_mailServerKeyHashAdapter", + "type": "address" + } + ], + "name": "updateMailServerKeyHashAdapter", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ITransferDomainProcessor", + "name": "_transferDomainProcessor", + "type": "address" + } + ], + "name": "updateTransferDomainProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "userBids", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "userListings", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "verifiedDomainRegistry", + "outputs": [ + { + "internalType": "contract IVerifiedDomainRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_bidId", + "type": "uint256" + } + ], + "name": "withdrawBid", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "NamecheapManagedKeyHashAdapter": { + "address": "0x7E537F3A9329a0c29F386E6B0c30257AfbE7883f", + "abi": [ + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_mailServerKeyHashes", + "type": "bytes32[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "mailserverKeyHash", + "type": "bytes32" + } + ], + "name": "MailServerKeyHashAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "mailserverKeyHash", + "type": "bytes32" + } + ], + "name": "MailServerKeyHashRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_mailserverKeyHash", + "type": "bytes32" + } + ], + "name": "addMailServerKeyHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getMailServerKeyHashes", + "outputs": [ + { + "internalType": "bytes32[]", + "name": "", + "type": "bytes32[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "isMailServerKeyHash", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "mailServerKeyHashes", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_mailserverKeyHash", + "type": "bytes32" + } + ], + "name": "removeMailServerKeyHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "NullifierRegistry": { + "address": "0x2b68bFd2b44a6a9E8dC7b414550457B091ECB5fB", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "nullifier", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "writer", + "type": "address" + } + ], + "name": "NullifierAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "writer", + "type": "address" + } + ], + "name": "WriterAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "writer", + "type": "address" + } + ], + "name": "WriterRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_nullifier", + "type": "bytes32" + } + ], + "name": "addNullifier", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newWriter", + "type": "address" + } + ], + "name": "addWritePermission", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getWriters", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "isNullified", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isWriter", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_removedWriter", + "type": "address" + } + ], + "name": "removeWritePermission", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "writers", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "TransferDomainProcessor": { + "address": "0x54c92a8828A393C5A6D1DfbB71d0e9e97329b39C", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_exchange", + "type": "address" + }, + { + "internalType": "contract INullifierRegistry", + "name": "_nullifierRegistry", + "type": "address" + }, + { + "internalType": "string", + "name": "_emailFromAddress", + "type": "string" + }, + { + "internalType": "uint256", + "name": "_timestampBuffer", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "inputs": [], + "name": "emailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "exchange", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getEmailFromAddress", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nullifierRegistry", + "outputs": [ + { + "internalType": "contract INullifierRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256[2]", + "name": "a", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "b", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "c", + "type": "uint256[2]" + }, + { + "internalType": "uint256[10]", + "name": "signals", + "type": "uint256[10]" + } + ], + "internalType": "struct ITransferDomainProcessor.TransferProof", + "name": "_proof", + "type": "tuple" + } + ], + "name": "processProof", + "outputs": [ + { + "internalType": "bytes32", + "name": "dkimKeyHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "hashedReceiverId", + "type": "bytes32" + }, + { + "internalType": "string", + "name": "domainName", + "type": "string" + }, + { + "internalType": "uint256", + "name": "bidId", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_emailFromAddress", + "type": "string" + } + ], + "name": "setEmailFromAddress", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_timestampBuffer", + "type": "uint256" + } + ], + "name": "setTimestampBuffer", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "timestampBuffer", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[2]", + "name": "_pA", + "type": "uint256[2]" + }, + { + "internalType": "uint256[2][2]", + "name": "_pB", + "type": "uint256[2][2]" + }, + { + "internalType": "uint256[2]", + "name": "_pC", + "type": "uint256[2]" + }, + { + "internalType": "uint256[10]", + "name": "_pubSignals", + "type": "uint256[10]" + } + ], + "name": "verifyProof", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "VerifiedDomainRegistry": { + "address": "0xbCbE5B3F85ffAFa46960272a581A2662c257EF57", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "exchange", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "name": "DomainListed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "exchange", + "type": "address" + } + ], + "name": "DomainListingRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "oldOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "DomainTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "internalType": "string", + "name": "domainName", + "type": "string" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + } + ], + "name": "DomainVerified", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "exchange", + "type": "address" + } + ], + "name": "ExchangeAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "exchange", + "type": "address" + } + ], + "name": "ExchangeRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "contract IVerifyDomainProcessor", + "name": "newVerifyDomainProcessor", + "type": "address" + } + ], + "name": "VerifyDomainProcessorUpdated", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_exchange", + "type": "address" + } + ], + "name": "addExchange", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "domains", + "outputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + }, + { + "internalType": "address", + "name": "exchange", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "exchanges", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + } + ], + "name": "getDomain", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + }, + { + "internalType": "address", + "name": "exchange", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "internalType": "struct IVerifiedDomainRegistry.Domain", + "name": "domain", + "type": "tuple" + } + ], + "internalType": "struct IVerifiedDomainRegistry.DomainWithId", + "name": "domainInfo", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_domainName", + "type": "string" + } + ], + "name": "getDomainId", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + } + ], + "name": "getDomainOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32[]", + "name": "_domains", + "type": "bytes32[]" + } + ], + "name": "getDomains", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + }, + { + "internalType": "address", + "name": "exchange", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "internalType": "struct IVerifiedDomainRegistry.Domain", + "name": "domain", + "type": "tuple" + } + ], + "internalType": "struct IVerifiedDomainRegistry.DomainWithId[]", + "name": "domainInfo", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getExchanges", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getUserDomains", + "outputs": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "domainId", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + }, + { + "internalType": "address", + "name": "exchange", + "type": "address" + }, + { + "internalType": "uint256", + "name": "listingId", + "type": "uint256" + } + ], + "internalType": "struct IVerifiedDomainRegistry.Domain", + "name": "domain", + "type": "tuple" + } + ], + "internalType": "struct IVerifiedDomainRegistry.DomainWithId[]", + "name": "domainInfo", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVerifyDomainProcessor", + "name": "_verifyDomainProcessor", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isExchange", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isInitialized", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + } + ], + "name": "removeDomainListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_exchange", + "type": "address" + } + ], + "name": "removeExchange", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "_listingId", + "type": "uint256" + } + ], + "name": "setDomainListing", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_domainId", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "_newOwner", + "type": "address" + } + ], + "name": "updateDomainOnSale", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IVerifyDomainProcessor", + "name": "_verifyDomainProcessor", + "type": "address" + } + ], + "name": "updateVerifyDomainProcessor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "userDomains", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "verifyDomainProcessor", + "outputs": [ + { + "internalType": "contract IVerifyDomainProcessor", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "string", + "name": "provider", + "type": "string" + }, + { + "internalType": "string", + "name": "parameters", + "type": "string" + }, + { + "internalType": "string", + "name": "context", + "type": "string" + } + ], + "internalType": "struct Claims.ClaimInfo", + "name": "claimInfo", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "identifier", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint32", + "name": "timestampS", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "epoch", + "type": "uint32" + } + ], + "internalType": "struct Claims.CompleteClaimData", + "name": "claim", + "type": "tuple" + }, + { + "internalType": "bytes[]", + "name": "signatures", + "type": "bytes[]" + } + ], + "internalType": "struct Claims.SignedClaim", + "name": "signedClaim", + "type": "tuple" + } + ], + "internalType": "struct IProxyBaseProcessor.Proof[]", + "name": "_proofs", + "type": "tuple[]" + } + ], + "name": "verifyDomains", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ] + }, + "VerifyDomainProcessor": { + "address": "0x4367155Fe7BAA99d9AE99fE4F6aC1b8E87012e6b", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_registry", + "type": "address" + }, + { + "internalType": "contract INullifierRegistry", + "name": "_nullifierRegistry", + "type": "address" + }, + { + "internalType": "string[]", + "name": "_providerHashes", + "type": "string[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "providerHash", + "type": "string" + } + ], + "name": "ProviderHashAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "providerHash", + "type": "string" + } + ], + "name": "ProviderHashRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "witness", + "type": "address" + } + ], + "name": "WitnessAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "witness", + "type": "address" + } + ], + "name": "WitnessRemoved", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_newProviderHash", + "type": "string" + } + ], + "name": "addProviderHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_newWitness", + "type": "address" + } + ], + "name": "addWitness", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getProviderHashes", + "outputs": [ + { + "internalType": "string[]", + "name": "", + "type": "string[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWitnesses", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "name": "isProviderHash", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "isWitness", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nullifierRegistry", + "outputs": [ + { + "internalType": "contract INullifierRegistry", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "providerHashes", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "registry", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "_removeProviderHash", + "type": "string" + } + ], + "name": "removeProviderHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_removeWitness", + "type": "address" + } + ], + "name": "removeWitness", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "string", + "name": "provider", + "type": "string" + }, + { + "internalType": "string", + "name": "parameters", + "type": "string" + }, + { + "internalType": "string", + "name": "context", + "type": "string" + } + ], + "internalType": "struct Claims.ClaimInfo", + "name": "claimInfo", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "identifier", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint32", + "name": "timestampS", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "epoch", + "type": "uint32" + } + ], + "internalType": "struct Claims.CompleteClaimData", + "name": "claim", + "type": "tuple" + }, + { + "internalType": "bytes[]", + "name": "signatures", + "type": "bytes[]" + } + ], + "internalType": "struct Claims.SignedClaim", + "name": "signedClaim", + "type": "tuple" + } + ], + "internalType": "struct IProxyBaseProcessor.Proof", + "name": "proof", + "type": "tuple" + } + ], + "name": "verifyProofSignatures", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "components": [ + { + "internalType": "string", + "name": "provider", + "type": "string" + }, + { + "internalType": "string", + "name": "parameters", + "type": "string" + }, + { + "internalType": "string", + "name": "context", + "type": "string" + } + ], + "internalType": "struct Claims.ClaimInfo", + "name": "claimInfo", + "type": "tuple" + }, + { + "components": [ + { + "components": [ + { + "internalType": "bytes32", + "name": "identifier", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "uint32", + "name": "timestampS", + "type": "uint32" + }, + { + "internalType": "uint32", + "name": "epoch", + "type": "uint32" + } + ], + "internalType": "struct Claims.CompleteClaimData", + "name": "claim", + "type": "tuple" + }, + { + "internalType": "bytes[]", + "name": "signatures", + "type": "bytes[]" + } + ], + "internalType": "struct Claims.SignedClaim", + "name": "signedClaim", + "type": "tuple" + } + ], + "internalType": "struct IProxyBaseProcessor.Proof[]", + "name": "_proofs", + "type": "tuple[]" + } + ], + "name": "verifyProofs", + "outputs": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "uint256", + "name": "expiryTime", + "type": "uint256" + } + ], + "internalType": "struct IVerifyDomainProcessor.DomainRaw[]", + "name": "domains", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "witnesses", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + } + } +} as const; \ No newline at end of file diff --git a/contracts-domain/deployments/parameters.ts b/contracts-domain/deployments/parameters.ts index a418557f6..47137a377 100644 --- a/contracts-domain/deployments/parameters.ts +++ b/contracts-domain/deployments/parameters.ts @@ -21,10 +21,10 @@ export const FEE_RECIPIENT: any = { }; export const FEE_PERCENTAGE: any = { - "localhost": ether(0.02), // 2% - "sepolia": ether(0.02), // 2% - "base": ether(0.02), // 2% - "base_staging": ether(0.02), // 2% + "localhost": ether(0.025), // 2.5% + "sepolia": ether(0.025), // 2.5% + "base": ether(0.025), // 2.5% + "base_staging": ether(0.025), // 2.5% }; export const BID_SETTLEMENT_PERIOD: any = { @@ -62,92 +62,92 @@ export const VERIFY_DOMAIN_PROVIDER_HASHES: any = [ '0xac441d6d1e9962eb0abcbc819231e48614786c179507fd0faaec4cad0b5d1e0b', // 17 '0xe62e6329abefdee24fcecf37ca55b112fa9d0abacb2c99cd7f8c0da6c7ba46a8', // 18 '0x099b6726de138236fa7d3917f17caef42ebd19fa93de96b1b1faffc713265d30', // 19 - // '0xde1e37cbb28770a1b1ed70d4a6837e0ee727926069ee8fa1633f03e4de2c35cd', - // '0x6c0e0b23424d75c6191209487a27bdcb9ee9f748ec05f872b4afd56af66c36c5', - // '0x9f76a244b731d7257d4cc846f3da987a6203862a32abe5d379785dbecd235d1a', - // '0xef63eb7d0da5808077af6a8e9c160416ca66db16779ef30e4949d31edd70bf09', - // '0x2b5db07f588bd27d3795281c640fd5ffe6de1114503a27e510a4aa4bd9d004d4', - // '0x7189940070b05a712fc63053e9c7718770c562cd7df084e50a941669f680090a', - // '0x1657faac94dd55e063362ddfb6f95c5a6d21e79ff758c6a8d6079510b004be32', - // '0x60a18f9b8af405dcb90b51e6719fc14b7c7927a5961444cd97eb8ecffc7ecbd9', - // '0x040fbe68e91a4575ad91d7dcb90077fcfc17627ef2a1293f59d1772959ccaed7', - // '0xe2f19f3c91d9a590cfaf25f46551b4a0239ab452ef5f638ab172ccfbd0a0c617', - // '0x70a8c0b560b4655c3a7c68c0bb76cf9fc42484a3bb73c5fed02a5fb4297965b6', - // '0x56c812dccd84620292a18a829158ba20fef49e52efa5794c58d7d2780148fc23', - // '0x72ab702376864dba1eb761a6937ab1d9fd02e607043d7d6434bb3f342b220a73', - // '0xd78e55f09de9c1869064135807c1514b2b7f905b209cc570ecd52e04b03658ea', - // '0x752c1557a4edaa74f9c6dd7c166ed91efce14ed906471641373f2a7b0284c1dd', - // '0x0a6d99c8e50b86556ab7cb84f513e100421fbf30bfec67cdd18ce72025531993', - // '0x6813bdf5e24e6b5dba7bf43da893b892b772ede62fd44dd2b64a3117337bbf1f', - // '0x3de42f758236bfb794df199d9e8458379d3712d2ec688e2e5ff3c3df5f958fa1', - // '0xc3dd13ceaf2f9de125cb236a3dbcf79c0c1f758ab6187ceda684e38455df61d3', - // '0xd9335b69d0a9912557e1a9ede125108931bcab6aee6874f25ff38bd7f4e15b53', - // '0x28f4d6a102a425f323ab09b3df79245cc107af12750359a3abff684eda8ccab4', - // '0x96e311f6dc7880938a832d817d9c7bf5362db1c11b1aa5c7477029ec1a67fddb', - // '0x6080466f782d79cf5e369d7ddb9dfad0a18d3305f9175f5dda9f018379dfa09b', - // '0x02e00e22814427e254d8f3864e3c2fc7d4df8f5a880a02acd453e7ed266d34f3', - // '0x7227d090de5230b94bb1276b3f7f88637c5f81ca78611dd688abaad8f444f994', - // '0x35e984b55982c5ff052a556f4222d68c8418b30fef2a492a54fdc2932d37d922', - // '0x7138e0ddbabc0a60acd45beab2de3b358b53de74f4232f39de107e6385948574', - // '0x8e5d65220543375a787871bf75fd97ac5e92ab19e4e3966f8cd10e626a2a60a7', - // '0x93368c81a1b5ae7bdda5f6d4438a468d021473bb87f2497fa9182919da4b0c94', - // '0x4427153487539ae730ef8efea808c07bb204874254f1c2122c10061f45b9f3c6', - // '0x435c11202ac6185b21b8db4fb611239f88b15a9fabd592881dcdc8e1d5699b1f', - // '0xbd8906d0befd6ee002dde561784391592d87700d5e056feb55edeef379b0818e', - // '0x8b2e8c033e6552fc84097959758d282fefef91b1fb14af4030000b9b9c0e4002', - // '0xb0bce44cf9775397a5165866ba30bd3e08d803361e07dcd13836b0e6bac90115', - // '0x4d498fe8a5c041a5b7db76193e7d8b892f0671e51ce96428ceb106ff3169a7c4', - // '0x315d843fb171162091c0b48bcdf9e7b6cd501e5e7b95939008307e1528fe47b9', - // '0xd7dffe2c62f550564eb39c36bcf0d6c5e42a81b465588d2130f0ea8069a7032e', - // '0xe92b04c68d583298f3c4b7bcc2950e1eb87c1f07c3d1ebb882f58b1c859569d4', - // '0x8d3f0ae15560c62602003b3ae3ac315225ce3efc5b8f1095f879874c57314bba', - // '0x586842c544b265525a27f2f69b24e8ea8e04d449f5da3b8382f77b9abffa6e20', - // '0x09a8b20b3de23b8f661e388e6541aa4e18b39edf7e2f0926e4b3763c82fee1e2', - // '0xb79056285d7d62718d9b1f19087cf246f6fa4bd54b59fefb6e53674eb036819f', - // '0x910bcc08eeca45f11593fe7b3aa808213a144ddcc952bd46480ebc827100def2', - // '0xb236556aad9e923c4550fee8bba81c41c7536853354ebd67df2df39d0805dbc1', - // '0x4f47385534d844365d9ec1642313713df7b50200d1934ff8500f021a4e50f0e1', - // '0xc234e7aaa70f35381cce4ed61eb5fddebb86a1cb00ded43da6bf60e1da75ffe5', - // '0x2cc4c39b7274f840719c07a65f6004a43a28545052fb79611568b94f8f286246', - // '0x0dde40a5b8a6459a903a69c380e8dd1f5e2204834db7257d919d05cf5fb5b60e', - // '0x0947712b8534d1c94dc99beb4471b5ff8a829146ac805a84899516ba7c2b921b', - // '0x89eacd1f0cddb88b7eef5e29fb4ec02ec2c18091e032a0c678183f525e962e1b', - // '0x3c95de2b959ef104f5237e7c7d827c84b7609e1c653d558d87c0d25919480c2b', - // '0x84293ae420c269d3c6c1545a925de8110a2682d05580c02908eb599d93e88933', - // '0x517aee0b4eb5683ea2ee6eea71ab1185a0d9fcbfdf32635fb7e3a00b43ed6105', - // '0x7daee2949ac85d2f3dcba4c2d45a4841c4ff53c6f9280f01627e97120fdfe9da', - // '0xee930d1872b327df3860ecd73230f947e6f580ac6d0dadc682a74dc8a4982dc9', - // '0x302dd9fb18d7eb42ae6fb33885fd29d19f6994fffcdcb9aef2d7cd736ad62497', - // '0xca6b572cc14692953bac2ac3a122bb825dee217d2fc06a36b45ca25989f70019', - // '0x11dc7a8b213bb58657d84da0d5a3cdff873dde18be19b2b644cf0b3e115b66d1', - // '0x8500d23729472f0c32264279081bee65e632c933cdc8f8cf55e763375f205fdb', - // '0x01bd276fa345583afe6900dd0adca011f2403698773b885959b9a029f05b3c57', - // '0x2d8a7f754f9061e593e0cc0c2837cccc385b5f8b78c0229c0bdb9896d88b4433', - // '0x7abab9115123f9e5741aea38ea067c74dfa8b6092c8532dbcc8989f7a8d83a92', - // '0x472b25279325695c81860fe0d64ac8b7042d1c84ea8e859c97e4acba9d586925', - // '0x606f6a5d814a6fe0e19e092b15ada33448e8b4ae7de97193d39fb88b5e22a2bc', - // '0x026620c2765771542f2bbe43dde1bbcd1961d7ca42aee878b7003bd58fbcdfa5', - // '0xa7b5e4bc48f40cc2e6e7136ed5335b1e714b3108bfa3e38ba11337260bcc4a11', - // '0x8450ab03bb68dcef8a02de079ea430859d8fe6b676d2766d2d0e9b51ef98deb3', - // '0xf4cadad2be2ab909a67f64e6092caa80758b6c705c694993fe751c60a439e194', - // '0x853fdf59b3e0d9d8fa9d05908df3d210d4e0ace89623d8c0d263df4e2c28d29e', - // '0xcf879c7ed93fed3ffe32896a2f0f47b04b061a3553b1a29137885e2c2ce89137', - // '0x90ee386b48c1f38ed4bd7892f79b4305a98f3f7fd6d3b6ff086737dcf27cc57d', - // '0xa9bae751ffff6b3d2c6aff1076a3a8ec83f993f9c103c783c59bc6d994f903af', - // '0xf2ba487dff86adcdb3de547fb379c76c529d3e281af8c4f0a410778bd82d1667', - // '0xa2059864db657d873b0143d3d7d00835791eead71bd51b3a9f5552eec4222b4e', - // '0x011518c2db496ca7aad11d852b07504703925fa5e068df9002480af49bb5a9cf', - // '0xa94526a2fec1b0fad05cbbb809b7572f4489fad26eb186900f029b9131734587', - // '0x0a1c8ea4623415a005e01c2b9b7d162be9b999b75a3ca7c25b919be63a5653e7', - // '0x38d390dfca745c9d32032db845c4550e67fb271065b042778cc04c94d588d3ee', - // '0xdb3575e62edb3032bbdaee45a7a65d228fc7f5cca2c5b7aa0955cc9df8a09ecb', - // '0xc27d518fd5a69f2f7917988162e3b707b52e4c17143ff07737a158f19d272819', // 99 + '0xde1e37cbb28770a1b1ed70d4a6837e0ee727926069ee8fa1633f03e4de2c35cd', + '0x6c0e0b23424d75c6191209487a27bdcb9ee9f748ec05f872b4afd56af66c36c5', + '0x9f76a244b731d7257d4cc846f3da987a6203862a32abe5d379785dbecd235d1a', + '0xef63eb7d0da5808077af6a8e9c160416ca66db16779ef30e4949d31edd70bf09', + '0x2b5db07f588bd27d3795281c640fd5ffe6de1114503a27e510a4aa4bd9d004d4', + '0x7189940070b05a712fc63053e9c7718770c562cd7df084e50a941669f680090a', + '0x1657faac94dd55e063362ddfb6f95c5a6d21e79ff758c6a8d6079510b004be32', + '0x60a18f9b8af405dcb90b51e6719fc14b7c7927a5961444cd97eb8ecffc7ecbd9', + '0x040fbe68e91a4575ad91d7dcb90077fcfc17627ef2a1293f59d1772959ccaed7', + '0xe2f19f3c91d9a590cfaf25f46551b4a0239ab452ef5f638ab172ccfbd0a0c617', + '0x70a8c0b560b4655c3a7c68c0bb76cf9fc42484a3bb73c5fed02a5fb4297965b6', + '0x56c812dccd84620292a18a829158ba20fef49e52efa5794c58d7d2780148fc23', + '0x72ab702376864dba1eb761a6937ab1d9fd02e607043d7d6434bb3f342b220a73', + '0xd78e55f09de9c1869064135807c1514b2b7f905b209cc570ecd52e04b03658ea', + '0x752c1557a4edaa74f9c6dd7c166ed91efce14ed906471641373f2a7b0284c1dd', + '0x0a6d99c8e50b86556ab7cb84f513e100421fbf30bfec67cdd18ce72025531993', + '0x6813bdf5e24e6b5dba7bf43da893b892b772ede62fd44dd2b64a3117337bbf1f', + '0x3de42f758236bfb794df199d9e8458379d3712d2ec688e2e5ff3c3df5f958fa1', + '0xc3dd13ceaf2f9de125cb236a3dbcf79c0c1f758ab6187ceda684e38455df61d3', + '0xd9335b69d0a9912557e1a9ede125108931bcab6aee6874f25ff38bd7f4e15b53', + '0x28f4d6a102a425f323ab09b3df79245cc107af12750359a3abff684eda8ccab4', + '0x96e311f6dc7880938a832d817d9c7bf5362db1c11b1aa5c7477029ec1a67fddb', + '0x6080466f782d79cf5e369d7ddb9dfad0a18d3305f9175f5dda9f018379dfa09b', + '0x02e00e22814427e254d8f3864e3c2fc7d4df8f5a880a02acd453e7ed266d34f3', + '0x7227d090de5230b94bb1276b3f7f88637c5f81ca78611dd688abaad8f444f994', + '0x35e984b55982c5ff052a556f4222d68c8418b30fef2a492a54fdc2932d37d922', + '0x7138e0ddbabc0a60acd45beab2de3b358b53de74f4232f39de107e6385948574', + '0x8e5d65220543375a787871bf75fd97ac5e92ab19e4e3966f8cd10e626a2a60a7', + '0x93368c81a1b5ae7bdda5f6d4438a468d021473bb87f2497fa9182919da4b0c94', + '0x4427153487539ae730ef8efea808c07bb204874254f1c2122c10061f45b9f3c6', + '0x435c11202ac6185b21b8db4fb611239f88b15a9fabd592881dcdc8e1d5699b1f', + '0xbd8906d0befd6ee002dde561784391592d87700d5e056feb55edeef379b0818e', + '0x8b2e8c033e6552fc84097959758d282fefef91b1fb14af4030000b9b9c0e4002', + '0xb0bce44cf9775397a5165866ba30bd3e08d803361e07dcd13836b0e6bac90115', + '0x4d498fe8a5c041a5b7db76193e7d8b892f0671e51ce96428ceb106ff3169a7c4', + '0x315d843fb171162091c0b48bcdf9e7b6cd501e5e7b95939008307e1528fe47b9', + '0xd7dffe2c62f550564eb39c36bcf0d6c5e42a81b465588d2130f0ea8069a7032e', + '0xe92b04c68d583298f3c4b7bcc2950e1eb87c1f07c3d1ebb882f58b1c859569d4', + '0x8d3f0ae15560c62602003b3ae3ac315225ce3efc5b8f1095f879874c57314bba', + '0x586842c544b265525a27f2f69b24e8ea8e04d449f5da3b8382f77b9abffa6e20', + '0x09a8b20b3de23b8f661e388e6541aa4e18b39edf7e2f0926e4b3763c82fee1e2', + '0xb79056285d7d62718d9b1f19087cf246f6fa4bd54b59fefb6e53674eb036819f', + '0x910bcc08eeca45f11593fe7b3aa808213a144ddcc952bd46480ebc827100def2', + '0xb236556aad9e923c4550fee8bba81c41c7536853354ebd67df2df39d0805dbc1', + '0x4f47385534d844365d9ec1642313713df7b50200d1934ff8500f021a4e50f0e1', + '0xc234e7aaa70f35381cce4ed61eb5fddebb86a1cb00ded43da6bf60e1da75ffe5', + '0x2cc4c39b7274f840719c07a65f6004a43a28545052fb79611568b94f8f286246', + '0x0dde40a5b8a6459a903a69c380e8dd1f5e2204834db7257d919d05cf5fb5b60e', + '0x0947712b8534d1c94dc99beb4471b5ff8a829146ac805a84899516ba7c2b921b', + '0x89eacd1f0cddb88b7eef5e29fb4ec02ec2c18091e032a0c678183f525e962e1b', + '0x3c95de2b959ef104f5237e7c7d827c84b7609e1c653d558d87c0d25919480c2b', + '0x84293ae420c269d3c6c1545a925de8110a2682d05580c02908eb599d93e88933', + '0x517aee0b4eb5683ea2ee6eea71ab1185a0d9fcbfdf32635fb7e3a00b43ed6105', + '0x7daee2949ac85d2f3dcba4c2d45a4841c4ff53c6f9280f01627e97120fdfe9da', + '0xee930d1872b327df3860ecd73230f947e6f580ac6d0dadc682a74dc8a4982dc9', + '0x302dd9fb18d7eb42ae6fb33885fd29d19f6994fffcdcb9aef2d7cd736ad62497', + '0xca6b572cc14692953bac2ac3a122bb825dee217d2fc06a36b45ca25989f70019', + '0x11dc7a8b213bb58657d84da0d5a3cdff873dde18be19b2b644cf0b3e115b66d1', + '0x8500d23729472f0c32264279081bee65e632c933cdc8f8cf55e763375f205fdb', + '0x01bd276fa345583afe6900dd0adca011f2403698773b885959b9a029f05b3c57', + '0x2d8a7f754f9061e593e0cc0c2837cccc385b5f8b78c0229c0bdb9896d88b4433', + '0x7abab9115123f9e5741aea38ea067c74dfa8b6092c8532dbcc8989f7a8d83a92', + '0x472b25279325695c81860fe0d64ac8b7042d1c84ea8e859c97e4acba9d586925', + '0x606f6a5d814a6fe0e19e092b15ada33448e8b4ae7de97193d39fb88b5e22a2bc', + '0x026620c2765771542f2bbe43dde1bbcd1961d7ca42aee878b7003bd58fbcdfa5', + '0xa7b5e4bc48f40cc2e6e7136ed5335b1e714b3108bfa3e38ba11337260bcc4a11', + '0x8450ab03bb68dcef8a02de079ea430859d8fe6b676d2766d2d0e9b51ef98deb3', + '0xf4cadad2be2ab909a67f64e6092caa80758b6c705c694993fe751c60a439e194', + '0x853fdf59b3e0d9d8fa9d05908df3d210d4e0ace89623d8c0d263df4e2c28d29e', + '0xcf879c7ed93fed3ffe32896a2f0f47b04b061a3553b1a29137885e2c2ce89137', + '0x90ee386b48c1f38ed4bd7892f79b4305a98f3f7fd6d3b6ff086737dcf27cc57d', + '0xa9bae751ffff6b3d2c6aff1076a3a8ec83f993f9c103c783c59bc6d994f903af', + '0xf2ba487dff86adcdb3de547fb379c76c529d3e281af8c4f0a410778bd82d1667', + '0xa2059864db657d873b0143d3d7d00835791eead71bd51b3a9f5552eec4222b4e', + '0x011518c2db496ca7aad11d852b07504703925fa5e068df9002480af49bb5a9cf', + '0xa94526a2fec1b0fad05cbbb809b7572f4489fad26eb186900f029b9131734587', + '0x0a1c8ea4623415a005e01c2b9b7d162be9b999b75a3ca7c25b919be63a5653e7', + '0x38d390dfca745c9d32032db845c4550e67fb271065b042778cc04c94d588d3ee', + '0xdb3575e62edb3032bbdaee45a7a65d228fc7f5cca2c5b7aa0955cc9df8a09ecb', + '0xc27d518fd5a69f2f7917988162e3b707b52e4c17143ff07737a158f19d272819', // 99 ]; export const VERIFY_DOMAIN_WITNESS: any = { "localhost": "0x0636c417755E3ae25C6c166D181c0607F4C572A3", "sepolia": "0x0636c417755E3ae25C6c166D181c0607F4C572A3", - "base": "", + "base": "0x0636c417755E3ae25C6c166D181c0607F4C572A3", "base_staging": "0x0636c417755E3ae25C6c166D181c0607F4C572A3", }; diff --git a/contracts-domain/deployments/sepolia/ClaimVerifier.json b/contracts-domain/deployments/sepolia/ClaimVerifier.json index caeca7f2e..52bd95ebe 100644 --- a/contracts-domain/deployments/sepolia/ClaimVerifier.json +++ b/contracts-domain/deployments/sepolia/ClaimVerifier.json @@ -1,5 +1,5 @@ { - "address": "0x8985018D19DcB645ddC3Eb486c434CB5f5EdA5C2", + "address": "0x71D6e2056e7138F1F489EE98658D4832348b3435", "abi": [ { "inputs": [ @@ -79,25 +79,25 @@ "type": "function" } ], - "transactionHash": "0x3b05e879508994ee528b39dd4d6d043a19c96b211df5fa1ae617b165c67a3d3c", + "transactionHash": "0xd2d2a832ea42941f6b1c31aded89efd24876d23349e233491673b88916d7458b", "receipt": { "to": null, "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "contractAddress": "0x8985018D19DcB645ddC3Eb486c434CB5f5EdA5C2", - "transactionIndex": 62, + "contractAddress": "0x71D6e2056e7138F1F489EE98658D4832348b3435", + "transactionIndex": 34, "gasUsed": "925596", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x688e3d61d7df7decd199c3e33369dd0d428efa655055beb14531ebe074eee77f", - "transactionHash": "0x3b05e879508994ee528b39dd4d6d043a19c96b211df5fa1ae617b165c67a3d3c", + "blockHash": "0xb0ae55b42e3486408d5a660346321241043f2a6febd33ec7a6f62be2bb00934d", + "transactionHash": "0xd2d2a832ea42941f6b1c31aded89efd24876d23349e233491673b88916d7458b", "logs": [], - "blockNumber": 6644704, - "cumulativeGasUsed": "5222281", + "blockNumber": 6746721, + "cumulativeGasUsed": "9193668", "status": 1, "byzantium": true }, "args": [], "numDeployments": 1, - "solcInputHash": "2d5447dc2e8fb3a2517c08b948266497", + "solcInputHash": "d865a6f49eab8c58036d78b72f5cb448", "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"data\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"maxValues\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"extractProviderHash\",\"type\":\"bool\"}],\"name\":\"extractAllFromContext\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"data\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"prefix\",\"type\":\"string\"}],\"name\":\"extractFieldFromContext\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"data\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"target\",\"type\":\"string\"}],\"name\":\"findSubstringEndIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"extractAllFromContext(string,uint8,bool)\":{\"params\":{\"data\":\"Context string from which target value needs to be extracted\",\"extractProviderHash\":\"Extracts and returns providerHash if true\",\"maxValues\":\"Maximum number of values to be extracted from extractedParameters\"}},\"extractFieldFromContext(string,string)\":{\"params\":{\"data\":\"Context string from which target value needs to be extracted\",\"prefix\":\"Prefix of the target value that needs to be extracted \"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"extractAllFromContext(string,uint8,bool)\":{\"notice\":\"Extracts ALL values from context in a single pass. Context is stored as serialized JSON string with two keys: extractedParameters and providerHash. ExtractedParameters itself is a JSON string with key-value pairs. This function returns extracted individual values from extractedParameters along with providerHash (if extractProviderHash is true). Use maxValues to limit the number of expected values to be extracted from extractedParameters. In most cases, one would need to extract all values from extractedParameters and providerHash, hence use this function over calling extractFieldFromContext multiple times. \"},\"extractFieldFromContext(string,string)\":{\"notice\":\"Extracts given target field value from context in claims. Extracts only ONE value. Pass prefix formatted with quotes, for example '\\\"providerHash\\\\\\\":\\\\\\\"' Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\"},\"findSubstringEndIndex(string,string)\":{\"notice\":\"Find the end index of target string in the data string. Returns the end index + 1 if the target string in the data string if found. Returns type(uint256).max if: - Target is longer than data - Target is not found Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/external/ClaimVerifier.sol\":\"ClaimVerifier\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\")\\n mstore(0x1c, hash)\\n message := keccak256(0x00, 0x3c)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40)\\n mstore(ptr, \\\"\\\\x19\\\\x01\\\")\\n mstore(add(ptr, 0x02), domainSeparator)\\n mstore(add(ptr, 0x22), structHash)\\n data := keccak256(ptr, 0x42)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\\n * `validator` and `data` according to the version 0 of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x00\\\", validator, data));\\n }\\n}\\n\",\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"./StringUtils.sol\\\";\\n\\n/**\\n * Library to assist with requesting,\\n * serialising & verifying credentials\\n */\\nlibrary Claims {\\n\\t/** Data required to describe a claim */\\n\\tstruct CompleteClaimData {\\n\\t\\tbytes32 identifier;\\n\\t\\taddress owner;\\n\\t\\tuint32 timestampS;\\n\\t\\tuint32 epoch;\\n\\t}\\n\\n\\tstruct ClaimInfo {\\n\\t\\tstring provider;\\n\\t\\tstring parameters;\\n\\t\\tstring context;\\n\\t}\\n\\n\\t/** Claim with signatures & signer */\\n\\tstruct SignedClaim {\\n\\t\\tCompleteClaimData claim;\\n\\t\\tbytes[] signatures;\\n\\t}\\n\\n\\t/**\\n\\t * Asserts that the claim is signed by the expected witnesses\\n\\t */\\n\\tfunction assertValidSignedClaim(\\n\\t\\tSignedClaim memory self,\\n\\t\\taddress[] memory expectedWitnessAddresses\\n\\t) internal pure {\\n\\t\\trequire(self.signatures.length > 0, \\\"No signatures\\\");\\n\\t\\taddress[] memory signedWitnesses = recoverSignersOfSignedClaim(self);\\n\\t\\tfor (uint256 i = 0; i < expectedWitnessAddresses.length; i++) {\\n\\t\\t\\tbool found = false;\\n\\t\\t\\tfor (uint256 j = 0; j < signedWitnesses.length; j++) {\\n\\t\\t\\t\\tif (signedWitnesses[j] == expectedWitnessAddresses[i]) {\\n\\t\\t\\t\\t\\tfound = true;\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\trequire(found, \\\"Missing witness signature\\\");\\n\\t\\t}\\n\\t}\\n\\n\\t/**\\n\\t * @dev recovers the signer of the claim\\n\\t */\\n\\tfunction recoverSignersOfSignedClaim(\\n\\t\\tSignedClaim memory self\\n\\t) internal pure returns (address[] memory) {\\n\\t\\tbytes memory serialised = serialise(self.claim);\\n\\t\\taddress[] memory signers = new address[](self.signatures.length);\\n\\t\\tfor (uint256 i = 0; i < self.signatures.length; i++) {\\n\\t\\t\\tsigners[i] = verifySignature(serialised, self.signatures[i]);\\n\\t\\t}\\n\\n\\t\\treturn signers;\\n\\t}\\n\\n\\t/**\\n\\t * @dev serialises the credential into a string;\\n\\t * the string is used to verify the signature\\n\\t *\\n\\t * the serialisation is the same as done by the TS library\\n\\t */\\n\\tfunction serialise(\\n\\t\\tCompleteClaimData memory self\\n\\t) internal pure returns (bytes memory) {\\n\\t\\treturn\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\tStringUtils.bytes2str(abi.encodePacked(self.identifier)),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.address2str(self.owner),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.timestampS),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.epoch)\\n\\t\\t\\t);\\n\\t}\\n\\n\\t/**\\n\\t * @dev returns the address of the user that generated the signature\\n\\t */\\n\\tfunction verifySignature(\\n\\t\\tbytes memory content,\\n\\t\\tbytes memory signature\\n\\t) internal pure returns (address signer) {\\n\\t\\tbytes32 signedHash = keccak256(\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\t\\\"\\\\x19Ethereum Signed Message:\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(content.length),\\n\\t\\t\\t\\tcontent\\n\\t\\t\\t)\\n\\t\\t);\\n\\t\\treturn ECDSA.recover(signedHash, signature);\\n\\t}\\n\\n\\tfunction hashClaimInfo(ClaimInfo memory claimInfo) internal pure returns (bytes32) {\\n\\t\\tbytes memory serialised = abi.encodePacked(\\n\\t\\t\\tclaimInfo.provider,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.parameters,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.context\\n\\t\\t);\\n\\t\\treturn keccak256(serialised);\\n\\t}\\n}\\n\",\"keccak256\":\"0x87a41e75d358e86798456ad45e03446cde8f1519c8af17905f6c8b852a5f2da7\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/StringUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/**\\n * Utilities for string manipulation & conversion\\n */\\nlibrary StringUtils {\\n\\tfunction address2str(address x) internal pure returns (string memory) {\\n\\t\\tbytes memory s = new bytes(40);\\n\\t\\tfor (uint i = 0; i < 20; i++) {\\n\\t\\t\\tbytes1 b = bytes1(uint8(uint(uint160(x)) / (2 ** (8 * (19 - i)))));\\n\\t\\t\\tbytes1 hi = bytes1(uint8(b) / 16);\\n\\t\\t\\tbytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));\\n\\t\\t\\ts[2 * i] = getChar(hi);\\n\\t\\t\\ts[2 * i + 1] = getChar(lo);\\n\\t\\t}\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", s));\\n\\t}\\n\\n\\tfunction bytes2str(bytes memory buffer) internal pure returns (string memory) {\\n\\t\\t// Fixed buffer size for hexadecimal convertion\\n\\t\\tbytes memory converted = new bytes(buffer.length * 2);\\n\\t\\tbytes memory _base = \\\"0123456789abcdef\\\";\\n\\n\\t\\tfor (uint256 i = 0; i < buffer.length; i++) {\\n\\t\\t\\tconverted[i * 2] = _base[uint8(buffer[i]) / _base.length];\\n\\t\\t\\tconverted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length];\\n\\t\\t}\\n\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", converted));\\n\\t}\\n\\n\\tfunction getChar(bytes1 b) internal pure returns (bytes1 c) {\\n\\t\\tif (uint8(b) < 10) return bytes1(uint8(b) + 0x30);\\n\\t\\telse return bytes1(uint8(b) + 0x57);\\n\\t}\\n\\n\\tfunction bool2str(bool _b) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_b) {\\n\\t\\t\\treturn \\\"true\\\";\\n\\t\\t} else {\\n\\t\\t\\treturn \\\"false\\\";\\n\\t\\t}\\n\\t}\\n\\n\\tfunction uint2str(uint _i) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_i == 0) {\\n\\t\\t\\treturn \\\"0\\\";\\n\\t\\t}\\n\\t\\tuint j = _i;\\n\\t\\tuint len;\\n\\t\\twhile (j != 0) {\\n\\t\\t\\tlen++;\\n\\t\\t\\tj /= 10;\\n\\t\\t}\\n\\t\\tbytes memory bstr = new bytes(len);\\n\\t\\tuint k = len;\\n\\t\\twhile (_i != 0) {\\n\\t\\t\\tk = k - 1;\\n\\t\\t\\tuint8 temp = (48 + uint8(_i - (_i / 10) * 10));\\n\\t\\t\\tbytes1 b1 = bytes1(temp);\\n\\t\\t\\tbstr[k] = b1;\\n\\t\\t\\t_i /= 10;\\n\\t\\t}\\n\\t\\treturn string(bstr);\\n\\t}\\n\\n\\tfunction areEqual(\\n\\t\\tstring calldata _a,\\n\\t\\tstring storage _b\\n\\t) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction areEqual(string memory _a, string memory _b) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction toLower(string memory str) internal pure returns (string memory) {\\n\\t\\tbytes memory bStr = bytes(str);\\n\\t\\tbytes memory bLower = new bytes(bStr.length);\\n\\t\\tfor (uint i = 0; i < bStr.length; i++) {\\n\\t\\t\\t// Uppercase character...\\n\\t\\t\\tif ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {\\n\\t\\t\\t\\t// So we add 32 to make it lowercase\\n\\t\\t\\t\\tbLower[i] = bytes1(uint8(bStr[i]) + 32);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tbLower[i] = bStr[i];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn string(bLower);\\n\\t}\\n\\n\\tfunction substring(\\n\\t\\tstring memory str,\\n\\t\\tuint startIndex,\\n\\t\\tuint endIndex\\n\\t) internal pure returns (string memory) {\\n\\t\\tbytes memory strBytes = bytes(str);\\n\\t\\tbytes memory result = new bytes(endIndex - startIndex);\\n\\t\\tfor (uint i = startIndex; i < endIndex; i++) {\\n\\t\\t\\tresult[i - startIndex] = strBytes[i];\\n\\t\\t}\\n\\t\\treturn string(result);\\n\\t}\\n}\\n\",\"keccak256\":\"0x15feebafef16d4c74c043b39e652ddae0e121987ceca74b663f6a2d2d7ba8b4b\",\"license\":\"MIT\"},\"contracts/external/ClaimVerifier.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Claims } from \\\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\nlibrary ClaimVerifier {\\n\\n /**\\n * Find the end index of target string in the data string. Returns the end index + 1 if\\n * the target string in the data string if found. Returns type(uint256).max if:\\n * - Target is longer than data\\n * - Target is not found\\n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\\n */\\n function findSubstringEndIndex(\\n string memory data,\\n string memory target\\n ) public pure returns (uint256) {\\n bytes memory dataBytes = bytes(data);\\n bytes memory targetBytes = bytes(target);\\n\\n if (dataBytes.length < targetBytes.length) {\\n return type(uint256).max;\\n }\\n\\n // Find start of target\\n for (uint i = 0; i <= dataBytes.length - targetBytes.length; i++) {\\n bool isMatch = true;\\n\\n for (uint j = 0; j < targetBytes.length && isMatch; j++) {\\n if (dataBytes[i + j] != targetBytes[j]) {\\n isMatch = false;\\n break;\\n }\\n }\\n\\n if (isMatch) {\\n return i + targetBytes.length; // Return end index + 1\\n }\\n }\\n\\n return type(uint256).max;\\n }\\n\\n /**\\n * Extracts given target field value from context in claims. Extracts only ONE value.\\n * Pass prefix formatted with quotes, for example '\\\"providerHash\\\\\\\":\\\\\\\"'\\n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\\n *\\n * @param data Context string from which target value needs to be extracted\\n * @param prefix Prefix of the target value that needs to be extracted \\n */\\n function extractFieldFromContext(\\n string memory data,\\n string memory prefix\\n ) public pure returns (string memory) {\\n // Find end index of prefix; which is the start index of the value\\n uint256 start = findSubstringEndIndex(data, prefix);\\n\\n bytes memory dataBytes = bytes(data);\\n if (start == dataBytes.length) {\\n return \\\"\\\"; // Prefix not found. Malformed or missing message\\n }\\n \\n // Find the end of the VALUE, assuming it ends with a quote not preceded by a backslash\\n uint256 end = start;\\n while (\\n end < dataBytes.length &&\\n !(dataBytes[end] == '\\\"' && dataBytes[end - 1] != \\\"\\\\\\\\\\\")\\n ) {\\n end++;\\n }\\n if (end <= start) {\\n return \\\"\\\"; // Malformed or missing message\\n }\\n bytes memory contextMessage = new bytes(end - start);\\n for (uint i = start; i < end; i++) {\\n contextMessage[i - start] = dataBytes[i];\\n }\\n return string(contextMessage);\\n }\\n\\n\\n /**\\n * Extracts ALL values from context in a single pass. Context is stored as serialized JSON string with \\n * two keys: extractedParameters and providerHash. ExtractedParameters itself is a JSON string with \\n * key-value pairs. This function returns extracted individual values from extractedParameters along \\n * with providerHash (if extractProviderHash is true). Use maxValues to limit the number of expected values\\n * to be extracted from extractedParameters. In most cases, one would need to extract all values from\\n * extractedParameters and providerHash, hence use this function over calling extractFieldFromContext \\n * multiple times.\\n * \\n * @param data Context string from which target value needs to be extracted\\n * @param maxValues Maximum number of values to be extracted from extractedParameters\\n * @param extractProviderHash Extracts and returns providerHash if true\\n */\\n function extractAllFromContext(\\n string memory data,\\n uint8 maxValues,\\n bool extractProviderHash\\n ) public pure returns (string[] memory) {\\n \\n require(maxValues > 0, \\\"Max values must be greater than 0\\\");\\n\\n bytes memory dataBytes = bytes(data);\\n uint index = 0;\\n\\n bytes memory extractedParametersBytes = bytes('{\\\\\\\"extractedParameters\\\\\\\":{\\\\\\\"');\\n for (uint i = 0; i < extractedParametersBytes.length; i++) {\\n require(dataBytes[index + i] == extractedParametersBytes[i], \\\"Extraction failed. Malformed extractedParameters\\\");\\n }\\n index += extractedParametersBytes.length;\\n\\n bool isValue = false; // starts with a key right after '{\\\\\\\"extractedParameters\\\\\\\":{\\\\\\\"'\\n uint valuesFound = 0;\\n \\n uint[] memory valueIndices = new uint[](extractProviderHash ? 2 * (maxValues + 1): 2 * maxValues);\\n\\n while (\\n index < dataBytes.length\\n ) {\\n // Keep incrementing until '\\\"', escaped quotes are not considered\\n if (!(dataBytes[index] == '\\\"' && dataBytes[index - 1] != \\\"\\\\\\\\\\\")) {\\n index++;\\n continue;\\n }\\n\\n if (!isValue) {\\n // \\\\\\\":\\\\\\\" (3 chars)\\n require(dataBytes[index + 1] == \\\":\\\" && dataBytes[index + 2] == '\\\\\\\"', \\\"Extraction failed. Malformed data 1\\\");\\n index += 3; // move it after \\\\\\\"\\n isValue = true;\\n valueIndices[2 * valuesFound] = index; // start index\\n } else {\\n // \\\\\\\",\\\\\\\" (3 chars) or \\\\\\\"}, (3 chars)\\n // \\\\\\\"}} is not supported, there should always be a providerHash\\n require(\\n dataBytes[index + 1] == \\\",\\\" && dataBytes[index + 2] == '\\\\\\\"' || \\n dataBytes[index + 1] == '}' && dataBytes[index + 2] == \\\",\\\",\\n \\\"Extraction failed. Malformed data 2\\\"\\n );\\n valueIndices[2 * valuesFound + 1] = index; // end index\\n valuesFound++;\\n\\n if (dataBytes[index + 1] == \\\",\\\") {\\n // Revert if valuesFound == maxValues and next char is a comma as there will be more values\\n require(valuesFound != maxValues, \\\"Extraction failed. Exceeded max values\\\");\\n index += 3;\\n isValue = false;\\n } else { // index + 1 = \\\"}\\\"\\n index += 3;\\n break; // end of extractedParameters\\n }\\n }\\n }\\n\\n if (extractProviderHash) {\\n bytes memory providerHashParamBytes = bytes(\\\"\\\\\\\"providerHash\\\\\\\":\\\\\\\"\\\");\\n for (uint i = 0; i < providerHashParamBytes.length; i++) {\\n require(dataBytes[index + i] == providerHashParamBytes[i], \\\"Extraction failed. Malformed providerHash\\\");\\n }\\n index += providerHashParamBytes.length;\\n \\n // final indices tuple in valueIndices will be for star and end indices of provider hash\\n valueIndices[2 * valuesFound] = index;\\n // Keep incrementing until '\\\"'\\n while (\\n index < dataBytes.length && dataBytes[index] != '\\\"'\\n ) {\\n index++;\\n }\\n valueIndices[2 * valuesFound + 1] = index;\\n valuesFound++;\\n } \\n \\n string[] memory values = new string[](valuesFound);\\n \\n for (uint i = 0; i < valuesFound; i++) {\\n uint startIndex = valueIndices[2 * i];\\n uint endIndex = valueIndices[2 * i + 1];\\n bytes memory contextValue = new bytes(endIndex - startIndex);\\n for (uint j = startIndex; j < endIndex; j++) {\\n contextValue[j - startIndex] = dataBytes[j];\\n }\\n values[i] = string(contextValue);\\n }\\n\\n return values;\\n }\\n}\\n\",\"keccak256\":\"0xac6a8d456c3b2c5ab5a475279a2f0f103faff3cb2d6abb2ce2029cd4265b904e\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x60806040523461001e57604051610fc4610024823930815050610fc490f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c80633755667e146100425780634be6d4f81461003d57634da485c6036100f65761030c565b6102e9565b6101ca565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761007f57604052565b610047565b9061009861009160405190565b928361005d565b565b67ffffffffffffffff811161007f57602090601f01601f19160190565b0190565b90826000939282370152565b909291926100dc6100d78261009a565b610084565b938185526020850190828401116100f657610098926100bb565b600080fd5b9080601f830112156100f657816020610116933591016100c7565b90565b9190916040818403126100f657803567ffffffffffffffff81116100f657836101439183016100fb565b92602082013567ffffffffffffffff81116100f65761011692016100fb565b60005b8381106101755750506000910152565b8181015183820152602001610165565b6101a66101af6020936100b79361019a815190565b80835293849260200190565b95869101610162565b601f01601f191690565b602080825261011692910190610185565b6101ed6101e16101db366004610119565b9061054f565b604051918291826101b9565b0390f35b60ff81165b036100f657565b90503590610098826101f1565b8015156101f6565b905035906100988261020a565b90916060828403126100f657813567ffffffffffffffff81116100f65761024b846101169285016100fb565b9361025981602086016101fd565b93604001610212565b9061011691610185565b90610282610278835190565b8083529160200190565b90816102946020830284019460200190565b926000915b8383106102a857505050505090565b909192939460206102cb6102c483856001950387528951610262565b9760200190565b9301930191939290610299565b60208082526101169291019061026c565b6101ed6103006102fa36600461021f565b91610a12565b604051918291826102d8565b6101ed61032361031d366004610119565b906103bf565b6040519182918290815260200190565b6101166101166101169290565b634e487b7160e01b600052601160045260246000fd5b60001981146103655760010190565b610340565b9190610375565b9290565b820391821161036557565b9190820180921161036557565b634e487b7160e01b600052603260045260246000fd5b906103ac825190565b8110156103ba570160200190565b61038d565b6103d26103d6916103ce600090565b5090565b9190565b81516103e66103d2610116845190565b106104fb576000916103f783610333565b61040d610116610405845190565b85519061036a565b81116104f4576001808061042087610333565b905b61044b575b505061043b5761043690610356565b6103f7565b9151610116935090505b90610380565b61045c610116879894969395985190565b8110806104ed575b156104e25761048d61047f610479838a610380565b846103a3565b516001600160f81b03191690565b6104bb6104ad6104a061047f858b6103a3565b6001600160f81b03191690565b916001600160f81b03191690565b036104d4576104c990610356565b839194929693610422565b509250809491503880610427565b819492969350610427565b5084610464565b5050501990565b505060001990565b906105106100d78361009a565b918252565b6101166000610503565b610116610515565b369037565b9061009861054261053c84610503565b9361009a565b601f190160208401610527565b919061037161056791610560606090565b50846103bf565b90610573610116835190565b831461067f57825b610586610116845190565b811080610619575b156105a15761059c90610356565b61057b565b918383111561060d576105bc6105b7858561036a565b61052c565b91845b845b811015610601576105fa816105dc61047f6105c194876103a3565b6105f46105e98a8461036a565b9160001a91886103a3565b53610356565b90506105bf565b50935050610116915090565b5091505061011661051f565b5061062761047f82856103a3565b610634601160f91b6104ad565b1480610646575b1561058e565b61058e565b5061064161066961047f61066361065d6001610333565b8561036a565b866103a3565b610676601760fa1b6104ad565b1415905061063b565b91505061011661051f565b6106976101166101169290565b60ff1690565b156106a457565b60405162461bcd60e51b815260206004820152602160248201527f4d61782076616c756573206d7573742062652067726561746572207468616e206044820152600360fc1b6064820152608490fd5b6106fd6019610503565b7f7b22657874726163746564506172616d6574657273223a7b2200000000000000602082015290565b6101166106f3565b1561073557565b60405162461bcd60e51b815260206004820152603060248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642065787460448201526f726163746564506172616d657465727360801b6064820152608490fd5b6107a29060ff165b9160ff1690565b029060ff821691820361036557565b6107bd9060ff1661079b565b019060ff821161036557565b6101166101166101169260ff1690565b67ffffffffffffffff811161007f5760208091020190565b906105106100d7836107d9565b9061009861054261080e846107f1565b936107d9565b1561081b57565b60405162461bcd60e51b815260206004820152602360248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642064617460448201526230901960e91b6064820152608490fd5b8181029291811591840414171561036557565b90610888825190565b8110156103ba576020809102010190565b156108a057565b60405162461bcd60e51b815260206004820152602660248201527f45787472616374696f6e206661696c65642e204578636565646564206d61782060448201526576616c75657360d01b6064820152608490fd5b156108fb57565b60405162461bcd60e51b815260206004820152602360248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642064617460448201526261203160e81b6064820152608490fd5b6109566010610503565b6f11383937bb34b232b92430b9b4111d1160811b602082015290565b61011661094c565b1561098157565b60405162461bcd60e51b815260206004820152602960248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642070726f6044820152680ecd2c8cae490c2e6d60bb1b6064820152608490fd5b60005b8281106109e757505050565b6060828201526020016109db565b90610098610a0561080e846107f1565b601f1901602084016109d8565b90610a2f600092610116610a258561068a565b60ff85161161069d565b93610a3983610333565b91610a42610726565b93835b610a50610116875190565b811015610a975780610a8d610a7461047f610a6e610a92958a610380565b8c6103a3565b610a876104ad6104a061047f868d6103a3565b1461072e565b610356565b610a45565b5092610445610aa99295979693975190565b918093610ab582610333565b968315610f7a57610af2610aed610ae86002610ae3610add610ad7600161068a565b886107b1565b9161068a565b610793565b6107c9565b6107fe565b955b610aff610116895190565b861015610f6c57610b1361047f878a6103a3565b610b20601160f91b6104ad565b1480610f39575b155b610f2957610bd757610b7c600195610b5561047f610b4f610b498a610333565b84610380565b8b6103a3565b610b62601d60f91b6104ad565b1480610ba5575b610b72906108f4565b6104456003610333565b94610ba086610b9d610b978c610b926002610333565b61086c565b8a61087f565b52565b610af4565b50610b72610bc261047f610a6e610bbc6002610333565b85610380565b610bcf601160f91b6104ad565b149050610b69565b93610c42600198610bf661047f610b4f610bf08d610333565b86610380565b610c03600b60fa1b6104ad565b1480610f02575b8015610ea9575b610c1a90610814565b610a8d83610b9d610c3c8d610445610c3687610b926002610333565b91610333565b8b61087f565b610c5b61047f610c55610bbc849c610333565b8a6103a3565b610c68600b60fa1b6104ad565b03610c8f5790610b72610c8892610c816103d2866107c9565b1415610899565b9382610af4565b50610ca7915061044560039897969598949394610333565b905b610d9d575b50610cb8846109f5565b94610cc282610333565b855b811015610d95576002610cf182610b92610ceb610ce7610b9784610b9288610333565b5190565b93610333565b610d0c610ce7610d0660019361044585610333565b8861087f565b91610d1a6105b7828561036a565b9281835b610d57575b50505050610cc491610d35610d509290565b610d3f828b61087f565b52610d4a818a61087f565b50610356565b9050610cc2565b8982821015610d8f5781610d7261047f8794610d89946103a3565b6105f4610d7f878461036a565b918c1a91896103a3565b90610d1e565b50610d23565b509350505050565b91949093610da9610972565b94610db381610333565b610dbe610116885190565b811015610e035780610a8d88610df86104ad6104a061047f86610df261047f8f8f610dfe9c610dec91610380565b906103a3565b956103a3565b1461097a565b610db3565b509392610445610e1592969793975190565b9384610e33600296610b9d610e2d85610b928b610333565b8661087f565b610e3e610116855190565b811080610e87575b15610e5957610e5490610356565b610e33565b610a8d90610b9d610e2d610e7685610b92610e8098999a9b610333565b6104456001610333565b9238610cae565b50610e9561047f82866103a3565b610ea2601160f91b6104ad565b1415610e46565b50610ebc61047f610b4f610bf08d610333565b610ec9607d60f81b6104ad565b148015610c115750610c1a610eed61047f610a6e610ee76002610333565b87610380565b610efa600b60fa1b6104ad565b149050610c11565b50610f1661047f610b4f610bf06002610333565b610f23601160f91b6104ad565b14610c0a565b94610f3390610356565b94610af4565b50610b29610f5661047f610b4f610f506001610333565b8a61036a565b610f63601760fa1b6104ad565b14159050610b27565b509695949391929050610ca9565b610af2610aed610ae884610ae3600261068a56fea2646970667358221220df8afdb50247b87e32995ce364cdd9d06fd8e2da0fc4e9ccb71b755e2d49a76864736f6c63430008120033", "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c80633755667e146100425780634be6d4f81461003d57634da485c6036100f65761030c565b6102e9565b6101ca565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761007f57604052565b610047565b9061009861009160405190565b928361005d565b565b67ffffffffffffffff811161007f57602090601f01601f19160190565b0190565b90826000939282370152565b909291926100dc6100d78261009a565b610084565b938185526020850190828401116100f657610098926100bb565b600080fd5b9080601f830112156100f657816020610116933591016100c7565b90565b9190916040818403126100f657803567ffffffffffffffff81116100f657836101439183016100fb565b92602082013567ffffffffffffffff81116100f65761011692016100fb565b60005b8381106101755750506000910152565b8181015183820152602001610165565b6101a66101af6020936100b79361019a815190565b80835293849260200190565b95869101610162565b601f01601f191690565b602080825261011692910190610185565b6101ed6101e16101db366004610119565b9061054f565b604051918291826101b9565b0390f35b60ff81165b036100f657565b90503590610098826101f1565b8015156101f6565b905035906100988261020a565b90916060828403126100f657813567ffffffffffffffff81116100f65761024b846101169285016100fb565b9361025981602086016101fd565b93604001610212565b9061011691610185565b90610282610278835190565b8083529160200190565b90816102946020830284019460200190565b926000915b8383106102a857505050505090565b909192939460206102cb6102c483856001950387528951610262565b9760200190565b9301930191939290610299565b60208082526101169291019061026c565b6101ed6103006102fa36600461021f565b91610a12565b604051918291826102d8565b6101ed61032361031d366004610119565b906103bf565b6040519182918290815260200190565b6101166101166101169290565b634e487b7160e01b600052601160045260246000fd5b60001981146103655760010190565b610340565b9190610375565b9290565b820391821161036557565b9190820180921161036557565b634e487b7160e01b600052603260045260246000fd5b906103ac825190565b8110156103ba570160200190565b61038d565b6103d26103d6916103ce600090565b5090565b9190565b81516103e66103d2610116845190565b106104fb576000916103f783610333565b61040d610116610405845190565b85519061036a565b81116104f4576001808061042087610333565b905b61044b575b505061043b5761043690610356565b6103f7565b9151610116935090505b90610380565b61045c610116879894969395985190565b8110806104ed575b156104e25761048d61047f610479838a610380565b846103a3565b516001600160f81b03191690565b6104bb6104ad6104a061047f858b6103a3565b6001600160f81b03191690565b916001600160f81b03191690565b036104d4576104c990610356565b839194929693610422565b509250809491503880610427565b819492969350610427565b5084610464565b5050501990565b505060001990565b906105106100d78361009a565b918252565b6101166000610503565b610116610515565b369037565b9061009861054261053c84610503565b9361009a565b601f190160208401610527565b919061037161056791610560606090565b50846103bf565b90610573610116835190565b831461067f57825b610586610116845190565b811080610619575b156105a15761059c90610356565b61057b565b918383111561060d576105bc6105b7858561036a565b61052c565b91845b845b811015610601576105fa816105dc61047f6105c194876103a3565b6105f46105e98a8461036a565b9160001a91886103a3565b53610356565b90506105bf565b50935050610116915090565b5091505061011661051f565b5061062761047f82856103a3565b610634601160f91b6104ad565b1480610646575b1561058e565b61058e565b5061064161066961047f61066361065d6001610333565b8561036a565b866103a3565b610676601760fa1b6104ad565b1415905061063b565b91505061011661051f565b6106976101166101169290565b60ff1690565b156106a457565b60405162461bcd60e51b815260206004820152602160248201527f4d61782076616c756573206d7573742062652067726561746572207468616e206044820152600360fc1b6064820152608490fd5b6106fd6019610503565b7f7b22657874726163746564506172616d6574657273223a7b2200000000000000602082015290565b6101166106f3565b1561073557565b60405162461bcd60e51b815260206004820152603060248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642065787460448201526f726163746564506172616d657465727360801b6064820152608490fd5b6107a29060ff165b9160ff1690565b029060ff821691820361036557565b6107bd9060ff1661079b565b019060ff821161036557565b6101166101166101169260ff1690565b67ffffffffffffffff811161007f5760208091020190565b906105106100d7836107d9565b9061009861054261080e846107f1565b936107d9565b1561081b57565b60405162461bcd60e51b815260206004820152602360248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642064617460448201526230901960e91b6064820152608490fd5b8181029291811591840414171561036557565b90610888825190565b8110156103ba576020809102010190565b156108a057565b60405162461bcd60e51b815260206004820152602660248201527f45787472616374696f6e206661696c65642e204578636565646564206d61782060448201526576616c75657360d01b6064820152608490fd5b156108fb57565b60405162461bcd60e51b815260206004820152602360248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642064617460448201526261203160e81b6064820152608490fd5b6109566010610503565b6f11383937bb34b232b92430b9b4111d1160811b602082015290565b61011661094c565b1561098157565b60405162461bcd60e51b815260206004820152602960248201527f45787472616374696f6e206661696c65642e204d616c666f726d65642070726f6044820152680ecd2c8cae490c2e6d60bb1b6064820152608490fd5b60005b8281106109e757505050565b6060828201526020016109db565b90610098610a0561080e846107f1565b601f1901602084016109d8565b90610a2f600092610116610a258561068a565b60ff85161161069d565b93610a3983610333565b91610a42610726565b93835b610a50610116875190565b811015610a975780610a8d610a7461047f610a6e610a92958a610380565b8c6103a3565b610a876104ad6104a061047f868d6103a3565b1461072e565b610356565b610a45565b5092610445610aa99295979693975190565b918093610ab582610333565b968315610f7a57610af2610aed610ae86002610ae3610add610ad7600161068a565b886107b1565b9161068a565b610793565b6107c9565b6107fe565b955b610aff610116895190565b861015610f6c57610b1361047f878a6103a3565b610b20601160f91b6104ad565b1480610f39575b155b610f2957610bd757610b7c600195610b5561047f610b4f610b498a610333565b84610380565b8b6103a3565b610b62601d60f91b6104ad565b1480610ba5575b610b72906108f4565b6104456003610333565b94610ba086610b9d610b978c610b926002610333565b61086c565b8a61087f565b52565b610af4565b50610b72610bc261047f610a6e610bbc6002610333565b85610380565b610bcf601160f91b6104ad565b149050610b69565b93610c42600198610bf661047f610b4f610bf08d610333565b86610380565b610c03600b60fa1b6104ad565b1480610f02575b8015610ea9575b610c1a90610814565b610a8d83610b9d610c3c8d610445610c3687610b926002610333565b91610333565b8b61087f565b610c5b61047f610c55610bbc849c610333565b8a6103a3565b610c68600b60fa1b6104ad565b03610c8f5790610b72610c8892610c816103d2866107c9565b1415610899565b9382610af4565b50610ca7915061044560039897969598949394610333565b905b610d9d575b50610cb8846109f5565b94610cc282610333565b855b811015610d95576002610cf182610b92610ceb610ce7610b9784610b9288610333565b5190565b93610333565b610d0c610ce7610d0660019361044585610333565b8861087f565b91610d1a6105b7828561036a565b9281835b610d57575b50505050610cc491610d35610d509290565b610d3f828b61087f565b52610d4a818a61087f565b50610356565b9050610cc2565b8982821015610d8f5781610d7261047f8794610d89946103a3565b6105f4610d7f878461036a565b918c1a91896103a3565b90610d1e565b50610d23565b509350505050565b91949093610da9610972565b94610db381610333565b610dbe610116885190565b811015610e035780610a8d88610df86104ad6104a061047f86610df261047f8f8f610dfe9c610dec91610380565b906103a3565b956103a3565b1461097a565b610db3565b509392610445610e1592969793975190565b9384610e33600296610b9d610e2d85610b928b610333565b8661087f565b610e3e610116855190565b811080610e87575b15610e5957610e5490610356565b610e33565b610a8d90610b9d610e2d610e7685610b92610e8098999a9b610333565b6104456001610333565b9238610cae565b50610e9561047f82866103a3565b610ea2601160f91b6104ad565b1415610e46565b50610ebc61047f610b4f610bf08d610333565b610ec9607d60f81b6104ad565b148015610c115750610c1a610eed61047f610a6e610ee76002610333565b87610380565b610efa600b60fa1b6104ad565b149050610c11565b50610f1661047f610b4f610bf06002610333565b610f23601160f91b6104ad565b14610c0a565b94610f3390610356565b94610af4565b50610b29610f5661047f610b4f610f506001610333565b8a61036a565b610f63601760fa1b6104ad565b14159050610b27565b509695949391929050610ca9565b610af2610aed610ae884610ae3600261068a56fea2646970667358221220df8afdb50247b87e32995ce364cdd9d06fd8e2da0fc4e9ccb71b755e2d49a76864736f6c63430008120033", diff --git a/contracts-domain/deployments/sepolia/DomainExchange.json b/contracts-domain/deployments/sepolia/DomainExchange.json index 8b8d88d9a..a62607260 100644 --- a/contracts-domain/deployments/sepolia/DomainExchange.json +++ b/contracts-domain/deployments/sepolia/DomainExchange.json @@ -1,5 +1,5 @@ { - "address": "0xe2B378D9181046c84dB1156B0F90cF3108e25E9D", + "address": "0xC8cd114C6274Ef1066840337E7678BC9731BEa68", "abi": [ { "inputs": [ @@ -1574,48 +1574,48 @@ "type": "function" } ], - "transactionHash": "0x563fc194ce6d8d53ff77cb6bae086ce3fa314574cbe534e8a3617a565a3153e0", + "transactionHash": "0x813d0e36b36d0a5f0d4e46febff9cd1eefed9b91b62739e9110b0fd0b91384bb", "receipt": { "to": null, "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "contractAddress": "0xe2B378D9181046c84dB1156B0F90cF3108e25E9D", - "transactionIndex": 51, + "contractAddress": "0xC8cd114C6274Ef1066840337E7678BC9731BEa68", + "transactionIndex": 52, "gasUsed": "4978143", - "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000000000000000000040000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xb88c8cad1f4c790e9f2bc1fe63b597a8c15af9e156acae29f0171cd584490b8e", - "transactionHash": "0x563fc194ce6d8d53ff77cb6bae086ce3fa314574cbe534e8a3617a565a3153e0", + "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000001000020000000000001004000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x76e642f49e10dfd19554afc869e19a2743e1d87138f1474f31655734af439d27", + "transactionHash": "0x813d0e36b36d0a5f0d4e46febff9cd1eefed9b91b62739e9110b0fd0b91384bb", "logs": [ { - "transactionIndex": 51, - "blockNumber": 6678942, - "transactionHash": "0x563fc194ce6d8d53ff77cb6bae086ce3fa314574cbe534e8a3617a565a3153e0", - "address": "0xe2B378D9181046c84dB1156B0F90cF3108e25E9D", + "transactionIndex": 52, + "blockNumber": 6746717, + "transactionHash": "0x813d0e36b36d0a5f0d4e46febff9cd1eefed9b91b62739e9110b0fd0b91384bb", + "address": "0xC8cd114C6274Ef1066840337E7678BC9731BEa68", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" ], "data": "0x", - "logIndex": 35, - "blockHash": "0xb88c8cad1f4c790e9f2bc1fe63b597a8c15af9e156acae29f0171cd584490b8e" + "logIndex": 108, + "blockHash": "0x76e642f49e10dfd19554afc869e19a2743e1d87138f1474f31655734af439d27" }, { - "transactionIndex": 51, - "blockNumber": 6678942, - "transactionHash": "0x563fc194ce6d8d53ff77cb6bae086ce3fa314574cbe534e8a3617a565a3153e0", - "address": "0xe2B378D9181046c84dB1156B0F90cF3108e25E9D", + "transactionIndex": 52, + "blockNumber": 6746717, + "transactionHash": "0x813d0e36b36d0a5f0d4e46febff9cd1eefed9b91b62739e9110b0fd0b91384bb", + "address": "0xC8cd114C6274Ef1066840337E7678BC9731BEa68", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" ], "data": "0x", - "logIndex": 36, - "blockHash": "0xb88c8cad1f4c790e9f2bc1fe63b597a8c15af9e156acae29f0171cd584490b8e" + "logIndex": 109, + "blockHash": "0x76e642f49e10dfd19554afc869e19a2743e1d87138f1474f31655734af439d27" } ], - "blockNumber": 6678942, - "cumulativeGasUsed": "8666116", + "blockNumber": 6746717, + "cumulativeGasUsed": "19567195", "status": 1, "byzantium": true }, @@ -1627,8 +1627,8 @@ "180", [] ], - "numDeployments": 2, - "solcInputHash": "5430ec5a2a9a288ed108e648fd68abb0", + "numDeployments": 1, + "solcInputHash": "d865a6f49eab8c58036d78b72f5cb448", "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_fee\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"_feeRecipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_bidSettlementPeriod\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_bidRefundPeriod\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"_allowedAddresses\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allowedAddress\",\"type\":\"address\"}],\"name\":\"AddressAddedToAllowlist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"allowedAddress\",\"type\":\"address\"}],\"name\":\"AddressRemovedFromAllowlist\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"AllowlistDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"AllowlistEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"BidCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPrice\",\"type\":\"uint256\"}],\"name\":\"BidPriceIncreased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBidRefundPeriod\",\"type\":\"uint256\"}],\"name\":\"BidRefundPeriodUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBidSettlementPeriod\",\"type\":\"uint256\"}],\"name\":\"BidSettlementPeriodUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BidWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newFeeRecipient\",\"type\":\"address\"}],\"name\":\"FeeRecipientUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newFee\",\"type\":\"uint256\"}],\"name\":\"FeeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"instantAccept\",\"type\":\"bool\"}],\"name\":\"InstantAcceptUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"dkimKeyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"askPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"minBidPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"saleEthRecipient\",\"type\":\"address\"}],\"name\":\"ListingCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"}],\"name\":\"ListingDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"}],\"name\":\"ListingDeletedByRegistry\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newAskPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"saleEthRecipient\",\"type\":\"address\"}],\"name\":\"ListingUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"newMailServerKeyHashAdapter\",\"type\":\"address\"}],\"name\":\"MailServerKeyHashAdapterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"}],\"name\":\"RefundInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"priceNetFees\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fees\",\"type\":\"uint256\"}],\"name\":\"SaleFinalized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract ITransferDomainProcessor\",\"name\":\"newTransferDomainProcessor\",\"type\":\"address\"}],\"name\":\"TransferDomainProcessorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_allowedAddresses\",\"type\":\"address[]\"}],\"name\":\"addAddressesToAllowlist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"allowedAddresses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bidCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bidRefundPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"bidSettlementPeriod\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"bids\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"encryptedBuyerId\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"buyerIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiryTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"refundInitiated\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bidId\",\"type\":\"uint256\"}],\"name\":\"buyerReleaseFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listingId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"_buyerIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"_encryptedBuyerId\",\"type\":\"string\"}],\"name\":\"createBid\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_domainId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_askPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_minBidPrice\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"_saleEthRecipient\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_encryptionKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_dkimKeyHash\",\"type\":\"bytes32\"}],\"name\":\"createListing\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listingId\",\"type\":\"uint256\"}],\"name\":\"deleteListing\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableAllowlist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableInstantAccept\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enableAllowlist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enableInstantAccept\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeRecipient\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"a\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"b\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"c\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[10]\",\"name\":\"signals\",\"type\":\"uint256[10]\"}],\"internalType\":\"struct ITransferDomainProcessor.TransferProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"finalizeSale\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowedSellers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_listingIds\",\"type\":\"uint256[]\"}],\"name\":\"getListingBids\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"encryptedBuyerId\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"buyerIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiryTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"refundInitiated\",\"type\":\"bool\"}],\"internalType\":\"struct DomainExchange.Bid\",\"name\":\"bid\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"buyerInstantAcceptEnabled\",\"type\":\"bool\"}],\"internalType\":\"struct DomainExchange.BidDetailsWithId[][]\",\"name\":\"bidInfo\",\"type\":\"tuple[][]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_listingIds\",\"type\":\"uint256[]\"}],\"name\":\"getListings\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"saleEthRecipient\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"dkimKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"encryptionKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"askPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minBidPrice\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256[]\",\"name\":\"bids\",\"type\":\"uint256[]\"}],\"internalType\":\"struct DomainExchange.Listing\",\"name\":\"listing\",\"type\":\"tuple\"}],\"internalType\":\"struct DomainExchange.ListingWithId[]\",\"name\":\"listingInfo\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getUserBids\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"buyer\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"encryptedBuyerId\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"buyerIdHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expiryTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"refundInitiated\",\"type\":\"bool\"}],\"internalType\":\"struct DomainExchange.Bid\",\"name\":\"bid\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"buyerInstantAcceptEnabled\",\"type\":\"bool\"}],\"internalType\":\"struct DomainExchange.BidDetailsWithId[]\",\"name\":\"bidInfo\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getUserListings\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"saleEthRecipient\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"dkimKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"encryptionKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"askPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minBidPrice\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256[]\",\"name\":\"bids\",\"type\":\"uint256[]\"}],\"internalType\":\"struct DomainExchange.Listing\",\"name\":\"listing\",\"type\":\"tuple\"}],\"internalType\":\"struct DomainExchange.ListingWithId[]\",\"name\":\"listingInfo\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bidId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_newPrice\",\"type\":\"uint256\"}],\"name\":\"increaseBidPrice\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ITransferDomainProcessor\",\"name\":\"_transferDomainProcessor\",\"type\":\"address\"},{\"internalType\":\"contract IVerifiedDomainRegistry\",\"name\":\"_verifiedDomainRegistry\",\"type\":\"address\"},{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"_mailServerKeyHashAdapter\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bidId\",\"type\":\"uint256\"}],\"name\":\"initiateRefund\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"instantAcceptEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isAllowed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"listingCounter\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"listings\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"seller\",\"type\":\"address\"},{\"internalType\":\"address payable\",\"name\":\"saleEthRecipient\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"dkimKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"encryptionKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"createdAt\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"askPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minBidPrice\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mailServerKeyHashAdapter\",\"outputs\":[{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pauseMarketplace\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listingId\",\"type\":\"uint256\"}],\"name\":\"registryRemoveListing\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_disallowedAddresses\",\"type\":\"address[]\"}],\"name\":\"removeAddressesFromAllowlist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"transferDomainProcessor\",\"outputs\":[{\"internalType\":\"contract ITransferDomainProcessor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpauseMarketplace\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newBidRefundPeriod\",\"type\":\"uint256\"}],\"name\":\"updateBidRefundPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newBidSettlementPeriod\",\"type\":\"uint256\"}],\"name\":\"updateBidSettlementPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newFee\",\"type\":\"uint256\"}],\"name\":\"updateFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address payable\",\"name\":\"_newFeeRecipient\",\"type\":\"address\"}],\"name\":\"updateFeeRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_listingId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_newAskPrice\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"_saleEthRecipient\",\"type\":\"address\"}],\"name\":\"updateListing\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IKeyHashAdapterV2\",\"name\":\"_mailServerKeyHashAdapter\",\"type\":\"address\"}],\"name\":\"updateMailServerKeyHashAdapter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ITransferDomainProcessor\",\"name\":\"_transferDomainProcessor\",\"type\":\"address\"}],\"name\":\"updateTransferDomainProcessor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"userBids\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"userListings\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifiedDomainRegistry\",\"outputs\":[{\"internalType\":\"contract IVerifiedDomainRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_bidId\",\"type\":\"uint256\"}],\"name\":\"withdrawBid\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Paused(address)\":{\"details\":\"Emitted when the pause is triggered by `account`.\"},\"Unpaused(address)\":{\"details\":\"Emitted when the pause is lifted by `account`.\"}},\"kind\":\"dev\",\"methods\":{\"addAddressesToAllowlist(address[])\":{\"params\":{\"_allowedAddresses\":\"List of addresses allowed to call allow listed functions\"}},\"buyerReleaseFunds(uint256)\":{\"params\":{\"_bidId\":\"The unique identifier of the bid to release funds for\"}},\"createBid(uint256,bytes32,string)\":{\"params\":{\"_buyerIdHash\":\"The hashed buyerId which is also output as part of the transfer proof later\",\"_encryptedBuyerId\":\"The encrypted buyerId. Should be the same as the buyerId hashed\",\"_listingId\":\"The unique identifier of the listing to bid on\"}},\"createListing(bytes32,uint256,uint256,address,bytes,bytes32)\":{\"params\":{\"_askPrice\":\"An asking price for the domain\",\"_dkimKeyHash\":\"The custom DKIM key hash. If empty, the managed DKIM key hash will be used\",\"_domainId\":\"The unique identifier of the domain\",\"_encryptionKey\":\"The encryption key for buyers to encrypt the buyerId to\",\"_minBidPrice\":\"The minimum bid price for the domain\",\"_saleEthRecipient\":\"The address to receive the ETH from the sale; must be a contract that can receive ETH or an EOA\"}},\"deleteListing(uint256)\":{\"params\":{\"_listingId\":\"The unique identifier of the listing to delete\"}},\"finalizeSale((uint256[2],uint256[2][2],uint256[2],uint256[10]))\":{\"params\":{\"_proof\":\"The zk-email proof of domain transfer\"}},\"getListingBids(uint256[])\":{\"params\":{\"_listingIds\":\"An array of listingIds to fetch bids for\"}},\"getListings(uint256[])\":{\"params\":{\"_listingIds\":\"An array of listingIds to fetch details for\"}},\"getUserBids(address)\":{\"params\":{\"_user\":\"The address of the user to fetch bids for\"}},\"getUserListings(address)\":{\"params\":{\"_user\":\"The address of the user to fetch listings for\"}},\"increaseBidPrice(uint256,uint256)\":{\"params\":{\"_bidId\":\"The unique identifier of the bid to increase the price for\",\"_newPrice\":\"The new price for the bid\"}},\"initialize(address,address,address)\":{\"params\":{\"_mailServerKeyHashAdapter\":\"The address of the mail server key hash adapter contract\",\"_transferDomainProcessor\":\"The address of the domain transfer processor contract\",\"_verifiedDomainRegistry\":\"The address of the verified domain registry contract\"}},\"initiateRefund(uint256)\":{\"params\":{\"_bidId\":\"The unique identifier of the bid to initiate refund for\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"paused()\":{\"details\":\"Returns true if the contract is paused, and false otherwise.\"},\"registryRemoveListing(uint256)\":{\"params\":{\"_listingId\":\"Listing Id to remove\"}},\"removeAddressesFromAllowlist(address[])\":{\"params\":{\"_disallowedAddresses\":\"List of addresses being disallowed from calling allow listed functions\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateBidRefundPeriod(uint256)\":{\"params\":{\"_newBidRefundPeriod\":\"The new bid refund period in seconds\"}},\"updateBidSettlementPeriod(uint256)\":{\"params\":{\"_newBidSettlementPeriod\":\"The new bid settlement period in seconds\"}},\"updateFee(uint256)\":{\"params\":{\"_newFee\":\"The new fee percentage (in basis points)\"}},\"updateFeeRecipient(address)\":{\"params\":{\"_newFeeRecipient\":\"The new address to receive fees\"}},\"updateListing(uint256,uint256,address)\":{\"params\":{\"_listingId\":\"The unique identifier of the listing to update\",\"_newAskPrice\":\"The new asking price for the listing\",\"_saleEthRecipient\":\"The new address to receive the ETH from the sale; must be a contract that can receive ETH or an EOA\"}},\"updateMailServerKeyHashAdapter(address)\":{\"params\":{\"_mailServerKeyHashAdapter\":\"The new mail server key hash adapter\"}},\"updateTransferDomainProcessor(address)\":{\"params\":{\"_transferDomainProcessor\":\"The new transfer domain processor\"}},\"withdrawBid(uint256)\":{\"params\":{\"_bidId\":\"The unique identifier of the bid to withdraw\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addAddressesToAllowlist(address[])\":{\"notice\":\"Adds passed addresses to an allow list. Addresses on the allow list are able to call allow listed functions.\"},\"buyerReleaseFunds(uint256)\":{\"notice\":\"ONLY BUYER: Finalize a sale by releasing funds to the seller. Proof of transfer is not required because it is not in the buyer's interest to release funds unless they have received the domain. Note that the bid can be in ANY STATE when this function is called. Upon calling this function funds will be transferred to the seller and fees will be taken by the protocol. The listing and the bid will be deleted. The function will revert if: - The bid is not owned by the caller - The listing is not active (sold or withdrawn)\"},\"createBid(uint256,bytes32,string)\":{\"notice\":\"Creates a new bid for a listing. Transfers ETH from the buyer to the contract. Every buyer has a unique identifier, for Namecheap it's their username. The seller needs the raw buyerId to transfer the domain off-chain. To facilitate this, the buyer encrypts their buyerId using the seller's encryption key and sends it along with the bid. The seller then decrypts the buyerId using their private key to get the raw buyerId. DEV NOTE: We do not check that the encrypted buyerId is the same as the hashed buyerId. This must be done in the client! This does not affect the security of the protocol as the encrypted buyerId is only used for communication between the buyer and the seller while maintaining privacy.\"},\"createListing(bytes32,uint256,uint256,address,bytes,bytes32)\":{\"notice\":\"Creates listing for a domain. If ownership of domain changes offchain, the new owner will have to first register the domain on the domain registry contract. Then the new owner can create a listing for the domain. The old listing will be deleted from the old owner's listings and the old listing is marked as NOT active, which prevents any new bids from being created on it and makes the old bids immediately withdrawable. We also allow the seller to specify a custom DKIM key hash for Namecheap if they want to opt out of using the managed DKIM key hash set in the transferDomainProcessor contract. The managed DKIM key hash *can* be updated by us whenever Namecheap rotates their DKIM key. Function reverts if: - Caller is not domain owner on the domain registry contract - Ask price is less than min bid price - Sale ETH recipient is the zero address\"},\"deleteListing(uint256)\":{\"notice\":\"ONLY SELLER: Marks a listing as NOT active. Removes the listing from the seller's listings array and domain listing. If the listing has no bids, it is deleted from the exchange. Bids against the listing are left as is to allow the buyer to withdraw the bid.\"},\"disableAllowlist()\":{\"notice\":\"Disable the allow list. When the allow list is disabled, any address is allowed to call functions with onlyAllowed modifier.\"},\"disableInstantAccept()\":{\"notice\":\"Disables the instant accept flag for the buyer.\"},\"enableAllowlist()\":{\"notice\":\"Enable the allow list. When the allow list is enabled, only approved addresses are allowed to functions with onlyAllowed modifier.\"},\"enableInstantAccept()\":{\"notice\":\"Enables the instant accept flag for the buyer. This flag is used to indicate if the buyer has configured their Namecheap account to accept ownership of domains immediately upon transfer. DEV NOTE: We can not check that the buyer has actually enabled instant accept on Namecheap. It is only an indicative flag to help the seller know if they can finalize the sale immediately or not. The seller may get tricked by a malicious buyer to initiate a transfer to them assuming instant accept is on. But if the buyer does not have instant accept enabled, the seller will get immediate feedback and they can cancel the transfer immediately.\"},\"finalizeSale((uint256[2],uint256[2][2],uint256[2],uint256[10]))\":{\"notice\":\"ONLY SELLER: Finalizes a sale by verifying the domain transfer and unlocking bid funds to the listing owner. The seller can also finalize the sale with bids that have initiated a refund including the ones that have expired based on timestamp but not withdrawn yet.\"},\"getAllowedSellers()\":{\"notice\":\"Get all allowed sellers\"},\"getListingBids(uint256[])\":{\"notice\":\"Returns the bids for given listingIds\"},\"getListings(uint256[])\":{\"notice\":\"Get listing information with listingId for a list of listingIds\"},\"getUserBids(address)\":{\"notice\":\"Returns the bids created by a user\"},\"getUserListings(address)\":{\"notice\":\"Returns all listings created by a user\"},\"increaseBidPrice(uint256,uint256)\":{\"notice\":\"ONLY BUYER: Increases the price of an existing bid. The new price can ONLY be higher than the old price. The buyer must send the additional amount of ETH. The function reverts if - bid has initiated refund, caller is not bid owner or listing is not active - the new price is less than old price - msg.value is NOT STRICTLY EQUAL to than new price - old price\"},\"initialize(address,address,address)\":{\"notice\":\"Initializes the contract with domain verification and transfer processors. Can only be called once by the contract owner \"},\"initiateRefund(uint256)\":{\"notice\":\"ONLY BUYER: Initiates the refund process for a bid. Can only be called by the bid owner after the initial bid expiry period has passed.\"},\"pauseMarketplace()\":{\"notice\":\"ONLY OWNER: Pauses listing and proof submission functionality for the marketplace. Functionalites that are paused: - Listing creation and update - Bid creation and update - Sale finalization Functinonalites that remain unpaused to allow users to retrieve funds in contract: - Bid refund initiation and withdrawal - Listing deletion - Manual settlement between buyer and seller\"},\"registryRemoveListing(uint256)\":{\"notice\":\"ONLY EXCHANGE: Remove a listing for domain when ownership changes on the registry. \"},\"removeAddressesFromAllowlist(address[])\":{\"notice\":\"Removes passed addresses from an allow list. Addresses not on the allow list are unable to call allow listed functions.\"},\"unpauseMarketplace()\":{\"notice\":\"ONLY OWNER: Restarts paused functionality for the marketplace.\"},\"updateBidRefundPeriod(uint256)\":{\"notice\":\"ONLY OWNER: Updates the bid refund period\"},\"updateBidSettlementPeriod(uint256)\":{\"notice\":\"ONLY OWNER: Updates the minimum bid active period\"},\"updateFee(uint256)\":{\"notice\":\"ONLY OWNER: Updates the fee percentage for the marketplace\"},\"updateFeeRecipient(address)\":{\"notice\":\"ONLY OWNER: Updates the fee recipient address\"},\"updateListing(uint256,uint256,address)\":{\"notice\":\"ONLY SELLER: Updates the asking price of an existing listing. We don't update the existing bids against the listing because the newAskPrice is an indicative value. The new ask price must be greater than or equal to the existing min bid price. If seller wants to update the min bid price, they should delete the listing and create a new one with the new min bid price.\"},\"updateMailServerKeyHashAdapter(address)\":{\"notice\":\"ONLY OWNER: Update the managed mail server key hash adapter\"},\"updateTransferDomainProcessor(address)\":{\"notice\":\"ONLY OWNER: Update the transfer domain processor\"},\"withdrawBid(uint256)\":{\"notice\":\"ONLY BUYER: Withdraws a bid after the refund period has ended. Transfers ETH back to the buyer.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/DomainExchange.sol\":\"DomainExchange\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/security/Pausable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which allows children to implement an emergency stop\\n * mechanism that can be triggered by an authorized account.\\n *\\n * This module is used through inheritance. It will make available the\\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\\n * the functions of your contract. Note that they will not be pausable by\\n * simply including this module, only once the modifiers are put in place.\\n */\\nabstract contract Pausable is Context {\\n /**\\n * @dev Emitted when the pause is triggered by `account`.\\n */\\n event Paused(address account);\\n\\n /**\\n * @dev Emitted when the pause is lifted by `account`.\\n */\\n event Unpaused(address account);\\n\\n bool private _paused;\\n\\n /**\\n * @dev Initializes the contract in unpaused state.\\n */\\n constructor() {\\n _paused = false;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is not paused.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n modifier whenNotPaused() {\\n _requireNotPaused();\\n _;\\n }\\n\\n /**\\n * @dev Modifier to make a function callable only when the contract is paused.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n modifier whenPaused() {\\n _requirePaused();\\n _;\\n }\\n\\n /**\\n * @dev Returns true if the contract is paused, and false otherwise.\\n */\\n function paused() public view virtual returns (bool) {\\n return _paused;\\n }\\n\\n /**\\n * @dev Throws if the contract is paused.\\n */\\n function _requireNotPaused() internal view virtual {\\n require(!paused(), \\\"Pausable: paused\\\");\\n }\\n\\n /**\\n * @dev Throws if the contract is not paused.\\n */\\n function _requirePaused() internal view virtual {\\n require(paused(), \\\"Pausable: not paused\\\");\\n }\\n\\n /**\\n * @dev Triggers stopped state.\\n *\\n * Requirements:\\n *\\n * - The contract must not be paused.\\n */\\n function _pause() internal virtual whenNotPaused {\\n _paused = true;\\n emit Paused(_msgSender());\\n }\\n\\n /**\\n * @dev Returns to normal state.\\n *\\n * Requirements:\\n *\\n * - The contract must be paused.\\n */\\n function _unpause() internal virtual whenPaused {\\n _paused = false;\\n emit Unpaused(_msgSender());\\n }\\n}\\n\",\"keccak256\":\"0x0849d93b16c9940beb286a7864ed02724b248b93e0d80ef6355af5ef15c64773\",\"license\":\"MIT\"},\"@openzeppelin/contracts/security/ReentrancyGuard.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuard {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n constructor() {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n _nonReentrantBefore();\\n _;\\n _nonReentrantAfter();\\n }\\n\\n function _nonReentrantBefore() private {\\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n }\\n\\n function _nonReentrantAfter() private {\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Returns true if the reentrancy guard is currently set to \\\"entered\\\", which indicates there is a\\n * `nonReentrant` function in the call stack.\\n */\\n function _reentrancyGuardEntered() internal view returns (bool) {\\n return _status == _ENTERED;\\n }\\n}\\n\",\"keccak256\":\"0xa535a5df777d44e945dd24aa43a11e44b024140fc340ad0dfe42acf4002aade1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n *\\n * Furthermore, `isContract` will also return true if the target contract within\\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\\n * which only has an effect at the end of a transaction.\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x006dd67219697fe68d7fbfdea512e7c4cb64a43565ed86171d67e844982da6fa\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\")\\n mstore(0x1c, hash)\\n message := keccak256(0x00, 0x3c)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40)\\n mstore(ptr, \\\"\\\\x19\\\\x01\\\")\\n mstore(add(ptr, 0x02), domainSeparator)\\n mstore(add(ptr, 0x22), structHash)\\n data := keccak256(ptr, 0x42)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\\n * `validator` and `data` according to the version 0 of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x00\\\", validator, data));\\n }\\n}\\n\",\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"./StringUtils.sol\\\";\\n\\n/**\\n * Library to assist with requesting,\\n * serialising & verifying credentials\\n */\\nlibrary Claims {\\n\\t/** Data required to describe a claim */\\n\\tstruct CompleteClaimData {\\n\\t\\tbytes32 identifier;\\n\\t\\taddress owner;\\n\\t\\tuint32 timestampS;\\n\\t\\tuint32 epoch;\\n\\t}\\n\\n\\tstruct ClaimInfo {\\n\\t\\tstring provider;\\n\\t\\tstring parameters;\\n\\t\\tstring context;\\n\\t}\\n\\n\\t/** Claim with signatures & signer */\\n\\tstruct SignedClaim {\\n\\t\\tCompleteClaimData claim;\\n\\t\\tbytes[] signatures;\\n\\t}\\n\\n\\t/**\\n\\t * Asserts that the claim is signed by the expected witnesses\\n\\t */\\n\\tfunction assertValidSignedClaim(\\n\\t\\tSignedClaim memory self,\\n\\t\\taddress[] memory expectedWitnessAddresses\\n\\t) internal pure {\\n\\t\\trequire(self.signatures.length > 0, \\\"No signatures\\\");\\n\\t\\taddress[] memory signedWitnesses = recoverSignersOfSignedClaim(self);\\n\\t\\tfor (uint256 i = 0; i < expectedWitnessAddresses.length; i++) {\\n\\t\\t\\tbool found = false;\\n\\t\\t\\tfor (uint256 j = 0; j < signedWitnesses.length; j++) {\\n\\t\\t\\t\\tif (signedWitnesses[j] == expectedWitnessAddresses[i]) {\\n\\t\\t\\t\\t\\tfound = true;\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\trequire(found, \\\"Missing witness signature\\\");\\n\\t\\t}\\n\\t}\\n\\n\\t/**\\n\\t * @dev recovers the signer of the claim\\n\\t */\\n\\tfunction recoverSignersOfSignedClaim(\\n\\t\\tSignedClaim memory self\\n\\t) internal pure returns (address[] memory) {\\n\\t\\tbytes memory serialised = serialise(self.claim);\\n\\t\\taddress[] memory signers = new address[](self.signatures.length);\\n\\t\\tfor (uint256 i = 0; i < self.signatures.length; i++) {\\n\\t\\t\\tsigners[i] = verifySignature(serialised, self.signatures[i]);\\n\\t\\t}\\n\\n\\t\\treturn signers;\\n\\t}\\n\\n\\t/**\\n\\t * @dev serialises the credential into a string;\\n\\t * the string is used to verify the signature\\n\\t *\\n\\t * the serialisation is the same as done by the TS library\\n\\t */\\n\\tfunction serialise(\\n\\t\\tCompleteClaimData memory self\\n\\t) internal pure returns (bytes memory) {\\n\\t\\treturn\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\tStringUtils.bytes2str(abi.encodePacked(self.identifier)),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.address2str(self.owner),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.timestampS),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.epoch)\\n\\t\\t\\t);\\n\\t}\\n\\n\\t/**\\n\\t * @dev returns the address of the user that generated the signature\\n\\t */\\n\\tfunction verifySignature(\\n\\t\\tbytes memory content,\\n\\t\\tbytes memory signature\\n\\t) internal pure returns (address signer) {\\n\\t\\tbytes32 signedHash = keccak256(\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\t\\\"\\\\x19Ethereum Signed Message:\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(content.length),\\n\\t\\t\\t\\tcontent\\n\\t\\t\\t)\\n\\t\\t);\\n\\t\\treturn ECDSA.recover(signedHash, signature);\\n\\t}\\n\\n\\tfunction hashClaimInfo(ClaimInfo memory claimInfo) internal pure returns (bytes32) {\\n\\t\\tbytes memory serialised = abi.encodePacked(\\n\\t\\t\\tclaimInfo.provider,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.parameters,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.context\\n\\t\\t);\\n\\t\\treturn keccak256(serialised);\\n\\t}\\n}\\n\",\"keccak256\":\"0x87a41e75d358e86798456ad45e03446cde8f1519c8af17905f6c8b852a5f2da7\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/StringUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/**\\n * Utilities for string manipulation & conversion\\n */\\nlibrary StringUtils {\\n\\tfunction address2str(address x) internal pure returns (string memory) {\\n\\t\\tbytes memory s = new bytes(40);\\n\\t\\tfor (uint i = 0; i < 20; i++) {\\n\\t\\t\\tbytes1 b = bytes1(uint8(uint(uint160(x)) / (2 ** (8 * (19 - i)))));\\n\\t\\t\\tbytes1 hi = bytes1(uint8(b) / 16);\\n\\t\\t\\tbytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));\\n\\t\\t\\ts[2 * i] = getChar(hi);\\n\\t\\t\\ts[2 * i + 1] = getChar(lo);\\n\\t\\t}\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", s));\\n\\t}\\n\\n\\tfunction bytes2str(bytes memory buffer) internal pure returns (string memory) {\\n\\t\\t// Fixed buffer size for hexadecimal convertion\\n\\t\\tbytes memory converted = new bytes(buffer.length * 2);\\n\\t\\tbytes memory _base = \\\"0123456789abcdef\\\";\\n\\n\\t\\tfor (uint256 i = 0; i < buffer.length; i++) {\\n\\t\\t\\tconverted[i * 2] = _base[uint8(buffer[i]) / _base.length];\\n\\t\\t\\tconverted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length];\\n\\t\\t}\\n\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", converted));\\n\\t}\\n\\n\\tfunction getChar(bytes1 b) internal pure returns (bytes1 c) {\\n\\t\\tif (uint8(b) < 10) return bytes1(uint8(b) + 0x30);\\n\\t\\telse return bytes1(uint8(b) + 0x57);\\n\\t}\\n\\n\\tfunction bool2str(bool _b) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_b) {\\n\\t\\t\\treturn \\\"true\\\";\\n\\t\\t} else {\\n\\t\\t\\treturn \\\"false\\\";\\n\\t\\t}\\n\\t}\\n\\n\\tfunction uint2str(uint _i) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_i == 0) {\\n\\t\\t\\treturn \\\"0\\\";\\n\\t\\t}\\n\\t\\tuint j = _i;\\n\\t\\tuint len;\\n\\t\\twhile (j != 0) {\\n\\t\\t\\tlen++;\\n\\t\\t\\tj /= 10;\\n\\t\\t}\\n\\t\\tbytes memory bstr = new bytes(len);\\n\\t\\tuint k = len;\\n\\t\\twhile (_i != 0) {\\n\\t\\t\\tk = k - 1;\\n\\t\\t\\tuint8 temp = (48 + uint8(_i - (_i / 10) * 10));\\n\\t\\t\\tbytes1 b1 = bytes1(temp);\\n\\t\\t\\tbstr[k] = b1;\\n\\t\\t\\t_i /= 10;\\n\\t\\t}\\n\\t\\treturn string(bstr);\\n\\t}\\n\\n\\tfunction areEqual(\\n\\t\\tstring calldata _a,\\n\\t\\tstring storage _b\\n\\t) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction areEqual(string memory _a, string memory _b) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction toLower(string memory str) internal pure returns (string memory) {\\n\\t\\tbytes memory bStr = bytes(str);\\n\\t\\tbytes memory bLower = new bytes(bStr.length);\\n\\t\\tfor (uint i = 0; i < bStr.length; i++) {\\n\\t\\t\\t// Uppercase character...\\n\\t\\t\\tif ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {\\n\\t\\t\\t\\t// So we add 32 to make it lowercase\\n\\t\\t\\t\\tbLower[i] = bytes1(uint8(bStr[i]) + 32);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tbLower[i] = bStr[i];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn string(bLower);\\n\\t}\\n\\n\\tfunction substring(\\n\\t\\tstring memory str,\\n\\t\\tuint startIndex,\\n\\t\\tuint endIndex\\n\\t) internal pure returns (string memory) {\\n\\t\\tbytes memory strBytes = bytes(str);\\n\\t\\tbytes memory result = new bytes(endIndex - startIndex);\\n\\t\\tfor (uint i = startIndex; i < endIndex; i++) {\\n\\t\\t\\tresult[i - startIndex] = strBytes[i];\\n\\t\\t}\\n\\t\\treturn string(result);\\n\\t}\\n}\\n\",\"keccak256\":\"0x15feebafef16d4c74c043b39e652ddae0e121987ceca74b663f6a2d2d7ba8b4b\",\"license\":\"MIT\"},\"contracts/DomainExchange.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\nimport { Address } from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport { ReentrancyGuard } from \\\"@openzeppelin/contracts/security/ReentrancyGuard.sol\\\";\\nimport { Pausable } from \\\"@openzeppelin/contracts/security/Pausable.sol\\\";\\n\\nimport { AddressAllowList } from \\\"./external/AddressAllowList.sol\\\";\\nimport { Bytes32ArrayUtils } from \\\"./external/lib/Bytes32ArrayUtils.sol\\\";\\nimport { Uint256ArrayUtils } from \\\"./external/lib/Uint256ArrayUtils.sol\\\";\\nimport { IKeyHashAdapterV2 } from \\\"./external/interfaces/IKeyHashAdapterV2.sol\\\";\\n\\nimport { IDomainExchange } from \\\"./interfaces/IDomainExchange.sol\\\";\\nimport { ITransferDomainProcessor } from \\\"./interfaces/ITransferDomainProcessor.sol\\\";\\nimport { IVerifiedDomainRegistry } from \\\"./interfaces/IVerifiedDomainRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract DomainExchange is IDomainExchange, AddressAllowList, ReentrancyGuard, Pausable {\\n\\n using Address for address payable;\\n using Bytes32ArrayUtils for bytes32[];\\n using Uint256ArrayUtils for uint256[];\\n\\n /* ============ Events ============ */\\n \\n event ListingCreated(\\n uint256 indexed listingId, \\n address indexed seller, \\n bytes32 indexed domainId, \\n bytes32 dkimKeyHash,\\n uint256 askPrice,\\n uint256 minBidPrice,\\n address saleEthRecipient\\n );\\n event ListingUpdated(uint256 indexed listingId, address indexed seller, uint256 newAskPrice, address saleEthRecipient);\\n event ListingDeleted(uint256 indexed listingId, address indexed seller);\\n event ListingDeletedByRegistry(uint256 indexed listingId);\\n \\n event BidCreated(uint256 indexed bidId, uint256 indexed listingId, address indexed buyer, uint256 price);\\n event BidPriceIncreased(uint256 indexed bidId, address indexed buyer, uint256 newPrice);\\n event RefundInitiated(uint256 indexed bidId, address indexed buyer);\\n event BidWithdrawn(uint256 indexed bidId, address indexed buyer, uint256 amount);\\n \\n event SaleFinalized(uint256 indexed bidId, uint256 indexed listingId, uint256 priceNetFees, uint256 fees);\\n \\n event InstantAcceptUpdated(address indexed buyer, bool instantAccept);\\n\\n event FeeUpdated(uint256 newFee);\\n event FeeRecipientUpdated(address indexed newFeeRecipient);\\n event BidSettlementPeriodUpdated(uint256 newBidSettlementPeriod);\\n event BidRefundPeriodUpdated(uint256 newBidRefundPeriod);\\n event TransferDomainProcessorUpdated(ITransferDomainProcessor indexed newTransferDomainProcessor);\\n event MailServerKeyHashAdapterUpdated(IKeyHashAdapterV2 indexed newMailServerKeyHashAdapter);\\n\\n /* ============ Structs ============ */\\n struct Listing {\\n address seller;\\n address payable saleEthRecipient; // Must be a contract that can receive ETH or an EOA\\n bytes32 dkimKeyHash; // Allow for custom DKIM key hash\\n bytes encryptionKey;\\n bytes32 domainId;\\n uint256 createdAt;\\n uint256 askPrice;\\n uint256 minBidPrice;\\n bool isActive; // false by default, set to true when the listing is created\\n uint256[] bids;\\n }\\n\\n struct ListingWithId {\\n uint256 listingId;\\n Listing listing;\\n }\\n\\n struct Bid {\\n address buyer;\\n uint256 listingId;\\n string encryptedBuyerId;\\n bytes32 buyerIdHash;\\n uint256 createdAt;\\n uint256 expiryTimestamp;\\n uint256 price;\\n bool refundInitiated;\\n }\\n\\n struct BidDetailsWithId {\\n uint256 bidId;\\n Bid bid;\\n bool buyerInstantAcceptEnabled;\\n }\\n\\n /* ============ Modifiers ============ */\\n modifier onlyInitialized() {\\n require(isInitialized, \\\"Contract must be initialized\\\");\\n _;\\n }\\n\\n /* ============ Public Variables ============ */\\n\\n mapping(uint256 => Listing) public listings;\\n mapping(address => uint256[]) public userListings;\\n mapping(uint256 => Bid) public bids;\\n mapping(address => uint256[]) public userBids;\\n mapping(address => bool) public instantAcceptEnabled;\\n\\n uint256 public fee;\\n address payable public feeRecipient;\\n uint256 public bidCounter;\\n uint256 public listingCounter;\\n uint256 public bidSettlementPeriod;\\n uint256 public bidRefundPeriod;\\n \\n bool public isInitialized;\\n \\n ITransferDomainProcessor public transferDomainProcessor;\\n IVerifiedDomainRegistry public verifiedDomainRegistry;\\n IKeyHashAdapterV2 public mailServerKeyHashAdapter;\\n\\n /* ============ Constants ============ */\\n uint256 internal constant PRECISE_UNIT = 1e18;\\n\\n /* ============ Constructor ============ */\\n\\n constructor(\\n address _owner,\\n uint256 _fee,\\n address payable _feeRecipient,\\n uint256 _bidSettlementPeriod,\\n uint256 _bidRefundPeriod,\\n address[] memory _allowedAddresses\\n ) AddressAllowList(_allowedAddresses) {\\n fee = _fee;\\n feeRecipient = _feeRecipient;\\n bidSettlementPeriod = _bidSettlementPeriod;\\n bidRefundPeriod = _bidRefundPeriod;\\n \\n bidCounter = 1;\\n listingCounter = 1;\\n isInitialized = false;\\n \\n transferOwnership(_owner);\\n }\\n\\n /* ============ Public Functions ============ */\\n\\n /**\\n * @notice Creates listing for a domain. If ownership of domain changes offchain, the new owner\\n * will have to first register the domain on the domain registry contract. Then the new owner\\n * can create a listing for the domain. The old listing will be deleted from the old owner's \\n * listings and the old listing is marked as NOT active, which prevents any new bids from being\\n * created on it and makes the old bids immediately withdrawable. We also allow the seller to\\n * specify a custom DKIM key hash for Namecheap if they want to opt out of using the managed DKIM\\n * key hash set in the transferDomainProcessor contract. The managed DKIM key hash *can* be \\n * updated by us whenever Namecheap rotates their DKIM key.\\n *\\n * Function reverts if:\\n * - Caller is not domain owner on the domain registry contract\\n * - Ask price is less than min bid price\\n * - Sale ETH recipient is the zero address\\n *\\n * @param _domainId The unique identifier of the domain\\n * @param _askPrice An asking price for the domain\\n * @param _minBidPrice The minimum bid price for the domain\\n * @param _saleEthRecipient The address to receive the ETH from the sale; must be a contract that can\\n * receive ETH or an EOA\\n * @param _encryptionKey The encryption key for buyers to encrypt the buyerId to\\n * @param _dkimKeyHash The custom DKIM key hash. If empty, the managed DKIM key hash will be used\\n */\\n function createListing(\\n bytes32 _domainId, \\n uint256 _askPrice, \\n uint256 _minBidPrice, \\n address payable _saleEthRecipient, \\n bytes memory _encryptionKey,\\n bytes32 _dkimKeyHash\\n ) \\n external\\n onlyAllowed\\n onlyInitialized \\n whenNotPaused\\n {\\n _verifyCreateListing(_domainId, _minBidPrice, _askPrice, _saleEthRecipient);\\n\\n uint256 listingId = _updateCreateListingState(\\n _domainId, _askPrice, _minBidPrice, _saleEthRecipient, _encryptionKey, _dkimKeyHash\\n );\\n\\n verifiedDomainRegistry.setDomainListing(_domainId, listingId);\\n\\n emit ListingCreated(listingId, msg.sender, _domainId, _dkimKeyHash, _askPrice, _minBidPrice, _saleEthRecipient);\\n }\\n\\n /**\\n * @notice Creates a new bid for a listing. Transfers ETH from the buyer to the contract. Every buyer\\n * has a unique identifier, for Namecheap it's their username. The seller needs the raw buyerId\\n * to transfer the domain off-chain. To facilitate this, the buyer encrypts their buyerId using the \\n * seller's encryption key and sends it along with the bid. The seller then decrypts the buyerId \\n * using their private key to get the raw buyerId.\\n *\\n * DEV NOTE: We do not check that the encrypted buyerId is the same as the hashed buyerId. This must be\\n * done in the client! This does not affect the security of the protocol as the encrypted buyerId is only \\n * used for communication between the buyer and the seller while maintaining privacy.\\n *\\n * @param _listingId The unique identifier of the listing to bid on\\n * @param _buyerIdHash The hashed buyerId which is also output as part of the transfer proof later\\n * @param _encryptedBuyerId The encrypted buyerId. Should be the same as the buyerId hashed\\n */\\n function createBid(uint256 _listingId, bytes32 _buyerIdHash, string memory _encryptedBuyerId) \\n external \\n payable\\n nonReentrant\\n whenNotPaused\\n {\\n uint256 price = msg.value;\\n Listing storage listing = listings[_listingId];\\n\\n _validateCreateBid(listing, price, _buyerIdHash);\\n\\n uint256 bidId = _updateCreateBidState(listing, _listingId, price, _buyerIdHash, _encryptedBuyerId);\\n\\n emit BidCreated(bidId, _listingId, msg.sender, price);\\n }\\n\\n /**\\n * @notice ONLY SELLER: Finalizes a sale by verifying the domain transfer and unlocking bid funds to \\n * the listing owner. The seller can also finalize the sale with bids that have initiated a refund \\n * including the ones that have expired based on timestamp but not withdrawn yet.\\n *\\n * @param _proof The zk-email proof of domain transfer\\n */\\n function finalizeSale(ITransferDomainProcessor.TransferProof calldata _proof) \\n external\\n onlyInitialized\\n nonReentrant\\n whenNotPaused\\n {\\n // Check\\n (\\n bytes32 dkimKeyHash,\\n bytes32 hashedReceiverId, \\n string memory domainName, \\n uint256 bidId\\n ) = transferDomainProcessor.processProof(_proof);\\n\\n Bid storage bid = bids[bidId];\\n Listing storage listing = listings[bid.listingId];\\n \\n _validateFinalizeSale(bid, listing, dkimKeyHash, hashedReceiverId, domainName);\\n \\n // Effect\\n verifiedDomainRegistry.updateDomainOnSale(listing.domainId, bid.buyer);\\n\\n uint256 transferValue = bid.price;\\n address payable recipient = listing.saleEthRecipient;\\n uint256 listingId = bid.listingId;\\n _updateFinalizeSaleState(bid, bidId, listing);\\n\\n // Interaction\\n uint256 feeAmount = _settleSale(recipient, transferValue);\\n \\n emit SaleFinalized(bidId, listingId, transferValue - feeAmount, feeAmount);\\n }\\n\\n /**\\n * @notice ONLY BUYER: Finalize a sale by releasing funds to the seller. Proof of transfer is not required\\n * because it is not in the buyer's interest to release funds unless they have received the domain. Note that the\\n * bid can be in ANY STATE when this function is called. Upon calling this function funds will be transferred to\\n * the seller and fees will be taken by the protocol. The listing and the bid will be deleted. The function will\\n * revert if:\\n * - The bid is not owned by the caller\\n * - The listing is not active (sold or withdrawn)\\n *\\n * @param _bidId The unique identifier of the bid to release funds for\\n */\\n function buyerReleaseFunds(uint256 _bidId) \\n external\\n nonReentrant\\n {\\n // Check\\n Bid storage bid = bids[_bidId];\\n Listing storage listing = listings[bid.listingId];\\n\\n require(bid.buyer == msg.sender, \\\"Caller is not bid owner\\\");\\n require(listing.isActive, \\\"Listing not active\\\");\\n\\n // Effect\\n verifiedDomainRegistry.updateDomainOnSale(listing.domainId, bid.buyer);\\n\\n uint256 transferValue = bid.price;\\n address payable recipient = listing.saleEthRecipient;\\n uint256 listingId = bid.listingId;\\n \\n _updateFinalizeSaleState(bid, _bidId, listing);\\n\\n // Interaction\\n uint256 feeAmount = _settleSale(recipient, transferValue);\\n\\n emit SaleFinalized(_bidId, listingId, transferValue - feeAmount, feeAmount);\\n }\\n\\n /**\\n * @notice ONLY SELLER: Updates the asking price of an existing listing. We don't update\\n * the existing bids against the listing because the newAskPrice is an indicative value.\\n * The new ask price must be greater than or equal to the existing min bid price. If seller\\n * wants to update the min bid price, they should delete the listing and create a new one with\\n * the new min bid price.\\n *\\n * @param _listingId The unique identifier of the listing to update\\n * @param _newAskPrice The new asking price for the listing\\n * @param _saleEthRecipient The new address to receive the ETH from the sale; must be a contract that can\\n * receive ETH or an EOA\\n */\\n function updateListing(uint256 _listingId, uint256 _newAskPrice, address payable _saleEthRecipient) external whenNotPaused {\\n Listing storage listing = listings[_listingId];\\n \\n require(listing.seller == msg.sender, \\\"Caller is not listing owner\\\");\\n require(listing.isActive, \\\"Listing not active\\\");\\n require(_newAskPrice >= listing.minBidPrice, \\\"Ask price is less than min bid price\\\");\\n require(_saleEthRecipient != address(0), \\\"Invalid sale ETH recipient\\\");\\n \\n listing.askPrice = _newAskPrice;\\n listing.saleEthRecipient = _saleEthRecipient;\\n\\n emit ListingUpdated(_listingId, msg.sender, _newAskPrice, _saleEthRecipient);\\n }\\n\\n /**\\n * @notice ONLY SELLER: Marks a listing as NOT active. Removes the listing from the seller's listings array\\n * and domain listing. If the listing has no bids, it is deleted from the exchange. Bids against the listing\\n * are left as is to allow the buyer to withdraw the bid.\\n *\\n * @param _listingId The unique identifier of the listing to delete\\n */\\n function deleteListing(uint256 _listingId) external {\\n Listing storage listing = listings[_listingId];\\n \\n require(listing.seller == msg.sender, \\\"Caller is not listing owner\\\");\\n require(listing.isActive, \\\"Listing not active\\\");\\n \\n verifiedDomainRegistry.removeDomainListing(listing.domainId);\\n\\n _pruneListing(listing, _listingId);\\n\\n emit ListingDeleted(_listingId, msg.sender);\\n }\\n\\n /**\\n * @notice ONLY EXCHANGE: Remove a listing for domain when ownership changes on the registry.\\n * \\n * @param _listingId Listing Id to remove\\n */\\n function registryRemoveListing(uint256 _listingId) external override {\\n Listing storage listing = listings[_listingId];\\n\\n require(address(verifiedDomainRegistry) == msg.sender, \\\"Caller is not registry\\\");\\n // If listing is NOT active, this function will NOT be called because the listing status\\n // would have already been removed from the registry beforehand; so there is no need to \\n // check if listing is active\\n \\n _pruneListing(listing, _listingId);\\n\\n emit ListingDeletedByRegistry(_listingId);\\n }\\n\\n /**\\n * @notice ONLY BUYER: Increases the price of an existing bid. The new price can ONLY be higher \\n * than the old price. The buyer must send the additional amount of ETH. The function reverts if\\n * - bid has initiated refund, caller is not bid owner or listing is not active\\n * - the new price is less than old price\\n * - msg.value is NOT STRICTLY EQUAL to than new price - old price\\n *\\n * @param _bidId The unique identifier of the bid to increase the price for\\n * @param _newPrice The new price for the bid\\n */\\n function increaseBidPrice(uint256 _bidId, uint256 _newPrice)\\n external\\n payable\\n nonReentrant\\n whenNotPaused\\n {\\n Bid storage bid = bids[_bidId];\\n Listing storage listing = listings[bid.listingId];\\n\\n // Check\\n _validateIncreaseBidPrice(bid, listing, _newPrice);\\n \\n // Effect\\n bid.price = _newPrice;\\n\\n emit BidPriceIncreased(_bidId, msg.sender, _newPrice);\\n }\\n\\n /**\\n * @notice Enables the instant accept flag for the buyer. This flag is used to indicate if the buyer has \\n * configured their Namecheap account to accept ownership of domains immediately upon transfer.\\n * \\n * DEV NOTE: We can not check that the buyer has actually enabled instant accept on Namecheap. It is only \\n * an indicative flag to help the seller know if they can finalize the sale immediately or not. The seller\\n * may get tricked by a malicious buyer to initiate a transfer to them assuming instant accept is on. But\\n * if the buyer does not have instant accept enabled, the seller will get immediate feedback and they can \\n * cancel the transfer immediately.\\n */\\n function enableInstantAccept() external onlyInitialized {\\n require(!instantAcceptEnabled[msg.sender], \\\"Instant accept already enabled\\\");\\n \\n instantAcceptEnabled[msg.sender] = true; \\n emit InstantAcceptUpdated(msg.sender, true);\\n }\\n\\n /**\\n * @notice Disables the instant accept flag for the buyer.\\n */\\n function disableInstantAccept() external onlyInitialized {\\n require(instantAcceptEnabled[msg.sender], \\\"Instant accept already disabled\\\");\\n\\n instantAcceptEnabled[msg.sender] = false;\\n emit InstantAcceptUpdated(msg.sender, false);\\n }\\n\\n /**\\n * @notice ONLY BUYER: Initiates the refund process for a bid. Can only be called by the bid owner \\n * after the initial bid expiry period has passed.\\n *\\n * @param _bidId The unique identifier of the bid to initiate refund for\\n */\\n function initiateRefund(uint256 _bidId) external {\\n Bid storage bid = bids[_bidId];\\n Listing storage listing = listings[bid.listingId];\\n\\n _validateInitiateRefund(bid, listing);\\n\\n bid.expiryTimestamp = block.timestamp + bidRefundPeriod;\\n bid.refundInitiated = true;\\n\\n emit RefundInitiated(_bidId, bid.buyer);\\n }\\n\\n /**\\n * @notice ONLY BUYER: Withdraws a bid after the refund period has ended. Transfers ETH back to the buyer.\\n *\\n * @param _bidId The unique identifier of the bid to withdraw\\n */\\n function withdrawBid(uint256 _bidId) external nonReentrant {\\n Bid storage bid = bids[_bidId];\\n Listing storage listing = listings[bid.listingId];\\n\\n // Check\\n _validateWithdrawBid(bid, listing);\\n\\n // Effect\\n uint256 refundAmount = bid.price;\\n _pruneBid(bid, _bidId, listing);\\n \\n // Interaction\\n payable(msg.sender).sendValue(refundAmount);\\n\\n emit BidWithdrawn(_bidId, msg.sender, refundAmount);\\n }\\n\\n /* ============ Admin Functions ============ */\\n\\n /**\\n * @notice Initializes the contract with domain verification and transfer processors. Can \\n * only be called once by the contract owner\\n * \\n * @param _transferDomainProcessor The address of the domain transfer processor contract\\n * @param _verifiedDomainRegistry The address of the verified domain registry contract\\n * @param _mailServerKeyHashAdapter The address of the mail server key hash adapter contract\\n */\\n function initialize(\\n ITransferDomainProcessor _transferDomainProcessor,\\n IVerifiedDomainRegistry _verifiedDomainRegistry,\\n IKeyHashAdapterV2 _mailServerKeyHashAdapter\\n ) external onlyOwner {\\n require(!isInitialized, \\\"Already initialized\\\");\\n transferDomainProcessor = _transferDomainProcessor;\\n verifiedDomainRegistry = _verifiedDomainRegistry;\\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n isInitialized = true;\\n }\\n\\n /**\\n * @notice ONLY OWNER: Pauses listing and proof submission functionality for the marketplace. \\n * Functionalites that are paused:\\n * - Listing creation and update\\n * - Bid creation and update\\n * - Sale finalization\\n * \\n * Functinonalites that remain unpaused to allow users to retrieve funds in contract:\\n * - Bid refund initiation and withdrawal\\n * - Listing deletion\\n * - Manual settlement between buyer and seller\\n */\\n function pauseMarketplace() external onlyOwner {\\n _pause();\\n }\\n\\n /**\\n * @notice ONLY OWNER: Restarts paused functionality for the marketplace.\\n */\\n function unpauseMarketplace() external onlyOwner {\\n _unpause();\\n }\\n\\n /**\\n * @notice ONLY OWNER: Update the transfer domain processor\\n *\\n * @param _transferDomainProcessor The new transfer domain processor\\n */\\n function updateTransferDomainProcessor(ITransferDomainProcessor _transferDomainProcessor) external onlyOwner {\\n require(address(_transferDomainProcessor) != address(0), \\\"Invalid address\\\");\\n \\n transferDomainProcessor = _transferDomainProcessor;\\n emit TransferDomainProcessorUpdated(_transferDomainProcessor);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Update the managed mail server key hash adapter\\n *\\n * @param _mailServerKeyHashAdapter The new mail server key hash adapter\\n */\\n function updateMailServerKeyHashAdapter(IKeyHashAdapterV2 _mailServerKeyHashAdapter) external onlyOwner {\\n require(address(_mailServerKeyHashAdapter) != address(0), \\\"Invalid address\\\");\\n \\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\\n emit MailServerKeyHashAdapterUpdated(_mailServerKeyHashAdapter);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Updates the fee percentage for the marketplace\\n *\\n * @param _newFee The new fee percentage (in basis points)\\n */\\n function updateFee(uint256 _newFee) external onlyOwner {\\n fee = _newFee;\\n emit FeeUpdated(_newFee);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Updates the fee recipient address\\n *\\n * @param _newFeeRecipient The new address to receive fees\\n */\\n function updateFeeRecipient(address payable _newFeeRecipient) external onlyOwner {\\n require(_newFeeRecipient != address(0), \\\"Invalid address\\\");\\n feeRecipient = _newFeeRecipient;\\n emit FeeRecipientUpdated(_newFeeRecipient);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Updates the minimum bid active period\\n *\\n * @param _newBidSettlementPeriod The new bid settlement period in seconds\\n */\\n function updateBidSettlementPeriod(uint256 _newBidSettlementPeriod) external onlyOwner {\\n require(_newBidSettlementPeriod > 0, \\\"Bid settlement period must be greater than 0\\\");\\n bidSettlementPeriod = _newBidSettlementPeriod;\\n emit BidSettlementPeriodUpdated(_newBidSettlementPeriod);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Updates the bid refund period\\n *\\n * @param _newBidRefundPeriod The new bid refund period in seconds\\n */\\n function updateBidRefundPeriod(uint256 _newBidRefundPeriod) external onlyOwner {\\n require(_newBidRefundPeriod > 0, \\\"Bid refund period must be greater than 0\\\");\\n bidRefundPeriod = _newBidRefundPeriod;\\n emit BidRefundPeriodUpdated(_newBidRefundPeriod);\\n }\\n\\n /* ============ View Functions ============ */ \\n\\n /**\\n * @notice Get listing information with listingId for a list of listingIds\\n * @param _listingIds An array of listingIds to fetch details for\\n */\\n function getListings(uint256[] memory _listingIds)\\n external \\n view \\n returns (ListingWithId[] memory listingInfo) \\n {\\n listingInfo = new ListingWithId[](_listingIds.length);\\n for (uint256 i = 0; i < _listingIds.length; i++) {\\n listingInfo[i] = ListingWithId({\\n listingId: _listingIds[i],\\n listing: listings[_listingIds[i]]\\n });\\n }\\n }\\n\\n /**\\n * @notice Returns all listings created by a user\\n * @param _user The address of the user to fetch listings for\\n */\\n function getUserListings(address _user) external view returns (ListingWithId[] memory listingInfo) {\\n uint256[] memory userListingIds = userListings[_user];\\n listingInfo = new ListingWithId[](userListingIds.length);\\n for (uint256 i = 0; i < userListingIds.length; i++) {\\n uint256 listingId = userListingIds[i];\\n listingInfo[i] = ListingWithId({\\n listingId: listingId,\\n listing: listings[listingId]\\n });\\n }\\n }\\n\\n /**\\n * @notice Returns the bids created by a user\\n * @param _user The address of the user to fetch bids for\\n */\\n function getUserBids(address _user) external view returns (BidDetailsWithId[] memory bidInfo) {\\n uint256[] memory userBidIds = userBids[_user];\\n bidInfo = new BidDetailsWithId[](userBidIds.length);\\n for (uint256 i = 0; i < userBidIds.length; i++) {\\n uint256 bidId = userBidIds[i];\\n bidInfo[i] = BidDetailsWithId({\\n bidId: bidId,\\n bid: bids[bidId],\\n buyerInstantAcceptEnabled: instantAcceptEnabled[_user]\\n });\\n }\\n }\\n\\n /**\\n * @notice Returns the bids for given listingIds\\n * @param _listingIds An array of listingIds to fetch bids for\\n */\\n function getListingBids(uint256[] memory _listingIds) external view returns (BidDetailsWithId[][] memory bidInfo) {\\n bidInfo = new BidDetailsWithId[][](_listingIds.length);\\n for (uint256 i = 0; i < _listingIds.length; i++) {\\n uint256 listingId = _listingIds[i];\\n uint256[] memory listingBidIds = listings[listingId].bids;\\n bidInfo[i] = new BidDetailsWithId[](listingBidIds.length);\\n for (uint256 j = 0; j < listingBidIds.length; j++) {\\n uint256 bidId = listingBidIds[j];\\n bidInfo[i][j] = BidDetailsWithId({\\n bidId: bidId,\\n bid: bids[bidId],\\n buyerInstantAcceptEnabled: instantAcceptEnabled[bids[bidId].buyer]\\n });\\n }\\n }\\n }\\n\\n /**\\n * @notice Get all allowed sellers\\n */\\n function getAllowedSellers() external view returns (address[] memory) {\\n return _getAllowedAddresses();\\n }\\n\\n\\n /* ============ Internal Functions ============ */\\n\\n function _verifyCreateListing(\\n bytes32 _domainId, \\n uint256 _minBidPrice, \\n uint256 _askPrice, \\n address _saleEthRecipient\\n ) internal view {\\n IVerifiedDomainRegistry.DomainWithId memory domainWithId = verifiedDomainRegistry.getDomain(_domainId);\\n require(domainWithId.domain.owner == msg.sender, \\\"Caller is not domain owner\\\");\\n require(domainWithId.domain.exchange == address(0), \\\"Domain already listed on registry\\\");\\n\\n require(_minBidPrice > 0, \\\"Minimum bid price is zero\\\");\\n require(_askPrice >= _minBidPrice, \\\"Ask price is less than min bid price\\\");\\n require(_saleEthRecipient != address(0), \\\"Invalid sale ETH recipient\\\");\\n }\\n\\n function _updateCreateListingState(\\n bytes32 _domainId, \\n uint256 _askPrice, \\n uint256 _minBidPrice,\\n address payable _saleEthRecipient,\\n bytes memory _encryptionKey,\\n bytes32 _dkimKeyHash\\n ) internal returns (uint256 listingId) {\\n \\n // New listing\\n listingId = listingCounter;\\n listings[listingId] = Listing({\\n seller: msg.sender,\\n saleEthRecipient: _saleEthRecipient,\\n encryptionKey: _encryptionKey,\\n dkimKeyHash: _dkimKeyHash,\\n askPrice: _askPrice,\\n minBidPrice: _minBidPrice,\\n domainId: _domainId,\\n createdAt: block.timestamp,\\n isActive: true,\\n bids: new uint256[](0)\\n });\\n userListings[msg.sender].push(listingId);\\n\\n // Increment listingCounter\\n listingCounter = listingCounter + 1;\\n }\\n\\n function _validateCreateBid(Listing storage _listing, uint256 _price, bytes32 _buyerIdHash) internal view {\\n require(_listing.seller != address(0), \\\"Listing does not exist\\\");\\n require(_listing.isActive, \\\"Listing not active\\\");\\n \\n // Validate inputs\\n require(_price >= _listing.minBidPrice, \\\"Bid price is less than min bid price\\\");\\n require(_buyerIdHash != bytes32(0), \\\"Buyer ID hash cannot be empty\\\");\\n }\\n\\n function _updateCreateBidState(\\n Listing storage _listing, \\n uint256 _listingId, \\n uint256 _price, \\n bytes32 _buyerIdHash, \\n string memory _encryptedBuyerId\\n ) internal returns (uint256 bidId) {\\n bidId = bidCounter;\\n bids[bidId] = Bid({\\n buyer: msg.sender,\\n listingId: _listingId,\\n encryptedBuyerId: _encryptedBuyerId,\\n buyerIdHash: _buyerIdHash,\\n createdAt: block.timestamp,\\n expiryTimestamp: type(uint256).max,\\n price: _price,\\n refundInitiated: false\\n });\\n userBids[msg.sender].push(bidId);\\n _listing.bids.push(bidId);\\n\\n // Increment bidCounter\\n bidCounter = bidCounter + 1;\\n }\\n\\n function _validateFinalizeSale(\\n Bid storage _bid, \\n Listing storage _listing,\\n bytes32 _dkimKeyHash,\\n bytes32 _hashedReceiverId, \\n string memory _transferredDomainName\\n ) internal view {\\n require(_bid.buyer != address(0), \\\"Bid does not exist\\\");\\n require(_listing.seller == msg.sender, \\\"Caller is not listing owner\\\");\\n require(_listing.isActive, \\\"Listing not active\\\");\\n\\n // Validate namecheap DKIM key\\n if (_listing.dkimKeyHash != bytes32(0)) {\\n require(_dkimKeyHash == _listing.dkimKeyHash, \\\"Invalid custom DKIM key hash\\\");\\n } else {\\n require(\\n mailServerKeyHashAdapter.isMailServerKeyHash(_dkimKeyHash), \\n \\\"Invalid managed DKIM key hash\\\"\\n );\\n }\\n\\n // Validate domain and receiver\\n bytes32 transferredDomainId = keccak256(abi.encodePacked(_transferredDomainName));\\n require(_bid.buyerIdHash == _hashedReceiverId, \\\"Invalid receiver\\\");\\n require(_listing.domainId == transferredDomainId, \\\"Invalid domain\\\");\\n }\\n\\n function _updateFinalizeSaleState(Bid storage _bid, uint256 _bidId, Listing storage _listing) internal {\\n uint256 listingId = _bid.listingId;\\n \\n _pruneBid(_bid, _bidId, _listing);\\n _pruneListing(_listing, listingId);\\n }\\n\\n function _validateIncreaseBidPrice(\\n Bid storage _bid, \\n Listing storage _listing, \\n uint256 _newPrice\\n ) internal view {\\n require(_bid.buyer == msg.sender, \\\"Caller is not bid owner\\\");\\n require(!_bid.refundInitiated, \\\"Refund already initiated\\\");\\n require(_listing.isActive, \\\"Listing not active\\\");\\n\\n // Validate new price\\n require(_newPrice > _bid.price, \\\"New price not greater than old price\\\");\\n require(msg.value == _newPrice - _bid.price, \\\"Incorrect amount of ETH sent\\\");\\n }\\n\\n function _validateInitiateRefund(Bid storage _bid, Listing storage _listing) internal view {\\n require(_bid.buyer == msg.sender, \\\"Caller is not bid owner\\\");\\n require(!_bid.refundInitiated, \\\"Refund already initiated\\\");\\n require(block.timestamp > bidSettlementPeriod + _bid.createdAt, \\\"Refund period not started\\\");\\n require(_listing.isActive, \\\"Listing expired. Bid can be withdrawn directly\\\");\\n }\\n\\n function _validateWithdrawBid(Bid storage _bid, Listing storage _listing) internal view {\\n require(_bid.buyer == msg.sender, \\\"Caller is not bid owner\\\");\\n if (_listing.isActive) {\\n require(_bid.refundInitiated, \\\"Refund not initiated\\\");\\n require(block.timestamp >= _bid.expiryTimestamp, \\\"Refund period not ended\\\");\\n }\\n }\\n\\n function _settleSale(address payable _recipient, uint256 _amount) internal returns (uint256 feeAmount) {\\n feeAmount = (_amount * fee) / PRECISE_UNIT;\\n _recipient.sendValue(_amount - feeAmount);\\n\\n if (feeAmount > 0) {\\n feeRecipient.sendValue(feeAmount);\\n }\\n }\\n\\n /**\\n * @notice Deletes a bid from the exchange. Removes the bid from the listing's bids array and the buyer's\\n * bids array. Deletes the listing if it is expired and has no bids.\\n */\\n function _pruneBid(Bid storage _bid, uint256 _bidId, Listing storage _listing) internal {\\n userBids[_bid.buyer].removeStorage(_bidId);\\n _listing.bids.removeStorage(_bidId);\\n if (!_listing.isActive && _listing.bids.length == 0) {\\n delete listings[_bid.listingId];\\n }\\n delete bids[_bidId];\\n }\\n\\n /**\\n * @notice Marks a listing as expired. Removes the listing from the seller's listings array and domain listing.\\n * If the listing has no bids, it is deleted from the exchange.\\n */\\n function _pruneListing(Listing storage _listing, uint256 _listingId) internal {\\n _listing.isActive = false;\\n userListings[_listing.seller].removeStorage(_listingId);\\n if (_listing.bids.length == 0) {\\n delete listings[_listingId];\\n }\\n }\\n}\\n\",\"keccak256\":\"0x3470413dda117592e3d5ff6d73a50901e64eb77df61b0617974141ac0542b707\",\"license\":\"MIT\"},\"contracts/external/AddressAllowList.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { AddressArrayUtils } from \\\"./lib/AddressArrayUtils.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract AddressAllowList is Ownable {\\n\\n using AddressArrayUtils for address[];\\n\\n /* ============ Events ============ */\\n event AddressAddedToAllowlist(address indexed allowedAddress);\\n event AddressRemovedFromAllowlist(address indexed allowedAddress);\\n event AllowlistEnabled();\\n event AllowlistDisabled();\\n \\n /* ============ Modifier ============ */\\n modifier onlyAllowed() {\\n require(isEnabled ? isAllowed[msg.sender] : true, \\\"Address is not allowed\\\");\\n _;\\n }\\n \\n /* ============ State Variables ============ */\\n bool public isEnabled; // Boolean indicating if the allowlist is enabled\\n address[] public allowedAddresses; // Array of addresses that are allowed from taking depositors liquidity\\n mapping(address => bool) public isAllowed; // Mapping of address to boolean indicating if the user is allowed\\n\\n /* ============ Constructor ============ */\\n constructor(address[] memory _allowedAddresses) Ownable() {\\n for (uint256 i = 0; i < _allowedAddresses.length; i++) {\\n address allowedAddress = _allowedAddresses[i];\\n\\n require(!isAllowed[allowedAddress], \\\"Address is already allowed\\\");\\n isAllowed[allowedAddress] = true;\\n emit AddressAddedToAllowlist(allowedAddress);\\n }\\n allowedAddresses = _allowedAddresses;\\n isEnabled = true;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice Adds passed addresses to an allow list. Addresses on the allow list are able to call allow listed\\n * functions.\\n *\\n * @param _allowedAddresses List of addresses allowed to call allow listed functions\\n */\\n function addAddressesToAllowlist(address[] memory _allowedAddresses) external onlyOwner {\\n for(uint256 i = 0; i < _allowedAddresses.length; i++) {\\n address allowedAddress = _allowedAddresses[i];\\n\\n require(!isAllowed[allowedAddress], \\\"Address already on allowlist\\\");\\n\\n isAllowed[allowedAddress] = true;\\n allowedAddresses.push(allowedAddress);\\n\\n emit AddressAddedToAllowlist(allowedAddress);\\n }\\n }\\n\\n /**\\n * @notice Removes passed addresses from an allow list. Addresses not on the allow list are unable to call\\n * allow listed functions.\\n *\\n * @param _disallowedAddresses List of addresses being disallowed from calling allow listed functions\\n */\\n function removeAddressesFromAllowlist(address[] memory _disallowedAddresses) external onlyOwner {\\n for(uint256 i = 0; i < _disallowedAddresses.length; i++) {\\n address disallowedAddress = _disallowedAddresses[i];\\n\\n require(isAllowed[disallowedAddress], \\\"Address already disallowed\\\");\\n\\n isAllowed[disallowedAddress] = false;\\n allowedAddresses.removeStorage(disallowedAddress);\\n\\n emit AddressRemovedFromAllowlist(disallowedAddress);\\n }\\n }\\n\\n /**\\n * @notice Enable the allow list. When the allow list is enabled, only approved addresses are allowed to\\n * functions with onlyAllowed modifier.\\n */\\n function enableAllowlist() external onlyOwner {\\n require(!isEnabled, \\\"Allow list is already enabled\\\");\\n\\n isEnabled = true;\\n emit AllowlistEnabled();\\n }\\n\\n /**\\n * @notice Disable the allow list. When the allow list is disabled, any address is allowed to call functions\\n * with onlyAllowed modifier.\\n */\\n function disableAllowlist() external onlyOwner {\\n require(isEnabled, \\\"Allow list is already disabled\\\");\\n\\n isEnabled = false;\\n emit AllowlistDisabled();\\n }\\n\\n /* ============ View Functions ============ */\\n\\n function _getAllowedAddresses() internal view returns (address[] memory) {\\n return allowedAddresses;\\n }\\n}\\n\",\"keccak256\":\"0x5a681a88a6e27db23ff879a4cf35842d008b2ce58bdd3c0c8a03028071762593\",\"license\":\"MIT\"},\"contracts/external/interfaces/IKeyHashAdapterV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IKeyHashAdapterV2 {\\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function getMailServerKeyHashes() external view returns (bytes32[] memory);\\n function isMailServerKeyHash(bytes32 _mailserverKeyHash) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc849f2dc34e4463550b8e0a16541bde429cb1adf43776b2c4179e9d4e4e656a2\",\"license\":\"MIT\"},\"contracts/external/interfaces/IProxyBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Claims } from \\\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IProxyBaseProcessor {\\n \\n struct Proof {\\n Claims.ClaimInfo claimInfo;\\n Claims.SignedClaim signedClaim;\\n }\\n}\\n\",\"keccak256\":\"0x65aa00301110dfdf8333bd9bb71ebad241d66ea5840a2db3ac6d4f6037083cb8\",\"license\":\"MIT\"},\"contracts/external/lib/AddressArrayUtils.sol\":{\"content\":\"/*\\n Copyright 2020 Set Labs Inc.\\n\\n Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n you may not use this file except in compliance with the License.\\n You may obtain a copy of the License at\\n\\n http://www.apache.org/licenses/LICENSE-2.0\\n\\n Unless required by applicable law or agreed to in writing, software\\n distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n See the License for the specific language governing permissions and\\n limitations under the License.\\n\\n SPDX-License-Identifier: MIT\\n*/\\n\\npragma solidity ^0.8.17;\\n\\n/**\\n * @title AddressArrayUtils\\n * @author Set Protocol\\n *\\n * Utility functions to handle Address Arrays\\n *\\n * CHANGELOG:\\n * - 4/21/21: Added validatePairsWithArray methods\\n */\\nlibrary AddressArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(address[] memory A, address a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(address[] memory A, address a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns true if there are 2 elements that are the same in an array\\n * @param A The input array to search\\n * @return Returns boolean for the first occurrence of a duplicate\\n */\\n function hasDuplicate(address[] memory A) internal pure returns(bool) {\\n require(A.length > 0, \\\"A is empty\\\");\\n\\n for (uint256 i = 0; i < A.length - 1; i++) {\\n address current = A[i];\\n for (uint256 j = i + 1; j < A.length; j++) {\\n if (current == A[j]) {\\n return true;\\n }\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n * @return Returns the array with the object removed.\\n */\\n function remove(address[] memory A, address a)\\n internal\\n pure\\n returns (address[] memory)\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n (address[] memory _A,) = pop(A, index);\\n return _A;\\n }\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n */\\n function removeStorage(address[] storage A, address a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n\\n /**\\n * Removes specified index from array\\n * @param A The input array to search\\n * @param index The index to remove\\n * @return Returns the new array and the removed entry\\n */\\n function pop(address[] memory A, uint256 index)\\n internal\\n pure\\n returns (address[] memory, address)\\n {\\n uint256 length = A.length;\\n require(index < A.length, \\\"Index must be < A length\\\");\\n address[] memory newAddresses = new address[](length - 1);\\n for (uint256 i = 0; i < index; i++) {\\n newAddresses[i] = A[i];\\n }\\n for (uint256 j = index + 1; j < length; j++) {\\n newAddresses[j - 1] = A[j];\\n }\\n return (newAddresses, A[index]);\\n }\\n}\\n\",\"keccak256\":\"0x486f1a373f33aa167227600ac2d0bf95b37685413d98a3e745107188f00ae405\",\"license\":\"MIT\"},\"contracts/external/lib/Bytes32ArrayUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.17;\\n\\n/**\\n * @title Bytes32ArrayUtils\\n * @author ZKP2P\\n *\\n * Fork of Set Protocol's AddressArrayUtils library adapted for usage with bytes32 arrays.\\n */\\nlibrary Bytes32ArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(bytes32[] memory A, bytes32 a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(bytes32[] memory A, bytes32 a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns true if there are 2 elements that are the same in an array\\n * @param A The input array to search\\n * @return Returns boolean for the first occurrence of a duplicate\\n */\\n function hasDuplicate(bytes32[] memory A) internal pure returns(bool) {\\n require(A.length > 0, \\\"A is empty\\\");\\n\\n for (uint256 i = 0; i < A.length - 1; i++) {\\n bytes32 current = A[i];\\n for (uint256 j = i + 1; j < A.length; j++) {\\n if (current == A[j]) {\\n return true;\\n }\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The bytes32 to remove\\n * @return Returns the array with the object removed.\\n */\\n function remove(bytes32[] memory A, bytes32 a)\\n internal\\n pure\\n returns (bytes32[] memory)\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"bytes32 not in array.\\\");\\n } else {\\n (bytes32[] memory _A,) = pop(A, index);\\n return _A;\\n }\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The bytes32 to remove\\n */\\n function removeStorage(bytes32[] storage A, bytes32 a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"bytes32 not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n\\n /**\\n * Removes specified index from array\\n * @param A The input array to search\\n * @param index The index to remove\\n * @return Returns the new array and the removed entry\\n */\\n function pop(bytes32[] memory A, uint256 index)\\n internal\\n pure\\n returns (bytes32[] memory, bytes32)\\n {\\n uint256 length = A.length;\\n require(index < A.length, \\\"Index must be < A length\\\");\\n bytes32[] memory newBytes = new bytes32[](length - 1);\\n for (uint256 i = 0; i < index; i++) {\\n newBytes[i] = A[i];\\n }\\n for (uint256 j = index + 1; j < length; j++) {\\n newBytes[j - 1] = A[j];\\n }\\n return (newBytes, A[index]);\\n }\\n}\\n\",\"keccak256\":\"0x14d572deda126ff812eb5ab0eed33120e13cc568fd611a4a6bff652f3e8440a8\",\"license\":\"MIT\"},\"contracts/external/lib/Uint256ArrayUtils.sol\":{\"content\":\"/*\\n Copyright 2020 Set Labs Inc.\\n\\n Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n you may not use this file except in compliance with the License.\\n You may obtain a copy of the License at\\n\\n http://www.apache.org/licenses/LICENSE-2.0\\n\\n Unless required by applicable law or agreed to in writing, software\\n distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n See the License for the specific language governing permissions and\\n limitations under the License.\\n\\n SPDX-License-Identifier: Apache-2.0\\n*/\\n\\npragma solidity ^0.8.18;\\n\\n/**\\n * @title Uint256ArrayUtils\\n * @author Set Protocol\\n *\\n * Utility functions to handle Uint256 Arrays\\n */\\nlibrary Uint256ArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(uint256[] memory A, uint256 a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(uint256[] memory A, uint256 a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns the combination of the two arrays\\n * @param A The first array\\n * @param B The second array\\n * @return Returns A extended by B\\n */\\n function extend(uint256[] memory A, uint256[] memory B) internal pure returns (uint256[] memory) {\\n uint256 aLength = A.length;\\n uint256 bLength = B.length;\\n uint256[] memory newUints = new uint256[](aLength + bLength);\\n for (uint256 i = 0; i < aLength; i++) {\\n newUints[i] = A[i];\\n }\\n for (uint256 j = 0; j < bLength; j++) {\\n newUints[aLength + j] = B[j];\\n }\\n return newUints;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The bytes32 to remove\\n */\\n function removeStorage(uint256[] storage A, uint256 a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"uint256 not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n}\\n\",\"keccak256\":\"0xbf9f00cb29fa144868141b708c11d55b219db79cd386db886a5d72e38bbadcb0\",\"license\":\"Apache-2.0\"},\"contracts/interfaces/IDomainExchange.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.18;\\n\\n\\ninterface IDomainExchange {\\n function registryRemoveListing(uint256 _listingId) external;\\n}\",\"keccak256\":\"0xe9deda400c359c1b42d10c518dc1f01605ea3a466e1be110f1f7c9be4af8253b\",\"license\":\"MIT\"},\"contracts/interfaces/ITransferDomainProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.18;\\n\\n\\ninterface ITransferDomainProcessor {\\n\\n struct TransferProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[10] signals;\\n }\\n\\n function processProof(\\n TransferProof calldata _proof\\n ) \\n external \\n returns (\\n bytes32 dkimKeyHash, \\n bytes32 hashedReceiverId, \\n string memory domainName, \\n uint256 bidId\\n );\\n}\",\"keccak256\":\"0x9cf5f1b070d7bad73d8ae57f7b20d449853f96fcbb5df1a443723df41c91339d\",\"license\":\"MIT\"},\"contracts/interfaces/IVerifiedDomainRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { IVerifyDomainProcessor } from \\\"./IVerifyDomainProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IVerifiedDomainRegistry {\\n\\n struct Domain {\\n address owner;\\n string name;\\n uint256 expiryTime;\\n address exchange;\\n uint256 listingId;\\n }\\n\\n struct DomainWithId {\\n bytes32 domainId;\\n Domain domain;\\n }\\n\\n function verifyDomains(IVerifyDomainProcessor.Proof[] memory _proofs) external;\\n \\n function getDomainId(string memory _domainName) external pure returns (bytes32);\\n function getDomainOwner(bytes32 _domainId) external view returns (address);\\n function getDomain(bytes32 _domainId) external view returns (DomainWithId memory);\\n function getDomains(bytes32[] memory _domainId) external view returns (DomainWithId[] memory);\\n \\n function setDomainListing(bytes32 _domainId, uint256 _listingId) external;\\n function removeDomainListing(bytes32 _domainId) external;\\n function updateDomainOnSale(bytes32 _domainId, address _newOwner) external;\\n}\\n\",\"keccak256\":\"0xcc45329e6720b7b9df3c67985b16f8d778528f756c045ba6c2196831b40afe92\",\"license\":\"MIT\"},\"contracts/interfaces/IVerifyDomainProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\nimport { IProxyBaseProcessor } from \\\"../external/interfaces/IProxyBaseProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IVerifyDomainProcessor is IProxyBaseProcessor {\\n \\n struct DomainRaw {\\n string name;\\n uint256 expiryTime;\\n }\\n\\n function verifyProofs(\\n Proof[] memory _proofs\\n ) \\n external \\n returns (DomainRaw[] memory domains);\\n}\",\"keccak256\":\"0xe66335a9d8fb3d03a9ee76bf44fbec775311aeed3f6666862f06124b6605a123\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x60806040523462000037576200002562000018620001e5565b94939093929192620002cd565b6040516154ee6200089382396154ee90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200007457604052565b6200003c565b90620000916200008960405190565b928362000052565b565b6001600160a01b031690565b90565b6001600160a01b0381165b036200003757565b905051906200009182620000a2565b80620000ad565b905051906200009182620000c4565b6001600160401b038111620000745760208091020190565b909291926200010b6200010582620000da565b6200007a565b93818552602080860192028301928184116200003757915b838310620001315750505050565b60208091620001418486620000b5565b81520192019162000123565b9080601f83011215620000375781516200009f92602001620000f2565b91909160c0818403126200003757620001848382620000b5565b92620001948160208401620000cb565b92604090620001a683838601620000b5565b93620001b68460608301620000cb565b93620001c68160808401620000cb565b9360018060a0850151921b03811162000037576200009f92016200014d565b6200020862005d8180380380620001fc816200007a565b9283398101906200016a565b909192939495565b90600019905b9181191691161790565b6200009f6200009f6200009f9290565b90620002446200009f6200024c9262000220565b825462000210565b9055565b906001600160a01b039062000216565b6200009f9062000093906001600160a01b031682565b6200009f9062000260565b6200009f9062000276565b90620002a06200009f6200024c9262000281565b825462000250565b9060ff9062000216565b90620002c56200009f6200024c92151590565b8254620002a8565b939192620003016200031194620002f96200030994620002f1620000919a6200034a565b600a62000230565b600b6200028c565b600e62000230565b600f62000230565b6200033662000321600162000220565b6200032e81600c62000230565b600d62000230565b6200034460006010620002b2565b6200077f565b62000355906200036f565b6200009160006004620002b2565b6200009f600162000220565b6200037a90620005c2565b620000916200038862000363565b600362000230565b634e487b7160e01b600052601160045260246000fd5b6000198114620003b65760010190565b62000390565b634e487b7160e01b600052603260045260246000fd5b90620003dc825190565b811015620003ee576020809102010190565b620003bc565b90620004009062000281565b600052602052604060002090565b156200041657565b60405162461bcd60e51b815260206004820152601a60248201527f4164647265737320697320616c726561647920616c6c6f7765640000000000006044820152606490fd5b0390fd5b9160001960089290920291821b911b62000216565b9190620004896200009f6200024c9362000220565b9083546200045f565b620000919160009162000474565b818110620004ac575050565b80620004bc600060019362000492565b01620004a0565b9091828110620004d257505050565b620000919290620004ea905b92600052602060002090565b9081019101620004a0565b906801000000000000000081116200007457816200051562000091935490565b90828155620004c3565b8151916001600160401b03831162000074576200054e620004de600192620005488686620004f5565b60200190565b92049160005b838110620005625750505050565b60019060206200057d6200009f86516001600160a01b031690565b940193818401550162000554565b9062000091916200051f565b9060ff60a01b9060a01b62000216565b90620005ba6200009f6200024c92151590565b825462000597565b620005cc620006b7565b600091620005da8362000220565b620005e76200009f845190565b8110156200069b57806200061162000604620006959386620003d2565b516001600160a01b031690565b620006546002620006406200063a620006366200062f8685620003f4565b5460ff1690565b1590565b6200040e565b6200064e83600192620003f4565b620002b2565b620006807f41f4a012571b6bf21f3c6557be5d1a28851ce415203203b84c14099b84fe97379162000281565b906200068b60405190565b600090a2620003a6565b620005da565b5091620006ae620000919260016200058b565b600190620005a7565b620000913362000830565b62000830565b6200009190620006d7620007dc565b62000754565b620000936200009f6200009f9290565b6200009f90620006dd565b156200070057565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6200009190620006c26200076d620000936000620006ed565b6001600160a01b0383161415620006f8565b6200009190620006c8565b156200079257565b60405162461bcd60e51b8152806200045b600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b62000091620007ea62000824565b62000806620007f93362000093565b916001600160a01b031690565b146200078a565b6200009f9062000093565b6200009f90546200080d565b6200009f600062000818565b6200083c600062000818565b906200084a8160006200028c565b620008816200087a7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09362000281565b9162000281565b916200088c60405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c80630373c0bf1461035257806303f693541461034d5780630d81539c146103485780630eaaf4c8146103435780630f2bc8b31461033e5780631756c30e146103395780631ce59f811461033457806321f67fbb1461032f5780632ac44f121461032a5780632f6db23814610325578063392e53cd146103205780633ec622791461031b5780634423c5f11461031657806346904840146103115780634f20fe5d1461030c5780635c975abb1461030757806364b55bed146103025780636759789f146102fd5780636aa633b6146102f85780636c2c9c7d146102f35780636caacbe7146102ee578063715018a6146102e95780637e064092146102e45780637e7a9c6c146102df5780637f17caa7146102da57806381c14314146102d557806386cfa7d3146102d057806387547367146102cb578063887f495a146102c65780638da5cb5b146102c15780639012c4a8146102bc578063944b8b2e146102b757806396ec50c3146102b25780639d8717a8146102ad578063a15ce280146102a8578063a8ef333f146102a3578063ad9287631461029e578063babcc53914610299578063bb46acd314610294578063bca0b9101461028f578063c0c53b8b1461028a578063c6a2aac814610285578063cf8e629a14610280578063ddca3f431461027b578063de74e57b14610276578063e38df96d14610271578063e6282c6e1461026c578063eb18a9d814610267578063f15851e614610262578063f160d3691461025d578063f2fde38b146102585763f6cda469036103c9576116f3565b6116db565b6116c3565b6116ab565b611690565b611678565b61165d565b61161a565b611474565b611450565b611438565b61141f565b6113dd565b6113b7565b611382565b611353565b611338565b611318565b6112b0565b6111c3565b61118e565b611151565b61112c565b611113565b6110cb565b6110af565b611012565b610ffa565b610fdf565b610fbb565b610fa3565b610f8b565b610ee3565b610ebc565b610e89565b610d31565b610cae565b610c87565b610bf9565b610b9e565b610963565b610935565b6108f7565b6108bb565b6108a3565b61088b565b610873565b610858565b610834565b6107fc565b6106da565b610682565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761038e57604052565b610357565b906103a76103a060405190565b928361036d565b565b6001600160401b03811161038e5760208091020190565b805b036103c957565b600080fd5b905035906103a7826103c0565b909291926103f06103eb826103a9565b610393565b93818552602080860192028301928184116103c957915b8383106104145750505050565b6020809161042284866103ce565b815201920191610407565b9080601f830112156103c957816020610448933591016103db565b90565b906020828203126103c95781356001600160401b0381116103c957610448920161042d565b9052565b6001600160a01b031690565b60005b8381106104935750506000910152565b8181015183820152602001610483565b6104c46104cd6020936104d7936104b8815190565b80835293849260200190565b95869101610480565b601f01601f191690565b0190565b906104fb6104f46104ea845190565b8084529260200190565b9260200190565b9060005b81811061050c5750505090565b9091926105296105226001928651815260200190565b9460200190565b9291016104ff565b80516001600160a01b031682526104489161012061058161014083016020858101516001600160a01b03169085015261056f60408601516040860152565b606085015184820360608601526104a3565b9261059160808201516080850152565b6105a060a082015160a0850152565b6105af60c082015160c0850152565b6105be60e082015160e0850152565b610100818101511515908401520151906101208184039101526104db565b8051825261044891604081019160200151906020818403910152610531565b90610448916105dc565b9061061b610611835190565b8083529160200190565b908161062d6020830284019460200190565b926000915b83831061064157505050505090565b9091929394602061066461065d838560019503875289516105fb565b9760200190565b9301930191939290610632565b602080825261044892910190610605565b346103c9576106a961069d61069836600461044b565b613266565b60405191829182610671565b0390f35b60009103126103c957565b610448916008021c81565b9061044891546106b8565b6104486000600c6106c3565b346103c9576106ea3660046106ad565b6106a96106f56106ce565b6040515b9182918290815260200190565b6001600160a01b0381166103c2565b905035906103a782610706565b6001600160401b03811161038e57602090601f01601f19160190565b90826000939282370152565b9092919261075a6103eb82610722565b938185526020850190828401116103c9576103a79261073e565b9080601f830112156103c9578160206104489335910161074a565b909160c0828403126103c9576107a583836103ce565b926107b381602085016103ce565b926107c182604083016103ce565b926107cf8360608401610715565b926080830135906001600160401b0382116103c9576107f381610448938601610774565b9360a0016103ce565b346103c95761081b61080f36600461078f565b94939093929192611b75565b604051005b906020828203126103c957610448916103ce565b346103c95761081b610847366004610820565b612961565b6104486000600f6106c3565b346103c9576108683660046106ad565b6106a96106f561084c565b346103c95761081b610886366004610820565b61258d565b346103c95761089b3660046106ad565b61081b61281a565b346103c9576108b33660046106ad565b61081b612be6565b346103c95761081b6108ce366004610820565b61282f565b90816102409103126103c95790565b90610240828203126103c957610448916108d3565b346103c95761081b61090a3660046108e2565b612106565b610448916008021c5b60ff1690565b90610448915461090f565b6104486000601061091e565b346103c9576109453660046106ad565b6106a9610950610929565b6040515b91829182901515815260200190565b346103c9576109733660046106ad565b61081b612b78565b6104486104486104489290565b906109929061097b565b600052602052604060002090565b6104489081565b61044890546109a0565b634e487b7160e01b600052602260045260246000fd5b90600160028304921680156109e7575b60208310146109e257565b6109b1565b91607f16916109d7565b80546000939291610a0e610a04836109c7565b8085529360200190565b9160018116908115610a605750600114610a2757505050565b610a3a9192939450600052602060002090565b916000925b818410610a4c5750500190565b805484840152602090930192600101610a3f565b92949550505060ff1916825215156020020190565b90610448916109f1565b906103a7610a9992610a9060405190565b93848092610a75565b038361036d565b61044890610918565b6104489054610aa0565b610abe906007610988565b90610ad082546001600160a01b031690565b91610add600182016109a7565b91610aea60028301610a7f565b91610af7600382016109a7565b91610b04600483016109a7565b91610b11600582016109a7565b916104486007610b23600685016109a7565b9301610aa9565b93989795610b8860e096610b81610b7988610b9698610b6c6103a79e99610b65610b8f9a600061010087019601906001600160a01b03169052565b60208d0152565b8a820360408c01526104a3565b9c6060890152565b6080870152565b60a0850152565b60c0830152565b019015159052565b346103c9576106a9610bb9610bb4366004610820565b610ab3565b94610bcc98969894919493929360405190565b98899889610b2a565b610448916008021c610474565b906104489154610bd5565b6104486000600b610be2565b346103c957610c093660046106ad565b6106a9610c14610bed565b6040515b918291826001600160a01b03909116815260200190565b90610c3e6104f46104ea845190565b9060005b818110610c4f5750505090565b909192610c6e61052260019286516001600160a01b0316815260200190565b929101610c42565b602080825261044892910190610c2f565b346103c957610c973660046106ad565b6106a9610ca26136f8565b60405191829182610c76565b346103c957610cbe3660046106ad565b6106a96109506118fa565b634e487b7160e01b600052603260045260246000fd5b8054821015610d0257610cf9600191600052602060002090565b91020190600090565b610cc9565b60016000610d13825490565b831015610d2e575061044891610d2891610cdf565b90610be2565b80fd5b346103c9576106a9610c14610d47366004610820565b610d07565b906020828203126103c95761044891610715565b80516001600160a01b03168252906104489060e080610d9e6101008401610d8c60208801516020870152565b604087015185820360408701526104a3565b94610dae60608201516060860152565b610dbd60808201516080860152565b610dcc60a082015160a0860152565b610ddb60c082015160c0860152565b01511515910152565b805182529061044890604080610e096060840160208701518582036020870152610d60565b9401511515910152565b9061044891610de4565b90610e29610611835190565b9081610e3b6020830284019460200190565b926000915b838310610e4f57505050505090565b90919293946020610e6b61065d83856001950387528951610e13565b9301930191939290610e40565b602080825261044892910190610e1d565b346103c9576106a9610ea4610e9f366004610d4c565b6134df565b60405191829182610e78565b6104486014600061091e565b346103c957610ecc3660046106ad565b6106a9610950610eb0565b6104486000600d6106c3565b346103c957610ef33660046106ad565b6106a96106f5610ed7565b90929192610f0e6103eb826103a9565b93818552602080860192028301928184116103c957915b838310610f325750505050565b60208091610f408486610715565b815201920191610f25565b9080601f830112156103c95781602061044893359101610efe565b906020828203126103c95781356001600160401b0381116103c9576104489201610f4b565b346103c95761081b610f9e366004610f66565b614f6c565b346103c957610fb33660046106ad565b61081b611743565b346103c95761081b610fce366004610820565b612f05565b6104486000600e6106c3565b346103c957610fef3660046106ad565b6106a96106f5610fd3565b346103c95761081b61100d366004610f66565b614e73565b346103c9576110223660046106ad565b61081b612788565b91906040838203126103c957610448906110448185610715565b936020016103ce565b61044890610474906001600160a01b031682565b6104489061104d565b61044890611061565b906109929061106a565b61108b600691600092611073565b90611094825490565b831015610d2e5750610448916110a991610cdf565b906106c3565b346103c9576106a96106f56110c536600461102a565b9061107d565b346103c95761081b6110de366004610d4c565b612d36565b90916060828403126103c9576104486110fc84846103ce565b9361110a81602086016103ce565b93604001610715565b346103c95761081b6111263660046110e3565b91612449565b346103c95761113c3660046106ad565b6106a9610c146000546001600160a01b031690565b346103c95761081b611164366004610820565b612dda565b61044860006011610be2565b6104709061106a565b6020810192916103a79190611175565b346103c95761119e3660046106ad565b6106a96111a9611169565b6040519182918261117e565b61108b600891600092611073565b346103c9576106a96106f56111d936600461102a565b906111b5565b906111eb610611835190565b90816111fd6020830284019460200190565b926000915b83831061121157505050505090565b9091929394602061122d61065d83856001950387528951610e13565b9301930191939290611202565b90610448916111df565b90611250610611835190565b90816112626020830284019460200190565b926000915b83831061127657505050505090565b9091929394602061129261065d8385600195038752895161123a565b9301930191939290611267565b602080825261044892910190611244565b346103c9576106a96112cb6112c636600461044b565b6135ce565b6040519182918261129f565b916060838303126103c9576112ec82846103ce565b926112fa83602083016103ce565b9260408201356001600160401b0381116103c9576104489201610774565b61081b6113263660046112d7565b91611c76565b61044860006012610be2565b346103c9576113483660046106ad565b6106a96111a961132c565b346103c95761081b611366366004610820565b612fc9565b6104489061137d600291600092611073565b61091e565b346103c9576106a9610950611398366004610d4c565b61136b565b91906040838203126103c9576104489061104481856103ce565b61081b6113c536600461139d565b90612695565b6104489061137d600991600092611073565b346103c9576106a96109506113f3366004610d4c565b6113cb565b90916060828403126103c9576104486114118484610715565b9361110a8160208601610715565b346103c95761081b6114323660046113f8565b91612b5a565b346103c9576114483660046106ad565b61081b615049565b346103c9576114603660046106ad565b61081b6150f4565b6104486000600a6106c3565b346103c9576114843660046106ad565b6106a96106f5611468565b805460009392916114a2610a04836109c7565b9160018116908115610a6057506001146114bb57505050565b6114ce9192939450600052602060002090565b916000925b8184106114e05750500190565b8054848401526020909301926001016114d3565b906104489161148f565b906103a7610a999261150f60405190565b938480926114f4565b611523906005610988565b80546001600160a01b03169161154360018301546001600160a01b031690565b91611550600282016109a7565b9161155d600383016114fe565b9161156a600482016109a7565b91611577600583016109a7565b91611584600682016109a7565b916104486008610b23600785016109a7565b9499989690610100966116056115fd61160c93610b96986115f06103a79e996115e96116139a60208f6115da61012082019860008301906001600160a01b03169052565b01906001600160a01b03169052565b60408d0152565b8a820360608c01526104a3565b9c6080890152565b60a0870152565b60c0850152565b60e0830152565b346103c9576106a9611635611630366004610820565b611518565b9561164899979995919594929460405190565b998a998a611596565b61044860016010610be2565b346103c95761166d3660046106ad565b6106a96111a9611651565b346103c95761081b61168b366004610820565b612454565b346103c9576106a961069d6116a6366004610d4c565b613312565b346103c95761081b6116be366004610820565b612243565b346103c95761081b6116d6366004610d4c565b612e3d565b346103c95761081b6116ee366004610d4c565b611864565b346103c95761081b611706366004610d4c565b612d8c565b61171361179f565b6103a7611731565b6104746104486104489290565b6104489061171b565b6103a761173e6000611728565b61189d565b6103a761170b565b1561175257565b60405162461bcd60e51b81528061179b600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6103a76117b46000546001600160a01b031690565b6117cd6117c033610474565b916001600160a01b031690565b1461174b565b6103a7906117df61179f565b61183f565b156117eb57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6103a79061173e6118536104746000611728565b6001600160a01b03831614156117e4565b6103a7906117d3565b906001600160a01b03905b9181191691161790565b906118926104486118999261106a565b825461186d565b9055565b6000546001600160a01b0316906118b5816000611882565b6118e86118e27f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09361106a565b9161106a565b916118f260405190565b80805b0390a3565b6104486004610aa9565b6104489060a01c610918565b6104489054611904565b1561192157565b60405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc81a5cc81b9bdd08185b1b1bddd95960521b6044820152606490fd5b906103a795949392916119726000611910565b156119975761199261198d611988336002611073565b610aa9565b61191a565b6119ed565b611992600161191a565b156119a857565b60405162461bcd60e51b815260206004820152601c60248201527f436f6e7472616374206d75737420626520696e697469616c697a6564000000006044820152606490fd5b906103a79594939291611a08611a036010610aa9565b6119a1565b906103a79594939291611a19611bc2565b611a71565b9081526040810192916103a79160200152565b6040513d6000823e3d90fd5b611a6a6103a794611a63606094989795611a5c608086019a6000870152565b6020850152565b6040830152565b0190611175565b9385611a9791969396611a8e611a868761106a565b858a8a6138e9565b85888589613dc3565b91611ab2611aad6011546001600160a01b031690565b61106a565b6327d335a890803b156103c957611ad891600091611acf60405190565b93849260e01b90565b8252818381611aeb8a8d60048401611a1e565b03925af18015611b7057611b52575b50611b4d3394611b3a611b36611b307f77a8be0890be6d79729c684636469d83d455e267a0bf0c9bc2463d8db867a5419761097b565b9761106a565b9790565b97611b4460405190565b94859485611a3d565b0390a4565b611b6a906000611b62818361036d565b8101906106ad565b38611afa565b611a31565b906103a7959493929161195f565b15611b8a57565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fd5b6103a7611bd4611bd06118fa565b1590565b611b83565b90611bec9291611be7611cf8565b611bf4565b6103a7611d34565b906103a79291611c02611bc2565b9091611c2a9034938484611c1a610448826005610988565b611c25848483613f91565b61414e565b903391611b4d611c6c611c66611c607f6d2b783673dbbf046f2e5a1f3c92ce62c29a0f5385f2b1f0eaf19019ef28cb559461097b565b9461097b565b9461106a565b946106f960405190565b906103a79291611bd9565b610448600261097b565b15611c9257565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b9060001990611878565b90611cf16104486118999261097b565b8254611cd7565b6103a7611d0560036109a7565b611d23611d10611c81565b918290611d1c565b9190565b1415611c8b565b6003611ce1565b610448600161097b565b6103a7611d23611d2a565b6103a790611d50611a036010610aa9565b611bec90611d5c611cf8565b6103a790611d68611bc2565b611f2e565b6104489060081c610474565b6104489054611d6d565b905051906103a7826103c0565b90929192611da06103eb82610722565b938185526020850190828401116103c9576103a792610480565b9080601f830112156103c957815161044892602001611d90565b6080818303126103c957611de88282611d83565b92611df68360208401611d83565b926040830151906001600160401b0382116103c957611e1a81610448938601611dba565b93606001611d83565b9037565b6103a791604091611e23565b906104d781604093611e27565b611e4c611d1860029390565b806000925b848410611e5f575050505050565b611e7b611e74600192611e6f8690565b611e33565b9360400190565b93019291611e51565b6103a79161014091611e23565b6103a7919061010090611ecf90611ea88482611e27565b611eb9604082016040860190611e40565b611eca60c0820160c0860190611e27565b820190565b910190611e84565b610240810192916103a79190611e91565b9081526040810192916103a7916020906115da565b634e487b7160e01b600052601160045260246000fd5b9190611f1e565b9290565b8203918211611f2957565b611efd565b6000611f6b91611f41611aad6010611d79565b611f60836365cd296c611f5360405190565b9687958694859360e01b90565b835260048301611ed7565b03925af18015611b70576000918291829182916120dd575b50611fbb611f95610448846007610988565b93600595611fb36104486001880198611fad8a6109a7565b90610988565b9384876143af565b611fd0611aad6011546001600160a01b031690565b90632b8a8002611fe2600483016109a7565b85546001600160a01b03165b93803b156103c9576120166000809461202161200960405190565b9889968795869460e01b90565b845260048401611ee8565b03925af1908115611b70576120719561207d93612076936120c7575b5061204a600687016109a7565b96828661206b61206560018c9701546001600160a01b031690565b946109a7565b98614557565b6148fd565b8094611f13565b926120b16120ab7f3247261fffac93019b3a34aa6692df18a5ddea75a12bf8ec4539903a608a6e4c9361097b565b9361097b565b936118f56120be60405190565b92839283611a1e565b6120d7906000611b62818361036d565b3861203d565b925090506120fd92503d8091833e6120f5818361036d565b810190611dd4565b90919238611f83565b6103a790611d3f565b611bec9061211b611cf8565b6121ad565b1561212757565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420626964206f776e65720000000000000000006044820152606490fd5b1561217357565b60405162461bcd60e51b81526020600482015260126024820152714c697374696e67206e6f742061637469766560701b6044820152606490fd5b6121bb610448826007610988565b60018101916121d16104486005611fad866109a7565b82906121f66121e783546001600160a01b031690565b6121f0336117c0565b14612120565b61220a61220560088301610aa9565b61216c565b61221f611aad6011546001600160a01b031690565b91632b8a800290611fee612235600485016109a7565b91546001600160a01b031690565b6103a79061210f565b906103a7929161225a611bc2565b612364565b1561226657565b60405162461bcd60e51b815260206004820152601b60248201527f43616c6c6572206973206e6f74206c697374696e67206f776e657200000000006044820152606490fd5b156122b257565b60405162461bcd60e51b8152602060048201526024808201527f41736b207072696365206973206c657373207468616e206d696e2062696420706044820152637269636560e01b6064820152608490fd5b1561230a57565b60405162461bcd60e51b815260206004820152601a60248201527f496e76616c69642073616c652045544820726563697069656e740000000000006044820152606490fd5b9081526040810192916103a791602090611a6a565b919091612375610448826005610988565b9161240081600161238d86546001600160a01b031690565b3396906123a39061239d896117c0565b1461225f565b6123b261220560088301610aa9565b6123cd6123c4610448600784016109a7565b895b10156122ab565b6123ed6123dd6104746000611728565b6123e68561106a565b1415612303565b6123fa8860068301611ce1565b01611882565b61243361242d7f6df0cec5e0539cca31fe823df048a8d5834ba5dc079fa1d38e5157f00f9d085b9361097b565b9361106a565b936118f561244060405190565b9283928361234f565b906103a7929161224c565b612462610448826005610988565b80546001600160a01b031633919061247d9061239d846117c0565b61248c61220560088301610aa9565b6124a1611aad6011546001600160a01b031690565b90636e74da686124b3600483016109a7565b833b156103c9576124e9936124db600080946124ce60405190565b9788958694859360e01b90565b835260048301526024820190565b03925af1908115611b7057612505928592612532575b50614ca6565b6118e86118e27f5832f888aea12cc23bd891f2d9fd4bd01b8ce0e22898b6e7cee1519f5bd469549361097b565b612542906000611b62818361036d565b386124ff565b1561254f57565b60405162461bcd60e51b815260206004820152601660248201527543616c6c6572206973206e6f7420726567697374727960501b6044820152606490fd5b6125cb8161259f610448826005610988565b6125c66125b7611aad6011546001600160a01b031690565b6125c0336117c0565b14612548565b614ca6565b6125f57ff7504a55c42715ea3e852b679d6453ecfe02acbddb4d0652aa251d4458b7cc219161097b565b906125ff60405190565b80805b0390a2565b90611bec91612614611cf8565b906103a791612621611bc2565b612659826006612635610448856007610988565b6126538361264d6104486005611fad600187016109a7565b8361465d565b01611ce1565b33906118f561268b61242d7f8283dd04c4a2b6691bd80232f254e0ad876b8bb149938d3e7ced5c6e8a35b6149361097b565b936106f960405190565b906103a791612607565b6126ac611a036010610aa9565b6103a7612720565b156126bb57565b60405162461bcd60e51b815260206004820152601e60248201527f496e7374616e742061636365707420616c726561647920656e61626c656400006044820152606490fd5b9060ff90611878565b9061271961044861189992151590565b8254612700565b3380612751600961273f61273a611bd06119888685611073565b6126b4565b61274c6001948592611073565b612709565b61260261277e7f2e259e0564e75f0e10ce0e012a5ce2528ae513b0188b619bcc581b8ba8db70329261106a565b9261095460405190565b6103a761269f565b61279d611a036010610aa9565b6103a76127f1565b156127ac57565b60405162461bcd60e51b815260206004820152601f60248201527f496e7374616e742061636365707420616c72656164792064697361626c6564006044820152606490fd5b3380612751600961280d6128086119888584611073565b6127a5565b61274c6000948592611073565b6103a7612790565b91908201809211611f2957565b6128a1600060076128936128466104488684610988565b91612889600561286d612867610448612861600189016109a7565b84610988565b86614781565b6128814261287b600f6109a7565b90612822565b908501611ce1565b6001908301612709565b01546001600160a01b031690565b6118e86118e27f9da9db6af7fcfa5edbaa006b61a744d33fe4651a4c594cddd3e9a7e757ecd8d59361097b565b611bec906128da611cf8565b6128e8610448826007610988565b9061291d6129006104486005611fad600187016109a7565b61290a8185614872565b82612917600686016109a7565b94614c0b565b33906129318361292c8461106a565b612a59565b6118f561268b61242d7f8f8619524e8d462cead34604bd2247ede24175801481e4d0b8059ac8aa41c3019361097b565b6103a7906128ce565b1561297157565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606490fd5b906129c36103eb83610722565b918252565b3d156129e2576129d73d6129b6565b903d6000602084013e565b606090565b156129ee57565b60405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608490fd5b60006103a792612a7a8293611aad612a703061106a565b849031101561296a565b90612a8460405190565b90818003925af1612a936129c8565b506129e7565b906103a79291612aa761179f565b612b18565b15612ab357565b60405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b90610100600160a81b039060081b611878565b90612b116104486118999261106a565b8254612aee565b612b4e9291612b40612b4792612b39612b34611bd06010610aa9565b612aac565b6010612b01565b6011611882565b6012611882565b6103a760016010612709565b906103a79291612a99565b612b6d61179f565b6103a76103a7612bcb565b6103a7612b65565b612b88611bc2565b6103a7612b9760016004612709565b33612bc67f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610c1860405190565b0390a1565b6103a7612b80565b612bdb61179f565b6103a76103a7612c34565b6103a7612bd3565b612bf6612c7f565b6103a7612c0560006004612709565b33612bc67f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91610c1860405190565b6103a7612bee565b15612c4357565b60405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606490fd5b6103a7612c8a6118fa565b612c3c565b6103a790612c9b61179f565b612cde565b15612ca757565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b612d01612cea8261106a565b612cfa6117c06104746000611728565b1415612ca0565b612d0c816010612b01565b6125f57f9106eb309cc633a951e77bd36af34646a9df8e6ade485938c34e3844a37b79da9161106a565b6103a790612c8f565b6103a790612d4b61179f565b612d57612cea8261106a565b612d62816012611882565b6125f57f9d3407c7200ba4f49e97f3d3f8250ec01c24b0ada6fa31053d71850793b739539161106a565b6103a790612d3f565b6103a790612da161179f565b612dac81600a611ce1565b612bc67f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c76916106f960405190565b6103a790612d95565b6103a790612def61179f565b612e08612dff6104746000611728565b612cfa8361106a565b612e1381600b611882565b6125f57f7a7b5a0a132f9e0581eb8527f66eae9ee89c2a3e79d4ac7e41a1f1f4d48a7fc29161106a565b6103a790612de3565b6103a790612e5261179f565b612eb8565b15612e5e57565b60405162461bcd60e51b815260206004820152602c60248201527f42696420736574746c656d656e7420706572696f64206d75737420626520677260448201526b06561746572207468616e20360a41b6064820152608490fd5b612ecc612ec5600061097b565b8211612e57565b612ed781600e611ce1565b612bc67f09a165ff77cf0f319f9ece89bc6dbe2a469a0da2640c9e6b501132846843daf5916106f960405190565b6103a790612e46565b6103a790612f1a61179f565b612f7c565b15612f2657565b60405162461bcd60e51b815260206004820152602860248201527f42696420726566756e6420706572696f64206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608490fd5b612f90612f89600061097b565b8211612f1f565b612f9b81600f611ce1565b612bc67f90e0312fddcd5cbec358d5c7d63976e5c97d71dfb8d6cd5f2c53b0a1a043ccf0916106f960405190565b6103a790612f0e565b906129c36103eb836103a9565b6104486040610393565b610448610140610393565b612ffc612fe9565b906000825260208080808080808080808b01600081520160008152016060815201600081520160008152016000815201600081520160008152016060905250565b905250565b610448612ff4565b613052612fdf565b9060008252602080830161303d613042565b61044861304a565b60005b82811061307b57505050565b602090613086613064565b818401520161306f565b906103a76130a66130a084612fd2565b936103a9565b601f19016020840161306c565b6000198114611f295760010190565b906130cb825190565b811015610d02576020809102010190565b906130f76130eb6104ea845490565b92600052602060002090565b9060005b8181106131085750505090565b90919261312c61312560019261311d876109a7565b815260200190565b9460010190565b9291016130fb565b90610448916130dc565b906103a7610a999261314f60405190565b93848092613134565b906103a76132556009613169612fe9565b9461318b61317e82546001600160a01b031690565b6001600160a01b03168752565b6131b26131a260018301546001600160a01b031690565b6001600160a01b03166020880152565b6131c86131c1600283016109a7565b6040880152565b6131de6131d7600383016114fe565b6060880152565b6131f46131ed600483016109a7565b6080880152565b61320a613203600583016109a7565b60a0880152565b613220613219600683016109a7565b60c0880152565b61323661322f600783016109a7565b60e0880152565b61324f61324560088301610aa9565b1515610100880152565b0161313e565b610120840152565b61044890613158565b90613277613272835190565b613090565b91600090836132858361097b565b613290610448845190565b81101561330257806132ac6132a86132fd93866130c2565b5190565b6132e26132db6132c46005611fad6132a8878b6130c2565b6132d66132cf612fdf565b948a860152565b61325d565b6020830152565b6132ec82896130c2565b526132f781886130c2565b506130b3565b613285565b5093505050565b6104489061313e565b61332961332e91613321606090565b506006611073565b613309565b9061333a613272835190565b91600090836133488361097b565b613353610448845190565b811015613302578061336b6132a861337c93866130c2565b6132e26132db6132c4836005610988565b613348565b6104486060610393565b610448610100610393565b61339e61338b565b906000825260208080808080808089016000815201606081520160008152016000815201600081520160005b8152016000905250565b610448613396565b6133e4613381565b90600082526020808084016133ca6133d4565b6104486133dc565b60005b82811061340e57505050565b6020906134196133f7565b8184015201613402565b906103a76134336130a084612fd2565b601f1901602084016133ff565b906103a76134cd600761345161338b565b9461346661317e82546001600160a01b031690565b61347c613475600183016109a7565b6020880152565b61348b6131c160028301610a7f565b61349a6131d7600383016109a7565b6134a96131ed600483016109a7565b6134b8613203600583016109a7565b6134c7613219600683016109a7565b01610aa9565b151560e0840152565b61044890613440565b906134ee613329836008611073565b6134fe6134f9825190565b613423565b926000918461350c8461097b565b613517610448845190565b81101561358c578061352f6132a861358793866130c2565b61357261353d826007610988565b613569611a5c6135516119888b6009611073565b9261356461355d613381565b968d880152565b6134d6565b15156040830152565b61357c828a6130c2565b526132f781896130c2565b61350c565b509450505050565b60005b8281106135a357505050565b606082820152602001613597565b906103a76135c16130a084612fd2565b601f190160208401613594565b6135de6135d9825190565b6135b1565b806000916135eb8361097b565b945b6135f8610448865190565b8610156136f057613621600961361b6136146132a88a8a6130c2565b6005610988565b01613309565b9461362d6134f9875190565b61363788866130c2565b5261364287856130c2565b5061364c8561097b565b613657610448885190565b8110156136d957806132f781886136b86136776132a86136d4978e6130c2565b613569611a5c60076135646136a96119886136928785610988565b936136a38a6128938a600994610988565b90611073565b946136b2613381565b97880152565b6136c28c8a6130c2565b51906136ce83836130c2565b526130c2565b61364c565b50929450946136e7906130b3565b949391936135ed565b935093505050565b61044861517f565b905051906103a782610706565b91909160a0818403126103c95761372460a0610393565b9260006137318284613700565b908501526020820151906001600160401b0382116103c9576137588161378b938501611dba565b6020860152604061376b82828601611d83565b90860152606061377d82828601613700565b908601526080809301611d83565b90830152565b9190916040818403126103c9576137a86040610393565b9260006137b58284611d83565b9085015260208201516001600160401b0381116103c9576132db920161370d565b906020828203126103c95781516001600160401b0381116103c9576104489201613791565b1561380257565b60405162461bcd60e51b815260206004820152601a60248201527f43616c6c6572206973206e6f7420646f6d61696e206f776e65720000000000006044820152606490fd5b1561384e57565b60405162461bcd60e51b815260206004820152602160248201527f446f6d61696e20616c7265616479206c6973746564206f6e20726567697374726044820152607960f81b6064820152608490fd5b156138a457565b60405162461bcd60e51b815260206004820152601960248201527f4d696e696d756d20626964207072696365206973207a65726f000000000000006044820152606490fd5b60006139269194939294613908611aad6011546001600160a01b031690565b6124db631a24254761391960405190565b9586948593849360e01b90565b03915afa938415611b70576104746123e6936123c6611d18613985606060206103a79b6117c0996000916139bf575b5001805151613976906001600160a01b0316613970336117c0565b146137fb565b5101516001600160a01b031690565b946104486139b860006139b361399a82611728565b996139ad6001600160a01b038c166117c0565b14613847565b61097b565b821161389d565b6139da913d8091833e6139d2818361036d565b8101906137d6565b38613955565b369037565b906103a76139f56130a084612fd2565b601f1901602084016139e0565b634e487b7160e01b600052600060045260246000fd5b90611cf16104486118999290565b9160001960089290920291821b911b611878565b9190613a4b6104486118999361097b565b908354613a26565b6103a791600091613a3a565b818110613a6a575050565b80613a786000600193613a53565b01613a5f565b9190601f8111613a8d57505050565b613a9f6103a793600052602060002090565b906020601f840181900483019310613ac2575b6020601f909101045b0190613a5f565b9091508190613ab2565b600019600883021c1916906002021790565b90613ae7815190565b906001600160401b03821161038e57613b0a82613b0485546109c7565b85613a7e565b602090601f8311600114613b3857611899929160009183613b2d575b5050613acc565b015190503880613b26565b601f19831691613b4d85600052602060002090565b9260005b818110613b8b57509160029391856001969410613b72575b50505002019055565b01516000196008601f8516021c19169055388080613b69565b91936020600181928787015181550195019201613b51565b906103a791613ade565b81810292918115918404141715611f2957565b818110613bcb575050565b80613bd96000600193613a53565b01613bc0565b90613bf290600019906020036008021c90565b8154169055565b9091828110613c0757505050565b6103a79290613c15906130eb565b9081019101613bc0565b90600160401b811161038e5781613c376103a7935490565b90828155613bf9565b8151916001600160401b03831161038e57613c6a6130eb600192613c648686613c1f565b60200190565b92049160005b838110613c7d5750505050565b6001906020613c8d610448865190565b9401938184015501613c70565b906103a791613c40565b6103a79190613d8a9061012090600990613ccf81613cc987516001600160a01b031690565b90611882565b613cea60018201613cc960208801516001600160a01b031690565b613d0260028201613cfc604088015190565b90613a18565b613d1a60038201613d14606088015190565b90613ba3565b613d2c60048201613cfc608088015190565b613d4460058201613d3e60a088015190565b90611ce1565b613d5660068201613d3e60c088015190565b613d6860078201613d3e60e088015190565b613d8360088201613d7d610100880151151590565b90612709565b0192015190565b90613c9a565b906103a791613ca4565b90815491600160401b83101561038e5782613dbd9160016103a795018155610cdf565b90613a3a565b919295949095613dd1600090565b50613ddc600d6109a7565b93849733944290600198600096613df28861097b565b613dfb906139e5565b9689613e05612fe9565b998a0190613e1b91906001600160a01b03169052565b6001600160a01b0316602089015260408801526060870152608086015260a085015260c084015260e0830152841515610100830152610120820152613e61836005610988565b90613e6b91613d90565b613e76906006611073565b90613e8091613d9a565b613e8a600d6109a7565b90613e949061097b565b613e9d91612822565b6103a790600d611ce1565b15613eaf57565b60405162461bcd60e51b8152602060048201526016602482015275131a5cdd1a5b99c8191bd95cc81b9bdd08195e1a5cdd60521b6044820152606490fd5b15613ef457565b60405162461bcd60e51b8152602060048201526024808201527f426964207072696365206973206c657373207468616e206d696e2062696420706044820152637269636560e01b6064820152608490fd5b15613f4c57565b60405162461bcd60e51b815260206004820152601d60248201527f427579657220494420686173682063616e6e6f7420626520656d7074790000006044820152606490fd5b611d18610448613ffb926139b36103a79695613ff4611d186104486007613fc260008801546001600160a01b031690565b96613fdf600098613fd86117c06104748c611728565b1415613ea8565b613fee61220560088301610aa9565b016109a7565b1015613eed565b1415613f45565b9061400b815190565b906001600160401b03821161038e5761402882613b0485546109c7565b602090601f831160011461404a57611899929160009183613b2d575050613acc565b601f1983169161405f85600052602060002090565b9260005b81811061408357509160029391856001969410613b725750505002019055565b91936020600181928787015181550195019201614063565b906103a791614002565b6103a79190613d7d9060e0906007906140c981613cc987516001600160a01b031690565b6140db60018201613d3e602088015190565b6140f3600282016140ed604088015190565b9061409b565b61410560038201613cfc606088015190565b61411760048201613d3e608088015190565b61412960058201613d3e60a088015190565b61413b60068201613d3e60c088015190565b01920151151590565b906103a7916140a5565b919493909261415d600c6109a7565b93849283973393426000199160009461417461338b565b6001600160a01b0389168782015296602088015260408701526060860152608085015260a084015260c0830152151560e08201526141b3836007610988565b906141bd91614144565b6141c8906008611073565b906141d291613d9a565b600901906141df91613d9a565b6141e9600c6109a7565b6141f3600161097b565b6141fc91612822565b6103a790600c611ce1565b1561420e57565b60405162461bcd60e51b8152602060048201526012602482015271109a5908191bd95cc81b9bdd08195e1a5cdd60721b6044820152606490fd5b8015156103c2565b905051906103a782614248565b906020828203126103c95761044891614250565b1561427857565b60405162461bcd60e51b815260206004820152601d60248201527f496e76616c6964206d616e6167656420444b494d206b657920686173680000006044820152606490fd5b156142c457565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c696420637573746f6d20444b494d206b65792068617368000000006044820152606490fd5b6104d76143219260209261431b815190565b94859290565b93849101610480565b61044891614309565b1561433a57565b60405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103932b1b2b4bb32b960811b6044820152606490fd5b1561437957565b60405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103237b6b0b4b760911b6044820152606490fd5b80549294909391926001600160a01b03166143dc6000916143d56117c061047485611728565b1415614207565b6143fb6143f2828601546001600160a01b031690565b61239d336117c0565b61440a61220560088601610aa9565b6002840190614421611d186104486120ab856109a7565b146144ac576144a693613fee611d18946144a0611d18611f1a6003611f1a9861445e6103a79e614458611d1861044860049d6109a7565b146142bd565b61448661446a60405190565b809261447a60208301918261432a565b9081038252038261036d565b614498614491825190565b9160200190565b209b016109a7565b14614333565b14614372565b5060206144e793956144c9611aad6012546001600160a01b031690565b6124db6319d091526144da60405190565b9788948593849360e01b90565b03915afa908115611b70576103a795613fee611d18946144a0611d18611f1a6003600497614524611f1a9a6144a69d600091614529575b50614271565b61445e565b61454a915060203d8111614550575b614542818361036d565b81019061425d565b3861451e565b503d614538565b90916125c6816103a794612917600186016109a7565b1561457457565b60405162461bcd60e51b815260206004820152601860248201527f526566756e6420616c726561647920696e6974696174656400000000000000006044820152606490fd5b156145c057565b60405162461bcd60e51b8152602060048201526024808201527f4e6577207072696365206e6f742067726561746572207468616e206f6c6420706044820152637269636560e01b6064820152608490fd5b1561461857565b60405162461bcd60e51b815260206004820152601c60248201527f496e636f727265637420616d6f756e74206f66204554482073656e74000000006044820152606490fd5b611d1861044860066146cc936146a461220560086103a7999861468d6121e760008701546001600160a01b031690565b6134c761469f611bd060078801610aa9565b61456d565b01936146bc6146b5610448876109a7565b82116145b9565b6146c634956109a7565b90611f13565b14614611565b156146d957565b60405162461bcd60e51b815260206004820152601960248201527f526566756e6420706572696f64206e6f742073746172746564000000000000006044820152606490fd5b1561472557565b60405162461bcd60e51b815260206004820152602e60248201527f4c697374696e6720657870697265642e204269642063616e206265207769746860448201526d647261776e206469726563746c7960901b6064820152608490fd5b60086103a7926134c76147de936147a56121e760008301546001600160a01b031690565b6147b761469f611bd060078401610aa9565b6147d8611d18610448429361287b60046147d1600e6109a7565b92016109a7565b116146d2565b61471e565b156147ea57565b60405162461bcd60e51b81526020600482015260146024820152731499599d5b99081b9bdd081a5b9a5d1a585d195960621b6044820152606490fd5b1561482d57565b60405162461bcd60e51b815260206004820152601760248201527f526566756e6420706572696f64206e6f7420656e6465640000000000000000006044820152606490fd5b9061488e906008906134c76121e785546001600160a01b031690565b6148955750565b806148ad6148a860076103a79401610aa9565b6147e3565b6148c0611d1861044860054294016109a7565b1015614826565b610448670de0b6b3a764000061097b565b634e487b7160e01b600052601260045260246000fd5b81156148f8570490565b6148d8565b909190614939614927614919614913600a6109a7565b86613bad565b6149216148c7565b906148ee565b91614933838096611f13565b90612a59565b614943600061097b565b811161494c5750565b6103a79061292c600b546001600160a01b031690565b9190613a4b6104486118999390565b6103a791600091614962565b9060009161499b61499382600052602060002090565b928354613acc565b905555565b91929060208210156149f857601f84116001146149c257611899929350613acc565b50906149f36103a79360016149ea6149df85600052602060002090565b92601f602091010490565b82019101613a5f565b61497d565b50614a318293614a0f600194600052602060002090565b613abb6020601f860104820192601f861680614a39575b50601f602091010490565b600202179055565b614a4590888603613bdf565b38614a26565b929091600160401b821161038e5760201115614a92576020811015614a735761189991613acc565b60019160ff1916614a8984600052602060002090565b55600202019055565b60019150600202019055565b908154614aaa816109c7565b90818311614ad3575b818310614ac1575b50505050565b614aca936149a0565b38808080614abb565b614adf83838387614a4b565b614ab3565b60006103a791614a9e565b90600003614b00576103a790614ae4565b613a02565b60006103a791613c1f565b90600003614b00576103a790614b05565b600060096103a7928280820155826001820155614b418360028301614971565b614b4e8360038301614aef565b614b5b8360048301614971565b614b688360058301613a53565b614b758360068301613a53565b614b828360078301613a53565b82600882015501614b10565b90600003614b00576103a790614b21565b600080825590600790614bb58360018301613a53565b614bc28360028301614aef565b614bcf8360038301614971565b614bdc8360048301613a53565b614be98360058301613a53565b614bf68360068301613a53565b0155565b90600003614b00576103a790614b9f565b600091614c6a916103a794614c55611bd06008614c4686614c41610448614c3b8c8a01546001600160a01b031690565b85611073565b6153e9565b60098401936134c787866153e9565b9081614c90575b50614c6f575b506007610988565b614bfa565b83614c85614c8a92611fad6001600592016109a7565b614b8e565b38614c62565b549050614c9f611d188661097b565b1438614c5c565b614cdf6009600092614cbb8460088301612709565b614cda85614c4161044860066136a3898701546001600160a01b031690565b015490565b614ceb611d188361097b565b14614cf4575050565b614c856103a7926005610988565b6103a790614d0e61179f565b614dba565b15614d1a57565b60405162461bcd60e51b815260206004820152601c60248201527f4164647265737320616c7265616479206f6e20616c6c6f776c697374000000006044820152606490fd5b916001600160a01b0360089290920291821b911b611878565b9190614d896104486118999361106a565b908354614d5f565b90815491600160401b83101561038e5782614db49160016103a795018155610cdf565b90614d78565b90614dc5600061097b565b614dd0610448845190565b811015614e6e5780614df5614de8614e6993866130c2565b516001600160a01b031690565b614e2c81614e27816104486002614e1a614e15611bd06119888685611073565b614d13565b61274c6001938492611073565b614d91565b614e567f41f4a012571b6bf21f3c6557be5d1a28851ce415203203b84c14099b84fe97379161106a565b90614e6060405190565b600090a26130b3565b614dc5565b509050565b6103a790614d02565b6103a790614e8861179f565b614ed9565b15614e9457565b60405162461bcd60e51b815260206004820152601a60248201527f4164647265737320616c726561647920646973616c6c6f7765640000000000006044820152606490fd5b906000614ee58161097b565b614ef0610448855190565b811015614f665780614f08614de8614f6193876130c2565b614f2c8461274c836002614f27614f226119888484611073565b614e8d565b611073565b614f37816001615245565b614e567ff27dccb929dd3f4dba2d3ffc29a7c74e35995e051a268a7c466f9ddabdf81eac9161106a565b614ee5565b50509050565b6103a790614e7c565b614f7d61179f565b6103a7614ff7565b15614f8c57565b60405162461bcd60e51b815260206004820152601d60248201527f416c6c6f77206c69737420697320616c726561647920656e61626c65640000006044820152606490fd5b9060ff60a01b9060a01b611878565b90614ff061044861189992151590565b8254614fd1565b61500c615007611bd06000611910565b614f85565b61501860016000614fe0565b7f8a943acd5f4e6d3df7565a4a08a93f6b04cc31bb6c01ca4aef7abd6baf455ec361504260405190565b8080612bc6565b6103a7614f75565b61505961179f565b6103a76150ad565b1561506857565b60405162461bcd60e51b815260206004820152601e60248201527f416c6c6f77206c69737420697320616c72656164792064697361626c656400006044820152606490fd5b6150bf6150ba6000611910565b615061565b6150ca600080614fe0565b7f2d35c8d348a345fd7b3b03b7cfcf7ad0b60c2d46742d5ca536342e4185becb0761504260405190565b6103a7615051565b9061510b6130eb6104ea845490565b9060005b81811061511c5750505090565b90919261514a61312560019261513987546001600160a01b031690565b6001600160a01b0316815260200190565b92910161510f565b90610448916150fc565b906103a7610a999261516d60405190565b93848092615152565b6104489061515c565b6104486001615176565b906151986130eb6104ea845490565b9060005b8181106151a95750505090565b9091926151c661312560019261513987546001600160a01b031690565b92910161519c565b9061044891615189565b906103a7610a99926151e960405190565b938480926151ce565b610448906151d8565b634e487b7160e01b600052603160045260246000fd5b6103a791600091614d78565b8054801561524057600019019061523d6152378383610cdf565b90615211565b55565b6151fb565b61525a61526192615255836151f2565b6152f8565b9092901590565b156152a35760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b6103a7916152bc6152b2835490565b6146c6600161097b565b908181036152cc575b505061521d565b614db46152df610d286152e69486610cdf565b9184610cdf565b38806152c5565b61044860001961097b565b919082519260006153088161097b565b855b8110156153525761531e614de882856130c2565b6153306001600160a01b0386166117c0565b146153485761534161530a916130b3565b9050615308565b9450505050600190565b5093505050611d186152ed565b9061536e6130eb6104ea845490565b9060005b81811061537f5750505090565b90919261539461312560019261311d876109a7565b929101615372565b906104489161535f565b906103a7610a99926153b760405190565b9384809261539c565b610448906153a6565b8054801561524057600019019061523d6153e38383610cdf565b90613a53565b61525a6153fe926153f9836153c0565b615479565b156154405760405162461bcd60e51b81526020600482015260156024820152743ab4b73a191a9b103737ba1034b71030b93930bc9760591b6044820152606490fd5b6103a79161544f6152b2835490565b9081810361545f575b50506153c9565b613dbd6152df6110a96154729486610cdf565b3880615458565b919082519260006154898161097b565b855b8110156153525761549f6132a882856130c2565b8414615348576154b161548b916130b3565b905061548956fea264697066735822122003aeb335a6d381b0a582f93c9d1aab7b6e89b54509710141d9511d69f98051bd64736f6c63430008120033", "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c80630373c0bf1461035257806303f693541461034d5780630d81539c146103485780630eaaf4c8146103435780630f2bc8b31461033e5780631756c30e146103395780631ce59f811461033457806321f67fbb1461032f5780632ac44f121461032a5780632f6db23814610325578063392e53cd146103205780633ec622791461031b5780634423c5f11461031657806346904840146103115780634f20fe5d1461030c5780635c975abb1461030757806364b55bed146103025780636759789f146102fd5780636aa633b6146102f85780636c2c9c7d146102f35780636caacbe7146102ee578063715018a6146102e95780637e064092146102e45780637e7a9c6c146102df5780637f17caa7146102da57806381c14314146102d557806386cfa7d3146102d057806387547367146102cb578063887f495a146102c65780638da5cb5b146102c15780639012c4a8146102bc578063944b8b2e146102b757806396ec50c3146102b25780639d8717a8146102ad578063a15ce280146102a8578063a8ef333f146102a3578063ad9287631461029e578063babcc53914610299578063bb46acd314610294578063bca0b9101461028f578063c0c53b8b1461028a578063c6a2aac814610285578063cf8e629a14610280578063ddca3f431461027b578063de74e57b14610276578063e38df96d14610271578063e6282c6e1461026c578063eb18a9d814610267578063f15851e614610262578063f160d3691461025d578063f2fde38b146102585763f6cda469036103c9576116f3565b6116db565b6116c3565b6116ab565b611690565b611678565b61165d565b61161a565b611474565b611450565b611438565b61141f565b6113dd565b6113b7565b611382565b611353565b611338565b611318565b6112b0565b6111c3565b61118e565b611151565b61112c565b611113565b6110cb565b6110af565b611012565b610ffa565b610fdf565b610fbb565b610fa3565b610f8b565b610ee3565b610ebc565b610e89565b610d31565b610cae565b610c87565b610bf9565b610b9e565b610963565b610935565b6108f7565b6108bb565b6108a3565b61088b565b610873565b610858565b610834565b6107fc565b6106da565b610682565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761038e57604052565b610357565b906103a76103a060405190565b928361036d565b565b6001600160401b03811161038e5760208091020190565b805b036103c957565b600080fd5b905035906103a7826103c0565b909291926103f06103eb826103a9565b610393565b93818552602080860192028301928184116103c957915b8383106104145750505050565b6020809161042284866103ce565b815201920191610407565b9080601f830112156103c957816020610448933591016103db565b90565b906020828203126103c95781356001600160401b0381116103c957610448920161042d565b9052565b6001600160a01b031690565b60005b8381106104935750506000910152565b8181015183820152602001610483565b6104c46104cd6020936104d7936104b8815190565b80835293849260200190565b95869101610480565b601f01601f191690565b0190565b906104fb6104f46104ea845190565b8084529260200190565b9260200190565b9060005b81811061050c5750505090565b9091926105296105226001928651815260200190565b9460200190565b9291016104ff565b80516001600160a01b031682526104489161012061058161014083016020858101516001600160a01b03169085015261056f60408601516040860152565b606085015184820360608601526104a3565b9261059160808201516080850152565b6105a060a082015160a0850152565b6105af60c082015160c0850152565b6105be60e082015160e0850152565b610100818101511515908401520151906101208184039101526104db565b8051825261044891604081019160200151906020818403910152610531565b90610448916105dc565b9061061b610611835190565b8083529160200190565b908161062d6020830284019460200190565b926000915b83831061064157505050505090565b9091929394602061066461065d838560019503875289516105fb565b9760200190565b9301930191939290610632565b602080825261044892910190610605565b346103c9576106a961069d61069836600461044b565b613266565b60405191829182610671565b0390f35b60009103126103c957565b610448916008021c81565b9061044891546106b8565b6104486000600c6106c3565b346103c9576106ea3660046106ad565b6106a96106f56106ce565b6040515b9182918290815260200190565b6001600160a01b0381166103c2565b905035906103a782610706565b6001600160401b03811161038e57602090601f01601f19160190565b90826000939282370152565b9092919261075a6103eb82610722565b938185526020850190828401116103c9576103a79261073e565b9080601f830112156103c9578160206104489335910161074a565b909160c0828403126103c9576107a583836103ce565b926107b381602085016103ce565b926107c182604083016103ce565b926107cf8360608401610715565b926080830135906001600160401b0382116103c9576107f381610448938601610774565b9360a0016103ce565b346103c95761081b61080f36600461078f565b94939093929192611b75565b604051005b906020828203126103c957610448916103ce565b346103c95761081b610847366004610820565b612961565b6104486000600f6106c3565b346103c9576108683660046106ad565b6106a96106f561084c565b346103c95761081b610886366004610820565b61258d565b346103c95761089b3660046106ad565b61081b61281a565b346103c9576108b33660046106ad565b61081b612be6565b346103c95761081b6108ce366004610820565b61282f565b90816102409103126103c95790565b90610240828203126103c957610448916108d3565b346103c95761081b61090a3660046108e2565b612106565b610448916008021c5b60ff1690565b90610448915461090f565b6104486000601061091e565b346103c9576109453660046106ad565b6106a9610950610929565b6040515b91829182901515815260200190565b346103c9576109733660046106ad565b61081b612b78565b6104486104486104489290565b906109929061097b565b600052602052604060002090565b6104489081565b61044890546109a0565b634e487b7160e01b600052602260045260246000fd5b90600160028304921680156109e7575b60208310146109e257565b6109b1565b91607f16916109d7565b80546000939291610a0e610a04836109c7565b8085529360200190565b9160018116908115610a605750600114610a2757505050565b610a3a9192939450600052602060002090565b916000925b818410610a4c5750500190565b805484840152602090930192600101610a3f565b92949550505060ff1916825215156020020190565b90610448916109f1565b906103a7610a9992610a9060405190565b93848092610a75565b038361036d565b61044890610918565b6104489054610aa0565b610abe906007610988565b90610ad082546001600160a01b031690565b91610add600182016109a7565b91610aea60028301610a7f565b91610af7600382016109a7565b91610b04600483016109a7565b91610b11600582016109a7565b916104486007610b23600685016109a7565b9301610aa9565b93989795610b8860e096610b81610b7988610b9698610b6c6103a79e99610b65610b8f9a600061010087019601906001600160a01b03169052565b60208d0152565b8a820360408c01526104a3565b9c6060890152565b6080870152565b60a0850152565b60c0830152565b019015159052565b346103c9576106a9610bb9610bb4366004610820565b610ab3565b94610bcc98969894919493929360405190565b98899889610b2a565b610448916008021c610474565b906104489154610bd5565b6104486000600b610be2565b346103c957610c093660046106ad565b6106a9610c14610bed565b6040515b918291826001600160a01b03909116815260200190565b90610c3e6104f46104ea845190565b9060005b818110610c4f5750505090565b909192610c6e61052260019286516001600160a01b0316815260200190565b929101610c42565b602080825261044892910190610c2f565b346103c957610c973660046106ad565b6106a9610ca26136f8565b60405191829182610c76565b346103c957610cbe3660046106ad565b6106a96109506118fa565b634e487b7160e01b600052603260045260246000fd5b8054821015610d0257610cf9600191600052602060002090565b91020190600090565b610cc9565b60016000610d13825490565b831015610d2e575061044891610d2891610cdf565b90610be2565b80fd5b346103c9576106a9610c14610d47366004610820565b610d07565b906020828203126103c95761044891610715565b80516001600160a01b03168252906104489060e080610d9e6101008401610d8c60208801516020870152565b604087015185820360408701526104a3565b94610dae60608201516060860152565b610dbd60808201516080860152565b610dcc60a082015160a0860152565b610ddb60c082015160c0860152565b01511515910152565b805182529061044890604080610e096060840160208701518582036020870152610d60565b9401511515910152565b9061044891610de4565b90610e29610611835190565b9081610e3b6020830284019460200190565b926000915b838310610e4f57505050505090565b90919293946020610e6b61065d83856001950387528951610e13565b9301930191939290610e40565b602080825261044892910190610e1d565b346103c9576106a9610ea4610e9f366004610d4c565b6134df565b60405191829182610e78565b6104486014600061091e565b346103c957610ecc3660046106ad565b6106a9610950610eb0565b6104486000600d6106c3565b346103c957610ef33660046106ad565b6106a96106f5610ed7565b90929192610f0e6103eb826103a9565b93818552602080860192028301928184116103c957915b838310610f325750505050565b60208091610f408486610715565b815201920191610f25565b9080601f830112156103c95781602061044893359101610efe565b906020828203126103c95781356001600160401b0381116103c9576104489201610f4b565b346103c95761081b610f9e366004610f66565b614f6c565b346103c957610fb33660046106ad565b61081b611743565b346103c95761081b610fce366004610820565b612f05565b6104486000600e6106c3565b346103c957610fef3660046106ad565b6106a96106f5610fd3565b346103c95761081b61100d366004610f66565b614e73565b346103c9576110223660046106ad565b61081b612788565b91906040838203126103c957610448906110448185610715565b936020016103ce565b61044890610474906001600160a01b031682565b6104489061104d565b61044890611061565b906109929061106a565b61108b600691600092611073565b90611094825490565b831015610d2e5750610448916110a991610cdf565b906106c3565b346103c9576106a96106f56110c536600461102a565b9061107d565b346103c95761081b6110de366004610d4c565b612d36565b90916060828403126103c9576104486110fc84846103ce565b9361110a81602086016103ce565b93604001610715565b346103c95761081b6111263660046110e3565b91612449565b346103c95761113c3660046106ad565b6106a9610c146000546001600160a01b031690565b346103c95761081b611164366004610820565b612dda565b61044860006011610be2565b6104709061106a565b6020810192916103a79190611175565b346103c95761119e3660046106ad565b6106a96111a9611169565b6040519182918261117e565b61108b600891600092611073565b346103c9576106a96106f56111d936600461102a565b906111b5565b906111eb610611835190565b90816111fd6020830284019460200190565b926000915b83831061121157505050505090565b9091929394602061122d61065d83856001950387528951610e13565b9301930191939290611202565b90610448916111df565b90611250610611835190565b90816112626020830284019460200190565b926000915b83831061127657505050505090565b9091929394602061129261065d8385600195038752895161123a565b9301930191939290611267565b602080825261044892910190611244565b346103c9576106a96112cb6112c636600461044b565b6135ce565b6040519182918261129f565b916060838303126103c9576112ec82846103ce565b926112fa83602083016103ce565b9260408201356001600160401b0381116103c9576104489201610774565b61081b6113263660046112d7565b91611c76565b61044860006012610be2565b346103c9576113483660046106ad565b6106a96111a961132c565b346103c95761081b611366366004610820565b612fc9565b6104489061137d600291600092611073565b61091e565b346103c9576106a9610950611398366004610d4c565b61136b565b91906040838203126103c9576104489061104481856103ce565b61081b6113c536600461139d565b90612695565b6104489061137d600991600092611073565b346103c9576106a96109506113f3366004610d4c565b6113cb565b90916060828403126103c9576104486114118484610715565b9361110a8160208601610715565b346103c95761081b6114323660046113f8565b91612b5a565b346103c9576114483660046106ad565b61081b615049565b346103c9576114603660046106ad565b61081b6150f4565b6104486000600a6106c3565b346103c9576114843660046106ad565b6106a96106f5611468565b805460009392916114a2610a04836109c7565b9160018116908115610a6057506001146114bb57505050565b6114ce9192939450600052602060002090565b916000925b8184106114e05750500190565b8054848401526020909301926001016114d3565b906104489161148f565b906103a7610a999261150f60405190565b938480926114f4565b611523906005610988565b80546001600160a01b03169161154360018301546001600160a01b031690565b91611550600282016109a7565b9161155d600383016114fe565b9161156a600482016109a7565b91611577600583016109a7565b91611584600682016109a7565b916104486008610b23600785016109a7565b9499989690610100966116056115fd61160c93610b96986115f06103a79e996115e96116139a60208f6115da61012082019860008301906001600160a01b03169052565b01906001600160a01b03169052565b60408d0152565b8a820360608c01526104a3565b9c6080890152565b60a0870152565b60c0850152565b60e0830152565b346103c9576106a9611635611630366004610820565b611518565b9561164899979995919594929460405190565b998a998a611596565b61044860016010610be2565b346103c95761166d3660046106ad565b6106a96111a9611651565b346103c95761081b61168b366004610820565b612454565b346103c9576106a961069d6116a6366004610d4c565b613312565b346103c95761081b6116be366004610820565b612243565b346103c95761081b6116d6366004610d4c565b612e3d565b346103c95761081b6116ee366004610d4c565b611864565b346103c95761081b611706366004610d4c565b612d8c565b61171361179f565b6103a7611731565b6104746104486104489290565b6104489061171b565b6103a761173e6000611728565b61189d565b6103a761170b565b1561175257565b60405162461bcd60e51b81528061179b600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6103a76117b46000546001600160a01b031690565b6117cd6117c033610474565b916001600160a01b031690565b1461174b565b6103a7906117df61179f565b61183f565b156117eb57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6103a79061173e6118536104746000611728565b6001600160a01b03831614156117e4565b6103a7906117d3565b906001600160a01b03905b9181191691161790565b906118926104486118999261106a565b825461186d565b9055565b6000546001600160a01b0316906118b5816000611882565b6118e86118e27f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09361106a565b9161106a565b916118f260405190565b80805b0390a3565b6104486004610aa9565b6104489060a01c610918565b6104489054611904565b1561192157565b60405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc81a5cc81b9bdd08185b1b1bddd95960521b6044820152606490fd5b906103a795949392916119726000611910565b156119975761199261198d611988336002611073565b610aa9565b61191a565b6119ed565b611992600161191a565b156119a857565b60405162461bcd60e51b815260206004820152601c60248201527f436f6e7472616374206d75737420626520696e697469616c697a6564000000006044820152606490fd5b906103a79594939291611a08611a036010610aa9565b6119a1565b906103a79594939291611a19611bc2565b611a71565b9081526040810192916103a79160200152565b6040513d6000823e3d90fd5b611a6a6103a794611a63606094989795611a5c608086019a6000870152565b6020850152565b6040830152565b0190611175565b9385611a9791969396611a8e611a868761106a565b858a8a6138e9565b85888589613dc3565b91611ab2611aad6011546001600160a01b031690565b61106a565b6327d335a890803b156103c957611ad891600091611acf60405190565b93849260e01b90565b8252818381611aeb8a8d60048401611a1e565b03925af18015611b7057611b52575b50611b4d3394611b3a611b36611b307f77a8be0890be6d79729c684636469d83d455e267a0bf0c9bc2463d8db867a5419761097b565b9761106a565b9790565b97611b4460405190565b94859485611a3d565b0390a4565b611b6a906000611b62818361036d565b8101906106ad565b38611afa565b611a31565b906103a7959493929161195f565b15611b8a57565b60405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606490fd5b6103a7611bd4611bd06118fa565b1590565b611b83565b90611bec9291611be7611cf8565b611bf4565b6103a7611d34565b906103a79291611c02611bc2565b9091611c2a9034938484611c1a610448826005610988565b611c25848483613f91565b61414e565b903391611b4d611c6c611c66611c607f6d2b783673dbbf046f2e5a1f3c92ce62c29a0f5385f2b1f0eaf19019ef28cb559461097b565b9461097b565b9461106a565b946106f960405190565b906103a79291611bd9565b610448600261097b565b15611c9257565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b9060001990611878565b90611cf16104486118999261097b565b8254611cd7565b6103a7611d0560036109a7565b611d23611d10611c81565b918290611d1c565b9190565b1415611c8b565b6003611ce1565b610448600161097b565b6103a7611d23611d2a565b6103a790611d50611a036010610aa9565b611bec90611d5c611cf8565b6103a790611d68611bc2565b611f2e565b6104489060081c610474565b6104489054611d6d565b905051906103a7826103c0565b90929192611da06103eb82610722565b938185526020850190828401116103c9576103a792610480565b9080601f830112156103c957815161044892602001611d90565b6080818303126103c957611de88282611d83565b92611df68360208401611d83565b926040830151906001600160401b0382116103c957611e1a81610448938601611dba565b93606001611d83565b9037565b6103a791604091611e23565b906104d781604093611e27565b611e4c611d1860029390565b806000925b848410611e5f575050505050565b611e7b611e74600192611e6f8690565b611e33565b9360400190565b93019291611e51565b6103a79161014091611e23565b6103a7919061010090611ecf90611ea88482611e27565b611eb9604082016040860190611e40565b611eca60c0820160c0860190611e27565b820190565b910190611e84565b610240810192916103a79190611e91565b9081526040810192916103a7916020906115da565b634e487b7160e01b600052601160045260246000fd5b9190611f1e565b9290565b8203918211611f2957565b611efd565b6000611f6b91611f41611aad6010611d79565b611f60836365cd296c611f5360405190565b9687958694859360e01b90565b835260048301611ed7565b03925af18015611b70576000918291829182916120dd575b50611fbb611f95610448846007610988565b93600595611fb36104486001880198611fad8a6109a7565b90610988565b9384876143af565b611fd0611aad6011546001600160a01b031690565b90632b8a8002611fe2600483016109a7565b85546001600160a01b03165b93803b156103c9576120166000809461202161200960405190565b9889968795869460e01b90565b845260048401611ee8565b03925af1908115611b70576120719561207d93612076936120c7575b5061204a600687016109a7565b96828661206b61206560018c9701546001600160a01b031690565b946109a7565b98614557565b6148fd565b8094611f13565b926120b16120ab7f3247261fffac93019b3a34aa6692df18a5ddea75a12bf8ec4539903a608a6e4c9361097b565b9361097b565b936118f56120be60405190565b92839283611a1e565b6120d7906000611b62818361036d565b3861203d565b925090506120fd92503d8091833e6120f5818361036d565b810190611dd4565b90919238611f83565b6103a790611d3f565b611bec9061211b611cf8565b6121ad565b1561212757565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206973206e6f7420626964206f776e65720000000000000000006044820152606490fd5b1561217357565b60405162461bcd60e51b81526020600482015260126024820152714c697374696e67206e6f742061637469766560701b6044820152606490fd5b6121bb610448826007610988565b60018101916121d16104486005611fad866109a7565b82906121f66121e783546001600160a01b031690565b6121f0336117c0565b14612120565b61220a61220560088301610aa9565b61216c565b61221f611aad6011546001600160a01b031690565b91632b8a800290611fee612235600485016109a7565b91546001600160a01b031690565b6103a79061210f565b906103a7929161225a611bc2565b612364565b1561226657565b60405162461bcd60e51b815260206004820152601b60248201527f43616c6c6572206973206e6f74206c697374696e67206f776e657200000000006044820152606490fd5b156122b257565b60405162461bcd60e51b8152602060048201526024808201527f41736b207072696365206973206c657373207468616e206d696e2062696420706044820152637269636560e01b6064820152608490fd5b1561230a57565b60405162461bcd60e51b815260206004820152601a60248201527f496e76616c69642073616c652045544820726563697069656e740000000000006044820152606490fd5b9081526040810192916103a791602090611a6a565b919091612375610448826005610988565b9161240081600161238d86546001600160a01b031690565b3396906123a39061239d896117c0565b1461225f565b6123b261220560088301610aa9565b6123cd6123c4610448600784016109a7565b895b10156122ab565b6123ed6123dd6104746000611728565b6123e68561106a565b1415612303565b6123fa8860068301611ce1565b01611882565b61243361242d7f6df0cec5e0539cca31fe823df048a8d5834ba5dc079fa1d38e5157f00f9d085b9361097b565b9361106a565b936118f561244060405190565b9283928361234f565b906103a7929161224c565b612462610448826005610988565b80546001600160a01b031633919061247d9061239d846117c0565b61248c61220560088301610aa9565b6124a1611aad6011546001600160a01b031690565b90636e74da686124b3600483016109a7565b833b156103c9576124e9936124db600080946124ce60405190565b9788958694859360e01b90565b835260048301526024820190565b03925af1908115611b7057612505928592612532575b50614ca6565b6118e86118e27f5832f888aea12cc23bd891f2d9fd4bd01b8ce0e22898b6e7cee1519f5bd469549361097b565b612542906000611b62818361036d565b386124ff565b1561254f57565b60405162461bcd60e51b815260206004820152601660248201527543616c6c6572206973206e6f7420726567697374727960501b6044820152606490fd5b6125cb8161259f610448826005610988565b6125c66125b7611aad6011546001600160a01b031690565b6125c0336117c0565b14612548565b614ca6565b6125f57ff7504a55c42715ea3e852b679d6453ecfe02acbddb4d0652aa251d4458b7cc219161097b565b906125ff60405190565b80805b0390a2565b90611bec91612614611cf8565b906103a791612621611bc2565b612659826006612635610448856007610988565b6126538361264d6104486005611fad600187016109a7565b8361465d565b01611ce1565b33906118f561268b61242d7f8283dd04c4a2b6691bd80232f254e0ad876b8bb149938d3e7ced5c6e8a35b6149361097b565b936106f960405190565b906103a791612607565b6126ac611a036010610aa9565b6103a7612720565b156126bb57565b60405162461bcd60e51b815260206004820152601e60248201527f496e7374616e742061636365707420616c726561647920656e61626c656400006044820152606490fd5b9060ff90611878565b9061271961044861189992151590565b8254612700565b3380612751600961273f61273a611bd06119888685611073565b6126b4565b61274c6001948592611073565b612709565b61260261277e7f2e259e0564e75f0e10ce0e012a5ce2528ae513b0188b619bcc581b8ba8db70329261106a565b9261095460405190565b6103a761269f565b61279d611a036010610aa9565b6103a76127f1565b156127ac57565b60405162461bcd60e51b815260206004820152601f60248201527f496e7374616e742061636365707420616c72656164792064697361626c6564006044820152606490fd5b3380612751600961280d6128086119888584611073565b6127a5565b61274c6000948592611073565b6103a7612790565b91908201809211611f2957565b6128a1600060076128936128466104488684610988565b91612889600561286d612867610448612861600189016109a7565b84610988565b86614781565b6128814261287b600f6109a7565b90612822565b908501611ce1565b6001908301612709565b01546001600160a01b031690565b6118e86118e27f9da9db6af7fcfa5edbaa006b61a744d33fe4651a4c594cddd3e9a7e757ecd8d59361097b565b611bec906128da611cf8565b6128e8610448826007610988565b9061291d6129006104486005611fad600187016109a7565b61290a8185614872565b82612917600686016109a7565b94614c0b565b33906129318361292c8461106a565b612a59565b6118f561268b61242d7f8f8619524e8d462cead34604bd2247ede24175801481e4d0b8059ac8aa41c3019361097b565b6103a7906128ce565b1561297157565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606490fd5b906129c36103eb83610722565b918252565b3d156129e2576129d73d6129b6565b903d6000602084013e565b606090565b156129ee57565b60405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608490fd5b60006103a792612a7a8293611aad612a703061106a565b849031101561296a565b90612a8460405190565b90818003925af1612a936129c8565b506129e7565b906103a79291612aa761179f565b612b18565b15612ab357565b60405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b90610100600160a81b039060081b611878565b90612b116104486118999261106a565b8254612aee565b612b4e9291612b40612b4792612b39612b34611bd06010610aa9565b612aac565b6010612b01565b6011611882565b6012611882565b6103a760016010612709565b906103a79291612a99565b612b6d61179f565b6103a76103a7612bcb565b6103a7612b65565b612b88611bc2565b6103a7612b9760016004612709565b33612bc67f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25891610c1860405190565b0390a1565b6103a7612b80565b612bdb61179f565b6103a76103a7612c34565b6103a7612bd3565b612bf6612c7f565b6103a7612c0560006004612709565b33612bc67f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa91610c1860405190565b6103a7612bee565b15612c4357565b60405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606490fd5b6103a7612c8a6118fa565b612c3c565b6103a790612c9b61179f565b612cde565b15612ca757565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b612d01612cea8261106a565b612cfa6117c06104746000611728565b1415612ca0565b612d0c816010612b01565b6125f57f9106eb309cc633a951e77bd36af34646a9df8e6ade485938c34e3844a37b79da9161106a565b6103a790612c8f565b6103a790612d4b61179f565b612d57612cea8261106a565b612d62816012611882565b6125f57f9d3407c7200ba4f49e97f3d3f8250ec01c24b0ada6fa31053d71850793b739539161106a565b6103a790612d3f565b6103a790612da161179f565b612dac81600a611ce1565b612bc67f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c76916106f960405190565b6103a790612d95565b6103a790612def61179f565b612e08612dff6104746000611728565b612cfa8361106a565b612e1381600b611882565b6125f57f7a7b5a0a132f9e0581eb8527f66eae9ee89c2a3e79d4ac7e41a1f1f4d48a7fc29161106a565b6103a790612de3565b6103a790612e5261179f565b612eb8565b15612e5e57565b60405162461bcd60e51b815260206004820152602c60248201527f42696420736574746c656d656e7420706572696f64206d75737420626520677260448201526b06561746572207468616e20360a41b6064820152608490fd5b612ecc612ec5600061097b565b8211612e57565b612ed781600e611ce1565b612bc67f09a165ff77cf0f319f9ece89bc6dbe2a469a0da2640c9e6b501132846843daf5916106f960405190565b6103a790612e46565b6103a790612f1a61179f565b612f7c565b15612f2657565b60405162461bcd60e51b815260206004820152602860248201527f42696420726566756e6420706572696f64206d75737420626520677265617465604482015267072207468616e20360c41b6064820152608490fd5b612f90612f89600061097b565b8211612f1f565b612f9b81600f611ce1565b612bc67f90e0312fddcd5cbec358d5c7d63976e5c97d71dfb8d6cd5f2c53b0a1a043ccf0916106f960405190565b6103a790612f0e565b906129c36103eb836103a9565b6104486040610393565b610448610140610393565b612ffc612fe9565b906000825260208080808080808080808b01600081520160008152016060815201600081520160008152016000815201600081520160008152016060905250565b905250565b610448612ff4565b613052612fdf565b9060008252602080830161303d613042565b61044861304a565b60005b82811061307b57505050565b602090613086613064565b818401520161306f565b906103a76130a66130a084612fd2565b936103a9565b601f19016020840161306c565b6000198114611f295760010190565b906130cb825190565b811015610d02576020809102010190565b906130f76130eb6104ea845490565b92600052602060002090565b9060005b8181106131085750505090565b90919261312c61312560019261311d876109a7565b815260200190565b9460010190565b9291016130fb565b90610448916130dc565b906103a7610a999261314f60405190565b93848092613134565b906103a76132556009613169612fe9565b9461318b61317e82546001600160a01b031690565b6001600160a01b03168752565b6131b26131a260018301546001600160a01b031690565b6001600160a01b03166020880152565b6131c86131c1600283016109a7565b6040880152565b6131de6131d7600383016114fe565b6060880152565b6131f46131ed600483016109a7565b6080880152565b61320a613203600583016109a7565b60a0880152565b613220613219600683016109a7565b60c0880152565b61323661322f600783016109a7565b60e0880152565b61324f61324560088301610aa9565b1515610100880152565b0161313e565b610120840152565b61044890613158565b90613277613272835190565b613090565b91600090836132858361097b565b613290610448845190565b81101561330257806132ac6132a86132fd93866130c2565b5190565b6132e26132db6132c46005611fad6132a8878b6130c2565b6132d66132cf612fdf565b948a860152565b61325d565b6020830152565b6132ec82896130c2565b526132f781886130c2565b506130b3565b613285565b5093505050565b6104489061313e565b61332961332e91613321606090565b506006611073565b613309565b9061333a613272835190565b91600090836133488361097b565b613353610448845190565b811015613302578061336b6132a861337c93866130c2565b6132e26132db6132c4836005610988565b613348565b6104486060610393565b610448610100610393565b61339e61338b565b906000825260208080808080808089016000815201606081520160008152016000815201600081520160005b8152016000905250565b610448613396565b6133e4613381565b90600082526020808084016133ca6133d4565b6104486133dc565b60005b82811061340e57505050565b6020906134196133f7565b8184015201613402565b906103a76134336130a084612fd2565b601f1901602084016133ff565b906103a76134cd600761345161338b565b9461346661317e82546001600160a01b031690565b61347c613475600183016109a7565b6020880152565b61348b6131c160028301610a7f565b61349a6131d7600383016109a7565b6134a96131ed600483016109a7565b6134b8613203600583016109a7565b6134c7613219600683016109a7565b01610aa9565b151560e0840152565b61044890613440565b906134ee613329836008611073565b6134fe6134f9825190565b613423565b926000918461350c8461097b565b613517610448845190565b81101561358c578061352f6132a861358793866130c2565b61357261353d826007610988565b613569611a5c6135516119888b6009611073565b9261356461355d613381565b968d880152565b6134d6565b15156040830152565b61357c828a6130c2565b526132f781896130c2565b61350c565b509450505050565b60005b8281106135a357505050565b606082820152602001613597565b906103a76135c16130a084612fd2565b601f190160208401613594565b6135de6135d9825190565b6135b1565b806000916135eb8361097b565b945b6135f8610448865190565b8610156136f057613621600961361b6136146132a88a8a6130c2565b6005610988565b01613309565b9461362d6134f9875190565b61363788866130c2565b5261364287856130c2565b5061364c8561097b565b613657610448885190565b8110156136d957806132f781886136b86136776132a86136d4978e6130c2565b613569611a5c60076135646136a96119886136928785610988565b936136a38a6128938a600994610988565b90611073565b946136b2613381565b97880152565b6136c28c8a6130c2565b51906136ce83836130c2565b526130c2565b61364c565b50929450946136e7906130b3565b949391936135ed565b935093505050565b61044861517f565b905051906103a782610706565b91909160a0818403126103c95761372460a0610393565b9260006137318284613700565b908501526020820151906001600160401b0382116103c9576137588161378b938501611dba565b6020860152604061376b82828601611d83565b90860152606061377d82828601613700565b908601526080809301611d83565b90830152565b9190916040818403126103c9576137a86040610393565b9260006137b58284611d83565b9085015260208201516001600160401b0381116103c9576132db920161370d565b906020828203126103c95781516001600160401b0381116103c9576104489201613791565b1561380257565b60405162461bcd60e51b815260206004820152601a60248201527f43616c6c6572206973206e6f7420646f6d61696e206f776e65720000000000006044820152606490fd5b1561384e57565b60405162461bcd60e51b815260206004820152602160248201527f446f6d61696e20616c7265616479206c6973746564206f6e20726567697374726044820152607960f81b6064820152608490fd5b156138a457565b60405162461bcd60e51b815260206004820152601960248201527f4d696e696d756d20626964207072696365206973207a65726f000000000000006044820152606490fd5b60006139269194939294613908611aad6011546001600160a01b031690565b6124db631a24254761391960405190565b9586948593849360e01b90565b03915afa938415611b70576104746123e6936123c6611d18613985606060206103a79b6117c0996000916139bf575b5001805151613976906001600160a01b0316613970336117c0565b146137fb565b5101516001600160a01b031690565b946104486139b860006139b361399a82611728565b996139ad6001600160a01b038c166117c0565b14613847565b61097b565b821161389d565b6139da913d8091833e6139d2818361036d565b8101906137d6565b38613955565b369037565b906103a76139f56130a084612fd2565b601f1901602084016139e0565b634e487b7160e01b600052600060045260246000fd5b90611cf16104486118999290565b9160001960089290920291821b911b611878565b9190613a4b6104486118999361097b565b908354613a26565b6103a791600091613a3a565b818110613a6a575050565b80613a786000600193613a53565b01613a5f565b9190601f8111613a8d57505050565b613a9f6103a793600052602060002090565b906020601f840181900483019310613ac2575b6020601f909101045b0190613a5f565b9091508190613ab2565b600019600883021c1916906002021790565b90613ae7815190565b906001600160401b03821161038e57613b0a82613b0485546109c7565b85613a7e565b602090601f8311600114613b3857611899929160009183613b2d575b5050613acc565b015190503880613b26565b601f19831691613b4d85600052602060002090565b9260005b818110613b8b57509160029391856001969410613b72575b50505002019055565b01516000196008601f8516021c19169055388080613b69565b91936020600181928787015181550195019201613b51565b906103a791613ade565b81810292918115918404141715611f2957565b818110613bcb575050565b80613bd96000600193613a53565b01613bc0565b90613bf290600019906020036008021c90565b8154169055565b9091828110613c0757505050565b6103a79290613c15906130eb565b9081019101613bc0565b90600160401b811161038e5781613c376103a7935490565b90828155613bf9565b8151916001600160401b03831161038e57613c6a6130eb600192613c648686613c1f565b60200190565b92049160005b838110613c7d5750505050565b6001906020613c8d610448865190565b9401938184015501613c70565b906103a791613c40565b6103a79190613d8a9061012090600990613ccf81613cc987516001600160a01b031690565b90611882565b613cea60018201613cc960208801516001600160a01b031690565b613d0260028201613cfc604088015190565b90613a18565b613d1a60038201613d14606088015190565b90613ba3565b613d2c60048201613cfc608088015190565b613d4460058201613d3e60a088015190565b90611ce1565b613d5660068201613d3e60c088015190565b613d6860078201613d3e60e088015190565b613d8360088201613d7d610100880151151590565b90612709565b0192015190565b90613c9a565b906103a791613ca4565b90815491600160401b83101561038e5782613dbd9160016103a795018155610cdf565b90613a3a565b919295949095613dd1600090565b50613ddc600d6109a7565b93849733944290600198600096613df28861097b565b613dfb906139e5565b9689613e05612fe9565b998a0190613e1b91906001600160a01b03169052565b6001600160a01b0316602089015260408801526060870152608086015260a085015260c084015260e0830152841515610100830152610120820152613e61836005610988565b90613e6b91613d90565b613e76906006611073565b90613e8091613d9a565b613e8a600d6109a7565b90613e949061097b565b613e9d91612822565b6103a790600d611ce1565b15613eaf57565b60405162461bcd60e51b8152602060048201526016602482015275131a5cdd1a5b99c8191bd95cc81b9bdd08195e1a5cdd60521b6044820152606490fd5b15613ef457565b60405162461bcd60e51b8152602060048201526024808201527f426964207072696365206973206c657373207468616e206d696e2062696420706044820152637269636560e01b6064820152608490fd5b15613f4c57565b60405162461bcd60e51b815260206004820152601d60248201527f427579657220494420686173682063616e6e6f7420626520656d7074790000006044820152606490fd5b611d18610448613ffb926139b36103a79695613ff4611d186104486007613fc260008801546001600160a01b031690565b96613fdf600098613fd86117c06104748c611728565b1415613ea8565b613fee61220560088301610aa9565b016109a7565b1015613eed565b1415613f45565b9061400b815190565b906001600160401b03821161038e5761402882613b0485546109c7565b602090601f831160011461404a57611899929160009183613b2d575050613acc565b601f1983169161405f85600052602060002090565b9260005b81811061408357509160029391856001969410613b725750505002019055565b91936020600181928787015181550195019201614063565b906103a791614002565b6103a79190613d7d9060e0906007906140c981613cc987516001600160a01b031690565b6140db60018201613d3e602088015190565b6140f3600282016140ed604088015190565b9061409b565b61410560038201613cfc606088015190565b61411760048201613d3e608088015190565b61412960058201613d3e60a088015190565b61413b60068201613d3e60c088015190565b01920151151590565b906103a7916140a5565b919493909261415d600c6109a7565b93849283973393426000199160009461417461338b565b6001600160a01b0389168782015296602088015260408701526060860152608085015260a084015260c0830152151560e08201526141b3836007610988565b906141bd91614144565b6141c8906008611073565b906141d291613d9a565b600901906141df91613d9a565b6141e9600c6109a7565b6141f3600161097b565b6141fc91612822565b6103a790600c611ce1565b1561420e57565b60405162461bcd60e51b8152602060048201526012602482015271109a5908191bd95cc81b9bdd08195e1a5cdd60721b6044820152606490fd5b8015156103c2565b905051906103a782614248565b906020828203126103c95761044891614250565b1561427857565b60405162461bcd60e51b815260206004820152601d60248201527f496e76616c6964206d616e6167656420444b494d206b657920686173680000006044820152606490fd5b156142c457565b60405162461bcd60e51b815260206004820152601c60248201527f496e76616c696420637573746f6d20444b494d206b65792068617368000000006044820152606490fd5b6104d76143219260209261431b815190565b94859290565b93849101610480565b61044891614309565b1561433a57565b60405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2103932b1b2b4bb32b960811b6044820152606490fd5b1561437957565b60405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b2103237b6b0b4b760911b6044820152606490fd5b80549294909391926001600160a01b03166143dc6000916143d56117c061047485611728565b1415614207565b6143fb6143f2828601546001600160a01b031690565b61239d336117c0565b61440a61220560088601610aa9565b6002840190614421611d186104486120ab856109a7565b146144ac576144a693613fee611d18946144a0611d18611f1a6003611f1a9861445e6103a79e614458611d1861044860049d6109a7565b146142bd565b61448661446a60405190565b809261447a60208301918261432a565b9081038252038261036d565b614498614491825190565b9160200190565b209b016109a7565b14614333565b14614372565b5060206144e793956144c9611aad6012546001600160a01b031690565b6124db6319d091526144da60405190565b9788948593849360e01b90565b03915afa908115611b70576103a795613fee611d18946144a0611d18611f1a6003600497614524611f1a9a6144a69d600091614529575b50614271565b61445e565b61454a915060203d8111614550575b614542818361036d565b81019061425d565b3861451e565b503d614538565b90916125c6816103a794612917600186016109a7565b1561457457565b60405162461bcd60e51b815260206004820152601860248201527f526566756e6420616c726561647920696e6974696174656400000000000000006044820152606490fd5b156145c057565b60405162461bcd60e51b8152602060048201526024808201527f4e6577207072696365206e6f742067726561746572207468616e206f6c6420706044820152637269636560e01b6064820152608490fd5b1561461857565b60405162461bcd60e51b815260206004820152601c60248201527f496e636f727265637420616d6f756e74206f66204554482073656e74000000006044820152606490fd5b611d1861044860066146cc936146a461220560086103a7999861468d6121e760008701546001600160a01b031690565b6134c761469f611bd060078801610aa9565b61456d565b01936146bc6146b5610448876109a7565b82116145b9565b6146c634956109a7565b90611f13565b14614611565b156146d957565b60405162461bcd60e51b815260206004820152601960248201527f526566756e6420706572696f64206e6f742073746172746564000000000000006044820152606490fd5b1561472557565b60405162461bcd60e51b815260206004820152602e60248201527f4c697374696e6720657870697265642e204269642063616e206265207769746860448201526d647261776e206469726563746c7960901b6064820152608490fd5b60086103a7926134c76147de936147a56121e760008301546001600160a01b031690565b6147b761469f611bd060078401610aa9565b6147d8611d18610448429361287b60046147d1600e6109a7565b92016109a7565b116146d2565b61471e565b156147ea57565b60405162461bcd60e51b81526020600482015260146024820152731499599d5b99081b9bdd081a5b9a5d1a585d195960621b6044820152606490fd5b1561482d57565b60405162461bcd60e51b815260206004820152601760248201527f526566756e6420706572696f64206e6f7420656e6465640000000000000000006044820152606490fd5b9061488e906008906134c76121e785546001600160a01b031690565b6148955750565b806148ad6148a860076103a79401610aa9565b6147e3565b6148c0611d1861044860054294016109a7565b1015614826565b610448670de0b6b3a764000061097b565b634e487b7160e01b600052601260045260246000fd5b81156148f8570490565b6148d8565b909190614939614927614919614913600a6109a7565b86613bad565b6149216148c7565b906148ee565b91614933838096611f13565b90612a59565b614943600061097b565b811161494c5750565b6103a79061292c600b546001600160a01b031690565b9190613a4b6104486118999390565b6103a791600091614962565b9060009161499b61499382600052602060002090565b928354613acc565b905555565b91929060208210156149f857601f84116001146149c257611899929350613acc565b50906149f36103a79360016149ea6149df85600052602060002090565b92601f602091010490565b82019101613a5f565b61497d565b50614a318293614a0f600194600052602060002090565b613abb6020601f860104820192601f861680614a39575b50601f602091010490565b600202179055565b614a4590888603613bdf565b38614a26565b929091600160401b821161038e5760201115614a92576020811015614a735761189991613acc565b60019160ff1916614a8984600052602060002090565b55600202019055565b60019150600202019055565b908154614aaa816109c7565b90818311614ad3575b818310614ac1575b50505050565b614aca936149a0565b38808080614abb565b614adf83838387614a4b565b614ab3565b60006103a791614a9e565b90600003614b00576103a790614ae4565b613a02565b60006103a791613c1f565b90600003614b00576103a790614b05565b600060096103a7928280820155826001820155614b418360028301614971565b614b4e8360038301614aef565b614b5b8360048301614971565b614b688360058301613a53565b614b758360068301613a53565b614b828360078301613a53565b82600882015501614b10565b90600003614b00576103a790614b21565b600080825590600790614bb58360018301613a53565b614bc28360028301614aef565b614bcf8360038301614971565b614bdc8360048301613a53565b614be98360058301613a53565b614bf68360068301613a53565b0155565b90600003614b00576103a790614b9f565b600091614c6a916103a794614c55611bd06008614c4686614c41610448614c3b8c8a01546001600160a01b031690565b85611073565b6153e9565b60098401936134c787866153e9565b9081614c90575b50614c6f575b506007610988565b614bfa565b83614c85614c8a92611fad6001600592016109a7565b614b8e565b38614c62565b549050614c9f611d188661097b565b1438614c5c565b614cdf6009600092614cbb8460088301612709565b614cda85614c4161044860066136a3898701546001600160a01b031690565b015490565b614ceb611d188361097b565b14614cf4575050565b614c856103a7926005610988565b6103a790614d0e61179f565b614dba565b15614d1a57565b60405162461bcd60e51b815260206004820152601c60248201527f4164647265737320616c7265616479206f6e20616c6c6f776c697374000000006044820152606490fd5b916001600160a01b0360089290920291821b911b611878565b9190614d896104486118999361106a565b908354614d5f565b90815491600160401b83101561038e5782614db49160016103a795018155610cdf565b90614d78565b90614dc5600061097b565b614dd0610448845190565b811015614e6e5780614df5614de8614e6993866130c2565b516001600160a01b031690565b614e2c81614e27816104486002614e1a614e15611bd06119888685611073565b614d13565b61274c6001938492611073565b614d91565b614e567f41f4a012571b6bf21f3c6557be5d1a28851ce415203203b84c14099b84fe97379161106a565b90614e6060405190565b600090a26130b3565b614dc5565b509050565b6103a790614d02565b6103a790614e8861179f565b614ed9565b15614e9457565b60405162461bcd60e51b815260206004820152601a60248201527f4164647265737320616c726561647920646973616c6c6f7765640000000000006044820152606490fd5b906000614ee58161097b565b614ef0610448855190565b811015614f665780614f08614de8614f6193876130c2565b614f2c8461274c836002614f27614f226119888484611073565b614e8d565b611073565b614f37816001615245565b614e567ff27dccb929dd3f4dba2d3ffc29a7c74e35995e051a268a7c466f9ddabdf81eac9161106a565b614ee5565b50509050565b6103a790614e7c565b614f7d61179f565b6103a7614ff7565b15614f8c57565b60405162461bcd60e51b815260206004820152601d60248201527f416c6c6f77206c69737420697320616c726561647920656e61626c65640000006044820152606490fd5b9060ff60a01b9060a01b611878565b90614ff061044861189992151590565b8254614fd1565b61500c615007611bd06000611910565b614f85565b61501860016000614fe0565b7f8a943acd5f4e6d3df7565a4a08a93f6b04cc31bb6c01ca4aef7abd6baf455ec361504260405190565b8080612bc6565b6103a7614f75565b61505961179f565b6103a76150ad565b1561506857565b60405162461bcd60e51b815260206004820152601e60248201527f416c6c6f77206c69737420697320616c72656164792064697361626c656400006044820152606490fd5b6150bf6150ba6000611910565b615061565b6150ca600080614fe0565b7f2d35c8d348a345fd7b3b03b7cfcf7ad0b60c2d46742d5ca536342e4185becb0761504260405190565b6103a7615051565b9061510b6130eb6104ea845490565b9060005b81811061511c5750505090565b90919261514a61312560019261513987546001600160a01b031690565b6001600160a01b0316815260200190565b92910161510f565b90610448916150fc565b906103a7610a999261516d60405190565b93848092615152565b6104489061515c565b6104486001615176565b906151986130eb6104ea845490565b9060005b8181106151a95750505090565b9091926151c661312560019261513987546001600160a01b031690565b92910161519c565b9061044891615189565b906103a7610a99926151e960405190565b938480926151ce565b610448906151d8565b634e487b7160e01b600052603160045260246000fd5b6103a791600091614d78565b8054801561524057600019019061523d6152378383610cdf565b90615211565b55565b6151fb565b61525a61526192615255836151f2565b6152f8565b9092901590565b156152a35760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b6103a7916152bc6152b2835490565b6146c6600161097b565b908181036152cc575b505061521d565b614db46152df610d286152e69486610cdf565b9184610cdf565b38806152c5565b61044860001961097b565b919082519260006153088161097b565b855b8110156153525761531e614de882856130c2565b6153306001600160a01b0386166117c0565b146153485761534161530a916130b3565b9050615308565b9450505050600190565b5093505050611d186152ed565b9061536e6130eb6104ea845490565b9060005b81811061537f5750505090565b90919261539461312560019261311d876109a7565b929101615372565b906104489161535f565b906103a7610a99926153b760405190565b9384809261539c565b610448906153a6565b8054801561524057600019019061523d6153e38383610cdf565b90613a53565b61525a6153fe926153f9836153c0565b615479565b156154405760405162461bcd60e51b81526020600482015260156024820152743ab4b73a191a9b103737ba1034b71030b93930bc9760591b6044820152606490fd5b6103a79161544f6152b2835490565b9081810361545f575b50506153c9565b613dbd6152df6110a96154729486610cdf565b3880615458565b919082519260006154898161097b565b855b8110156153525761549f6132a882856130c2565b8414615348576154b161548b916130b3565b905061548956fea264697066735822122003aeb335a6d381b0a582f93c9d1aab7b6e89b54509710141d9511d69f98051bd64736f6c63430008120033", @@ -1892,7 +1892,7 @@ "type": "t_address" }, { - "astId": 5930, + "astId": 8064, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "isEnabled", "offset": 20, @@ -1900,7 +1900,7 @@ "type": "t_bool" }, { - "astId": 5933, + "astId": 8067, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "allowedAddresses", "offset": 0, @@ -1908,7 +1908,7 @@ "type": "t_array(t_address)dyn_storage" }, { - "astId": 5937, + "astId": 8071, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "isAllowed", "offset": 0, @@ -1932,15 +1932,15 @@ "type": "t_bool" }, { - "astId": 3236, + "astId": 4981, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "listings", "offset": 0, "slot": "5", - "type": "t_mapping(t_uint256,t_struct(Listing)3191_storage)" + "type": "t_mapping(t_uint256,t_struct(Listing)4936_storage)" }, { - "astId": 3241, + "astId": 4986, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "userListings", "offset": 0, @@ -1948,15 +1948,15 @@ "type": "t_mapping(t_address,t_array(t_uint256)dyn_storage)" }, { - "astId": 3246, + "astId": 4991, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "bids", "offset": 0, "slot": "7", - "type": "t_mapping(t_uint256,t_struct(Bid)3214_storage)" + "type": "t_mapping(t_uint256,t_struct(Bid)4959_storage)" }, { - "astId": 3251, + "astId": 4996, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "userBids", "offset": 0, @@ -1964,7 +1964,7 @@ "type": "t_mapping(t_address,t_array(t_uint256)dyn_storage)" }, { - "astId": 3255, + "astId": 5000, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "instantAcceptEnabled", "offset": 0, @@ -1972,7 +1972,7 @@ "type": "t_mapping(t_address,t_bool)" }, { - "astId": 3257, + "astId": 5002, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "fee", "offset": 0, @@ -1980,7 +1980,7 @@ "type": "t_uint256" }, { - "astId": 3259, + "astId": 5004, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "feeRecipient", "offset": 0, @@ -1988,7 +1988,7 @@ "type": "t_address_payable" }, { - "astId": 3261, + "astId": 5006, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "bidCounter", "offset": 0, @@ -1996,7 +1996,7 @@ "type": "t_uint256" }, { - "astId": 3263, + "astId": 5008, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "listingCounter", "offset": 0, @@ -2004,7 +2004,7 @@ "type": "t_uint256" }, { - "astId": 3265, + "astId": 5010, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "bidSettlementPeriod", "offset": 0, @@ -2012,7 +2012,7 @@ "type": "t_uint256" }, { - "astId": 3267, + "astId": 5012, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "bidRefundPeriod", "offset": 0, @@ -2020,7 +2020,7 @@ "type": "t_uint256" }, { - "astId": 3269, + "astId": 5014, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "isInitialized", "offset": 0, @@ -2028,28 +2028,28 @@ "type": "t_bool" }, { - "astId": 3272, + "astId": 5017, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "transferDomainProcessor", "offset": 1, "slot": "16", - "type": "t_contract(ITransferDomainProcessor)7099" + "type": "t_contract(ITransferDomainProcessor)11791" }, { - "astId": 3275, + "astId": 5020, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "verifiedDomainRegistry", "offset": 0, "slot": "17", - "type": "t_contract(IVerifiedDomainRegistry)7179" + "type": "t_contract(IVerifiedDomainRegistry)11871" }, { - "astId": 3278, + "astId": 5023, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "mailServerKeyHashAdapter", "offset": 0, "slot": "18", - "type": "t_contract(IKeyHashAdapterV2)6171" + "type": "t_contract(IKeyHashAdapterV2)9595" } ], "types": { @@ -2090,17 +2090,17 @@ "label": "bytes", "numberOfBytes": "32" }, - "t_contract(IKeyHashAdapterV2)6171": { + "t_contract(IKeyHashAdapterV2)9595": { "encoding": "inplace", "label": "contract IKeyHashAdapterV2", "numberOfBytes": "20" }, - "t_contract(ITransferDomainProcessor)7099": { + "t_contract(ITransferDomainProcessor)11791": { "encoding": "inplace", "label": "contract ITransferDomainProcessor", "numberOfBytes": "20" }, - "t_contract(IVerifiedDomainRegistry)7179": { + "t_contract(IVerifiedDomainRegistry)11871": { "encoding": "inplace", "label": "contract IVerifiedDomainRegistry", "numberOfBytes": "20" @@ -2119,31 +2119,31 @@ "numberOfBytes": "32", "value": "t_bool" }, - "t_mapping(t_uint256,t_struct(Bid)3214_storage)": { + "t_mapping(t_uint256,t_struct(Bid)4959_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct DomainExchange.Bid)", "numberOfBytes": "32", - "value": "t_struct(Bid)3214_storage" + "value": "t_struct(Bid)4959_storage" }, - "t_mapping(t_uint256,t_struct(Listing)3191_storage)": { + "t_mapping(t_uint256,t_struct(Listing)4936_storage)": { "encoding": "mapping", "key": "t_uint256", "label": "mapping(uint256 => struct DomainExchange.Listing)", "numberOfBytes": "32", - "value": "t_struct(Listing)3191_storage" + "value": "t_struct(Listing)4936_storage" }, "t_string_storage": { "encoding": "bytes", "label": "string", "numberOfBytes": "32" }, - "t_struct(Bid)3214_storage": { + "t_struct(Bid)4959_storage": { "encoding": "inplace", "label": "struct DomainExchange.Bid", "members": [ { - "astId": 3199, + "astId": 4944, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "buyer", "offset": 0, @@ -2151,7 +2151,7 @@ "type": "t_address" }, { - "astId": 3201, + "astId": 4946, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "listingId", "offset": 0, @@ -2159,7 +2159,7 @@ "type": "t_uint256" }, { - "astId": 3203, + "astId": 4948, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "encryptedBuyerId", "offset": 0, @@ -2167,7 +2167,7 @@ "type": "t_string_storage" }, { - "astId": 3205, + "astId": 4950, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "buyerIdHash", "offset": 0, @@ -2175,7 +2175,7 @@ "type": "t_bytes32" }, { - "astId": 3207, + "astId": 4952, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "createdAt", "offset": 0, @@ -2183,7 +2183,7 @@ "type": "t_uint256" }, { - "astId": 3209, + "astId": 4954, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "expiryTimestamp", "offset": 0, @@ -2191,7 +2191,7 @@ "type": "t_uint256" }, { - "astId": 3211, + "astId": 4956, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "price", "offset": 0, @@ -2199,7 +2199,7 @@ "type": "t_uint256" }, { - "astId": 3213, + "astId": 4958, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "refundInitiated", "offset": 0, @@ -2209,12 +2209,12 @@ ], "numberOfBytes": "256" }, - "t_struct(Listing)3191_storage": { + "t_struct(Listing)4936_storage": { "encoding": "inplace", "label": "struct DomainExchange.Listing", "members": [ { - "astId": 3171, + "astId": 4916, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "seller", "offset": 0, @@ -2222,7 +2222,7 @@ "type": "t_address" }, { - "astId": 3173, + "astId": 4918, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "saleEthRecipient", "offset": 0, @@ -2230,7 +2230,7 @@ "type": "t_address_payable" }, { - "astId": 3175, + "astId": 4920, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "dkimKeyHash", "offset": 0, @@ -2238,7 +2238,7 @@ "type": "t_bytes32" }, { - "astId": 3177, + "astId": 4922, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "encryptionKey", "offset": 0, @@ -2246,7 +2246,7 @@ "type": "t_bytes_storage" }, { - "astId": 3179, + "astId": 4924, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "domainId", "offset": 0, @@ -2254,7 +2254,7 @@ "type": "t_bytes32" }, { - "astId": 3181, + "astId": 4926, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "createdAt", "offset": 0, @@ -2262,7 +2262,7 @@ "type": "t_uint256" }, { - "astId": 3183, + "astId": 4928, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "askPrice", "offset": 0, @@ -2270,7 +2270,7 @@ "type": "t_uint256" }, { - "astId": 3185, + "astId": 4930, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "minBidPrice", "offset": 0, @@ -2278,7 +2278,7 @@ "type": "t_uint256" }, { - "astId": 3187, + "astId": 4932, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "isActive", "offset": 0, @@ -2286,7 +2286,7 @@ "type": "t_bool" }, { - "astId": 3190, + "astId": 4935, "contract": "contracts/DomainExchange.sol:DomainExchange", "label": "bids", "offset": 0, diff --git a/contracts-domain/deployments/sepolia/NamecheapManagedKeyHashAdapter.json b/contracts-domain/deployments/sepolia/NamecheapManagedKeyHashAdapter.json index c3e566646..b9082dfa1 100644 --- a/contracts-domain/deployments/sepolia/NamecheapManagedKeyHashAdapter.json +++ b/contracts-domain/deployments/sepolia/NamecheapManagedKeyHashAdapter.json @@ -1,5 +1,5 @@ { - "address": "0x462e1CB14dC8eb4b4940F7EB91CD1589eF0cbFE6", + "address": "0x5d96e0Bf0c080C5f42475d767248A7501D069883", "abi": [ { "inputs": [ @@ -168,34 +168,34 @@ "type": "function" } ], - "transactionHash": "0x78cbddc528629face0d2cc9786db104ec03558ade8f1e8270fe87f8372329c90", + "transactionHash": "0x62bd91915a3250bc1c43c516da97f8d35ef7a99ca4e9d3d88ad79dca257bf6e7", "receipt": { "to": null, "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "contractAddress": "0x462e1CB14dC8eb4b4940F7EB91CD1589eF0cbFE6", - "transactionIndex": 78, + "contractAddress": "0x5d96e0Bf0c080C5f42475d767248A7501D069883", + "transactionIndex": 27, "gasUsed": "766431", - "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000000000000000000000000000000000010000000000000000000400000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000008000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0xa37809ce0532f5b7438afab09ecdc2069f7c052587eb57544d911e9e1eaea377", - "transactionHash": "0x78cbddc528629face0d2cc9786db104ec03558ade8f1e8270fe87f8372329c90", + "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000002000000000400000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000001000000800000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x72493b2f8e97e7ef2c77bd3eeed2a1b45100f11aaf203fa0e1475ac489baa627", + "transactionHash": "0x62bd91915a3250bc1c43c516da97f8d35ef7a99ca4e9d3d88ad79dca257bf6e7", "logs": [ { - "transactionIndex": 78, - "blockNumber": 6644701, - "transactionHash": "0x78cbddc528629face0d2cc9786db104ec03558ade8f1e8270fe87f8372329c90", - "address": "0x462e1CB14dC8eb4b4940F7EB91CD1589eF0cbFE6", + "transactionIndex": 27, + "blockNumber": 6746718, + "transactionHash": "0x62bd91915a3250bc1c43c516da97f8d35ef7a99ca4e9d3d88ad79dca257bf6e7", + "address": "0x5d96e0Bf0c080C5f42475d767248A7501D069883", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" ], "data": "0x", - "logIndex": 78, - "blockHash": "0xa37809ce0532f5b7438afab09ecdc2069f7c052587eb57544d911e9e1eaea377" + "logIndex": 29, + "blockHash": "0x72493b2f8e97e7ef2c77bd3eeed2a1b45100f11aaf203fa0e1475ac489baa627" } ], - "blockNumber": 6644701, - "cumulativeGasUsed": "8101416", + "blockNumber": 6746718, + "cumulativeGasUsed": "6706718", "status": 1, "byzantium": true }, @@ -205,7 +205,7 @@ ] ], "numDeployments": 1, - "solcInputHash": "2d5447dc2e8fb3a2517c08b948266497", + "solcInputHash": "d865a6f49eab8c58036d78b72f5cb448", "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_mailServerKeyHashes\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"mailserverKeyHash\",\"type\":\"bytes32\"}],\"name\":\"MailServerKeyHashAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"mailserverKeyHash\",\"type\":\"bytes32\"}],\"name\":\"MailServerKeyHashRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_mailserverKeyHash\",\"type\":\"bytes32\"}],\"name\":\"addMailServerKeyHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMailServerKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"isMailServerKeyHash\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"mailServerKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_mailserverKeyHash\",\"type\":\"bytes32\"}],\"name\":\"removeMailServerKeyHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/external/ManagedKeyHashAdapterV2.sol\":\"ManagedKeyHashAdapterV2\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"contracts/external/ManagedKeyHashAdapterV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"./interfaces/IKeyHashAdapterV2.sol\\\";\\nimport { Bytes32ArrayUtils } from \\\"./lib/Bytes32ArrayUtils.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract ManagedKeyHashAdapterV2 is Ownable, IKeyHashAdapterV2 {\\n \\n using Bytes32ArrayUtils for bytes32[];\\n\\n /* ============ Events ============ */\\n event MailServerKeyHashAdded(bytes32 mailserverKeyHash);\\n event MailServerKeyHashRemoved(bytes32 mailserverKeyHash);\\n\\n /* ============ State Variables ============ */\\n\\n mapping(bytes32 => bool) public isMailServerKeyHash;\\n bytes32[] public mailServerKeyHashes;\\n\\n /* ============ Constructor ============ */\\n\\n constructor(\\n bytes32[] memory _mailServerKeyHashes\\n )\\n Ownable()\\n {\\n for (uint256 i = 0; i < _mailServerKeyHashes.length; i++) {\\n bytes32 mailserverKeyHash = _mailServerKeyHashes[i];\\n require(!isMailServerKeyHash[mailserverKeyHash], \\\"Key hash already added\\\");\\n \\n isMailServerKeyHash[mailserverKeyHash] = true;\\n mailServerKeyHashes.push(mailserverKeyHash);\\n }\\n }\\n\\n /* ============ External Functions ============ */\\n\\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external onlyOwner {\\n require(!isMailServerKeyHash[_mailserverKeyHash], \\\"Key hash already added\\\");\\n\\n isMailServerKeyHash[_mailserverKeyHash] = true;\\n mailServerKeyHashes.push(_mailserverKeyHash);\\n\\n emit MailServerKeyHashAdded(_mailserverKeyHash);\\n }\\n\\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external onlyOwner {\\n require(isMailServerKeyHash[_mailserverKeyHash], \\\"Key hash not added\\\");\\n\\n isMailServerKeyHash[_mailserverKeyHash] = false;\\n mailServerKeyHashes.removeStorage(_mailserverKeyHash);\\n\\n emit MailServerKeyHashRemoved(_mailserverKeyHash);\\n }\\n\\n /* ============ External Getter Functions ============ */\\n\\n function getMailServerKeyHashes() external view override returns (bytes32[] memory) {\\n return mailServerKeyHashes;\\n }\\n}\\n\",\"keccak256\":\"0x13d60704c96e0d88380cc2db7367cf17848b03fcd410fade3ba7161046cabeac\",\"license\":\"MIT\"},\"contracts/external/interfaces/IKeyHashAdapterV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IKeyHashAdapterV2 {\\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function getMailServerKeyHashes() external view returns (bytes32[] memory);\\n function isMailServerKeyHash(bytes32 _mailserverKeyHash) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc849f2dc34e4463550b8e0a16541bde429cb1adf43776b2c4179e9d4e4e656a2\",\"license\":\"MIT\"},\"contracts/external/lib/Bytes32ArrayUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.17;\\n\\n/**\\n * @title Bytes32ArrayUtils\\n * @author ZKP2P\\n *\\n * Fork of Set Protocol's AddressArrayUtils library adapted for usage with bytes32 arrays.\\n */\\nlibrary Bytes32ArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(bytes32[] memory A, bytes32 a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(bytes32[] memory A, bytes32 a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns true if there are 2 elements that are the same in an array\\n * @param A The input array to search\\n * @return Returns boolean for the first occurrence of a duplicate\\n */\\n function hasDuplicate(bytes32[] memory A) internal pure returns(bool) {\\n require(A.length > 0, \\\"A is empty\\\");\\n\\n for (uint256 i = 0; i < A.length - 1; i++) {\\n bytes32 current = A[i];\\n for (uint256 j = i + 1; j < A.length; j++) {\\n if (current == A[j]) {\\n return true;\\n }\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The bytes32 to remove\\n * @return Returns the array with the object removed.\\n */\\n function remove(bytes32[] memory A, bytes32 a)\\n internal\\n pure\\n returns (bytes32[] memory)\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"bytes32 not in array.\\\");\\n } else {\\n (bytes32[] memory _A,) = pop(A, index);\\n return _A;\\n }\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The bytes32 to remove\\n */\\n function removeStorage(bytes32[] storage A, bytes32 a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"bytes32 not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n\\n /**\\n * Removes specified index from array\\n * @param A The input array to search\\n * @param index The index to remove\\n * @return Returns the new array and the removed entry\\n */\\n function pop(bytes32[] memory A, uint256 index)\\n internal\\n pure\\n returns (bytes32[] memory, bytes32)\\n {\\n uint256 length = A.length;\\n require(index < A.length, \\\"Index must be < A length\\\");\\n bytes32[] memory newBytes = new bytes32[](length - 1);\\n for (uint256 i = 0; i < index; i++) {\\n newBytes[i] = A[i];\\n }\\n for (uint256 j = index + 1; j < length; j++) {\\n newBytes[j - 1] = A[j];\\n }\\n return (newBytes, A[index]);\\n }\\n}\\n\",\"keccak256\":\"0x14d572deda126ff812eb5ab0eed33120e13cc568fd611a4a6bff652f3e8440a8\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x60806040523462000030576200001e620000186200013d565b620002d7565b604051610aed620004718239610aed90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200006d57604052565b62000035565b906200008a6200008260405190565b92836200004b565b565b6001600160401b0381116200006d5760208091020190565b90929192620000bd620000b7826200008c565b62000073565b93818552602080860192028301928184116200003057915b838310620000e35750505050565b8251815260209283019201620000d5565b9080601f83011215620000305781516200011192602001620000a4565b90565b90602082820312620000305781516001600160401b0381116200003057620001119201620000f4565b6200011162000f5e80380380620001548162000073565b92833981019062000114565b6200011162000111620001119290565b634e487b7160e01b600052601160045260246000fd5b6000198114620001965760010190565b62000170565b634e487b7160e01b600052603260045260246000fd5b90620001bc825190565b811015620001ce576020809102010190565b6200019c565b15620001dc57565b60405162461bcd60e51b815260206004820152601660248201527f4b6579206861736820616c7265616479206164646564000000000000000000006044820152606490fd5b9060ff905b9181191691161790565b9062000243620001116200024b92151590565b825462000221565b9055565b8054821015620001ce576200026b600191600052602060002090565b91020190600090565b9160001960089290920291821b911b62000226565b91906200029b620001116200024b9390565b90835462000274565b90815491680100000000000000008310156200006d5782620002d09160016200008a950181556200024f565b9062000289565b90620002e26200038c565b620002ee600062000160565b620002fb62000111845190565b8110156200038757806200037b620003206200031c620003819487620001b2565b5190565b62000373600162000358620003526200034e62000347868590600052602052604060002090565b5460ff1690565b1590565b620001d4565b6200036d838290600052602052604060002090565b62000230565b6002620002a4565b62000186565b620002ee565b509050565b6200008a80336200040e565b62000111905b6001600160a01b031690565b62000111905462000398565b906001600160a01b039062000226565b62000111906200039e906001600160a01b031682565b6200011190620003c6565b6200011190620003dc565b9062000406620001116200024b92620003e7565b8254620003b6565b6200041a6000620003aa565b9062000428816000620003f2565b6200045f620004587f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093620003e7565b91620003e7565b916200046a60405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c806319d091521461009257806361ba662a1461008d578063687bc0ab14610088578063715018a6146100835780638da5cb5b1461007e578063a26c04ee14610079578063b86e2d72146100745763f2fde38b036100a057610339565b6102dd565b610247565b610208565b6101e4565b6101bd565b61012e565b6100fd565b805b036100a057565b600080fd5b905035906100b282610097565b565b906020828203126100a0576100c8916100a5565b90565b6100c8916008021c5b60ff1690565b906100c891546100cb565b60009081526001602052604081206100c891906100da565b346100a05761012a6101186101133660046100b4565b6100e5565b60405191829182901515815260200190565b0390f35b346100a0576101466101413660046100b4565b6106e8565b604051005b60009103126100a057565b9061017661016f610165845190565b8084529260200190565b9260200190565b9060005b8181106101875750505090565b9091926101a461019d6001928651815260200190565b9460200190565b92910161017a565b60208082526100c892910190610156565b346100a0576101cd36600461014b565b61012a6101d861087e565b604051918291826101ac565b346100a0576101f436600461014b565b610146610389565b6001600160a01b031690565b346100a05761021836600461014b565b61012a61022d6000546001600160a01b031690565b604051918291826001600160a01b03909116815260200190565b346100a05761014661025a3660046100b4565b6107b6565b634e487b7160e01b600052603260045260246000fd5b80548210156102985761028f600191600052602060002090565b91020190600090565b61025f565b6100c8916008021c81565b906100c8915461029d565b600260006102bf825490565b8310156102da57506100c8916102d491610275565b906102a8565b80fd5b346100a05761012a6102f86102f33660046100b4565b6102b3565b6040515b9182918290815260200190565b6001600160a01b038116610099565b905035906100b282610309565b906020828203126100a0576100c891610318565b346100a05761014661034c366004610325565b6104aa565b6103596103e5565b6100b2610377565b6101fc6100c86100c89290565b6100c890610361565b6100b2610384600061036e565b610509565b6100b2610351565b1561039857565b60405162461bcd60e51b8152806103e1600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6100b26103fa6000546001600160a01b031690565b610413610406336101fc565b916001600160a01b031690565b14610391565b6100b2906104256103e5565b610485565b1561043157565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6100b2906103846104996101fc600061036e565b6001600160a01b038316141561042a565b6100b290610419565b906001600160a01b03905b9181191691161790565b6100c8906101fc906001600160a01b031682565b6100c8906104c8565b6100c8906104dc565b906104fe6100c8610505926104e5565b82546104b3565b9055565b6000546001600160a01b0316906105218160006104ee565b61055461054e7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936104e5565b916104e5565b9161055e60405190565b600090a3565b6100b2906105706103e5565b610661565b6100c8906100d4565b6100c89054610575565b1561058f57565b60405162461bcd60e51b815260206004820152601660248201527512d95e481a185cda08185b1c9958591e48185919195960521b6044820152606490fd5b9060ff906104be565b906105e66100c861050592151590565b82546105cd565b634e487b7160e01b600052604160045260246000fd5b9160001960089290920291821b911b6104be565b91906106266100c86105059390565b908354610603565b908154916801000000000000000083101561065c57826106569160016100b295018155610275565b90610617565b6105ed565b6106aa600161069161068c610688610683868590600052602052604060002090565b61057e565b1590565b610588565b6106a5838290600052602052604060002090565b6105d6565b6106b581600261062e565b6106e37fc1674d5f4b3c1397f7aad948ab8fb7adfb24a8f170f8c07349d880c342da030b916102fc60405190565b0390a1565b6100b290610564565b6100b2906106fd6103e5565b610743565b1561070957565b60405162461bcd60e51b815260206004820152601260248201527112d95e481a185cda081b9bdd08185919195960721b6044820152606490fd5b61077d6001610767610762610683858490600052602052604060002090565b610702565b6106a58360009290600052602052604060002090565b610788816002610971565b6106e37f57f03401c03965ea5770efca656f696bdaa598efbaa2c899de9c70749634fabd916102fc60405190565b6100b2906106f1565b6100c89081565b6100c890546107bf565b906107eb6107df610165845490565b92600052602060002090565b9060005b8181106107fc5750505090565b909192610820610819600192610811876107c6565b815260200190565b9460010190565b9291016107ef565b906100c8916107d0565b90601f01601f1916810190811067ffffffffffffffff82111761065c57604052565b906100b261086e9261086560405190565b93848092610828565b0383610832565b6100c890610854565b6100c86002610875565b906108976107df610165845490565b9060005b8181106108a85750505090565b9091926108bd610819600192610811876107c6565b92910161089b565b906100c891610888565b906100b261086e926108e060405190565b938480926108c5565b6100c8906108cf565b6100c86100c86100c89290565b634e487b7160e01b600052601160045260246000fd5b9190820391821161092257565b6108ff565b634e487b7160e01b600052603160045260246000fd5b6100b291600091610617565b8054801561096c5760001901906109696109638383610275565b9061093d565b55565b610927565b61098661098d92610981836108e9565b610a53565b9092901590565b156109cf5760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b6044820152606490fd5b6100b2916109ee6109de835490565b6109e860016108f2565b90610915565b908181036109fe575b5050610949565b610656610a116102d4610a189486610275565b9184610275565b38806109f7565b60001981146109225760010190565b90610a37825190565b811015610298576020809102010190565b6100c86000196108f2565b91908251926000610a63816108f2565b855b811015610aaa57610a7d610a798285610a2e565b5190565b8490610a88565b9190565b14610aa057610a99610a6591610a1f565b9050610a63565b9450505050600190565b5093505050610a84610a4856fea2646970667358221220cea7059c06059b0cdd2bc4094fb91f900abb58ad31de2b8f44a6d19c080e596264736f6c63430008120033", "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806319d091521461009257806361ba662a1461008d578063687bc0ab14610088578063715018a6146100835780638da5cb5b1461007e578063a26c04ee14610079578063b86e2d72146100745763f2fde38b036100a057610339565b6102dd565b610247565b610208565b6101e4565b6101bd565b61012e565b6100fd565b805b036100a057565b600080fd5b905035906100b282610097565b565b906020828203126100a0576100c8916100a5565b90565b6100c8916008021c5b60ff1690565b906100c891546100cb565b60009081526001602052604081206100c891906100da565b346100a05761012a6101186101133660046100b4565b6100e5565b60405191829182901515815260200190565b0390f35b346100a0576101466101413660046100b4565b6106e8565b604051005b60009103126100a057565b9061017661016f610165845190565b8084529260200190565b9260200190565b9060005b8181106101875750505090565b9091926101a461019d6001928651815260200190565b9460200190565b92910161017a565b60208082526100c892910190610156565b346100a0576101cd36600461014b565b61012a6101d861087e565b604051918291826101ac565b346100a0576101f436600461014b565b610146610389565b6001600160a01b031690565b346100a05761021836600461014b565b61012a61022d6000546001600160a01b031690565b604051918291826001600160a01b03909116815260200190565b346100a05761014661025a3660046100b4565b6107b6565b634e487b7160e01b600052603260045260246000fd5b80548210156102985761028f600191600052602060002090565b91020190600090565b61025f565b6100c8916008021c81565b906100c8915461029d565b600260006102bf825490565b8310156102da57506100c8916102d491610275565b906102a8565b80fd5b346100a05761012a6102f86102f33660046100b4565b6102b3565b6040515b9182918290815260200190565b6001600160a01b038116610099565b905035906100b282610309565b906020828203126100a0576100c891610318565b346100a05761014661034c366004610325565b6104aa565b6103596103e5565b6100b2610377565b6101fc6100c86100c89290565b6100c890610361565b6100b2610384600061036e565b610509565b6100b2610351565b1561039857565b60405162461bcd60e51b8152806103e1600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6100b26103fa6000546001600160a01b031690565b610413610406336101fc565b916001600160a01b031690565b14610391565b6100b2906104256103e5565b610485565b1561043157565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6100b2906103846104996101fc600061036e565b6001600160a01b038316141561042a565b6100b290610419565b906001600160a01b03905b9181191691161790565b6100c8906101fc906001600160a01b031682565b6100c8906104c8565b6100c8906104dc565b906104fe6100c8610505926104e5565b82546104b3565b9055565b6000546001600160a01b0316906105218160006104ee565b61055461054e7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936104e5565b916104e5565b9161055e60405190565b600090a3565b6100b2906105706103e5565b610661565b6100c8906100d4565b6100c89054610575565b1561058f57565b60405162461bcd60e51b815260206004820152601660248201527512d95e481a185cda08185b1c9958591e48185919195960521b6044820152606490fd5b9060ff906104be565b906105e66100c861050592151590565b82546105cd565b634e487b7160e01b600052604160045260246000fd5b9160001960089290920291821b911b6104be565b91906106266100c86105059390565b908354610603565b908154916801000000000000000083101561065c57826106569160016100b295018155610275565b90610617565b6105ed565b6106aa600161069161068c610688610683868590600052602052604060002090565b61057e565b1590565b610588565b6106a5838290600052602052604060002090565b6105d6565b6106b581600261062e565b6106e37fc1674d5f4b3c1397f7aad948ab8fb7adfb24a8f170f8c07349d880c342da030b916102fc60405190565b0390a1565b6100b290610564565b6100b2906106fd6103e5565b610743565b1561070957565b60405162461bcd60e51b815260206004820152601260248201527112d95e481a185cda081b9bdd08185919195960721b6044820152606490fd5b61077d6001610767610762610683858490600052602052604060002090565b610702565b6106a58360009290600052602052604060002090565b610788816002610971565b6106e37f57f03401c03965ea5770efca656f696bdaa598efbaa2c899de9c70749634fabd916102fc60405190565b6100b2906106f1565b6100c89081565b6100c890546107bf565b906107eb6107df610165845490565b92600052602060002090565b9060005b8181106107fc5750505090565b909192610820610819600192610811876107c6565b815260200190565b9460010190565b9291016107ef565b906100c8916107d0565b90601f01601f1916810190811067ffffffffffffffff82111761065c57604052565b906100b261086e9261086560405190565b93848092610828565b0383610832565b6100c890610854565b6100c86002610875565b906108976107df610165845490565b9060005b8181106108a85750505090565b9091926108bd610819600192610811876107c6565b92910161089b565b906100c891610888565b906100b261086e926108e060405190565b938480926108c5565b6100c8906108cf565b6100c86100c86100c89290565b634e487b7160e01b600052601160045260246000fd5b9190820391821161092257565b6108ff565b634e487b7160e01b600052603160045260246000fd5b6100b291600091610617565b8054801561096c5760001901906109696109638383610275565b9061093d565b55565b610927565b61098661098d92610981836108e9565b610a53565b9092901590565b156109cf5760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b6044820152606490fd5b6100b2916109ee6109de835490565b6109e860016108f2565b90610915565b908181036109fe575b5050610949565b610656610a116102d4610a189486610275565b9184610275565b38806109f7565b60001981146109225760010190565b90610a37825190565b811015610298576020809102010190565b6100c86000196108f2565b91908251926000610a63816108f2565b855b811015610aaa57610a7d610a798285610a2e565b5190565b8490610a88565b9190565b14610aa057610a99610a6591610a1f565b9050610a63565b9450505050600190565b5093505050610a84610a4856fea2646970667358221220cea7059c06059b0cdd2bc4094fb91f900abb58ad31de2b8f44a6d19c080e596264736f6c63430008120033", @@ -240,7 +240,7 @@ "type": "t_address" }, { - "astId": 8398, + "astId": 8924, "contract": "contracts/external/ManagedKeyHashAdapterV2.sol:ManagedKeyHashAdapterV2", "label": "isMailServerKeyHash", "offset": 0, @@ -248,7 +248,7 @@ "type": "t_mapping(t_bytes32,t_bool)" }, { - "astId": 8401, + "astId": 8927, "contract": "contracts/external/ManagedKeyHashAdapterV2.sol:ManagedKeyHashAdapterV2", "label": "mailServerKeyHashes", "offset": 0, diff --git a/contracts-domain/deployments/sepolia/NullifierRegistry.json b/contracts-domain/deployments/sepolia/NullifierRegistry.json index ddedd847d..578f2ff5d 100644 --- a/contracts-domain/deployments/sepolia/NullifierRegistry.json +++ b/contracts-domain/deployments/sepolia/NullifierRegistry.json @@ -1,5 +1,5 @@ { - "address": "0x5eDB64B6FF3Fe18CE0bf7a890a6cC6a7D236c925", + "address": "0xCE6454f272127ba69e8C8128B92F2388Ca343257", "abi": [ { "inputs": [], @@ -213,40 +213,40 @@ "type": "function" } ], - "transactionHash": "0xc4a8fe11c5aa310f8b2b1811d17681c0b703df93d08b74857890e41ee79f3a77", + "transactionHash": "0xd5dd3fbcb7da32b053269a6ec73a8f681d9773a19f7b77aab51169967c10e250", "receipt": { "to": null, "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "contractAddress": "0x5eDB64B6FF3Fe18CE0bf7a890a6cC6a7D236c925", - "transactionIndex": 62, + "contractAddress": "0xCE6454f272127ba69e8C8128B92F2388Ca343257", + "transactionIndex": 23, "gasUsed": "782784", - "logsBloom": "0x08000000000000000000000000000000000000000000004000800000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000100000000000000000400000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x52b3279b5971bfb20c6938b7de9e6c93955b58dd5f568cf3cca1282251ecb0df", - "transactionHash": "0xc4a8fe11c5aa310f8b2b1811d17681c0b703df93d08b74857890e41ee79f3a77", + "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000100000000000000000000000000000010000000000000000000000000000000000000000000020000000000001000000000000000000000000000000000000020000000000000008000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x7180218a75fbd67903c3e4e754f5245c85a46a1e997ba4abadaff774ffb9ccff", + "transactionHash": "0xd5dd3fbcb7da32b053269a6ec73a8f681d9773a19f7b77aab51169967c10e250", "logs": [ { - "transactionIndex": 62, - "blockNumber": 6644702, - "transactionHash": "0xc4a8fe11c5aa310f8b2b1811d17681c0b703df93d08b74857890e41ee79f3a77", - "address": "0x5eDB64B6FF3Fe18CE0bf7a890a6cC6a7D236c925", + "transactionIndex": 23, + "blockNumber": 6746719, + "transactionHash": "0xd5dd3fbcb7da32b053269a6ec73a8f681d9773a19f7b77aab51169967c10e250", + "address": "0xCE6454f272127ba69e8C8128B92F2388Ca343257", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" ], "data": "0x", - "logIndex": 71, - "blockHash": "0x52b3279b5971bfb20c6938b7de9e6c93955b58dd5f568cf3cca1282251ecb0df" + "logIndex": 53, + "blockHash": "0x7180218a75fbd67903c3e4e754f5245c85a46a1e997ba4abadaff774ffb9ccff" } ], - "blockNumber": 6644702, - "cumulativeGasUsed": "9160332", + "blockNumber": 6746719, + "cumulativeGasUsed": "6197806", "status": 1, "byzantium": true }, "args": [], "numDeployments": 1, - "solcInputHash": "2d5447dc2e8fb3a2517c08b948266497", + "solcInputHash": "d865a6f49eab8c58036d78b72f5cb448", "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"nullifier\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"writer\",\"type\":\"address\"}],\"name\":\"NullifierAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"writer\",\"type\":\"address\"}],\"name\":\"WriterAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"writer\",\"type\":\"address\"}],\"name\":\"WriterRemoved\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_nullifier\",\"type\":\"bytes32\"}],\"name\":\"addNullifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newWriter\",\"type\":\"address\"}],\"name\":\"addWritePermission\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWriters\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"isNullified\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isWriter\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_removedWriter\",\"type\":\"address\"}],\"name\":\"removeWritePermission\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"writers\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addNullifier(bytes32)\":{\"params\":{\"_nullifier\":\"The nullifier to store\"}},\"addWritePermission(address)\":{\"params\":{\"_newWriter\":\"The nullifier to store\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"removeWritePermission(address)\":{\"params\":{\"_removedWriter\":\"The nullifier to store\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addNullifier(bytes32)\":{\"notice\":\"ONLY WRITER: Only addresses with permission to write to this contract can call. Stores a nullifier for an email.\"},\"addWritePermission(address)\":{\"notice\":\"ONLY OWNER: Add address that has write permissions to the registry. Writer must not have been previously added.\"},\"removeWritePermission(address)\":{\"notice\":\"ONLY OWNER: Remove address that has write permissions to the registry. Writer must have been previously added.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/external/NullifierRegistry.sol\":\"NullifierRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"contracts/external/NullifierRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { AddressArrayUtils } from \\\"./lib/AddressArrayUtils.sol\\\";\\nimport { INullifierRegistry } from \\\"./interfaces/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract NullifierRegistry is Ownable, INullifierRegistry {\\n\\n using AddressArrayUtils for address[];\\n \\n /* ============ Events ============ */\\n event NullifierAdded(bytes32 nullifier, address indexed writer);\\n event WriterAdded(address writer);\\n event WriterRemoved(address writer);\\n\\n /* ============ Modifiers ============ */\\n modifier onlyWriter() {\\n require(isWriter[msg.sender], \\\"Only addresses with write permissions can call\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n mapping(bytes32 => bool) public isNullified;\\n mapping(address => bool) public isWriter;\\n address[] public writers;\\n\\n /* ============ Constructor ============ */\\n constructor() Ownable() {}\\n \\n /* ============ External Functions ============ */\\n\\n /**\\n * ONLY WRITER: Only addresses with permission to write to this contract can call. Stores a nullifier for an email.\\n *\\n * @param _nullifier The nullifier to store\\n */\\n function addNullifier(bytes32 _nullifier) external onlyWriter {\\n require(!isNullified[_nullifier], \\\"Nullifier already exists\\\");\\n\\n isNullified[_nullifier] = true;\\n\\n emit NullifierAdded(_nullifier, msg.sender);\\n }\\n\\n /* ============ Admin Functions ============ */\\n\\n /**\\n * ONLY OWNER: Add address that has write permissions to the registry. Writer must not have been previously added.\\n *\\n * @param _newWriter The nullifier to store\\n */\\n function addWritePermission(address _newWriter) external onlyOwner {\\n require(!isWriter[_newWriter], \\\"Address is already a writer\\\");\\n\\n isWriter[_newWriter] = true;\\n writers.push(_newWriter);\\n\\n emit WriterAdded(_newWriter);\\n }\\n\\n /**\\n * ONLY OWNER: Remove address that has write permissions to the registry. Writer must have been previously added.\\n *\\n * @param _removedWriter The nullifier to store\\n */\\n function removeWritePermission(address _removedWriter) external onlyOwner {\\n require(isWriter[_removedWriter], \\\"Address is not a writer\\\");\\n\\n isWriter[_removedWriter] = false;\\n writers.removeStorage(_removedWriter);\\n\\n emit WriterRemoved(_removedWriter);\\n }\\n\\n /* ============ External View Functions ============ */\\n\\n function getWriters() external view returns(address[] memory) {\\n return writers;\\n }\\n}\\n\",\"keccak256\":\"0x2c461bc3e7074c455f0e7cce2edceb6db47d158ce38f8562ba3c02d41fd4ea77\",\"license\":\"MIT\"},\"contracts/external/interfaces/INullifierRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface INullifierRegistry {\\n function addNullifier(bytes32 _nullifier) external;\\n function isNullified(bytes32 _nullifier) external view returns(bool);\\n}\\n\",\"keccak256\":\"0x107164bc9a320938b513305878163b7fa884da4cdae58d0c8e81bfbb00c97c5e\",\"license\":\"MIT\"},\"contracts/external/lib/AddressArrayUtils.sol\":{\"content\":\"/*\\n Copyright 2020 Set Labs Inc.\\n\\n Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n you may not use this file except in compliance with the License.\\n You may obtain a copy of the License at\\n\\n http://www.apache.org/licenses/LICENSE-2.0\\n\\n Unless required by applicable law or agreed to in writing, software\\n distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n See the License for the specific language governing permissions and\\n limitations under the License.\\n\\n SPDX-License-Identifier: MIT\\n*/\\n\\npragma solidity ^0.8.17;\\n\\n/**\\n * @title AddressArrayUtils\\n * @author Set Protocol\\n *\\n * Utility functions to handle Address Arrays\\n *\\n * CHANGELOG:\\n * - 4/21/21: Added validatePairsWithArray methods\\n */\\nlibrary AddressArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(address[] memory A, address a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(address[] memory A, address a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns true if there are 2 elements that are the same in an array\\n * @param A The input array to search\\n * @return Returns boolean for the first occurrence of a duplicate\\n */\\n function hasDuplicate(address[] memory A) internal pure returns(bool) {\\n require(A.length > 0, \\\"A is empty\\\");\\n\\n for (uint256 i = 0; i < A.length - 1; i++) {\\n address current = A[i];\\n for (uint256 j = i + 1; j < A.length; j++) {\\n if (current == A[j]) {\\n return true;\\n }\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n * @return Returns the array with the object removed.\\n */\\n function remove(address[] memory A, address a)\\n internal\\n pure\\n returns (address[] memory)\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n (address[] memory _A,) = pop(A, index);\\n return _A;\\n }\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n */\\n function removeStorage(address[] storage A, address a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n\\n /**\\n * Removes specified index from array\\n * @param A The input array to search\\n * @param index The index to remove\\n * @return Returns the new array and the removed entry\\n */\\n function pop(address[] memory A, uint256 index)\\n internal\\n pure\\n returns (address[] memory, address)\\n {\\n uint256 length = A.length;\\n require(index < A.length, \\\"Index must be < A length\\\");\\n address[] memory newAddresses = new address[](length - 1);\\n for (uint256 i = 0; i < index; i++) {\\n newAddresses[i] = A[i];\\n }\\n for (uint256 j = index + 1; j < length; j++) {\\n newAddresses[j - 1] = A[j];\\n }\\n return (newAddresses, A[index]);\\n }\\n}\\n\",\"keccak256\":\"0x486f1a373f33aa167227600ac2d0bf95b37685413d98a3e745107188f00ae405\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x6080604052346200002657620000146200002b565b604051610cb3620001278239610cb390f35b600080fd5b6200003562000037565b565b620000358033620000c4565b62000055905b6001600160a01b031690565b90565b62000055905462000043565b620000559062000049906001600160a01b031682565b620000559062000064565b62000055906200007a565b90620000a462000055620000c09262000085565b82546001600160a01b0319166001600160a01b03919091161790565b9055565b620000d0600062000058565b90620000de81600062000090565b620001156200010e7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09362000085565b9162000085565b916200012060405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c8063169394bb146100b2578063286f9201146100ad5780632b29ba23146100a85780635bd4df32146100a357806366a526721461009e578063715018a6146100995780638da5cb5b14610094578063cb01316c1461008f578063d6da03261461008a5763f2fde38b036100c0576103ce565b6103b6565b61038f565b610304565b6102ec565b6102ab565b610213565b6101f8565b610199565b61012c565b805b036100c057565b600080fd5b905035906100d2826100b7565b565b906020828203126100c0576100e8916100c5565b90565b905b600052602052604060002090565b6100e8916008021c5b60ff1690565b906100e891546100fb565b6100e8906101276001916000926100eb565b61010a565b346100c0576101596101476101423660046100d4565b610115565b60405191829182901515815260200190565b0390f35b6001600160a01b031690565b6001600160a01b0381166100b9565b905035906100d282610169565b906020828203126100c0576100e891610178565b346100c0576101b16101ac366004610185565b610970565b604051005b6100e89061015d906001600160a01b031682565b6100e8906101b6565b6100e8906101ca565b906100ed906101d3565b6100e8906101276002916000926101dc565b346100c05761015961014761020e366004610185565b6101e6565b346100c0576101b16102263660046100d4565b610763565b634e487b7160e01b600052603260045260246000fd5b80548210156102645761025b600191600052602060002090565b91020190600090565b61022b565b6100e8916008021c61015d565b906100e89154610269565b6003600061028d825490565b8310156102a857506100e8916102a291610241565b90610276565b80fd5b346100c0576101596102c66102c13660046100d4565b610281565b6040515b918291826001600160a01b03909116815260200190565b60009103126100c057565b346100c0576102fc3660046102e1565b6101b161043b565b346100c0576103143660046102e1565b6101596102c66103f9565b9061033f61033861032e845190565b8084529260200190565b9260200190565b9060005b8181106103505750505090565b90919261037661036f60019286516001600160a01b0316815260200190565b9460200190565b929101610343565b60208082526100e89291019061031f565b346100c05761039f3660046102e1565b6101596103aa610a30565b6040519182918261037e565b346100c0576101b16103c9366004610185565b6108ab565b346100c0576101b16103e1366004610185565b610552565b6100e89061015d565b6100e890546103e6565b6100e860006103ef565b61040b610497565b6100d2610429565b61015d6100e86100e89290565b6100e890610413565b6100d26104366000610420565b61058b565b6100d2610403565b1561044a57565b60405162461bcd60e51b815280610493600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6100d26104a26103f9565b6104bb6104ae3361015d565b916001600160a01b031690565b14610443565b6100d2906104cd610497565b61052d565b156104d957565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6100d29061043661054161015d6000610420565b6001600160a01b03831614156104d2565b6100d2906104c1565b906001600160a01b03905b9181191691161790565b906105806100e8610587926101d3565b825461055b565b9055565b61059560006103ef565b906105a1816000610570565b6105d46105ce7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936101d3565b916101d3565b916105de60405190565b600090a3565b6100e890610104565b6100e890546105e4565b156105fe57565b60405162461bcd60e51b815260206004820152602e60248201527f4f6e6c79206164647265737365732077697468207772697465207065726d697360448201526d1cda5bdb9cc818d85b8818d85b1b60921b6064820152608490fd5b6100d29061067961067461066f3360026101dc565b6105ed565b6105f7565b6106ea565b1561068557565b60405162461bcd60e51b815260206004820152601860248201527f4e756c6c696669657220616c72656164792065786973747300000000000000006044820152606490fd5b9060ff90610566565b906106e36100e861058792151590565b82546106ca565b61071a600161070b61070661070261066f86856100eb565b1590565b61067e565b61071583826100eb565b6106d3565b7f57d64412939564693aa1e17d56c93933396b3a990f47c84dfc16a201fc2f3f8361075e610747336101d3565b9261075160405190565b9182918290815260200190565b0390a2565b6100d29061065a565b6100d290610778610497565b610844565b1561078457565b60405162461bcd60e51b815260206004820152601b60248201527f4164647265737320697320616c726561647920612077726974657200000000006044820152606490fd5b634e487b7160e01b600052604160045260246000fd5b916001600160a01b0360089290920291821b911b610566565b91906108096100e8610587936101d3565b9083546107df565b908154916801000000000000000083101561083f57826108399160016100d295018155610241565b906107f8565b6107c9565b61086d600261086161085c61070261066f86856101dc565b61077d565b610715836001926101dc565b610878816003610811565b6108a67f6ff3aa2ea7b53070f6d9d07a445d338d89e8edef44250ffa8be19f53910d4a2e916102ca60405190565b0390a1565b6100d29061076c565b6100d2906108c0610497565b610911565b156108cc57565b60405162461bcd60e51b815260206004820152601760248201527f41646472657373206973206e6f742061207772697465720000000000000000006044820152606490fd5b610937600261092b61092661066f85846101dc565b6108c5565b610715836000926101dc565b610942816003610b23565b6108a67f86e5bbceda94081c32220d685f37cc4e3ea7bb0be2dfbf0cb703579505a5390e916102ca60405190565b6100d2906108b4565b9061099461098861032e845490565b92600052602060002090565b9060005b8181106109a55750505090565b9091926109d26109cb6001926109ba876103ef565b6001600160a01b0316815260200190565b9460010190565b929101610998565b906100e891610979565b90601f01601f1916810190811067ffffffffffffffff82111761083f57604052565b906100d2610a2092610a1760405190565b938480926109da565b03836109e4565b6100e890610a06565b6100e86003610a27565b90610a4961098861032e845490565b9060005b818110610a5a5750505090565b909192610a6f6109cb6001926109ba876103ef565b929101610a4d565b906100e891610a3a565b906100d2610a2092610a9260405190565b93848092610a77565b6100e890610a81565b6100e86100e86100e89290565b634e487b7160e01b600052601160045260246000fd5b91908203918211610ad457565b610ab1565b634e487b7160e01b600052603160045260246000fd5b6100d2916000916107f8565b80548015610b1e576000190190610b1b610b158383610241565b90610aef565b55565b610ad9565b610b38610b3f92610b3383610a9b565b610c05565b9092901590565b15610b815760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b6100d291610ba0610b90835490565b610b9a6001610aa4565b90610ac7565b90818103610bb0575b5050610afb565b610839610bc36102a2610bca9486610241565b9184610241565b3880610ba9565b6000198114610ad45760010190565b90610be9825190565b811015610264576020809102010190565b6100e8600019610aa4565b91908251926000610c1581610aa4565b855b811015610c6c57610c38610c2b8285610be0565b516001600160a01b031690565b610c4a6001600160a01b0386166104ae565b14610c6257610c5b610c1791610bd1565b9050610c15565b9450505050600190565b5093505050610c79610bfa565b919056fea2646970667358221220ac3610fa2c1635ee2b87dd0e289f617051e7537c7f88c7217955bec887e7c00964736f6c63430008120033", "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c8063169394bb146100b2578063286f9201146100ad5780632b29ba23146100a85780635bd4df32146100a357806366a526721461009e578063715018a6146100995780638da5cb5b14610094578063cb01316c1461008f578063d6da03261461008a5763f2fde38b036100c0576103ce565b6103b6565b61038f565b610304565b6102ec565b6102ab565b610213565b6101f8565b610199565b61012c565b805b036100c057565b600080fd5b905035906100d2826100b7565b565b906020828203126100c0576100e8916100c5565b90565b905b600052602052604060002090565b6100e8916008021c5b60ff1690565b906100e891546100fb565b6100e8906101276001916000926100eb565b61010a565b346100c0576101596101476101423660046100d4565b610115565b60405191829182901515815260200190565b0390f35b6001600160a01b031690565b6001600160a01b0381166100b9565b905035906100d282610169565b906020828203126100c0576100e891610178565b346100c0576101b16101ac366004610185565b610970565b604051005b6100e89061015d906001600160a01b031682565b6100e8906101b6565b6100e8906101ca565b906100ed906101d3565b6100e8906101276002916000926101dc565b346100c05761015961014761020e366004610185565b6101e6565b346100c0576101b16102263660046100d4565b610763565b634e487b7160e01b600052603260045260246000fd5b80548210156102645761025b600191600052602060002090565b91020190600090565b61022b565b6100e8916008021c61015d565b906100e89154610269565b6003600061028d825490565b8310156102a857506100e8916102a291610241565b90610276565b80fd5b346100c0576101596102c66102c13660046100d4565b610281565b6040515b918291826001600160a01b03909116815260200190565b60009103126100c057565b346100c0576102fc3660046102e1565b6101b161043b565b346100c0576103143660046102e1565b6101596102c66103f9565b9061033f61033861032e845190565b8084529260200190565b9260200190565b9060005b8181106103505750505090565b90919261037661036f60019286516001600160a01b0316815260200190565b9460200190565b929101610343565b60208082526100e89291019061031f565b346100c05761039f3660046102e1565b6101596103aa610a30565b6040519182918261037e565b346100c0576101b16103c9366004610185565b6108ab565b346100c0576101b16103e1366004610185565b610552565b6100e89061015d565b6100e890546103e6565b6100e860006103ef565b61040b610497565b6100d2610429565b61015d6100e86100e89290565b6100e890610413565b6100d26104366000610420565b61058b565b6100d2610403565b1561044a57565b60405162461bcd60e51b815280610493600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6100d26104a26103f9565b6104bb6104ae3361015d565b916001600160a01b031690565b14610443565b6100d2906104cd610497565b61052d565b156104d957565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6100d29061043661054161015d6000610420565b6001600160a01b03831614156104d2565b6100d2906104c1565b906001600160a01b03905b9181191691161790565b906105806100e8610587926101d3565b825461055b565b9055565b61059560006103ef565b906105a1816000610570565b6105d46105ce7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936101d3565b916101d3565b916105de60405190565b600090a3565b6100e890610104565b6100e890546105e4565b156105fe57565b60405162461bcd60e51b815260206004820152602e60248201527f4f6e6c79206164647265737365732077697468207772697465207065726d697360448201526d1cda5bdb9cc818d85b8818d85b1b60921b6064820152608490fd5b6100d29061067961067461066f3360026101dc565b6105ed565b6105f7565b6106ea565b1561068557565b60405162461bcd60e51b815260206004820152601860248201527f4e756c6c696669657220616c72656164792065786973747300000000000000006044820152606490fd5b9060ff90610566565b906106e36100e861058792151590565b82546106ca565b61071a600161070b61070661070261066f86856100eb565b1590565b61067e565b61071583826100eb565b6106d3565b7f57d64412939564693aa1e17d56c93933396b3a990f47c84dfc16a201fc2f3f8361075e610747336101d3565b9261075160405190565b9182918290815260200190565b0390a2565b6100d29061065a565b6100d290610778610497565b610844565b1561078457565b60405162461bcd60e51b815260206004820152601b60248201527f4164647265737320697320616c726561647920612077726974657200000000006044820152606490fd5b634e487b7160e01b600052604160045260246000fd5b916001600160a01b0360089290920291821b911b610566565b91906108096100e8610587936101d3565b9083546107df565b908154916801000000000000000083101561083f57826108399160016100d295018155610241565b906107f8565b6107c9565b61086d600261086161085c61070261066f86856101dc565b61077d565b610715836001926101dc565b610878816003610811565b6108a67f6ff3aa2ea7b53070f6d9d07a445d338d89e8edef44250ffa8be19f53910d4a2e916102ca60405190565b0390a1565b6100d29061076c565b6100d2906108c0610497565b610911565b156108cc57565b60405162461bcd60e51b815260206004820152601760248201527f41646472657373206973206e6f742061207772697465720000000000000000006044820152606490fd5b610937600261092b61092661066f85846101dc565b6108c5565b610715836000926101dc565b610942816003610b23565b6108a67f86e5bbceda94081c32220d685f37cc4e3ea7bb0be2dfbf0cb703579505a5390e916102ca60405190565b6100d2906108b4565b9061099461098861032e845490565b92600052602060002090565b9060005b8181106109a55750505090565b9091926109d26109cb6001926109ba876103ef565b6001600160a01b0316815260200190565b9460010190565b929101610998565b906100e891610979565b90601f01601f1916810190811067ffffffffffffffff82111761083f57604052565b906100d2610a2092610a1760405190565b938480926109da565b03836109e4565b6100e890610a06565b6100e86003610a27565b90610a4961098861032e845490565b9060005b818110610a5a5750505090565b909192610a6f6109cb6001926109ba876103ef565b929101610a4d565b906100e891610a3a565b906100d2610a2092610a9260405190565b93848092610a77565b6100e890610a81565b6100e86100e86100e89290565b634e487b7160e01b600052601160045260246000fd5b91908203918211610ad457565b610ab1565b634e487b7160e01b600052603160045260246000fd5b6100d2916000916107f8565b80548015610b1e576000190190610b1b610b158383610241565b90610aef565b55565b610ad9565b610b38610b3f92610b3383610a9b565b610c05565b9092901590565b15610b815760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b6100d291610ba0610b90835490565b610b9a6001610aa4565b90610ac7565b90818103610bb0575b5050610afb565b610839610bc36102a2610bca9486610241565b9184610241565b3880610ba9565b6000198114610ad45760010190565b90610be9825190565b811015610264576020809102010190565b6100e8600019610aa4565b91908251926000610c1581610aa4565b855b811015610c6c57610c38610c2b8285610be0565b516001600160a01b031690565b610c4a6001600160a01b0386166104ae565b14610c6257610c5b610c1791610bd1565b9050610c15565b9450505050600190565b5093505050610c79610bfa565b919056fea2646970667358221220ac3610fa2c1635ee2b87dd0e289f617051e7537c7f88c7217955bec887e7c00964736f6c63430008120033", @@ -306,7 +306,7 @@ "type": "t_address" }, { - "astId": 8569, + "astId": 9095, "contract": "contracts/external/NullifierRegistry.sol:NullifierRegistry", "label": "isNullified", "offset": 0, @@ -314,7 +314,7 @@ "type": "t_mapping(t_bytes32,t_bool)" }, { - "astId": 8573, + "astId": 9099, "contract": "contracts/external/NullifierRegistry.sol:NullifierRegistry", "label": "isWriter", "offset": 0, @@ -322,7 +322,7 @@ "type": "t_mapping(t_address,t_bool)" }, { - "astId": 8576, + "astId": 9102, "contract": "contracts/external/NullifierRegistry.sol:NullifierRegistry", "label": "writers", "offset": 0, diff --git a/contracts-domain/deployments/sepolia/TransferDomainProcessor.json b/contracts-domain/deployments/sepolia/TransferDomainProcessor.json index 67cd8e1ca..88d28357e 100644 --- a/contracts-domain/deployments/sepolia/TransferDomainProcessor.json +++ b/contracts-domain/deployments/sepolia/TransferDomainProcessor.json @@ -1,5 +1,5 @@ { - "address": "0x939aE0876c3e9B7320499239895D46B379AdAb91", + "address": "0x9046aa835dB91DBd742eF98A1bb651812Eab0eE1", "abi": [ { "inputs": [ @@ -261,48 +261,48 @@ "type": "function" } ], - "transactionHash": "0xf7af28dd7a5d761aee85c433f8bbbda0ffa5ee25492e3625cbd908d5f71d9f73", + "transactionHash": "0xf8d15eab1991b06be699ce610c2431a0588448c10191408a7a6b9b3f6e6ecc85", "receipt": { "to": null, "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "contractAddress": "0x939aE0876c3e9B7320499239895D46B379AdAb91", - "transactionIndex": 78, - "gasUsed": "1844230", - "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000000000000000000000000000002000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000008000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x7c10f34d8d9912ac00b23b350dde569f2f63772d5f285ae729e9a32f874cbd59", - "transactionHash": "0xf7af28dd7a5d761aee85c433f8bbbda0ffa5ee25492e3625cbd908d5f71d9f73", + "contractAddress": "0x9046aa835dB91DBd742eF98A1bb651812Eab0eE1", + "transactionIndex": 63, + "gasUsed": "1844254", + "logsBloom": "0x00000000000000000000000000000100000000000000004000800000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000802000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xcc35229b1dca8d5984be2bcf000ec2e6dbbc309e15d22ac9e32c93bd5e80b9d2", + "transactionHash": "0xf8d15eab1991b06be699ce610c2431a0588448c10191408a7a6b9b3f6e6ecc85", "logs": [ { - "transactionIndex": 78, - "blockNumber": 6678943, - "transactionHash": "0xf7af28dd7a5d761aee85c433f8bbbda0ffa5ee25492e3625cbd908d5f71d9f73", - "address": "0x939aE0876c3e9B7320499239895D46B379AdAb91", + "transactionIndex": 63, + "blockNumber": 6746720, + "transactionHash": "0xf8d15eab1991b06be699ce610c2431a0588448c10191408a7a6b9b3f6e6ecc85", + "address": "0x9046aa835dB91DBd742eF98A1bb651812Eab0eE1", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" ], "data": "0x", - "logIndex": 85, - "blockHash": "0x7c10f34d8d9912ac00b23b350dde569f2f63772d5f285ae729e9a32f874cbd59" + "logIndex": 118, + "blockHash": "0xcc35229b1dca8d5984be2bcf000ec2e6dbbc309e15d22ac9e32c93bd5e80b9d2" } ], - "blockNumber": 6678943, - "cumulativeGasUsed": "15206907", + "blockNumber": 6746720, + "cumulativeGasUsed": "13293090", "status": 1, "byzantium": true }, "args": [ - "0xe2B378D9181046c84dB1156B0F90cF3108e25E9D", - "0x5eDB64B6FF3Fe18CE0bf7a890a6cC6a7D236c925", + "0xC8cd114C6274Ef1066840337E7678BC9731BEa68", + "0xCE6454f272127ba69e8C8128B92F2388Ca343257", "support@namecheap.com", "0" ], - "numDeployments": 2, - "solcInputHash": "2d5447dc2e8fb3a2517c08b948266497", - "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_exchange\",\"type\":\"address\"},{\"internalType\":\"contract INullifierRegistry\",\"name\":\"_nullifierRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_emailFromAddress\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_timestampBuffer\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"emailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"exchange\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEmailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nullifierRegistry\",\"outputs\":[{\"internalType\":\"contract INullifierRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"a\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"b\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"c\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[10]\",\"name\":\"signals\",\"type\":\"uint256[10]\"}],\"internalType\":\"struct ITransferDomainProcessor.TransferProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"processProof\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"dkimKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"hashedReceiverId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"domainName\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_emailFromAddress\",\"type\":\"string\"}],\"name\":\"setEmailFromAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_timestampBuffer\",\"type\":\"uint256\"}],\"name\":\"setTimestampBuffer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timestampBuffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"_pA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"_pB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"_pC\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[10]\",\"name\":\"_pubSignals\",\"type\":\"uint256[10]\"}],\"name\":\"verifyProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setEmailFromAddress(string)\":{\"params\":{\"_emailFromAddress\":\"The from email address for validated emails, MUST BE PROPERLY PADDED\"}},\"setTimestampBuffer(uint256)\":{\"params\":{\"_timestampBuffer\":\"The timestamp buffer for validated emails\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"setEmailFromAddress(string)\":{\"notice\":\"ONLY OWNER: Sets the from email address for validated emails. Check that email address is properly padded (if necessary). Padding will be dependent on if unpacking functions cut trailing 0s or not.\"},\"setTimestampBuffer(uint256)\":{\"notice\":\"ONLY OWNER: Sets the timestamp buffer for validated emails. This is the amount of time in seconds that the timestamp can be off by and still be considered valid. Necessary to build in flexibility with L2 timestamps.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TransferDomainProcessor.sol\":\"TransferDomainProcessor\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@zk-email/contracts/utils/StringUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.7.6;\\n\\n// https://github.com/nalinbhardwaj/ethdosnumber/blob/main/ethdos-contracts/src/HexStrings.sol\\nlibrary StringUtils {\\n bytes16 internal constant ALPHABET = \\\"0123456789abcdef\\\";\\n uint256 internal constant DEFAULT_PACK_SIZE = 31;\\n\\n /// @notice Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n /// @dev Credit to Open Zeppelin under MIT license https://github.com/OpenZeppelin/openzeppelin-contracts/blob/243adff49ce1700e0ecb99fe522fb16cff1d1ddc/contracts/utils/Strings.sol#L55\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = ALPHABET[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n function toHexStringNoPrefix(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length);\\n for (uint256 i = buffer.length; i > 0; i--) {\\n buffer[i - 1] = ALPHABET[value & 0xf];\\n value >>= 4;\\n }\\n return string(buffer);\\n }\\n\\n function toString(uint256 value) internal pure returns (string memory) {\\n return toString(abi.encodePacked(value));\\n }\\n\\n function toString(bytes32 value) internal pure returns (string memory) {\\n return toString(abi.encodePacked(value));\\n }\\n\\n function toString(address account) internal pure returns (string memory) {\\n return toString(abi.encodePacked(account));\\n }\\n\\n function stringEq(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));\\n }\\n\\n function toString(bytes memory data) internal pure returns (string memory) {\\n bytes memory alphabet = \\\"0123456789abcdef\\\";\\n\\n bytes memory str = new bytes(2 + data.length * 2);\\n str[0] = \\\"0\\\";\\n str[1] = \\\"x\\\";\\n for (uint256 i = 0; i < data.length; i++) {\\n str[2 + i * 2] = alphabet[uint256(uint8(data[i] >> 4))];\\n str[3 + i * 2] = alphabet[uint256(uint8(data[i] & 0x0f))];\\n }\\n return string(str);\\n }\\n\\n // 1 packed byte = packSize (usually 31) normal bytes, all in one 255/256-bit value\\n // Note that this is not 32 due to the field modulus of circom\\n function convertPackedByteToString(uint256 packedByte, uint256 packSize)\\n internal\\n pure\\n returns (string memory extractedString)\\n {\\n uint256[] memory packedBytes = new uint256[](1);\\n packedBytes[0] = packedByte;\\n return convertPackedBytesToString(packedBytes, packSize, packSize);\\n }\\n\\n // Note: This convenience function removes the max string length check, which may cause misalignment with the circom\\n // If using this, then the circom needs to rangecheck packed length in the circuit itself\\n // This defaults to 31 bytes per packed byte\\n function convertPackedBytesToString(uint256[] memory packedBytes) \\n internal\\n pure\\n returns (string memory extractedString)\\n {\\n return convertPackedBytesToString(packedBytes, packedBytes.length * DEFAULT_PACK_SIZE, DEFAULT_PACK_SIZE);\\n }\\n\\n // Unpacks uint256s into bytes and then extracts the non-zero characters\\n // Only extracts contiguous non-zero characters and ensures theres only 1 such state\\n // Note that unpackedLen may be more than packedBytes.length * 8 since there may be 0s\\n // signals is the total number of signals (i.e. bytes) packed into the packedBytes. it defaults to packedBytes.length * packSize\\n function convertPackedBytesToString(uint256[] memory packedBytes, uint256 signals, uint256 packSize)\\n internal\\n pure\\n returns (string memory extractedString)\\n {\\n uint8 state = 0;\\n // bytes: 0 0 0 0 y u s h _ g 0 0 0\\n // state: 0 0 0 0 1 1 1 1 1 1 2 2 2\\n bytes memory nonzeroBytesArray = new bytes(packedBytes.length * packSize);\\n uint256 nonzeroBytesArrayIndex = 0;\\n for (uint16 i = 0; i < packedBytes.length; i++) {\\n uint256 packedByte = packedBytes[i];\\n uint8[] memory unpackedBytes = new uint8[](packSize);\\n for (uint256 j = 0; j < packSize; j++) {\\n unpackedBytes[j] = uint8(packedByte >> (j * 8));\\n }\\n for (uint256 j = 0; j < packSize; j++) {\\n uint256 unpackedByte = unpackedBytes[j]; //unpackedBytes[j];\\n if (unpackedByte != 0) {\\n nonzeroBytesArray[nonzeroBytesArrayIndex] = bytes1(uint8(unpackedByte));\\n nonzeroBytesArrayIndex++;\\n if (state % 2 == 0) {\\n state += 1;\\n }\\n } else {\\n if (state % 2 == 1) {\\n state += 1;\\n }\\n }\\n packedByte = packedByte >> 8;\\n }\\n }\\n // TODO: You might want to assert that the state is exactly 1 or 2\\n // If not, that means empty bytse have been removed from the middle and things have been concatenated.\\n // We removed due to some tests failing, but this is not ideal and the require should be uncommented as soon as tests pass with it.\\n\\n // require(state == 1 || state == 2, \\\"Invalid final state of packed bytes in email; more than two non-zero regions found!\\\");\\n require(state >= 1, \\\"No packed bytes found! Invalid final state of packed bytes in email; value is likely 0!\\\");\\n require(nonzeroBytesArrayIndex <= signals, \\\"Packed bytes more than allowed max number of signals!\\\");\\n string memory returnValue = removeTrailingZeros(string(nonzeroBytesArray));\\n return returnValue;\\n // Have to end at the end of the email -- state cannot be 1 since there should be an email footer\\n }\\n\\n function bytes32ToString(bytes32 input) internal pure returns (string memory) {\\n uint256 i;\\n for (i = 0; i < 32 && input[i] != 0; i++) {}\\n bytes memory resultBytes = new bytes(i);\\n for (i = 0; i < 32 && input[i] != 0; i++) {\\n resultBytes[i] = input[i];\\n }\\n return string(resultBytes);\\n }\\n\\n // sliceArray is used to slice an array of uint256s from start-end into a new array of uint256s\\n function sliceArray(uint256[] memory input, uint256 start, uint256 end) internal pure returns (uint256[] memory) {\\n require(start <= end && end <= input.length, \\\"Invalid slice indices\\\");\\n uint256[] memory result = new uint256[](end - start);\\n for (uint256 i = start; i < end; i++) {\\n result[i - start] = input[i];\\n }\\n return result;\\n }\\n\\n // stringToUint is used to convert a string like \\\"45\\\" to a uint256 4\\n function stringToUint(string memory s) internal pure returns (uint256) {\\n bytes memory b = bytes(s);\\n uint256 result = 0;\\n for (uint256 i = 0; i < b.length; i++) {\\n if (b[i] >= 0x30 && b[i] <= 0x39) {\\n result = result * 10 + (uint256(uint8(b[i])) - 48);\\n }\\n\\n // TODO: Currently truncates decimals\\n if (b[i] == 0x2E) {\\n return result;\\n }\\n }\\n return result;\\n }\\n\\n // getDomainFromEmail is used to extract the domain from an email i.e. the part after the @\\n function getDomainFromEmail(string memory fromEmail) internal pure returns (string memory) {\\n bytes memory emailBytes = bytes(fromEmail);\\n uint256 atIndex;\\n for (uint256 i = 0; i < emailBytes.length; i++) {\\n if (emailBytes[i] == \\\"@\\\") {\\n atIndex = i;\\n break;\\n }\\n }\\n\\n bytes memory domainBytes = new bytes(emailBytes.length - atIndex - 1);\\n for (uint256 j = 0; j < domainBytes.length; j++) {\\n domainBytes[j] = emailBytes[atIndex + 1 + j];\\n }\\n return bytes32ToString(bytes32(bytes(domainBytes)));\\n }\\n\\n function removeTrailingZeros(string memory input) public pure returns (string memory) {\\n bytes memory inputBytes = bytes(input);\\n uint256 endIndex = inputBytes.length;\\n\\n for (uint256 i = 0; i < inputBytes.length; i++) {\\n if (inputBytes[i] == 0) {\\n endIndex = i;\\n break;\\n }\\n }\\n\\n bytes memory resultBytes = new bytes(endIndex);\\n for (uint256 i = 0; i < endIndex; i++) {\\n resultBytes[i] = inputBytes[i];\\n }\\n\\n return string(resultBytes);\\n }\\n\\n // Upper/lower string utils from https://github.com/willitscale/solidity-util/blob/master/lib/Strings.sol\\n /**\\n * Upper\\n *\\n * Converts all the values of a string to their corresponding upper case\\n * value.\\n *\\n * @param _base When being used for a data type this is the extended object\\n * otherwise this is the string base to convert to upper case\\n * @return string\\n */\\n function upper(string memory _base) public pure returns (string memory) {\\n bytes memory _baseBytes = bytes(_base);\\n for (uint256 i = 0; i < _baseBytes.length; i++) {\\n _baseBytes[i] = _upper(_baseBytes[i]);\\n }\\n return string(_baseBytes);\\n }\\n\\n /**\\n * Lower\\n *\\n * Converts all the values of a string to their corresponding lower case\\n * value.\\n *\\n * @param _base When being used for a data type this is the extended object\\n * otherwise this is the string base to convert to lower case\\n * @return string\\n */\\n function lower(string memory _base) public pure returns (string memory) {\\n bytes memory _baseBytes = bytes(_base);\\n for (uint256 i = 0; i < _baseBytes.length; i++) {\\n _baseBytes[i] = _lower(_baseBytes[i]);\\n }\\n return string(_baseBytes);\\n }\\n\\n /**\\n * Upper\\n *\\n * Convert an alphabetic character to upper case and return the original\\n * value when not alphabetic\\n *\\n * @param _b1 The byte to be converted to upper case\\n * @return bytes1 The converted value if the passed value was alphabetic\\n * and in a lower case otherwise returns the original value\\n */\\n function _upper(bytes1 _b1) private pure returns (bytes1) {\\n if (_b1 >= 0x61 && _b1 <= 0x7A) {\\n return bytes1(uint8(_b1) - 32);\\n }\\n\\n return _b1;\\n }\\n\\n /**\\n * Lower\\n *\\n * Convert an alphabetic character to lower case and return the original\\n * value when not alphabetic\\n *\\n * @param _b1 The byte to be converted to lower case\\n * @return bytes1 The converted value if the passed value was alphabetic\\n * and in a upper case otherwise returns the original value\\n */\\n function _lower(bytes1 _b1) private pure returns (bytes1) {\\n if (_b1 >= 0x41 && _b1 <= 0x5A) {\\n return bytes1(uint8(_b1) + 32);\\n }\\n\\n return _b1;\\n }\\n}\\n\",\"keccak256\":\"0x8c5b56494116a0c056c63e28fe892eea9bee5b056b09efa6aba1c9a82dc26c18\",\"license\":\"MIT\"},\"contracts/TransferDomainProcessor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\nimport { StringUtils } from \\\"@zk-email/contracts/utils/StringUtils.sol\\\";\\n\\nimport { EmailBaseProcessor } from \\\"./external/processors/EmailBaseProcessor.sol\\\";\\nimport { INullifierRegistry } from \\\"./external/interfaces/INullifierRegistry.sol\\\";\\nimport { StringConversionUtils } from \\\"./external/lib/StringConversionUtils.sol\\\";\\n\\nimport { Groth16Verifier } from \\\"./verifiers/namecheap_transfer_verifier.sol\\\";\\nimport { ITransferDomainProcessor } from \\\"./interfaces/ITransferDomainProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract TransferDomainProcessor is Groth16Verifier, ITransferDomainProcessor, EmailBaseProcessor {\\n \\n using StringUtils for uint256[];\\n using StringConversionUtils for string;\\n\\n /* ============ Constants ============ */\\n uint256 constant PACK_SIZE = 31;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _exchange,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Groth16Verifier()\\n EmailBaseProcessor(\\n _exchange,\\n _nullifierRegistry,\\n _emailFromAddress,\\n _timestampBuffer\\n )\\n {}\\n \\n /* ============ External Functions ============ */\\n\\n function processProof(\\n TransferProof calldata _proof\\n )\\n external\\n override\\n onlyExchange\\n returns (\\n bytes32 dkimKeyHash,\\n bytes32 hashedReceiverId,\\n string memory domainName, \\n uint256 bidId\\n )\\n {\\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \\\"Invalid Proof\\\");\\n\\n // Signal [0] is the DKIM key hash\\n dkimKeyHash = bytes32(_proof.signals[0]);\\n\\n // Signals [1:2] are the packed from email address\\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 2);\\n require(\\n keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \\n \\\"Invalid email from address\\\"\\n );\\n \\n // Signals [2:7] are packed domain name\\n domainName = _parseSignalArray(_proof.signals, 2, 7);\\n\\n // Signal [7] is packed hashed namecheap id to which domain was transferred\\n hashedReceiverId = bytes32(_proof.signals[7]);\\n\\n // Check if email has been used previously, if not nullify it so it can't be used again\\n _validateAndAddNullifier(bytes32(_proof.signals[8]));\\n\\n // Signal [9] is bidId\\n bidId = _proof.signals[9];\\n }\\n \\n /* ============ Internal Functions ============ */\\n\\n function _parseSignalArray(uint256[10] calldata _signals, uint8 _from, uint8 _to) \\n internal \\n pure \\n returns (string memory) \\n {\\n uint256[] memory signalArray = new uint256[](_to - _from);\\n for (uint256 i = _from; i < _to; i++) {\\n signalArray[i - _from] = _signals[i];\\n }\\n\\n return signalArray.convertPackedBytesToString(signalArray.length * PACK_SIZE, PACK_SIZE);\\n }\\n}\\n\",\"keccak256\":\"0x27e7d34dbe222f5a865d0b34f276eac82f3888f00e9816c398ee5fe9cf18bb2c\",\"license\":\"MIT\"},\"contracts/external/interfaces/IKeyHashAdapterV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IKeyHashAdapterV2 {\\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function getMailServerKeyHashes() external view returns (bytes32[] memory);\\n function isMailServerKeyHash(bytes32 _mailserverKeyHash) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc849f2dc34e4463550b8e0a16541bde429cb1adf43776b2c4179e9d4e4e656a2\",\"license\":\"MIT\"},\"contracts/external/interfaces/INullifierRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface INullifierRegistry {\\n function addNullifier(bytes32 _nullifier) external;\\n function isNullified(bytes32 _nullifier) external view returns(bool);\\n}\\n\",\"keccak256\":\"0x107164bc9a320938b513305878163b7fa884da4cdae58d0c8e81bfbb00c97c5e\",\"license\":\"MIT\"},\"contracts/external/lib/StringConversionUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\n// Building on zk-email's StringUtils library we add the ability to handle decimals when\\n// converting from string to Uint\\nlibrary StringConversionUtils {\\n \\n /**\\n * @notice Function that parses numbers returned as strings including floating point numbers. Returned floating point\\n * numbers are to have the desired amount of decimal specified. If the stringified version of the floating point\\n * number has more decimal places than desired then the function will revert in order to be maximally safe. If\\n * the returned number has multiple floating points then the function will revert.\\n *\\n * Examples: _s = \\\"12.34\\\", _expectedDecimals = 6 => 12340000\\n * _s = \\\"12.34\\\", _expectedDecimals = 2 => 1234\\n * _s = \\\"12.34\\\", _expectedDecimals = 1 => REVERT (we never want loss of precision only addition)\\n * _s = \\\"12.34.56\\\", _expectedDecimals = 6 => REVERT (Invalid number)\\n *\\n * @param _s String being processed\\n * @param _desiredDecimals Desired amount of decimal places\\n */\\n function stringToUint(string memory _s, uint256 _desiredDecimals) internal pure returns (uint256) {\\n return stringToUint(_s, 0x2E, _desiredDecimals);\\n }\\n\\n function stringToUint(\\n string memory _s,\\n bytes1 _decimalCharacter,\\n uint256 _desiredDecimals\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n bytes memory b = bytes(_s);\\n\\n uint256 result = 0;\\n uint256 decimalPlaces = 0;\\n\\n bool decimals = false;\\n for (uint256 i = 0; i < b.length; i++) {\\n if (b[i] >= 0x30 && b[i] <= 0x39) {\\n result = result * 10 + (uint256(uint8(b[i])) - 48);\\n }\\n\\n if (decimals) {\\n decimalPlaces++;\\n }\\n\\n if (b[i] == _decimalCharacter) {\\n require(decimals == false, \\\"String has multiple decimals\\\");\\n decimals = true;\\n }\\n }\\n\\n require(decimalPlaces <= _desiredDecimals, \\\"String has too many decimal places\\\");\\n return result * (10 ** (_desiredDecimals - decimalPlaces));\\n }\\n\\n /**\\n * @notice Function that returns a substring from _startIndex to _endIndex (non-inclusive).\\n *\\n * @param _str String being processed\\n * @param _startIndex Index to start parsing from\\n * @param _endIndex Index to stop parsing at (index not included in result)\\n */\\n function substring(string memory _str, uint _startIndex, uint _endIndex) internal pure returns (string memory ) {\\n bytes memory strBytes = bytes(_str);\\n bytes memory result = new bytes(_endIndex-_startIndex);\\n for(uint i = _startIndex; i < _endIndex; i++) {\\n result[i-_startIndex] = strBytes[i];\\n }\\n return string(result);\\n }\\n\\n function replaceString(\\n string memory _str,\\n string memory _lookupValue,\\n string memory _replaceValue\\n )\\n internal\\n pure\\n returns (string memory)\\n {\\n bytes memory strBytes = bytes(_str);\\n bytes memory lookupBytes = bytes(_lookupValue);\\n\\n uint256 lookupIndex = indexOf(_str, _lookupValue);\\n if (lookupIndex == type(uint256).max) {\\n return _str;\\n }\\n\\n // Split the original string into two parts: before and after the keyword\\n string memory beforeKeyword = substring(_str, 0, lookupIndex);\\n string memory afterKeyword = substring(_str, lookupIndex + lookupBytes.length, strBytes.length);\\n \\n return string.concat(beforeKeyword, _replaceValue, afterKeyword);\\n }\\n\\n function indexOf(string memory str, string memory substr) internal pure returns (uint) {\\n bytes memory strBytes = bytes(str);\\n bytes memory substrBytes = bytes(substr);\\n \\n if (strBytes.length < substrBytes.length) return type(uint256).max;\\n \\n for (uint i = 0; i <= strBytes.length - substrBytes.length; i++) {\\n bool found = true;\\n for (uint j = 0; j < substrBytes.length; j++) {\\n if (strBytes[i + j] != substrBytes[j]) {\\n found = false;\\n break;\\n }\\n }\\n if (found) return i;\\n }\\n \\n return type(uint256).max;\\n }\\n\\n function stringComparison(string memory _a, string memory _b) internal pure returns (bool) {\\n return (keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b)));\\n }\\n}\\n\",\"keccak256\":\"0xfcdfb3c2c8d5a6b7f480f827049782a70fb98f8b3838dcad0e0bb95237b94a0c\",\"license\":\"MIT\"},\"contracts/external/processors/EmailBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"../interfaces/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"../interfaces/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract EmailBaseProcessor is Ownable {\\n\\n /* ============ Modifiers ============ */\\n modifier onlyExchange() {\\n require(msg.sender == exchange, \\\"Only exchange can call this function\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n address public immutable exchange;\\n INullifierRegistry public nullifierRegistry;\\n bytes public emailFromAddress;\\n uint256 public timestampBuffer;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _exchange,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Ownable()\\n {\\n exchange = _exchange;\\n nullifierRegistry = _nullifierRegistry;\\n emailFromAddress = bytes(_emailFromAddress);\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice ONLY OWNER: Sets the from email address for validated emails. Check that email address is properly\\n * padded (if necessary). Padding will be dependent on if unpacking functions cut trailing 0s or not.\\n *\\n * @param _emailFromAddress The from email address for validated emails, MUST BE PROPERLY PADDED\\n */\\n function setEmailFromAddress(string memory _emailFromAddress) external onlyOwner {\\n emailFromAddress = bytes(_emailFromAddress);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Sets the timestamp buffer for validated emails. This is the amount of time in seconds\\n * that the timestamp can be off by and still be considered valid. Necessary to build in flexibility with L2\\n * timestamps.\\n *\\n * @param _timestampBuffer The timestamp buffer for validated emails\\n */\\n function setTimestampBuffer(uint256 _timestampBuffer) external onlyOwner {\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Getters ============ */\\n\\n function getEmailFromAddress() external view returns (bytes memory) {\\n return emailFromAddress;\\n }\\n\\n\\n /* ============ Internal Functions ============ */\\n\\n function _validateAndAddNullifier(bytes32 _nullifier) internal {\\n require(!nullifierRegistry.isNullified(_nullifier), \\\"Nullifier has already been used\\\");\\n nullifierRegistry.addNullifier(_nullifier);\\n }\\n}\\n\",\"keccak256\":\"0xe210c8e937a457c2d2aff798f3696f04ce1d011470294f02fb1169006a385f07\",\"license\":\"MIT\"},\"contracts/interfaces/ITransferDomainProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.18;\\n\\n\\ninterface ITransferDomainProcessor {\\n\\n struct TransferProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[10] signals;\\n }\\n\\n function processProof(\\n TransferProof calldata _proof\\n ) \\n external \\n returns (\\n bytes32 dkimKeyHash, \\n bytes32 hashedReceiverId, \\n string memory domainName, \\n uint256 bidId\\n );\\n}\",\"keccak256\":\"0x9cf5f1b070d7bad73d8ae57f7b20d449853f96fcbb5df1a443723df41c91339d\",\"license\":\"MIT\"},\"contracts/verifiers/namecheap_transfer_verifier.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n/*\\n Copyright 2021 0KIMS association.\\n\\n This file is generated with [snarkJS](https://github.com/iden3/snarkjs).\\n\\n snarkJS is a free software: you can redistribute it and/or modify it\\n under the terms of the GNU General Public License as published by\\n the Free Software Foundation, either version 3 of the License, or\\n (at your option) any later version.\\n\\n snarkJS is distributed in the hope that it will be useful, but WITHOUT\\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\\n License for more details.\\n\\n You should have received a copy of the GNU General Public License\\n along with snarkJS. If not, see .\\n*/\\n\\npragma solidity >=0.7.0 <0.9.0;\\n\\ncontract Groth16Verifier {\\n // Scalar field size\\n uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n // Base field size\\n uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\\n\\n // Verification Key data\\n uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042;\\n uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958;\\n uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132;\\n uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731;\\n uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679;\\n uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856;\\n uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n\\n\\n uint256 constant IC0x = 12140764414809439171579073747096628005611143888739021778142114438725209856911;\\n uint256 constant IC0y = 18380664008722994554410246598515713804368408809139402801410617352473294938101;\\n\\n uint256 constant IC1x = 16287270730688090110441256630912972881096977102957363147237538512209615075930;\\n uint256 constant IC1y = 2449016754858987854593324887044687327196932594716827949199487058237499016691;\\n\\n uint256 constant IC2x = 12290000746054008145532172012836689239677528072347882111559847558608807494030;\\n uint256 constant IC2y = 14308358318183304542626969831757608989020288980497492892592599563043422576641;\\n\\n uint256 constant IC3x = 17109205409157997740951972967816433882944148152574672952222919864324056429618;\\n uint256 constant IC3y = 9961558237149244928391169779496769511791942854258198694890294984589871243856;\\n\\n uint256 constant IC4x = 12885622983359679040345794541760667584938087103345731492334670493606961282700;\\n uint256 constant IC4y = 18397333374263242470546340955330845415543534978510188436756186606821028634481;\\n\\n uint256 constant IC5x = 8251971901226176941314060074725743834337466028961811325874949093602610929902;\\n uint256 constant IC5y = 16257777857146800480589260332284762827173712873310789777823130626151679328406;\\n\\n uint256 constant IC6x = 7755902890727928430969631143079950108469618570373249456222008624592630122217;\\n uint256 constant IC6y = 10757977250154075642155615103618917172698106635999924885067022788329148453826;\\n\\n uint256 constant IC7x = 9229565613389027758694089669374665969186485724568040364429447974425840672975;\\n uint256 constant IC7y = 8522685561456236376873601057738356653321521861001626828091657280469196217906;\\n\\n uint256 constant IC8x = 21276732369738095771663301979590133243106197446584260397744418605720907267683;\\n uint256 constant IC8y = 7293000518568388677473960035761983204180608786522452828815102825735261508468;\\n\\n uint256 constant IC9x = 9116173570523657214485637140779662063231707742648921986441734490858993965489;\\n uint256 constant IC9y = 20125316561678768525824986864877835211109013619593406972323904438419789772526;\\n\\n uint256 constant IC10x = 14220475398513461434883329515056365002533036699993990374428625877488131891870;\\n uint256 constant IC10y = 12173247053801606963174627761051371553685163525039542034195810636700588930659;\\n\\n\\n // Memory data\\n uint16 constant pVk = 0;\\n uint16 constant pPairing = 128;\\n\\n uint16 constant pLastMem = 896;\\n\\n function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[10] calldata _pubSignals) public view returns (bool) {\\n assembly {\\n function checkField(v) {\\n if iszero(lt(v, r)) {\\n mstore(0, 0)\\n return(0, 0x20)\\n }\\n }\\n\\n // G1 function to multiply a G1 value(x,y) to value in an address\\n function g1_mulAccC(pR, x, y, s) {\\n let success\\n let mIn := mload(0x40)\\n mstore(mIn, x)\\n mstore(add(mIn, 32), y)\\n mstore(add(mIn, 64), s)\\n\\n success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)\\n\\n if iszero(success) {\\n mstore(0, 0)\\n return(0, 0x20)\\n }\\n\\n mstore(add(mIn, 64), mload(pR))\\n mstore(add(mIn, 96), mload(add(pR, 32)))\\n\\n success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)\\n\\n if iszero(success) {\\n mstore(0, 0)\\n return(0, 0x20)\\n }\\n }\\n\\n function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {\\n let _pPairing := add(pMem, pPairing)\\n let _pVk := add(pMem, pVk)\\n\\n mstore(_pVk, IC0x)\\n mstore(add(_pVk, 32), IC0y)\\n\\n // Compute the linear combination vk_x\\n\\n g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))\\n\\n g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))\\n\\n g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))\\n\\n g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))\\n\\n g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))\\n\\n g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)))\\n\\n g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)))\\n\\n g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)))\\n\\n g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)))\\n\\n g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288)))\\n\\n\\n // -A\\n mstore(_pPairing, calldataload(pA))\\n mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q))\\n\\n // B\\n mstore(add(_pPairing, 64), calldataload(pB))\\n mstore(add(_pPairing, 96), calldataload(add(pB, 32)))\\n mstore(add(_pPairing, 128), calldataload(add(pB, 64)))\\n mstore(add(_pPairing, 160), calldataload(add(pB, 96)))\\n\\n // alpha1\\n mstore(add(_pPairing, 192), alphax)\\n mstore(add(_pPairing, 224), alphay)\\n\\n // beta2\\n mstore(add(_pPairing, 256), betax1)\\n mstore(add(_pPairing, 288), betax2)\\n mstore(add(_pPairing, 320), betay1)\\n mstore(add(_pPairing, 352), betay2)\\n\\n // vk_x\\n mstore(add(_pPairing, 384), mload(add(pMem, pVk)))\\n mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))\\n\\n\\n // gamma2\\n mstore(add(_pPairing, 448), gammax1)\\n mstore(add(_pPairing, 480), gammax2)\\n mstore(add(_pPairing, 512), gammay1)\\n mstore(add(_pPairing, 544), gammay2)\\n\\n // C\\n mstore(add(_pPairing, 576), calldataload(pC))\\n mstore(add(_pPairing, 608), calldataload(add(pC, 32)))\\n\\n // delta2\\n mstore(add(_pPairing, 640), deltax1)\\n mstore(add(_pPairing, 672), deltax2)\\n mstore(add(_pPairing, 704), deltay1)\\n mstore(add(_pPairing, 736), deltay2)\\n\\n\\n let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20)\\n\\n isOk := and(success, mload(_pPairing))\\n }\\n\\n let pMem := mload(0x40)\\n mstore(0x40, add(pMem, pLastMem))\\n\\n // Validate that all evaluations \\u2208 F\\n\\n checkField(calldataload(add(_pubSignals, 0)))\\n\\n checkField(calldataload(add(_pubSignals, 32)))\\n\\n checkField(calldataload(add(_pubSignals, 64)))\\n\\n checkField(calldataload(add(_pubSignals, 96)))\\n\\n checkField(calldataload(add(_pubSignals, 128)))\\n\\n checkField(calldataload(add(_pubSignals, 160)))\\n\\n checkField(calldataload(add(_pubSignals, 192)))\\n\\n checkField(calldataload(add(_pubSignals, 224)))\\n\\n checkField(calldataload(add(_pubSignals, 256)))\\n\\n checkField(calldataload(add(_pubSignals, 288)))\\n\\n checkField(calldataload(add(_pubSignals, 320)))\\n\\n\\n // Validate all evaluations\\n let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)\\n\\n mstore(0, isValid)\\n return(0, 0x20)\\n }\\n }\\n }\",\"keccak256\":\"0x55848d7bd571fc2f3c2bfe5a219bfad381731ac46a791e45737b8b36ef8d482f\",\"license\":\"GPL-3.0\"}},\"version\":1}", - "bytecode": "0x60a06040523462000044576200002262000018620001f4565b929190916200021d565b604051611eb66200054c82396080518181816104da01526109460152611eb690f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200008157604052565b62000049565b906200009e6200009660405190565b92836200005f565b565b6001600160a01b031690565b90565b6001600160a01b0381165b036200004457565b905051906200009e82620000af565b6001600160a01b038116620000ba565b905051906200009e82620000d1565b6001600160401b0381116200008157602090601f01601f19160190565b60005b838110620001215750506000910152565b818101518382015260200162000110565b909291926200014b6200014582620000f0565b62000087565b9381855260208501908284011162000044576200009e926200010d565b9080601f8301121562000044578151620000ac9260200162000132565b80620000ba565b905051906200009e8262000185565b6080818303126200004457620001b28282620000c2565b92620001c28360208401620000e1565b604083015190936001600160401b0382116200004457620001ea81620000ac93860162000168565b936060016200018c565b6200021762002402803803806200020b8162000087565b9283398101906200019b565b90919293565b906200009e939291620004ab565b906001600160a01b03905b9181191691161790565b620000ac90620000a0906001600160a01b031682565b620000ac9062000240565b620000ac9062000256565b9062000280620000ac620002889262000261565b82546200022b565b9055565b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015620002c5575b6020831014620002bf57565b6200028c565b91607f1691620002b3565b9160001960089290920291821b911b62000236565b620000ac620000ac620000ac9290565b91906200030a620000ac6200028893620002e5565b908354620002d0565b6200009e91600091620002f5565b8181106200032d575050565b806200033d600060019362000313565b0162000321565b9190601f81116200035457505050565b620003686200009e93600052602060002090565b906020601f8401819004830193106200038c575b6020601f90910104019062000321565b90915081906200037c565b90620003a1815190565b906001600160401b0382116200008157620003c982620003c28554620002a2565b8562000344565b602090601f8311600114620004085762000288929160009183620003fc575b5050600019600883021c1916906002021790565b015190503880620003e8565b601f198316916200041e85600052602060002090565b9260005b8181106200045f5750916002939185600196941062000445575b50505002019055565b01516000196008601f8516021c191690553880806200043c565b9193602060018192878701518155019501920162000422565b906200009e9162000397565b906000199062000236565b90620004a3620000ac6200028892620002e5565b825462000484565b6200009e9392620000ac620004dc93620004d493620004c9620004e4565b60805260016200026c565b600262000478565b60036200048f565b6200009e336000546001600160a01b031690620005038160006200026c565b6200053a620005337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09362000261565b9162000261565b916200054560405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c806365cd296c146100d2578063715018a6146100cd5780638da5cb5b146100c8578063b2a3fda4146100c3578063b870676c146100be578063c0d05fed146100b9578063ced1e978146100b4578063d2f7265a146100af578063dbac5821146100aa578063f2fde38b146100a5578063f3bb70f6146100a05763f6c7226b036100e6576106bf565b6105f9565b61057b565b610520565b6104c5565b6104aa565b610483565b6102e7565b610265565b610206565b6101dd565b61019d565b90816102409103126100e65790565b600080fd5b90610240828203126100e657610100916100d7565b90565b9052565b60005b83811061011a5750506000910152565b818101518382015260200161010a565b61014b61015460209361015e9361013f815190565b80835293849260200190565b95869101610107565b601f01601f191690565b0190565b94939160609161019b946101896101969361018260808b019460008c0152565b60208a0152565b878203604089015261012a565b940152565b565b346100e6576101ce6101b86101b33660046100eb565b610d21565b906101c594929460405190565b94859485610162565b0390f35b60009103126100e657565b346100e6576101ed3660046101d2565b6101f561072c565b604051005b6001600160a01b031690565b346100e6576102163660046101d2565b6101ce6102216106ea565b604051918291826001600160a01b03909116815260200190565b805b036100e657565b9050359061019b8261023b565b906020828203126100e65761010091610244565b346100e6576101f5610278366004610251565b6115da565b610100916008021c6001600160a01b031690565b90610100915461027d565b61010060006001610291565b610100906101fa906001600160a01b031682565b610100906102a8565b610100906102bc565b610103906102c5565b60208101929161019b91906102ce565b346100e6576102f73660046101d2565b6101ce61030261029c565b604051918291826102d7565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561035a575b602083101461035557565b610324565b91607f169161034a565b805460009392916103816103778361033a565b8085529360200190565b91600181169081156103d3575060011461039a57505050565b6103ad9192939450600052602060002090565b916000925b8184106103bf5750500190565b8054848401526020909301926001016103b2565b92949550505060ff1916825215156020020190565b9061010091610364565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761042a57604052565b6103f2565b9061019b6104499261044060405190565b938480926103e8565b0383610408565b90600010610461576101009061042f565b61030e565b61010060006002610450565b60208082526101009291019061012a565b346100e6576104933660046101d2565b6101ce61049e610466565b60405191829182610472565b346100e6576104ba3660046101d2565b6101ce61049e6115e3565b346100e6576104d53660046101d2565b6101ce7f0000000000000000000000000000000000000000000000000000000000000000610221565b610100916008021c81565b9061010091546104fe565b61010060006003610509565b346100e6576105303660046101d2565b6101ce61053b610514565b6040519182918290815260200190565b6001600160a01b03811661023d565b9050359061019b8261054b565b906020828203126100e6576101009161055a565b346100e6576101f561058e366004610567565b610843565b919060408301116100e657565b919060808301116100e657565b91906101408301116100e657565b610240818303126100e6576105d08282610593565b926101006105e184604085016105a0565b936105ef8160c08601610593565b93610100016105ad565b346100e6576106093660046105bb565b92919091611dc5565b9061019b61061f60405190565b9283610408565b67ffffffffffffffff811161042a57602090601f01601f19160190565b90826000939282370152565b9092919261066461065f82610626565b610612565b938185526020850190828401116100e65761019b92610643565b9080601f830112156100e6578160206101009335910161064f565b906020828203126100e657813567ffffffffffffffff81116100e657610100920161067e565b346100e6576101f56106d2366004610699565b611594565b610100906101fa565b61010090546106d7565b61010060006106e0565b6106fc610788565b61019b61071a565b6101fa6101006101009290565b61010090610704565b61019b6107276000610711565b61087c565b61019b6106f4565b1561073b57565b60405162461bcd60e51b815280610784600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b61019b6107936106ea565b6107ac61079f336101fa565b916001600160a01b031690565b14610734565b61019b906107be610788565b61081e565b156107ca57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61019b906107276108326101fa6000610711565b6001600160a01b03831614156107c3565b61019b906107b2565b906001600160a01b03905b9181191691161790565b90610871610100610878926102c5565b825461084c565b9055565b61088660006106e0565b90610892816000610861565b6108c56108bf7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936102c5565b916102c5565b916108cf60405190565b600090a3565b156108dc57565b60405162461bcd60e51b8152602060048201526024808201527f4f6e6c792065786368616e67652063616e2063616c6c20746869732066756e636044820152633a34b7b760e11b6064820152608490fd5b61097694939291906109713361096b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661079f565b146108d5565b610b73565b90919293565b80151561023d565b9050519061019b8261097c565b906020828203126100e65761010091610984565b9037565b61019b916040916109a5565b9061015e816040936109a9565b6109d26109ce60029390565b9190565b806000925b8484106109e5575050505050565b610a016109fa6001926109f58690565b6109b5565b9360400190565b930192916109d7565b61019b91610140916109a5565b610a4f61019b94610a4561010094989795610a3b61024086019a60008701906109a9565b60408501906109c2565b60c08301906109a9565b0190610a0a565b6040513d6000823e3d90fd5b15610a6957565b60405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606490fd5b634e487b7160e01b600052603260045260246000fd5b90600a811015610ac5576020020190565b610a9e565b6101006101006101009290565b356101008161023b565b610aee6101006101009290565b60ff1690565b61015e610b0c92602092610b06815190565b94859290565b93849101610107565b61010091610af4565b6101009061042f565b15610b2e57565b60405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606490fd5b50505050610b80306102c5565b602063f3bb70f6916000840190610bb96040860194610bc461010060c0890198018098610bac60405190565b9889978896879660e01b90565b865260048601610a17565b03915afa8015610d1c57610be091600091610cee575b50610a62565b610c03610bfe610bf9610bf36000610aca565b84610ab4565b610ad7565b610aca565b91600290610c88610c146001610ae1565b92610c826109ce610c73610c32610c2a85610ae1565b80988a610e1c565b610c5a610c3e60405190565b8092610c4e602083019182610b15565b90810382520382610408565b610c6c610c65825190565b9160200190565b2093610b1e565b610c7e610c65825190565b2090565b14610b27565b610100610bf9610cbc610bfe610bf9610cb6610cb0600798610ca98a610ae1565b908b610e1c565b97610aca565b88610ab4565b94610cde610cd9610bfe610bf9610cd36008610aca565b85610ab4565b611639565b610ce86009610aca565b90610ab4565b610d0f915060203d8111610d15575b610d078183610408565b810190610991565b38610bda565b503d610cfd565b610a56565b6109769060006060818061092d565b634e487b7160e01b600052601160045260246000fd5b610d559060ff165b9160ff1690565b90039060ff8211610d6257565b610d30565b6101006101006101009260ff1690565b67ffffffffffffffff811161042a5760208091020190565b90610d9c61065f83610d77565b918252565b369037565b9061019b610dbc610db684610d8f565b93610d77565b601f190160208401610da1565b6000198114610d625760010190565b91908203918211610d6257565b90610dee825190565b811015610ac5576020809102010190565b610100601f610aca565b81810292918115918404141715610d6257565b909290610e39610e34610e2f8686610d46565b610d67565b610da6565b91610e4385610d67565b610e4c85610d67565b811015610e9457610e8d81610e88610e6a610bf9610e4c9588610ab4565b610e85610e7f610e798c610d67565b85610dd8565b89610de5565b52565b610dc9565b9050610e43565b509350506101009150610ea5815190565b90610eb8610eb1610dff565b8093610e09565b906110c9565b90610d9c61065f83610626565b9061019b610dbc610edb84610ebe565b93610626565b610eee6101006101009290565b61ffff1690565b61ffff1661ffff8114610d625760010190565b6101006101006101009261ffff1690565b61010090610f2a6109ce6101009490565b901c90565b634e487b7160e01b600052601260045260246000fd5b610f519060ff16610d4e565b908115610f5c570690565b610f2f565b610f6d9060ff16610d4e565b019060ff8211610d6257565b610f8f610f896101009260ff1690565b60f81b90565b6001600160f81b03191690565b90610fa5825190565b811015610ac5570160200190565b61010090610f2a6109ce6101009460ff1690565b15610fce57565b60405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a490fd5b1561106657565b60405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608490fd5b926000926110d684610ae1565b6110ef6110ea836110e5895190565b610e09565b610ecb565b946110f981610aca565b9561110382610ee1565b965b6111106101008a5190565b61111989610f08565b10156112e75761113861113461112e8a610f08565b8b610de5565b5190565b98899661114487610da6565b9861114e86610aca565b8881101561119b5780610e888c8f6111969461118861118361118e9361117d6111776008610aca565b85610e09565b90610f19565b610ae1565b92610de5565b9060ff169052565b61114e565b5091909a50989295989793969194976111b388610aca565b955b8a8710156112c6576111d4610e2f6111cd8989610de5565b5160ff1690565b6111dd8a610aca565b811461127957906111f86111f361120a93610ae1565b610f79565b8a1a611204828b610f9c565b53610dc9565b9261121e6112186002610ae1565b8b610f45565b61122a610d4e8b610ae1565b14611255575b61124861124e915b6112426008610ae1565b90610fb3565b96610dc9565b95926111b5565b9861124861127061124e9261126a6001610ae1565b90610f61565b9a915050611230565b50926112886112186002610ae1565b600190611297610d4e83610ae1565b146112aa575b5061124861124e91611238565b6112be61124e929b61126a61124893610ae1565b9a915061129d565b989550935097949598916112da9150610ef5565b9695979197949094611105565b926109ce919598506101009750610100945061131a92509561010061132197611313610d4e6001610ae1565b1015610fc7565b111561105f565b611333565b610f8f610f896101009290565b80519060009261134284610aca565b61134d610100845190565b8110156113ef5761136f6113618285610f9c565b516001600160f81b03191690565b61138961137b87611326565b916001600160f81b03191690565b1461139c5761139790610dc9565b611342565b9250905b6113a983610ecb565b916113b385610aca565b845b8110156113e3576113dc816113d06113616113b59487610f9c565b881a6112048288610f9c565b90506113b3565b50935050610100915090565b50906113a0565b61019b90611402610788565b611589565b9160001960089290920291821b911b610857565b919061142c61010061087893610aca565b908354611407565b61019b9160009161141b565b81811061144b575050565b806114596000600193611434565b01611440565b9190601f811161146e57505050565b61148061019b93600052602060002090565b906020601f8401819004830193106114a2575b6020601f909101040190611440565b9091508190611493565b906114b5815190565b9067ffffffffffffffff821161042a576114d9826114d3855461033a565b8561145f565b602090601f831160011461151457610878929160009183611509575b5050600019600883021c1916906002021790565b0151905038806114f5565b601f1983169161152985600052602060002090565b9260005b8181106115675750916002939185600196941061154e575b50505002019055565b01516000196008601f8516021c19169055388080611545565b9193602060018192878701518155019501920161152d565b9061019b916114ac565b61019b90600261157f565b61019b906113f6565b61019b906115a9610788565b6115cf565b9060001990610857565b906115c861010061087892610aca565b82546115ae565b61019b9060036115b8565b61019b9061159d565b6101006002610b1e565b156115f457565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b611668602061165061164b60016106e0565b6102c5565b63169394bb9061165f60405190565b93849260e01b90565b82526004820185905260249082905afa908115610d1c57611698916116939160009161170b57501590565b6115ed565b6116a561164b60016106e0565b90635bd4df3290823b156100e6576116e2926116d4600080946116c760405190565b9687958694859360e01b90565b835260048301526024820190565b03925af18015610d1c576116f35750565b61019b9060006117038183610408565b8101906101d2565b611723915060203d8111610d1557610d078183610408565b1590565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561175057565b6000805260206000f35b919290926040519384526020840152604083015260408260608160076107d05a03fa156117505760806040928251848201526020830151606082015260066107d05a03fa1561175057565b93909260606020947f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47866080860198611b4061012060008901977f1ad76ddc6a22025c3aed93a2ecb7959a46cc41d238ec4fa18423c68b65669b8f89527f28a3164ff2e0c9468f0179ac2f0dff75b6ec8dc89312e675ffe12f126abc1ff5858a015261187760008201357f056a18281a43ab963f0c5a58b6e66002c17db2946ccf61b5d6a45ebccfea85f37f240244bfb8c78a8f6285c53b3ec73f814299bb5d1a92ffe50d78549341c53a5a8c61175a565b6118c6858201357f1fa23e6accea51843090b5191a0a7a7be6bfb7ace978534a3c0148fcf067a0017f1b2be4d79798243ced7d220b271ec81cdf295fa20a0cc07790b383bba107818e8c61175a565b61191660408201357f16060acad62ea556a4f729b2e590cc567fc5e7da1a10f455c6f1b1433ae562507f25d377935ec79e99aa9d9e5ae28d9cb6c4ada889612fdd69683e3c8e80a834328c61175a565b611965888201357f28ac858d14a4f2c21d2c922d1435d04ee21d923026f083495095ad80a7e39f717f1c7d011040cfb2aec801eaa384048e03933e7a3fc8769abdee473ff37610fe8c8c61175a565b6119b560808201357f23f193803e0d0f5c2d38baac0b934a3ccf5e6703aa81317e26585c01345500967f123e735950330f217eec135908fb77e047a140443955131bf6c99d7a71c060ee8c61175a565b611a0560a08201357f17c8cca1da2e449f38869f18dadef181eaf21fbd61da70d84319351bfa3713c27f1125af7b1070f92c587c112a2a5d534f78165566d27978f4493fa82b4ac506e98c61175a565b611a5560c08201357f12d7ab490c9dd82226d7eb92187f9965edeb4e0bf8efd86f141998071c4a1e327f1467bfbf69dedff0004714c315ee8976a2b23452ddbc2808ab9da798dec560cf8c61175a565b611aa560e08201357f101fb127cded6f2ebe972c71d467a3eb0082e5093c0fa0b34e4ae35de8e3d3747f2f0a3429b93f9e693fa44aec6203bcd33ec5cfa9937c1a77906f0ade6c5fbe638c61175a565b611af66101008201357f2c7e8687c0484be0586fe253c7ab55258a0421bd6fe80c353b4c4a166574f6ee7f14279246c9032b4cf9597db6e67afb3d2a45699c02c4186618d09eb93d9f59b18c61175a565b01357f1ae9d04c753e792e4b6a4bb10f0c4ac42817580c171130e23093425e4ceb76637f1f7080fc237ec1ce5953ed7c4d0fbcd36bffa16a825e5686151e283ac7f3e29e8961175a565b80358a5201358103068688015280356040880152858101358288015260408101356080880152013560a08601527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08601527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08601527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008601527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208601527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408601527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160860152516101808501528260000101516101a08401527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08401527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08401527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008401527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220840152803561024084015201356102608201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26102808201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6102a08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102c08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa6102e08201526020816103008160086107d05a03fa90511690565b91611e779391611dd3600090565b50604051936103808501604052611ded6000850135611727565b611dfa6020850135611727565b611e076040850135611727565b611e146060850135611727565b611e216080850135611727565b611e2e60a0850135611727565b611e3b60c0850135611727565b611e4860e0850135611727565b611e56610100850135611727565b611e64610120850135611727565b611e72610140850135611727565b6117a5565b60005260206000f3fea2646970667358221220fd7a7e5f5c2e3f82b4fc3045adcf8f4ebac68b16422547b3377c1acbedc4ea3264736f6c63430008120033", - "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806365cd296c146100d2578063715018a6146100cd5780638da5cb5b146100c8578063b2a3fda4146100c3578063b870676c146100be578063c0d05fed146100b9578063ced1e978146100b4578063d2f7265a146100af578063dbac5821146100aa578063f2fde38b146100a5578063f3bb70f6146100a05763f6c7226b036100e6576106bf565b6105f9565b61057b565b610520565b6104c5565b6104aa565b610483565b6102e7565b610265565b610206565b6101dd565b61019d565b90816102409103126100e65790565b600080fd5b90610240828203126100e657610100916100d7565b90565b9052565b60005b83811061011a5750506000910152565b818101518382015260200161010a565b61014b61015460209361015e9361013f815190565b80835293849260200190565b95869101610107565b601f01601f191690565b0190565b94939160609161019b946101896101969361018260808b019460008c0152565b60208a0152565b878203604089015261012a565b940152565b565b346100e6576101ce6101b86101b33660046100eb565b610d21565b906101c594929460405190565b94859485610162565b0390f35b60009103126100e657565b346100e6576101ed3660046101d2565b6101f561072c565b604051005b6001600160a01b031690565b346100e6576102163660046101d2565b6101ce6102216106ea565b604051918291826001600160a01b03909116815260200190565b805b036100e657565b9050359061019b8261023b565b906020828203126100e65761010091610244565b346100e6576101f5610278366004610251565b6115da565b610100916008021c6001600160a01b031690565b90610100915461027d565b61010060006001610291565b610100906101fa906001600160a01b031682565b610100906102a8565b610100906102bc565b610103906102c5565b60208101929161019b91906102ce565b346100e6576102f73660046101d2565b6101ce61030261029c565b604051918291826102d7565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561035a575b602083101461035557565b610324565b91607f169161034a565b805460009392916103816103778361033a565b8085529360200190565b91600181169081156103d3575060011461039a57505050565b6103ad9192939450600052602060002090565b916000925b8184106103bf5750500190565b8054848401526020909301926001016103b2565b92949550505060ff1916825215156020020190565b9061010091610364565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761042a57604052565b6103f2565b9061019b6104499261044060405190565b938480926103e8565b0383610408565b90600010610461576101009061042f565b61030e565b61010060006002610450565b60208082526101009291019061012a565b346100e6576104933660046101d2565b6101ce61049e610466565b60405191829182610472565b346100e6576104ba3660046101d2565b6101ce61049e6115e3565b346100e6576104d53660046101d2565b6101ce7f0000000000000000000000000000000000000000000000000000000000000000610221565b610100916008021c81565b9061010091546104fe565b61010060006003610509565b346100e6576105303660046101d2565b6101ce61053b610514565b6040519182918290815260200190565b6001600160a01b03811661023d565b9050359061019b8261054b565b906020828203126100e6576101009161055a565b346100e6576101f561058e366004610567565b610843565b919060408301116100e657565b919060808301116100e657565b91906101408301116100e657565b610240818303126100e6576105d08282610593565b926101006105e184604085016105a0565b936105ef8160c08601610593565b93610100016105ad565b346100e6576106093660046105bb565b92919091611dc5565b9061019b61061f60405190565b9283610408565b67ffffffffffffffff811161042a57602090601f01601f19160190565b90826000939282370152565b9092919261066461065f82610626565b610612565b938185526020850190828401116100e65761019b92610643565b9080601f830112156100e6578160206101009335910161064f565b906020828203126100e657813567ffffffffffffffff81116100e657610100920161067e565b346100e6576101f56106d2366004610699565b611594565b610100906101fa565b61010090546106d7565b61010060006106e0565b6106fc610788565b61019b61071a565b6101fa6101006101009290565b61010090610704565b61019b6107276000610711565b61087c565b61019b6106f4565b1561073b57565b60405162461bcd60e51b815280610784600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b61019b6107936106ea565b6107ac61079f336101fa565b916001600160a01b031690565b14610734565b61019b906107be610788565b61081e565b156107ca57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61019b906107276108326101fa6000610711565b6001600160a01b03831614156107c3565b61019b906107b2565b906001600160a01b03905b9181191691161790565b90610871610100610878926102c5565b825461084c565b9055565b61088660006106e0565b90610892816000610861565b6108c56108bf7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936102c5565b916102c5565b916108cf60405190565b600090a3565b156108dc57565b60405162461bcd60e51b8152602060048201526024808201527f4f6e6c792065786368616e67652063616e2063616c6c20746869732066756e636044820152633a34b7b760e11b6064820152608490fd5b61097694939291906109713361096b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661079f565b146108d5565b610b73565b90919293565b80151561023d565b9050519061019b8261097c565b906020828203126100e65761010091610984565b9037565b61019b916040916109a5565b9061015e816040936109a9565b6109d26109ce60029390565b9190565b806000925b8484106109e5575050505050565b610a016109fa6001926109f58690565b6109b5565b9360400190565b930192916109d7565b61019b91610140916109a5565b610a4f61019b94610a4561010094989795610a3b61024086019a60008701906109a9565b60408501906109c2565b60c08301906109a9565b0190610a0a565b6040513d6000823e3d90fd5b15610a6957565b60405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606490fd5b634e487b7160e01b600052603260045260246000fd5b90600a811015610ac5576020020190565b610a9e565b6101006101006101009290565b356101008161023b565b610aee6101006101009290565b60ff1690565b61015e610b0c92602092610b06815190565b94859290565b93849101610107565b61010091610af4565b6101009061042f565b15610b2e57565b60405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606490fd5b50505050610b80306102c5565b602063f3bb70f6916000840190610bb96040860194610bc461010060c0890198018098610bac60405190565b9889978896879660e01b90565b865260048601610a17565b03915afa8015610d1c57610be091600091610cee575b50610a62565b610c03610bfe610bf9610bf36000610aca565b84610ab4565b610ad7565b610aca565b91600290610c88610c146001610ae1565b92610c826109ce610c73610c32610c2a85610ae1565b80988a610e1c565b610c5a610c3e60405190565b8092610c4e602083019182610b15565b90810382520382610408565b610c6c610c65825190565b9160200190565b2093610b1e565b610c7e610c65825190565b2090565b14610b27565b610100610bf9610cbc610bfe610bf9610cb6610cb0600798610ca98a610ae1565b908b610e1c565b97610aca565b88610ab4565b94610cde610cd9610bfe610bf9610cd36008610aca565b85610ab4565b611639565b610ce86009610aca565b90610ab4565b610d0f915060203d8111610d15575b610d078183610408565b810190610991565b38610bda565b503d610cfd565b610a56565b6109769060006060818061092d565b634e487b7160e01b600052601160045260246000fd5b610d559060ff165b9160ff1690565b90039060ff8211610d6257565b610d30565b6101006101006101009260ff1690565b67ffffffffffffffff811161042a5760208091020190565b90610d9c61065f83610d77565b918252565b369037565b9061019b610dbc610db684610d8f565b93610d77565b601f190160208401610da1565b6000198114610d625760010190565b91908203918211610d6257565b90610dee825190565b811015610ac5576020809102010190565b610100601f610aca565b81810292918115918404141715610d6257565b909290610e39610e34610e2f8686610d46565b610d67565b610da6565b91610e4385610d67565b610e4c85610d67565b811015610e9457610e8d81610e88610e6a610bf9610e4c9588610ab4565b610e85610e7f610e798c610d67565b85610dd8565b89610de5565b52565b610dc9565b9050610e43565b509350506101009150610ea5815190565b90610eb8610eb1610dff565b8093610e09565b906110c9565b90610d9c61065f83610626565b9061019b610dbc610edb84610ebe565b93610626565b610eee6101006101009290565b61ffff1690565b61ffff1661ffff8114610d625760010190565b6101006101006101009261ffff1690565b61010090610f2a6109ce6101009490565b901c90565b634e487b7160e01b600052601260045260246000fd5b610f519060ff16610d4e565b908115610f5c570690565b610f2f565b610f6d9060ff16610d4e565b019060ff8211610d6257565b610f8f610f896101009260ff1690565b60f81b90565b6001600160f81b03191690565b90610fa5825190565b811015610ac5570160200190565b61010090610f2a6109ce6101009460ff1690565b15610fce57565b60405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a490fd5b1561106657565b60405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608490fd5b926000926110d684610ae1565b6110ef6110ea836110e5895190565b610e09565b610ecb565b946110f981610aca565b9561110382610ee1565b965b6111106101008a5190565b61111989610f08565b10156112e75761113861113461112e8a610f08565b8b610de5565b5190565b98899661114487610da6565b9861114e86610aca565b8881101561119b5780610e888c8f6111969461118861118361118e9361117d6111776008610aca565b85610e09565b90610f19565b610ae1565b92610de5565b9060ff169052565b61114e565b5091909a50989295989793969194976111b388610aca565b955b8a8710156112c6576111d4610e2f6111cd8989610de5565b5160ff1690565b6111dd8a610aca565b811461127957906111f86111f361120a93610ae1565b610f79565b8a1a611204828b610f9c565b53610dc9565b9261121e6112186002610ae1565b8b610f45565b61122a610d4e8b610ae1565b14611255575b61124861124e915b6112426008610ae1565b90610fb3565b96610dc9565b95926111b5565b9861124861127061124e9261126a6001610ae1565b90610f61565b9a915050611230565b50926112886112186002610ae1565b600190611297610d4e83610ae1565b146112aa575b5061124861124e91611238565b6112be61124e929b61126a61124893610ae1565b9a915061129d565b989550935097949598916112da9150610ef5565b9695979197949094611105565b926109ce919598506101009750610100945061131a92509561010061132197611313610d4e6001610ae1565b1015610fc7565b111561105f565b611333565b610f8f610f896101009290565b80519060009261134284610aca565b61134d610100845190565b8110156113ef5761136f6113618285610f9c565b516001600160f81b03191690565b61138961137b87611326565b916001600160f81b03191690565b1461139c5761139790610dc9565b611342565b9250905b6113a983610ecb565b916113b385610aca565b845b8110156113e3576113dc816113d06113616113b59487610f9c565b881a6112048288610f9c565b90506113b3565b50935050610100915090565b50906113a0565b61019b90611402610788565b611589565b9160001960089290920291821b911b610857565b919061142c61010061087893610aca565b908354611407565b61019b9160009161141b565b81811061144b575050565b806114596000600193611434565b01611440565b9190601f811161146e57505050565b61148061019b93600052602060002090565b906020601f8401819004830193106114a2575b6020601f909101040190611440565b9091508190611493565b906114b5815190565b9067ffffffffffffffff821161042a576114d9826114d3855461033a565b8561145f565b602090601f831160011461151457610878929160009183611509575b5050600019600883021c1916906002021790565b0151905038806114f5565b601f1983169161152985600052602060002090565b9260005b8181106115675750916002939185600196941061154e575b50505002019055565b01516000196008601f8516021c19169055388080611545565b9193602060018192878701518155019501920161152d565b9061019b916114ac565b61019b90600261157f565b61019b906113f6565b61019b906115a9610788565b6115cf565b9060001990610857565b906115c861010061087892610aca565b82546115ae565b61019b9060036115b8565b61019b9061159d565b6101006002610b1e565b156115f457565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b611668602061165061164b60016106e0565b6102c5565b63169394bb9061165f60405190565b93849260e01b90565b82526004820185905260249082905afa908115610d1c57611698916116939160009161170b57501590565b6115ed565b6116a561164b60016106e0565b90635bd4df3290823b156100e6576116e2926116d4600080946116c760405190565b9687958694859360e01b90565b835260048301526024820190565b03925af18015610d1c576116f35750565b61019b9060006117038183610408565b8101906101d2565b611723915060203d8111610d1557610d078183610408565b1590565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561175057565b6000805260206000f35b919290926040519384526020840152604083015260408260608160076107d05a03fa156117505760806040928251848201526020830151606082015260066107d05a03fa1561175057565b93909260606020947f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47866080860198611b4061012060008901977f1ad76ddc6a22025c3aed93a2ecb7959a46cc41d238ec4fa18423c68b65669b8f89527f28a3164ff2e0c9468f0179ac2f0dff75b6ec8dc89312e675ffe12f126abc1ff5858a015261187760008201357f056a18281a43ab963f0c5a58b6e66002c17db2946ccf61b5d6a45ebccfea85f37f240244bfb8c78a8f6285c53b3ec73f814299bb5d1a92ffe50d78549341c53a5a8c61175a565b6118c6858201357f1fa23e6accea51843090b5191a0a7a7be6bfb7ace978534a3c0148fcf067a0017f1b2be4d79798243ced7d220b271ec81cdf295fa20a0cc07790b383bba107818e8c61175a565b61191660408201357f16060acad62ea556a4f729b2e590cc567fc5e7da1a10f455c6f1b1433ae562507f25d377935ec79e99aa9d9e5ae28d9cb6c4ada889612fdd69683e3c8e80a834328c61175a565b611965888201357f28ac858d14a4f2c21d2c922d1435d04ee21d923026f083495095ad80a7e39f717f1c7d011040cfb2aec801eaa384048e03933e7a3fc8769abdee473ff37610fe8c8c61175a565b6119b560808201357f23f193803e0d0f5c2d38baac0b934a3ccf5e6703aa81317e26585c01345500967f123e735950330f217eec135908fb77e047a140443955131bf6c99d7a71c060ee8c61175a565b611a0560a08201357f17c8cca1da2e449f38869f18dadef181eaf21fbd61da70d84319351bfa3713c27f1125af7b1070f92c587c112a2a5d534f78165566d27978f4493fa82b4ac506e98c61175a565b611a5560c08201357f12d7ab490c9dd82226d7eb92187f9965edeb4e0bf8efd86f141998071c4a1e327f1467bfbf69dedff0004714c315ee8976a2b23452ddbc2808ab9da798dec560cf8c61175a565b611aa560e08201357f101fb127cded6f2ebe972c71d467a3eb0082e5093c0fa0b34e4ae35de8e3d3747f2f0a3429b93f9e693fa44aec6203bcd33ec5cfa9937c1a77906f0ade6c5fbe638c61175a565b611af66101008201357f2c7e8687c0484be0586fe253c7ab55258a0421bd6fe80c353b4c4a166574f6ee7f14279246c9032b4cf9597db6e67afb3d2a45699c02c4186618d09eb93d9f59b18c61175a565b01357f1ae9d04c753e792e4b6a4bb10f0c4ac42817580c171130e23093425e4ceb76637f1f7080fc237ec1ce5953ed7c4d0fbcd36bffa16a825e5686151e283ac7f3e29e8961175a565b80358a5201358103068688015280356040880152858101358288015260408101356080880152013560a08601527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08601527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08601527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008601527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208601527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408601527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160860152516101808501528260000101516101a08401527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08401527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08401527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008401527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220840152803561024084015201356102608201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26102808201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6102a08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102c08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa6102e08201526020816103008160086107d05a03fa90511690565b91611e779391611dd3600090565b50604051936103808501604052611ded6000850135611727565b611dfa6020850135611727565b611e076040850135611727565b611e146060850135611727565b611e216080850135611727565b611e2e60a0850135611727565b611e3b60c0850135611727565b611e4860e0850135611727565b611e56610100850135611727565b611e64610120850135611727565b611e72610140850135611727565b6117a5565b60005260206000f3fea2646970667358221220fd7a7e5f5c2e3f82b4fc3045adcf8f4ebac68b16422547b3377c1acbedc4ea3264736f6c63430008120033", + "numDeployments": 1, + "solcInputHash": "a43d75c8fa53cbd70612f5013c5d17a2", + "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_exchange\",\"type\":\"address\"},{\"internalType\":\"contract INullifierRegistry\",\"name\":\"_nullifierRegistry\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_emailFromAddress\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"_timestampBuffer\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"emailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"exchange\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getEmailFromAddress\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nullifierRegistry\",\"outputs\":[{\"internalType\":\"contract INullifierRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"a\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"b\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"c\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[10]\",\"name\":\"signals\",\"type\":\"uint256[10]\"}],\"internalType\":\"struct ITransferDomainProcessor.TransferProof\",\"name\":\"_proof\",\"type\":\"tuple\"}],\"name\":\"processProof\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"dkimKeyHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"hashedReceiverId\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"domainName\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"bidId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_emailFromAddress\",\"type\":\"string\"}],\"name\":\"setEmailFromAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_timestampBuffer\",\"type\":\"uint256\"}],\"name\":\"setTimestampBuffer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"timestampBuffer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"_pA\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2][2]\",\"name\":\"_pB\",\"type\":\"uint256[2][2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"_pC\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[10]\",\"name\":\"_pubSignals\",\"type\":\"uint256[10]\"}],\"name\":\"verifyProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setEmailFromAddress(string)\":{\"params\":{\"_emailFromAddress\":\"The from email address for validated emails, MUST BE PROPERLY PADDED\"}},\"setTimestampBuffer(uint256)\":{\"params\":{\"_timestampBuffer\":\"The timestamp buffer for validated emails\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"setEmailFromAddress(string)\":{\"notice\":\"ONLY OWNER: Sets the from email address for validated emails. Check that email address is properly padded (if necessary). Padding will be dependent on if unpacking functions cut trailing 0s or not.\"},\"setTimestampBuffer(uint256)\":{\"notice\":\"ONLY OWNER: Sets the timestamp buffer for validated emails. This is the amount of time in seconds that the timestamp can be off by and still be considered valid. Necessary to build in flexibility with L2 timestamps.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TransferDomainProcessor.sol\":\"TransferDomainProcessor\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@zk-email/contracts/utils/StringUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.7.6;\\n\\n// https://github.com/nalinbhardwaj/ethdosnumber/blob/main/ethdos-contracts/src/HexStrings.sol\\nlibrary StringUtils {\\n bytes16 internal constant ALPHABET = \\\"0123456789abcdef\\\";\\n uint256 internal constant DEFAULT_PACK_SIZE = 31;\\n\\n /// @notice Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n /// @dev Credit to Open Zeppelin under MIT license https://github.com/OpenZeppelin/openzeppelin-contracts/blob/243adff49ce1700e0ecb99fe522fb16cff1d1ddc/contracts/utils/Strings.sol#L55\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = ALPHABET[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n function toHexStringNoPrefix(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length);\\n for (uint256 i = buffer.length; i > 0; i--) {\\n buffer[i - 1] = ALPHABET[value & 0xf];\\n value >>= 4;\\n }\\n return string(buffer);\\n }\\n\\n function toString(uint256 value) internal pure returns (string memory) {\\n return toString(abi.encodePacked(value));\\n }\\n\\n function toString(bytes32 value) internal pure returns (string memory) {\\n return toString(abi.encodePacked(value));\\n }\\n\\n function toString(address account) internal pure returns (string memory) {\\n return toString(abi.encodePacked(account));\\n }\\n\\n function stringEq(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));\\n }\\n\\n function toString(bytes memory data) internal pure returns (string memory) {\\n bytes memory alphabet = \\\"0123456789abcdef\\\";\\n\\n bytes memory str = new bytes(2 + data.length * 2);\\n str[0] = \\\"0\\\";\\n str[1] = \\\"x\\\";\\n for (uint256 i = 0; i < data.length; i++) {\\n str[2 + i * 2] = alphabet[uint256(uint8(data[i] >> 4))];\\n str[3 + i * 2] = alphabet[uint256(uint8(data[i] & 0x0f))];\\n }\\n return string(str);\\n }\\n\\n // 1 packed byte = packSize (usually 31) normal bytes, all in one 255/256-bit value\\n // Note that this is not 32 due to the field modulus of circom\\n function convertPackedByteToString(uint256 packedByte, uint256 packSize)\\n internal\\n pure\\n returns (string memory extractedString)\\n {\\n uint256[] memory packedBytes = new uint256[](1);\\n packedBytes[0] = packedByte;\\n return convertPackedBytesToString(packedBytes, packSize, packSize);\\n }\\n\\n // Note: This convenience function removes the max string length check, which may cause misalignment with the circom\\n // If using this, then the circom needs to rangecheck packed length in the circuit itself\\n // This defaults to 31 bytes per packed byte\\n function convertPackedBytesToString(uint256[] memory packedBytes) \\n internal\\n pure\\n returns (string memory extractedString)\\n {\\n return convertPackedBytesToString(packedBytes, packedBytes.length * DEFAULT_PACK_SIZE, DEFAULT_PACK_SIZE);\\n }\\n\\n // Unpacks uint256s into bytes and then extracts the non-zero characters\\n // Only extracts contiguous non-zero characters and ensures theres only 1 such state\\n // Note that unpackedLen may be more than packedBytes.length * 8 since there may be 0s\\n // signals is the total number of signals (i.e. bytes) packed into the packedBytes. it defaults to packedBytes.length * packSize\\n function convertPackedBytesToString(uint256[] memory packedBytes, uint256 signals, uint256 packSize)\\n internal\\n pure\\n returns (string memory extractedString)\\n {\\n uint8 state = 0;\\n // bytes: 0 0 0 0 y u s h _ g 0 0 0\\n // state: 0 0 0 0 1 1 1 1 1 1 2 2 2\\n bytes memory nonzeroBytesArray = new bytes(packedBytes.length * packSize);\\n uint256 nonzeroBytesArrayIndex = 0;\\n for (uint16 i = 0; i < packedBytes.length; i++) {\\n uint256 packedByte = packedBytes[i];\\n uint8[] memory unpackedBytes = new uint8[](packSize);\\n for (uint256 j = 0; j < packSize; j++) {\\n unpackedBytes[j] = uint8(packedByte >> (j * 8));\\n }\\n for (uint256 j = 0; j < packSize; j++) {\\n uint256 unpackedByte = unpackedBytes[j]; //unpackedBytes[j];\\n if (unpackedByte != 0) {\\n nonzeroBytesArray[nonzeroBytesArrayIndex] = bytes1(uint8(unpackedByte));\\n nonzeroBytesArrayIndex++;\\n if (state % 2 == 0) {\\n state += 1;\\n }\\n } else {\\n if (state % 2 == 1) {\\n state += 1;\\n }\\n }\\n packedByte = packedByte >> 8;\\n }\\n }\\n // TODO: You might want to assert that the state is exactly 1 or 2\\n // If not, that means empty bytse have been removed from the middle and things have been concatenated.\\n // We removed due to some tests failing, but this is not ideal and the require should be uncommented as soon as tests pass with it.\\n\\n // require(state == 1 || state == 2, \\\"Invalid final state of packed bytes in email; more than two non-zero regions found!\\\");\\n require(state >= 1, \\\"No packed bytes found! Invalid final state of packed bytes in email; value is likely 0!\\\");\\n require(nonzeroBytesArrayIndex <= signals, \\\"Packed bytes more than allowed max number of signals!\\\");\\n string memory returnValue = removeTrailingZeros(string(nonzeroBytesArray));\\n return returnValue;\\n // Have to end at the end of the email -- state cannot be 1 since there should be an email footer\\n }\\n\\n function bytes32ToString(bytes32 input) internal pure returns (string memory) {\\n uint256 i;\\n for (i = 0; i < 32 && input[i] != 0; i++) {}\\n bytes memory resultBytes = new bytes(i);\\n for (i = 0; i < 32 && input[i] != 0; i++) {\\n resultBytes[i] = input[i];\\n }\\n return string(resultBytes);\\n }\\n\\n // sliceArray is used to slice an array of uint256s from start-end into a new array of uint256s\\n function sliceArray(uint256[] memory input, uint256 start, uint256 end) internal pure returns (uint256[] memory) {\\n require(start <= end && end <= input.length, \\\"Invalid slice indices\\\");\\n uint256[] memory result = new uint256[](end - start);\\n for (uint256 i = start; i < end; i++) {\\n result[i - start] = input[i];\\n }\\n return result;\\n }\\n\\n // stringToUint is used to convert a string like \\\"45\\\" to a uint256 4\\n function stringToUint(string memory s) internal pure returns (uint256) {\\n bytes memory b = bytes(s);\\n uint256 result = 0;\\n for (uint256 i = 0; i < b.length; i++) {\\n if (b[i] >= 0x30 && b[i] <= 0x39) {\\n result = result * 10 + (uint256(uint8(b[i])) - 48);\\n }\\n\\n // TODO: Currently truncates decimals\\n if (b[i] == 0x2E) {\\n return result;\\n }\\n }\\n return result;\\n }\\n\\n // getDomainFromEmail is used to extract the domain from an email i.e. the part after the @\\n function getDomainFromEmail(string memory fromEmail) internal pure returns (string memory) {\\n bytes memory emailBytes = bytes(fromEmail);\\n uint256 atIndex;\\n for (uint256 i = 0; i < emailBytes.length; i++) {\\n if (emailBytes[i] == \\\"@\\\") {\\n atIndex = i;\\n break;\\n }\\n }\\n\\n bytes memory domainBytes = new bytes(emailBytes.length - atIndex - 1);\\n for (uint256 j = 0; j < domainBytes.length; j++) {\\n domainBytes[j] = emailBytes[atIndex + 1 + j];\\n }\\n return bytes32ToString(bytes32(bytes(domainBytes)));\\n }\\n\\n function removeTrailingZeros(string memory input) public pure returns (string memory) {\\n bytes memory inputBytes = bytes(input);\\n uint256 endIndex = inputBytes.length;\\n\\n for (uint256 i = 0; i < inputBytes.length; i++) {\\n if (inputBytes[i] == 0) {\\n endIndex = i;\\n break;\\n }\\n }\\n\\n bytes memory resultBytes = new bytes(endIndex);\\n for (uint256 i = 0; i < endIndex; i++) {\\n resultBytes[i] = inputBytes[i];\\n }\\n\\n return string(resultBytes);\\n }\\n\\n // Upper/lower string utils from https://github.com/willitscale/solidity-util/blob/master/lib/Strings.sol\\n /**\\n * Upper\\n *\\n * Converts all the values of a string to their corresponding upper case\\n * value.\\n *\\n * @param _base When being used for a data type this is the extended object\\n * otherwise this is the string base to convert to upper case\\n * @return string\\n */\\n function upper(string memory _base) public pure returns (string memory) {\\n bytes memory _baseBytes = bytes(_base);\\n for (uint256 i = 0; i < _baseBytes.length; i++) {\\n _baseBytes[i] = _upper(_baseBytes[i]);\\n }\\n return string(_baseBytes);\\n }\\n\\n /**\\n * Lower\\n *\\n * Converts all the values of a string to their corresponding lower case\\n * value.\\n *\\n * @param _base When being used for a data type this is the extended object\\n * otherwise this is the string base to convert to lower case\\n * @return string\\n */\\n function lower(string memory _base) public pure returns (string memory) {\\n bytes memory _baseBytes = bytes(_base);\\n for (uint256 i = 0; i < _baseBytes.length; i++) {\\n _baseBytes[i] = _lower(_baseBytes[i]);\\n }\\n return string(_baseBytes);\\n }\\n\\n /**\\n * Upper\\n *\\n * Convert an alphabetic character to upper case and return the original\\n * value when not alphabetic\\n *\\n * @param _b1 The byte to be converted to upper case\\n * @return bytes1 The converted value if the passed value was alphabetic\\n * and in a lower case otherwise returns the original value\\n */\\n function _upper(bytes1 _b1) private pure returns (bytes1) {\\n if (_b1 >= 0x61 && _b1 <= 0x7A) {\\n return bytes1(uint8(_b1) - 32);\\n }\\n\\n return _b1;\\n }\\n\\n /**\\n * Lower\\n *\\n * Convert an alphabetic character to lower case and return the original\\n * value when not alphabetic\\n *\\n * @param _b1 The byte to be converted to lower case\\n * @return bytes1 The converted value if the passed value was alphabetic\\n * and in a upper case otherwise returns the original value\\n */\\n function _lower(bytes1 _b1) private pure returns (bytes1) {\\n if (_b1 >= 0x41 && _b1 <= 0x5A) {\\n return bytes1(uint8(_b1) + 32);\\n }\\n\\n return _b1;\\n }\\n}\\n\",\"keccak256\":\"0x8c5b56494116a0c056c63e28fe892eea9bee5b056b09efa6aba1c9a82dc26c18\",\"license\":\"MIT\"},\"contracts/TransferDomainProcessor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\nimport { StringUtils } from \\\"@zk-email/contracts/utils/StringUtils.sol\\\";\\n\\nimport { EmailBaseProcessor } from \\\"./external/processors/EmailBaseProcessor.sol\\\";\\nimport { INullifierRegistry } from \\\"./external/interfaces/INullifierRegistry.sol\\\";\\nimport { StringConversionUtils } from \\\"./external/lib/StringConversionUtils.sol\\\";\\n\\nimport { Groth16Verifier } from \\\"./verifiers/namecheap_transfer_verifier.sol\\\";\\nimport { ITransferDomainProcessor } from \\\"./interfaces/ITransferDomainProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract TransferDomainProcessor is Groth16Verifier, ITransferDomainProcessor, EmailBaseProcessor {\\n \\n using StringUtils for uint256[];\\n using StringConversionUtils for string;\\n\\n /* ============ Constants ============ */\\n uint256 constant PACK_SIZE = 31;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _exchange,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Groth16Verifier()\\n EmailBaseProcessor(\\n _exchange,\\n _nullifierRegistry,\\n _emailFromAddress,\\n _timestampBuffer\\n )\\n {}\\n \\n /* ============ External Functions ============ */\\n\\n function processProof(\\n TransferProof calldata _proof\\n )\\n external\\n override\\n onlyExchange\\n returns (\\n bytes32 dkimKeyHash,\\n bytes32 hashedReceiverId,\\n string memory domainName, \\n uint256 bidId\\n )\\n {\\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \\\"Invalid Proof\\\");\\n\\n // Signal [0] is the DKIM key hash\\n dkimKeyHash = bytes32(_proof.signals[0]);\\n\\n // Signals [1:2] are the packed from email address\\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 2);\\n require(\\n keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \\n \\\"Invalid email from address\\\"\\n );\\n \\n // Signals [2:7] are packed domain name\\n domainName = _parseSignalArray(_proof.signals, 2, 7);\\n\\n // Signal [7] is packed hashed namecheap id to which domain was transferred\\n hashedReceiverId = bytes32(_proof.signals[7]);\\n\\n // Check if email has been used previously, if not nullify it so it can't be used again\\n _validateAndAddNullifier(bytes32(_proof.signals[8]));\\n\\n // Signal [9] is bidId\\n bidId = _proof.signals[9];\\n }\\n \\n /* ============ Internal Functions ============ */\\n\\n function _parseSignalArray(uint256[10] calldata _signals, uint8 _from, uint8 _to) \\n internal \\n pure \\n returns (string memory) \\n {\\n uint256[] memory signalArray = new uint256[](_to - _from);\\n for (uint256 i = _from; i < _to; i++) {\\n signalArray[i - _from] = _signals[i];\\n }\\n\\n return signalArray.convertPackedBytesToString(signalArray.length * PACK_SIZE, PACK_SIZE);\\n }\\n}\\n\",\"keccak256\":\"0x27e7d34dbe222f5a865d0b34f276eac82f3888f00e9816c398ee5fe9cf18bb2c\",\"license\":\"MIT\"},\"contracts/external/interfaces/IKeyHashAdapterV2.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface IKeyHashAdapterV2 {\\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external;\\n function getMailServerKeyHashes() external view returns (bytes32[] memory);\\n function isMailServerKeyHash(bytes32 _mailserverKeyHash) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc849f2dc34e4463550b8e0a16541bde429cb1adf43776b2c4179e9d4e4e656a2\",\"license\":\"MIT\"},\"contracts/external/interfaces/INullifierRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface INullifierRegistry {\\n function addNullifier(bytes32 _nullifier) external;\\n function isNullified(bytes32 _nullifier) external view returns(bool);\\n}\\n\",\"keccak256\":\"0x107164bc9a320938b513305878163b7fa884da4cdae58d0c8e81bfbb00c97c5e\",\"license\":\"MIT\"},\"contracts/external/lib/StringConversionUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\n// Building on zk-email's StringUtils library we add the ability to handle decimals when\\n// converting from string to Uint\\nlibrary StringConversionUtils {\\n \\n /**\\n * @notice Function that parses numbers returned as strings including floating point numbers. Returned floating point\\n * numbers are to have the desired amount of decimal specified. If the stringified version of the floating point\\n * number has more decimal places than desired then the function will revert in order to be maximally safe. If\\n * the returned number has multiple floating points then the function will revert.\\n *\\n * Examples: _s = \\\"12.34\\\", _expectedDecimals = 6 => 12340000\\n * _s = \\\"12.34\\\", _expectedDecimals = 2 => 1234\\n * _s = \\\"12.34\\\", _expectedDecimals = 1 => REVERT (we never want loss of precision only addition)\\n * _s = \\\"12.34.56\\\", _expectedDecimals = 6 => REVERT (Invalid number)\\n *\\n * @param _s String being processed\\n * @param _desiredDecimals Desired amount of decimal places\\n */\\n function stringToUint(string memory _s, uint256 _desiredDecimals) internal pure returns (uint256) {\\n return stringToUint(_s, 0x2E, _desiredDecimals);\\n }\\n\\n function stringToUint(\\n string memory _s,\\n bytes1 _decimalCharacter,\\n uint256 _desiredDecimals\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n bytes memory b = bytes(_s);\\n\\n uint256 result = 0;\\n uint256 decimalPlaces = 0;\\n\\n bool decimals = false;\\n for (uint256 i = 0; i < b.length; i++) {\\n if (b[i] >= 0x30 && b[i] <= 0x39) {\\n result = result * 10 + (uint256(uint8(b[i])) - 48);\\n }\\n\\n if (decimals) {\\n decimalPlaces++;\\n }\\n\\n if (b[i] == _decimalCharacter) {\\n require(decimals == false, \\\"String has multiple decimals\\\");\\n decimals = true;\\n }\\n }\\n\\n require(decimalPlaces <= _desiredDecimals, \\\"String has too many decimal places\\\");\\n return result * (10 ** (_desiredDecimals - decimalPlaces));\\n }\\n\\n /**\\n * @notice Function that returns a substring from _startIndex to _endIndex (non-inclusive).\\n *\\n * @param _str String being processed\\n * @param _startIndex Index to start parsing from\\n * @param _endIndex Index to stop parsing at (index not included in result)\\n */\\n function substring(string memory _str, uint _startIndex, uint _endIndex) internal pure returns (string memory ) {\\n bytes memory strBytes = bytes(_str);\\n bytes memory result = new bytes(_endIndex-_startIndex);\\n for(uint i = _startIndex; i < _endIndex; i++) {\\n result[i-_startIndex] = strBytes[i];\\n }\\n return string(result);\\n }\\n\\n function replaceString(\\n string memory _str,\\n string memory _lookupValue,\\n string memory _replaceValue\\n )\\n internal\\n pure\\n returns (string memory)\\n {\\n bytes memory strBytes = bytes(_str);\\n bytes memory lookupBytes = bytes(_lookupValue);\\n\\n uint256 lookupIndex = indexOf(_str, _lookupValue);\\n if (lookupIndex == type(uint256).max) {\\n return _str;\\n }\\n\\n // Split the original string into two parts: before and after the keyword\\n string memory beforeKeyword = substring(_str, 0, lookupIndex);\\n string memory afterKeyword = substring(_str, lookupIndex + lookupBytes.length, strBytes.length);\\n \\n return string.concat(beforeKeyword, _replaceValue, afterKeyword);\\n }\\n\\n function indexOf(string memory str, string memory substr) internal pure returns (uint) {\\n bytes memory strBytes = bytes(str);\\n bytes memory substrBytes = bytes(substr);\\n \\n if (strBytes.length < substrBytes.length) return type(uint256).max;\\n \\n for (uint i = 0; i <= strBytes.length - substrBytes.length; i++) {\\n bool found = true;\\n for (uint j = 0; j < substrBytes.length; j++) {\\n if (strBytes[i + j] != substrBytes[j]) {\\n found = false;\\n break;\\n }\\n }\\n if (found) return i;\\n }\\n \\n return type(uint256).max;\\n }\\n\\n function stringComparison(string memory _a, string memory _b) internal pure returns (bool) {\\n return (keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b)));\\n }\\n}\\n\",\"keccak256\":\"0xfcdfb3c2c8d5a6b7f480f827049782a70fb98f8b3838dcad0e0bb95237b94a0c\",\"license\":\"MIT\"},\"contracts/external/processors/EmailBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\nimport { IKeyHashAdapterV2 } from \\\"../interfaces/IKeyHashAdapterV2.sol\\\";\\nimport { INullifierRegistry } from \\\"../interfaces/INullifierRegistry.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract EmailBaseProcessor is Ownable {\\n\\n /* ============ Modifiers ============ */\\n modifier onlyExchange() {\\n require(msg.sender == exchange, \\\"Only exchange can call this function\\\");\\n _;\\n }\\n\\n /* ============ State Variables ============ */\\n address public immutable exchange;\\n INullifierRegistry public nullifierRegistry;\\n bytes public emailFromAddress;\\n uint256 public timestampBuffer;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _exchange,\\n INullifierRegistry _nullifierRegistry,\\n string memory _emailFromAddress,\\n uint256 _timestampBuffer\\n )\\n Ownable()\\n {\\n exchange = _exchange;\\n nullifierRegistry = _nullifierRegistry;\\n emailFromAddress = bytes(_emailFromAddress);\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * @notice ONLY OWNER: Sets the from email address for validated emails. Check that email address is properly\\n * padded (if necessary). Padding will be dependent on if unpacking functions cut trailing 0s or not.\\n *\\n * @param _emailFromAddress The from email address for validated emails, MUST BE PROPERLY PADDED\\n */\\n function setEmailFromAddress(string memory _emailFromAddress) external onlyOwner {\\n emailFromAddress = bytes(_emailFromAddress);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Sets the timestamp buffer for validated emails. This is the amount of time in seconds\\n * that the timestamp can be off by and still be considered valid. Necessary to build in flexibility with L2\\n * timestamps.\\n *\\n * @param _timestampBuffer The timestamp buffer for validated emails\\n */\\n function setTimestampBuffer(uint256 _timestampBuffer) external onlyOwner {\\n timestampBuffer = _timestampBuffer;\\n }\\n\\n /* ============ External Getters ============ */\\n\\n function getEmailFromAddress() external view returns (bytes memory) {\\n return emailFromAddress;\\n }\\n\\n\\n /* ============ Internal Functions ============ */\\n\\n function _validateAndAddNullifier(bytes32 _nullifier) internal {\\n require(!nullifierRegistry.isNullified(_nullifier), \\\"Nullifier has already been used\\\");\\n nullifierRegistry.addNullifier(_nullifier);\\n }\\n}\\n\",\"keccak256\":\"0xe210c8e937a457c2d2aff798f3696f04ce1d011470294f02fb1169006a385f07\",\"license\":\"MIT\"},\"contracts/interfaces/ITransferDomainProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.18;\\n\\n\\ninterface ITransferDomainProcessor {\\n\\n struct TransferProof {\\n uint256[2] a;\\n uint256[2][2] b;\\n uint256[2] c;\\n uint256[10] signals;\\n }\\n\\n function processProof(\\n TransferProof calldata _proof\\n ) \\n external \\n returns (\\n bytes32 dkimKeyHash, \\n bytes32 hashedReceiverId, \\n string memory domainName, \\n uint256 bidId\\n );\\n}\",\"keccak256\":\"0x9cf5f1b070d7bad73d8ae57f7b20d449853f96fcbb5df1a443723df41c91339d\",\"license\":\"MIT\"},\"contracts/verifiers/namecheap_transfer_verifier.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\n/*\\n Copyright 2021 0KIMS association.\\n\\n This file is generated with [snarkJS](https://github.com/iden3/snarkjs).\\n\\n snarkJS is a free software: you can redistribute it and/or modify it\\n under the terms of the GNU General Public License as published by\\n the Free Software Foundation, either version 3 of the License, or\\n (at your option) any later version.\\n\\n snarkJS is distributed in the hope that it will be useful, but WITHOUT\\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\\n License for more details.\\n\\n You should have received a copy of the GNU General Public License\\n along with snarkJS. If not, see .\\n*/\\n\\npragma solidity >=0.7.0 <0.9.0;\\n\\ncontract Groth16Verifier {\\n // Scalar field size\\n uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n // Base field size\\n uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\\n\\n // Verification Key data\\n uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042;\\n uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958;\\n uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132;\\n uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731;\\n uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679;\\n uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856;\\n uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\\n uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\\n uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\\n uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\\n\\n \\n uint256 constant IC0x = 12718791721466586474772975178991944367361898681403889293050590835735829974174;\\n uint256 constant IC0y = 6579614210328804738196110281777440845203538387714672921854127346802897741731;\\n \\n uint256 constant IC1x = 15050971342023334328313633330499885418161248915553086390701402242486225179368;\\n uint256 constant IC1y = 5024764877577619588829734526990256704181621131776349449360023481477820279987;\\n \\n uint256 constant IC2x = 7494265978725599958916265753653166549633529129800692658333846839504191651648;\\n uint256 constant IC2y = 6331829577874431053631060489192183034310045972687441697179743819760334117448;\\n \\n uint256 constant IC3x = 19001722242244131321371144536562173279385056519981716838131699446018662048085;\\n uint256 constant IC3y = 8148711952593941450664988855383229951630582602775661040234820121548658879338;\\n \\n uint256 constant IC4x = 3624352076627862068761560802183636400416483488844158805038644908873200708814;\\n uint256 constant IC4y = 20894074159790604892251457333772898092352374489464929653588484093719978460605;\\n \\n uint256 constant IC5x = 2098287694939727519558784139808406325855172668407809961967029546183317335265;\\n uint256 constant IC5y = 5659241113472526955215440521431168972841548603376846026887752206139550832697;\\n \\n uint256 constant IC6x = 17054571586962694690567468783102453574497782768524521043534058966826398455175;\\n uint256 constant IC6y = 4087439525418017845490176926142509334113265173570304433911881676407144081865;\\n \\n uint256 constant IC7x = 7441928267847731392209447389119131741297268634643246304512516729270550734194;\\n uint256 constant IC7y = 15714253901405577134617988311525363228461039013850912155558149694323922788327;\\n \\n uint256 constant IC8x = 11989172231499636764423272601594485978016807201316866170676011918612131765820;\\n uint256 constant IC8y = 15918479982497737545158513843427772249925445687882255296587424450200131669618;\\n \\n uint256 constant IC9x = 19827744545534206076315711984525184804508732918768894016552346430789516516368;\\n uint256 constant IC9y = 16361460611570894490152793347002588479282989223552655286979659973731335376509;\\n \\n uint256 constant IC10x = 10898965818757221383985300751768263931593441442012024286290119328446015154272;\\n uint256 constant IC10y = 6989418820395701171656324073128354251482680955655018162117108617053607002569;\\n \\n \\n // Memory data\\n uint16 constant pVk = 0;\\n uint16 constant pPairing = 128;\\n\\n uint16 constant pLastMem = 896;\\n\\n function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[10] calldata _pubSignals) public view returns (bool) {\\n assembly {\\n function checkField(v) {\\n if iszero(lt(v, r)) {\\n mstore(0, 0)\\n return(0, 0x20)\\n }\\n }\\n \\n // G1 function to multiply a G1 value(x,y) to value in an address\\n function g1_mulAccC(pR, x, y, s) {\\n let success\\n let mIn := mload(0x40)\\n mstore(mIn, x)\\n mstore(add(mIn, 32), y)\\n mstore(add(mIn, 64), s)\\n\\n success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)\\n\\n if iszero(success) {\\n mstore(0, 0)\\n return(0, 0x20)\\n }\\n\\n mstore(add(mIn, 64), mload(pR))\\n mstore(add(mIn, 96), mload(add(pR, 32)))\\n\\n success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)\\n\\n if iszero(success) {\\n mstore(0, 0)\\n return(0, 0x20)\\n }\\n }\\n\\n function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {\\n let _pPairing := add(pMem, pPairing)\\n let _pVk := add(pMem, pVk)\\n\\n mstore(_pVk, IC0x)\\n mstore(add(_pVk, 32), IC0y)\\n\\n // Compute the linear combination vk_x\\n \\n g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))\\n \\n g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))\\n \\n g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))\\n \\n g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))\\n \\n g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))\\n \\n g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)))\\n \\n g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)))\\n \\n g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)))\\n \\n g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)))\\n \\n g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288)))\\n \\n\\n // -A\\n mstore(_pPairing, calldataload(pA))\\n mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q))\\n\\n // B\\n mstore(add(_pPairing, 64), calldataload(pB))\\n mstore(add(_pPairing, 96), calldataload(add(pB, 32)))\\n mstore(add(_pPairing, 128), calldataload(add(pB, 64)))\\n mstore(add(_pPairing, 160), calldataload(add(pB, 96)))\\n\\n // alpha1\\n mstore(add(_pPairing, 192), alphax)\\n mstore(add(_pPairing, 224), alphay)\\n\\n // beta2\\n mstore(add(_pPairing, 256), betax1)\\n mstore(add(_pPairing, 288), betax2)\\n mstore(add(_pPairing, 320), betay1)\\n mstore(add(_pPairing, 352), betay2)\\n\\n // vk_x\\n mstore(add(_pPairing, 384), mload(add(pMem, pVk)))\\n mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))\\n\\n\\n // gamma2\\n mstore(add(_pPairing, 448), gammax1)\\n mstore(add(_pPairing, 480), gammax2)\\n mstore(add(_pPairing, 512), gammay1)\\n mstore(add(_pPairing, 544), gammay2)\\n\\n // C\\n mstore(add(_pPairing, 576), calldataload(pC))\\n mstore(add(_pPairing, 608), calldataload(add(pC, 32)))\\n\\n // delta2\\n mstore(add(_pPairing, 640), deltax1)\\n mstore(add(_pPairing, 672), deltax2)\\n mstore(add(_pPairing, 704), deltay1)\\n mstore(add(_pPairing, 736), deltay2)\\n\\n\\n let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20)\\n\\n isOk := and(success, mload(_pPairing))\\n }\\n\\n let pMem := mload(0x40)\\n mstore(0x40, add(pMem, pLastMem))\\n\\n // Validate that all evaluations \\u2208 F\\n \\n checkField(calldataload(add(_pubSignals, 0)))\\n \\n checkField(calldataload(add(_pubSignals, 32)))\\n \\n checkField(calldataload(add(_pubSignals, 64)))\\n \\n checkField(calldataload(add(_pubSignals, 96)))\\n \\n checkField(calldataload(add(_pubSignals, 128)))\\n \\n checkField(calldataload(add(_pubSignals, 160)))\\n \\n checkField(calldataload(add(_pubSignals, 192)))\\n \\n checkField(calldataload(add(_pubSignals, 224)))\\n \\n checkField(calldataload(add(_pubSignals, 256)))\\n \\n checkField(calldataload(add(_pubSignals, 288)))\\n \\n checkField(calldataload(add(_pubSignals, 320)))\\n \\n\\n // Validate all evaluations\\n let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)\\n\\n mstore(0, isValid)\\n return(0, 0x20)\\n }\\n }\\n }\\n\",\"keccak256\":\"0x8217154b5c54e3ae008197fcd5f09c15c539d7026ac0fcb2d80e19810edeee7e\",\"license\":\"GPL-3.0\"}},\"version\":1}", + "bytecode": "0x60a06040523462000044576200002262000018620001f4565b929190916200021d565b604051611eb66200054c82396080518181816104da01526109460152611eb690f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200008157604052565b62000049565b906200009e6200009660405190565b92836200005f565b565b6001600160a01b031690565b90565b6001600160a01b0381165b036200004457565b905051906200009e82620000af565b6001600160a01b038116620000ba565b905051906200009e82620000d1565b6001600160401b0381116200008157602090601f01601f19160190565b60005b838110620001215750506000910152565b818101518382015260200162000110565b909291926200014b6200014582620000f0565b62000087565b9381855260208501908284011162000044576200009e926200010d565b9080601f8301121562000044578151620000ac9260200162000132565b80620000ba565b905051906200009e8262000185565b6080818303126200004457620001b28282620000c2565b92620001c28360208401620000e1565b604083015190936001600160401b0382116200004457620001ea81620000ac93860162000168565b936060016200018c565b6200021762002402803803806200020b8162000087565b9283398101906200019b565b90919293565b906200009e939291620004ab565b906001600160a01b03905b9181191691161790565b620000ac90620000a0906001600160a01b031682565b620000ac9062000240565b620000ac9062000256565b9062000280620000ac620002889262000261565b82546200022b565b9055565b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015620002c5575b6020831014620002bf57565b6200028c565b91607f1691620002b3565b9160001960089290920291821b911b62000236565b620000ac620000ac620000ac9290565b91906200030a620000ac6200028893620002e5565b908354620002d0565b6200009e91600091620002f5565b8181106200032d575050565b806200033d600060019362000313565b0162000321565b9190601f81116200035457505050565b620003686200009e93600052602060002090565b906020601f8401819004830193106200038c575b6020601f90910104019062000321565b90915081906200037c565b90620003a1815190565b906001600160401b0382116200008157620003c982620003c28554620002a2565b8562000344565b602090601f8311600114620004085762000288929160009183620003fc575b5050600019600883021c1916906002021790565b015190503880620003e8565b601f198316916200041e85600052602060002090565b9260005b8181106200045f5750916002939185600196941062000445575b50505002019055565b01516000196008601f8516021c191690553880806200043c565b9193602060018192878701518155019501920162000422565b906200009e9162000397565b906000199062000236565b90620004a3620000ac6200028892620002e5565b825462000484565b6200009e9392620000ac620004dc93620004d493620004c9620004e4565b60805260016200026c565b600262000478565b60036200048f565b6200009e336000546001600160a01b031690620005038160006200026c565b6200053a620005337f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09362000261565b9162000261565b916200054560405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c806365cd296c146100d2578063715018a6146100cd5780638da5cb5b146100c8578063b2a3fda4146100c3578063b870676c146100be578063c0d05fed146100b9578063ced1e978146100b4578063d2f7265a146100af578063dbac5821146100aa578063f2fde38b146100a5578063f3bb70f6146100a05763f6c7226b036100e6576106bf565b6105f9565b61057b565b610520565b6104c5565b6104aa565b610483565b6102e7565b610265565b610206565b6101dd565b61019d565b90816102409103126100e65790565b600080fd5b90610240828203126100e657610100916100d7565b90565b9052565b60005b83811061011a5750506000910152565b818101518382015260200161010a565b61014b61015460209361015e9361013f815190565b80835293849260200190565b95869101610107565b601f01601f191690565b0190565b94939160609161019b946101896101969361018260808b019460008c0152565b60208a0152565b878203604089015261012a565b940152565b565b346100e6576101ce6101b86101b33660046100eb565b610d21565b906101c594929460405190565b94859485610162565b0390f35b60009103126100e657565b346100e6576101ed3660046101d2565b6101f561072c565b604051005b6001600160a01b031690565b346100e6576102163660046101d2565b6101ce6102216106ea565b604051918291826001600160a01b03909116815260200190565b805b036100e657565b9050359061019b8261023b565b906020828203126100e65761010091610244565b346100e6576101f5610278366004610251565b6115da565b610100916008021c6001600160a01b031690565b90610100915461027d565b61010060006001610291565b610100906101fa906001600160a01b031682565b610100906102a8565b610100906102bc565b610103906102c5565b60208101929161019b91906102ce565b346100e6576102f73660046101d2565b6101ce61030261029c565b604051918291826102d7565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561035a575b602083101461035557565b610324565b91607f169161034a565b805460009392916103816103778361033a565b8085529360200190565b91600181169081156103d3575060011461039a57505050565b6103ad9192939450600052602060002090565b916000925b8184106103bf5750500190565b8054848401526020909301926001016103b2565b92949550505060ff1916825215156020020190565b9061010091610364565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761042a57604052565b6103f2565b9061019b6104499261044060405190565b938480926103e8565b0383610408565b90600010610461576101009061042f565b61030e565b61010060006002610450565b60208082526101009291019061012a565b346100e6576104933660046101d2565b6101ce61049e610466565b60405191829182610472565b346100e6576104ba3660046101d2565b6101ce61049e6115e3565b346100e6576104d53660046101d2565b6101ce7f0000000000000000000000000000000000000000000000000000000000000000610221565b610100916008021c81565b9061010091546104fe565b61010060006003610509565b346100e6576105303660046101d2565b6101ce61053b610514565b6040519182918290815260200190565b6001600160a01b03811661023d565b9050359061019b8261054b565b906020828203126100e6576101009161055a565b346100e6576101f561058e366004610567565b610843565b919060408301116100e657565b919060808301116100e657565b91906101408301116100e657565b610240818303126100e6576105d08282610593565b926101006105e184604085016105a0565b936105ef8160c08601610593565b93610100016105ad565b346100e6576106093660046105bb565b92919091611dc5565b9061019b61061f60405190565b9283610408565b67ffffffffffffffff811161042a57602090601f01601f19160190565b90826000939282370152565b9092919261066461065f82610626565b610612565b938185526020850190828401116100e65761019b92610643565b9080601f830112156100e6578160206101009335910161064f565b906020828203126100e657813567ffffffffffffffff81116100e657610100920161067e565b346100e6576101f56106d2366004610699565b611594565b610100906101fa565b61010090546106d7565b61010060006106e0565b6106fc610788565b61019b61071a565b6101fa6101006101009290565b61010090610704565b61019b6107276000610711565b61087c565b61019b6106f4565b1561073b57565b60405162461bcd60e51b815280610784600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b61019b6107936106ea565b6107ac61079f336101fa565b916001600160a01b031690565b14610734565b61019b906107be610788565b61081e565b156107ca57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61019b906107276108326101fa6000610711565b6001600160a01b03831614156107c3565b61019b906107b2565b906001600160a01b03905b9181191691161790565b90610871610100610878926102c5565b825461084c565b9055565b61088660006106e0565b90610892816000610861565b6108c56108bf7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936102c5565b916102c5565b916108cf60405190565b600090a3565b156108dc57565b60405162461bcd60e51b8152602060048201526024808201527f4f6e6c792065786368616e67652063616e2063616c6c20746869732066756e636044820152633a34b7b760e11b6064820152608490fd5b61097694939291906109713361096b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661079f565b146108d5565b610b73565b90919293565b80151561023d565b9050519061019b8261097c565b906020828203126100e65761010091610984565b9037565b61019b916040916109a5565b9061015e816040936109a9565b6109d26109ce60029390565b9190565b806000925b8484106109e5575050505050565b610a016109fa6001926109f58690565b6109b5565b9360400190565b930192916109d7565b61019b91610140916109a5565b610a4f61019b94610a4561010094989795610a3b61024086019a60008701906109a9565b60408501906109c2565b60c08301906109a9565b0190610a0a565b6040513d6000823e3d90fd5b15610a6957565b60405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606490fd5b634e487b7160e01b600052603260045260246000fd5b90600a811015610ac5576020020190565b610a9e565b6101006101006101009290565b356101008161023b565b610aee6101006101009290565b60ff1690565b61015e610b0c92602092610b06815190565b94859290565b93849101610107565b61010091610af4565b6101009061042f565b15610b2e57565b60405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606490fd5b50505050610b80306102c5565b602063f3bb70f6916000840190610bb96040860194610bc461010060c0890198018098610bac60405190565b9889978896879660e01b90565b865260048601610a17565b03915afa8015610d1c57610be091600091610cee575b50610a62565b610c03610bfe610bf9610bf36000610aca565b84610ab4565b610ad7565b610aca565b91600290610c88610c146001610ae1565b92610c826109ce610c73610c32610c2a85610ae1565b80988a610e1c565b610c5a610c3e60405190565b8092610c4e602083019182610b15565b90810382520382610408565b610c6c610c65825190565b9160200190565b2093610b1e565b610c7e610c65825190565b2090565b14610b27565b610100610bf9610cbc610bfe610bf9610cb6610cb0600798610ca98a610ae1565b908b610e1c565b97610aca565b88610ab4565b94610cde610cd9610bfe610bf9610cd36008610aca565b85610ab4565b611639565b610ce86009610aca565b90610ab4565b610d0f915060203d8111610d15575b610d078183610408565b810190610991565b38610bda565b503d610cfd565b610a56565b6109769060006060818061092d565b634e487b7160e01b600052601160045260246000fd5b610d559060ff165b9160ff1690565b90039060ff8211610d6257565b610d30565b6101006101006101009260ff1690565b67ffffffffffffffff811161042a5760208091020190565b90610d9c61065f83610d77565b918252565b369037565b9061019b610dbc610db684610d8f565b93610d77565b601f190160208401610da1565b6000198114610d625760010190565b91908203918211610d6257565b90610dee825190565b811015610ac5576020809102010190565b610100601f610aca565b81810292918115918404141715610d6257565b909290610e39610e34610e2f8686610d46565b610d67565b610da6565b91610e4385610d67565b610e4c85610d67565b811015610e9457610e8d81610e88610e6a610bf9610e4c9588610ab4565b610e85610e7f610e798c610d67565b85610dd8565b89610de5565b52565b610dc9565b9050610e43565b509350506101009150610ea5815190565b90610eb8610eb1610dff565b8093610e09565b906110c9565b90610d9c61065f83610626565b9061019b610dbc610edb84610ebe565b93610626565b610eee6101006101009290565b61ffff1690565b61ffff1661ffff8114610d625760010190565b6101006101006101009261ffff1690565b61010090610f2a6109ce6101009490565b901c90565b634e487b7160e01b600052601260045260246000fd5b610f519060ff16610d4e565b908115610f5c570690565b610f2f565b610f6d9060ff16610d4e565b019060ff8211610d6257565b610f8f610f896101009260ff1690565b60f81b90565b6001600160f81b03191690565b90610fa5825190565b811015610ac5570160200190565b61010090610f2a6109ce6101009460ff1690565b15610fce57565b60405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a490fd5b1561106657565b60405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608490fd5b926000926110d684610ae1565b6110ef6110ea836110e5895190565b610e09565b610ecb565b946110f981610aca565b9561110382610ee1565b965b6111106101008a5190565b61111989610f08565b10156112e75761113861113461112e8a610f08565b8b610de5565b5190565b98899661114487610da6565b9861114e86610aca565b8881101561119b5780610e888c8f6111969461118861118361118e9361117d6111776008610aca565b85610e09565b90610f19565b610ae1565b92610de5565b9060ff169052565b61114e565b5091909a50989295989793969194976111b388610aca565b955b8a8710156112c6576111d4610e2f6111cd8989610de5565b5160ff1690565b6111dd8a610aca565b811461127957906111f86111f361120a93610ae1565b610f79565b8a1a611204828b610f9c565b53610dc9565b9261121e6112186002610ae1565b8b610f45565b61122a610d4e8b610ae1565b14611255575b61124861124e915b6112426008610ae1565b90610fb3565b96610dc9565b95926111b5565b9861124861127061124e9261126a6001610ae1565b90610f61565b9a915050611230565b50926112886112186002610ae1565b600190611297610d4e83610ae1565b146112aa575b5061124861124e91611238565b6112be61124e929b61126a61124893610ae1565b9a915061129d565b989550935097949598916112da9150610ef5565b9695979197949094611105565b926109ce919598506101009750610100945061131a92509561010061132197611313610d4e6001610ae1565b1015610fc7565b111561105f565b611333565b610f8f610f896101009290565b80519060009261134284610aca565b61134d610100845190565b8110156113ef5761136f6113618285610f9c565b516001600160f81b03191690565b61138961137b87611326565b916001600160f81b03191690565b1461139c5761139790610dc9565b611342565b9250905b6113a983610ecb565b916113b385610aca565b845b8110156113e3576113dc816113d06113616113b59487610f9c565b881a6112048288610f9c565b90506113b3565b50935050610100915090565b50906113a0565b61019b90611402610788565b611589565b9160001960089290920291821b911b610857565b919061142c61010061087893610aca565b908354611407565b61019b9160009161141b565b81811061144b575050565b806114596000600193611434565b01611440565b9190601f811161146e57505050565b61148061019b93600052602060002090565b906020601f8401819004830193106114a2575b6020601f909101040190611440565b9091508190611493565b906114b5815190565b9067ffffffffffffffff821161042a576114d9826114d3855461033a565b8561145f565b602090601f831160011461151457610878929160009183611509575b5050600019600883021c1916906002021790565b0151905038806114f5565b601f1983169161152985600052602060002090565b9260005b8181106115675750916002939185600196941061154e575b50505002019055565b01516000196008601f8516021c19169055388080611545565b9193602060018192878701518155019501920161152d565b9061019b916114ac565b61019b90600261157f565b61019b906113f6565b61019b906115a9610788565b6115cf565b9060001990610857565b906115c861010061087892610aca565b82546115ae565b61019b9060036115b8565b61019b9061159d565b6101006002610b1e565b156115f457565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b611668602061165061164b60016106e0565b6102c5565b63169394bb9061165f60405190565b93849260e01b90565b82526004820185905260249082905afa908115610d1c57611698916116939160009161170b57501590565b6115ed565b6116a561164b60016106e0565b90635bd4df3290823b156100e6576116e2926116d4600080946116c760405190565b9687958694859360e01b90565b835260048301526024820190565b03925af18015610d1c576116f35750565b61019b9060006117038183610408565b8101906101d2565b611723915060203d8111610d1557610d078183610408565b1590565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561175057565b6000805260206000f35b919290926040519384526020840152604083015260408260608160076107d05a03fa156117505760806040928251848201526020830151606082015260066107d05a03fa1561175057565b93909260606020947f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47866080860198611b4061012060008901977f1c1e94bcd36515d96e435f61ee4fa0dc859f4090dcd5430374ced5e4ba688c9e89527f0e8bedfefb241a5448eac861c9f80086b6607f3082ace30b718ad164db3867a3858a015261187760008201357f0b1bea87e58d7f9b1df1b6e6530258dc6bf8354ee1e0287efbcde5faf0876cb37f21468c42c1abfe13be4583929db42dc4b6f1a3feb44d8e1336bbd6337b9992e88c61175a565b6118c6858201357f0dffb044274ff4d10fbf5545d248655f5203dca9161a6fd6ad5308d4ad2d9a487f10919aaea1bb570dabdefb8f9328f924ab0d33a21482584e6dbe5cc23d707f408c61175a565b61191660408201357f120401ecf289d3509044f33e1aab31e9cc9242ca08b56fe495beb5bf63dcab6a7f2a0297fa255705f360180d052e0f129394b63fedbf85496d1f61e4c335d5a1558c61175a565b611965888201357f2e31a07bdd388f34a6d84d0472485df1348189472b2f0119f41660d3c22045bd7f08034f82261ae61a6d5991ff892682a8d3117745585fea2279e9baf22f982cce8c61175a565b6119b560808201357f0c8304577691476e7b57b48d30630acc74c9b52baf12c6ef8bc1e28cc78798397f04a396b83d64f44cb37262119ef21df828153f3e5b22833520b2892c83752ce18c61175a565b611a0560a08201357f090968a6484d95f390fc636cfe1613f6ee8dac2b288485a2cf277886982669c97f25b48ba246ea1a991339587df4a62b88be3279d0b3b1d326cf9521a33d7b15878c61175a565b611a5560c08201357f22bdf3d83eddebc573238bb59aabc778011e095a196740f3ac64f69991275fe77f1073fb6d0a6ed98484e814d7d7cc0382850f5e66ff79e3215e470ccdbc3925728c61175a565b611aa560e08201357f23318a569b541a09f38bb1b3d2dec411fd8c6650abe56326b4abc7cdf5fd0e727f1a81a189d3c977a50f37f8fb6442804d25dced44e296159c9d9a1a313ea45e3c8c61175a565b611af66101008201357f242c422f58c0818ce1bc402140ef550d2ce6f537f7b97990b6c853d772818e7d7f2bd61b1039bd486ebd25c9866b7a34429b9d05f3ada0d35090b2b5a04c03dc108c61175a565b01357f0f73def0c88e50c35c62db1ac618eceec4f44d1d0666468a9c28cd8c8cbf81c97f1818989682bac795f6357e1a3d405e82b9a3bdbc86f5eb980be62287b25d28608961175a565b80358a5201358103068688015280356040880152858101358288015260408101356080880152013560a08601527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08601527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08601527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008601527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208601527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408601527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160860152516101808501528260000101516101a08401527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08401527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08401527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008401527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220840152803561024084015201356102608201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26102808201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6102a08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102c08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa6102e08201526020816103008160086107d05a03fa90511690565b91611e779391611dd3600090565b50604051936103808501604052611ded6000850135611727565b611dfa6020850135611727565b611e076040850135611727565b611e146060850135611727565b611e216080850135611727565b611e2e60a0850135611727565b611e3b60c0850135611727565b611e4860e0850135611727565b611e56610100850135611727565b611e64610120850135611727565b611e72610140850135611727565b6117a5565b60005260206000f3fea2646970667358221220b070e387d647569a745b0f851caaf898e12804e32149ebe4dcfc527f1e24f21e64736f6c63430008120033", + "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806365cd296c146100d2578063715018a6146100cd5780638da5cb5b146100c8578063b2a3fda4146100c3578063b870676c146100be578063c0d05fed146100b9578063ced1e978146100b4578063d2f7265a146100af578063dbac5821146100aa578063f2fde38b146100a5578063f3bb70f6146100a05763f6c7226b036100e6576106bf565b6105f9565b61057b565b610520565b6104c5565b6104aa565b610483565b6102e7565b610265565b610206565b6101dd565b61019d565b90816102409103126100e65790565b600080fd5b90610240828203126100e657610100916100d7565b90565b9052565b60005b83811061011a5750506000910152565b818101518382015260200161010a565b61014b61015460209361015e9361013f815190565b80835293849260200190565b95869101610107565b601f01601f191690565b0190565b94939160609161019b946101896101969361018260808b019460008c0152565b60208a0152565b878203604089015261012a565b940152565b565b346100e6576101ce6101b86101b33660046100eb565b610d21565b906101c594929460405190565b94859485610162565b0390f35b60009103126100e657565b346100e6576101ed3660046101d2565b6101f561072c565b604051005b6001600160a01b031690565b346100e6576102163660046101d2565b6101ce6102216106ea565b604051918291826001600160a01b03909116815260200190565b805b036100e657565b9050359061019b8261023b565b906020828203126100e65761010091610244565b346100e6576101f5610278366004610251565b6115da565b610100916008021c6001600160a01b031690565b90610100915461027d565b61010060006001610291565b610100906101fa906001600160a01b031682565b610100906102a8565b610100906102bc565b610103906102c5565b60208101929161019b91906102ce565b346100e6576102f73660046101d2565b6101ce61030261029c565b604051918291826102d7565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561035a575b602083101461035557565b610324565b91607f169161034a565b805460009392916103816103778361033a565b8085529360200190565b91600181169081156103d3575060011461039a57505050565b6103ad9192939450600052602060002090565b916000925b8184106103bf5750500190565b8054848401526020909301926001016103b2565b92949550505060ff1916825215156020020190565b9061010091610364565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761042a57604052565b6103f2565b9061019b6104499261044060405190565b938480926103e8565b0383610408565b90600010610461576101009061042f565b61030e565b61010060006002610450565b60208082526101009291019061012a565b346100e6576104933660046101d2565b6101ce61049e610466565b60405191829182610472565b346100e6576104ba3660046101d2565b6101ce61049e6115e3565b346100e6576104d53660046101d2565b6101ce7f0000000000000000000000000000000000000000000000000000000000000000610221565b610100916008021c81565b9061010091546104fe565b61010060006003610509565b346100e6576105303660046101d2565b6101ce61053b610514565b6040519182918290815260200190565b6001600160a01b03811661023d565b9050359061019b8261054b565b906020828203126100e6576101009161055a565b346100e6576101f561058e366004610567565b610843565b919060408301116100e657565b919060808301116100e657565b91906101408301116100e657565b610240818303126100e6576105d08282610593565b926101006105e184604085016105a0565b936105ef8160c08601610593565b93610100016105ad565b346100e6576106093660046105bb565b92919091611dc5565b9061019b61061f60405190565b9283610408565b67ffffffffffffffff811161042a57602090601f01601f19160190565b90826000939282370152565b9092919261066461065f82610626565b610612565b938185526020850190828401116100e65761019b92610643565b9080601f830112156100e6578160206101009335910161064f565b906020828203126100e657813567ffffffffffffffff81116100e657610100920161067e565b346100e6576101f56106d2366004610699565b611594565b610100906101fa565b61010090546106d7565b61010060006106e0565b6106fc610788565b61019b61071a565b6101fa6101006101009290565b61010090610704565b61019b6107276000610711565b61087c565b61019b6106f4565b1561073b57565b60405162461bcd60e51b815280610784600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b61019b6107936106ea565b6107ac61079f336101fa565b916001600160a01b031690565b14610734565b61019b906107be610788565b61081e565b156107ca57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61019b906107276108326101fa6000610711565b6001600160a01b03831614156107c3565b61019b906107b2565b906001600160a01b03905b9181191691161790565b90610871610100610878926102c5565b825461084c565b9055565b61088660006106e0565b90610892816000610861565b6108c56108bf7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936102c5565b916102c5565b916108cf60405190565b600090a3565b156108dc57565b60405162461bcd60e51b8152602060048201526024808201527f4f6e6c792065786368616e67652063616e2063616c6c20746869732066756e636044820152633a34b7b760e11b6064820152608490fd5b61097694939291906109713361096b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001661079f565b146108d5565b610b73565b90919293565b80151561023d565b9050519061019b8261097c565b906020828203126100e65761010091610984565b9037565b61019b916040916109a5565b9061015e816040936109a9565b6109d26109ce60029390565b9190565b806000925b8484106109e5575050505050565b610a016109fa6001926109f58690565b6109b5565b9360400190565b930192916109d7565b61019b91610140916109a5565b610a4f61019b94610a4561010094989795610a3b61024086019a60008701906109a9565b60408501906109c2565b60c08301906109a9565b0190610a0a565b6040513d6000823e3d90fd5b15610a6957565b60405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b210283937b7b360991b6044820152606490fd5b634e487b7160e01b600052603260045260246000fd5b90600a811015610ac5576020020190565b610a9e565b6101006101006101009290565b356101008161023b565b610aee6101006101009290565b60ff1690565b61015e610b0c92602092610b06815190565b94859290565b93849101610107565b61010091610af4565b6101009061042f565b15610b2e57565b60405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420656d61696c2066726f6d20616464726573730000000000006044820152606490fd5b50505050610b80306102c5565b602063f3bb70f6916000840190610bb96040860194610bc461010060c0890198018098610bac60405190565b9889978896879660e01b90565b865260048601610a17565b03915afa8015610d1c57610be091600091610cee575b50610a62565b610c03610bfe610bf9610bf36000610aca565b84610ab4565b610ad7565b610aca565b91600290610c88610c146001610ae1565b92610c826109ce610c73610c32610c2a85610ae1565b80988a610e1c565b610c5a610c3e60405190565b8092610c4e602083019182610b15565b90810382520382610408565b610c6c610c65825190565b9160200190565b2093610b1e565b610c7e610c65825190565b2090565b14610b27565b610100610bf9610cbc610bfe610bf9610cb6610cb0600798610ca98a610ae1565b908b610e1c565b97610aca565b88610ab4565b94610cde610cd9610bfe610bf9610cd36008610aca565b85610ab4565b611639565b610ce86009610aca565b90610ab4565b610d0f915060203d8111610d15575b610d078183610408565b810190610991565b38610bda565b503d610cfd565b610a56565b6109769060006060818061092d565b634e487b7160e01b600052601160045260246000fd5b610d559060ff165b9160ff1690565b90039060ff8211610d6257565b610d30565b6101006101006101009260ff1690565b67ffffffffffffffff811161042a5760208091020190565b90610d9c61065f83610d77565b918252565b369037565b9061019b610dbc610db684610d8f565b93610d77565b601f190160208401610da1565b6000198114610d625760010190565b91908203918211610d6257565b90610dee825190565b811015610ac5576020809102010190565b610100601f610aca565b81810292918115918404141715610d6257565b909290610e39610e34610e2f8686610d46565b610d67565b610da6565b91610e4385610d67565b610e4c85610d67565b811015610e9457610e8d81610e88610e6a610bf9610e4c9588610ab4565b610e85610e7f610e798c610d67565b85610dd8565b89610de5565b52565b610dc9565b9050610e43565b509350506101009150610ea5815190565b90610eb8610eb1610dff565b8093610e09565b906110c9565b90610d9c61065f83610626565b9061019b610dbc610edb84610ebe565b93610626565b610eee6101006101009290565b61ffff1690565b61ffff1661ffff8114610d625760010190565b6101006101006101009261ffff1690565b61010090610f2a6109ce6101009490565b901c90565b634e487b7160e01b600052601260045260246000fd5b610f519060ff16610d4e565b908115610f5c570690565b610f2f565b610f6d9060ff16610d4e565b019060ff8211610d6257565b610f8f610f896101009260ff1690565b60f81b90565b6001600160f81b03191690565b90610fa5825190565b811015610ac5570160200190565b61010090610f2a6109ce6101009460ff1690565b15610fce57565b60405162461bcd60e51b815260206004820152605760248201527f4e6f207061636b656420627974657320666f756e642120496e76616c6964206660448201527f696e616c207374617465206f66207061636b656420627974657320696e20656d60648201527f61696c3b2076616c7565206973206c696b656c79203021000000000000000000608482015260a490fd5b1561106657565b60405162461bcd60e51b815260206004820152603560248201527f5061636b6564206279746573206d6f7265207468616e20616c6c6f776564206d6044820152746178206e756d626572206f66207369676e616c732160581b6064820152608490fd5b926000926110d684610ae1565b6110ef6110ea836110e5895190565b610e09565b610ecb565b946110f981610aca565b9561110382610ee1565b965b6111106101008a5190565b61111989610f08565b10156112e75761113861113461112e8a610f08565b8b610de5565b5190565b98899661114487610da6565b9861114e86610aca565b8881101561119b5780610e888c8f6111969461118861118361118e9361117d6111776008610aca565b85610e09565b90610f19565b610ae1565b92610de5565b9060ff169052565b61114e565b5091909a50989295989793969194976111b388610aca565b955b8a8710156112c6576111d4610e2f6111cd8989610de5565b5160ff1690565b6111dd8a610aca565b811461127957906111f86111f361120a93610ae1565b610f79565b8a1a611204828b610f9c565b53610dc9565b9261121e6112186002610ae1565b8b610f45565b61122a610d4e8b610ae1565b14611255575b61124861124e915b6112426008610ae1565b90610fb3565b96610dc9565b95926111b5565b9861124861127061124e9261126a6001610ae1565b90610f61565b9a915050611230565b50926112886112186002610ae1565b600190611297610d4e83610ae1565b146112aa575b5061124861124e91611238565b6112be61124e929b61126a61124893610ae1565b9a915061129d565b989550935097949598916112da9150610ef5565b9695979197949094611105565b926109ce919598506101009750610100945061131a92509561010061132197611313610d4e6001610ae1565b1015610fc7565b111561105f565b611333565b610f8f610f896101009290565b80519060009261134284610aca565b61134d610100845190565b8110156113ef5761136f6113618285610f9c565b516001600160f81b03191690565b61138961137b87611326565b916001600160f81b03191690565b1461139c5761139790610dc9565b611342565b9250905b6113a983610ecb565b916113b385610aca565b845b8110156113e3576113dc816113d06113616113b59487610f9c565b881a6112048288610f9c565b90506113b3565b50935050610100915090565b50906113a0565b61019b90611402610788565b611589565b9160001960089290920291821b911b610857565b919061142c61010061087893610aca565b908354611407565b61019b9160009161141b565b81811061144b575050565b806114596000600193611434565b01611440565b9190601f811161146e57505050565b61148061019b93600052602060002090565b906020601f8401819004830193106114a2575b6020601f909101040190611440565b9091508190611493565b906114b5815190565b9067ffffffffffffffff821161042a576114d9826114d3855461033a565b8561145f565b602090601f831160011461151457610878929160009183611509575b5050600019600883021c1916906002021790565b0151905038806114f5565b601f1983169161152985600052602060002090565b9260005b8181106115675750916002939185600196941061154e575b50505002019055565b01516000196008601f8516021c19169055388080611545565b9193602060018192878701518155019501920161152d565b9061019b916114ac565b61019b90600261157f565b61019b906113f6565b61019b906115a9610788565b6115cf565b9060001990610857565b906115c861010061087892610aca565b82546115ae565b61019b9060036115b8565b61019b9061159d565b6101006002610b1e565b156115f457565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b611668602061165061164b60016106e0565b6102c5565b63169394bb9061165f60405190565b93849260e01b90565b82526004820185905260249082905afa908115610d1c57611698916116939160009161170b57501590565b6115ed565b6116a561164b60016106e0565b90635bd4df3290823b156100e6576116e2926116d4600080946116c760405190565b9687958694859360e01b90565b835260048301526024820190565b03925af18015610d1c576116f35750565b61019b9060006117038183610408565b8101906101d2565b611723915060203d8111610d1557610d078183610408565b1590565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001111561175057565b6000805260206000f35b919290926040519384526020840152604083015260408260608160076107d05a03fa156117505760806040928251848201526020830151606082015260066107d05a03fa1561175057565b93909260606020947f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47866080860198611b4061012060008901977f1c1e94bcd36515d96e435f61ee4fa0dc859f4090dcd5430374ced5e4ba688c9e89527f0e8bedfefb241a5448eac861c9f80086b6607f3082ace30b718ad164db3867a3858a015261187760008201357f0b1bea87e58d7f9b1df1b6e6530258dc6bf8354ee1e0287efbcde5faf0876cb37f21468c42c1abfe13be4583929db42dc4b6f1a3feb44d8e1336bbd6337b9992e88c61175a565b6118c6858201357f0dffb044274ff4d10fbf5545d248655f5203dca9161a6fd6ad5308d4ad2d9a487f10919aaea1bb570dabdefb8f9328f924ab0d33a21482584e6dbe5cc23d707f408c61175a565b61191660408201357f120401ecf289d3509044f33e1aab31e9cc9242ca08b56fe495beb5bf63dcab6a7f2a0297fa255705f360180d052e0f129394b63fedbf85496d1f61e4c335d5a1558c61175a565b611965888201357f2e31a07bdd388f34a6d84d0472485df1348189472b2f0119f41660d3c22045bd7f08034f82261ae61a6d5991ff892682a8d3117745585fea2279e9baf22f982cce8c61175a565b6119b560808201357f0c8304577691476e7b57b48d30630acc74c9b52baf12c6ef8bc1e28cc78798397f04a396b83d64f44cb37262119ef21df828153f3e5b22833520b2892c83752ce18c61175a565b611a0560a08201357f090968a6484d95f390fc636cfe1613f6ee8dac2b288485a2cf277886982669c97f25b48ba246ea1a991339587df4a62b88be3279d0b3b1d326cf9521a33d7b15878c61175a565b611a5560c08201357f22bdf3d83eddebc573238bb59aabc778011e095a196740f3ac64f69991275fe77f1073fb6d0a6ed98484e814d7d7cc0382850f5e66ff79e3215e470ccdbc3925728c61175a565b611aa560e08201357f23318a569b541a09f38bb1b3d2dec411fd8c6650abe56326b4abc7cdf5fd0e727f1a81a189d3c977a50f37f8fb6442804d25dced44e296159c9d9a1a313ea45e3c8c61175a565b611af66101008201357f242c422f58c0818ce1bc402140ef550d2ce6f537f7b97990b6c853d772818e7d7f2bd61b1039bd486ebd25c9866b7a34429b9d05f3ada0d35090b2b5a04c03dc108c61175a565b01357f0f73def0c88e50c35c62db1ac618eceec4f44d1d0666468a9c28cd8c8cbf81c97f1818989682bac795f6357e1a3d405e82b9a3bdbc86f5eb980be62287b25d28608961175a565b80358a5201358103068688015280356040880152858101358288015260408101356080880152013560a08601527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e260c08601527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d192660e08601527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c6101008601527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab6101208601527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a76101408601527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8610160860152516101808501528260000101516101a08401527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08401527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08401527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008401527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220840152803561024084015201356102608201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26102808201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6102a08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102c08201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa6102e08201526020816103008160086107d05a03fa90511690565b91611e779391611dd3600090565b50604051936103808501604052611ded6000850135611727565b611dfa6020850135611727565b611e076040850135611727565b611e146060850135611727565b611e216080850135611727565b611e2e60a0850135611727565b611e3b60c0850135611727565b611e4860e0850135611727565b611e56610100850135611727565b611e64610120850135611727565b611e72610140850135611727565b6117a5565b60005260206000f3fea2646970667358221220b070e387d647569a745b0f851caaf898e12804e32149ebe4dcfc527f1e24f21e64736f6c63430008120033", "devdoc": { "kind": "dev", "methods": { @@ -351,15 +351,15 @@ "type": "t_address" }, { - "astId": 10688, + "astId": 1862, "contract": "contracts/TransferDomainProcessor.sol:TransferDomainProcessor", "label": "nullifierRegistry", "offset": 0, "slot": "1", - "type": "t_contract(INullifierRegistry)9084" + "type": "t_contract(INullifierRegistry)1450" }, { - "astId": 10690, + "astId": 1864, "contract": "contracts/TransferDomainProcessor.sol:TransferDomainProcessor", "label": "emailFromAddress", "offset": 0, @@ -367,7 +367,7 @@ "type": "t_bytes_storage" }, { - "astId": 10692, + "astId": 1866, "contract": "contracts/TransferDomainProcessor.sol:TransferDomainProcessor", "label": "timestampBuffer", "offset": 0, @@ -386,7 +386,7 @@ "label": "bytes", "numberOfBytes": "32" }, - "t_contract(INullifierRegistry)9084": { + "t_contract(INullifierRegistry)1450": { "encoding": "inplace", "label": "contract INullifierRegistry", "numberOfBytes": "20" diff --git a/contracts-domain/deployments/sepolia/USDCMock.json b/contracts-domain/deployments/sepolia/USDCMock.json index 72f195ac5..2be0854a7 100644 --- a/contracts-domain/deployments/sepolia/USDCMock.json +++ b/contracts-domain/deployments/sepolia/USDCMock.json @@ -1,5 +1,5 @@ { - "address": "0xa238C4112eC47e1883b7B1095c981D5f458AB9D1", + "address": "0xdE76EA7B759F9ebb5F4B000ACc312CC5F9c3C096", "abi": [ { "inputs": [ @@ -293,34 +293,34 @@ "type": "function" } ], - "transactionHash": "0x8724b3fad3b8105e7ac60dc7de982ed760d6b99c78d634cd4b425286208de401", + "transactionHash": "0x9187216cf98d19b9b1e8aa3e00e7cdc92589508a26a952288041485b954787de", "receipt": { "to": null, "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "contractAddress": "0xa238C4112eC47e1883b7B1095c981D5f458AB9D1", - "transactionIndex": 65, + "contractAddress": "0xdE76EA7B759F9ebb5F4B000ACc312CC5F9c3C096", + "transactionIndex": 24, "gasUsed": "748119", - "logsBloom": "0x00000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000008008008000000000000000000000000000000000000000100000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x11def926f157d25c3024fe4dd4bcc3eec54ae4012d987e640dc4c11751e21447", - "transactionHash": "0x8724b3fad3b8105e7ac60dc7de982ed760d6b99c78d634cd4b425286208de401", + "logsBloom": "0x00000000000000000000000000000000800000000000004000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000800000000000008000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000008000000000", + "blockHash": "0x34409c3dd97c075ae0655d494a3886cc8b1cbf738cd01cb2151e367c71afb1ab", + "transactionHash": "0x9187216cf98d19b9b1e8aa3e00e7cdc92589508a26a952288041485b954787de", "logs": [ { - "transactionIndex": 65, - "blockNumber": 6644699, - "transactionHash": "0x8724b3fad3b8105e7ac60dc7de982ed760d6b99c78d634cd4b425286208de401", - "address": "0xa238C4112eC47e1883b7B1095c981D5f458AB9D1", + "transactionIndex": 24, + "blockNumber": 6746716, + "transactionHash": "0x9187216cf98d19b9b1e8aa3e00e7cdc92589508a26a952288041485b954787de", + "address": "0xdE76EA7B759F9ebb5F4B000ACc312CC5F9c3C096", "topics": [ "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" ], "data": "0x000000000000000000000000000000000000000000000000000000e8d4a51000", - "logIndex": 65, - "blockHash": "0x11def926f157d25c3024fe4dd4bcc3eec54ae4012d987e640dc4c11751e21447" + "logIndex": 55, + "blockHash": "0x34409c3dd97c075ae0655d494a3886cc8b1cbf738cd01cb2151e367c71afb1ab" } ], - "blockNumber": 6644699, - "cumulativeGasUsed": "7194572", + "blockNumber": 6746716, + "cumulativeGasUsed": "5347385", "status": 1, "byzantium": true }, @@ -330,7 +330,7 @@ "USDC" ], "numDeployments": 1, - "solcInputHash": "2d5447dc2e8fb3a2517c08b948266497", + "solcInputHash": "d865a6f49eab8c58036d78b72f5cb448", "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_mintAmount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"events\":{\"Approval(address,address,uint256)\":{\"details\":\"Emitted when the allowance of a `spender` for an `owner` is set by a call to {approve}. `value` is the new allowance.\"},\"Transfer(address,address,uint256)\":{\"details\":\"Emitted when `value` tokens are moved from one account (`from`) to another (`to`). Note that `value` may be zero.\"}},\"kind\":\"dev\",\"methods\":{\"allowance(address,address)\":{\"details\":\"See {IERC20-allowance}.\"},\"approve(address,uint256)\":{\"details\":\"See {IERC20-approve}. NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on `transferFrom`. This is semantically equivalent to an infinite approval. Requirements: - `spender` cannot be the zero address.\"},\"balanceOf(address)\":{\"details\":\"See {IERC20-balanceOf}.\"},\"decimals()\":{\"details\":\"Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5.05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the default value returned by this function, unless it's overridden. NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}.\"},\"decreaseAllowance(address,uint256)\":{\"details\":\"Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`.\"},\"increaseAllowance(address,uint256)\":{\"details\":\"Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address.\"},\"name()\":{\"details\":\"Returns the name of the token.\"},\"symbol()\":{\"details\":\"Returns the symbol of the token, usually a shorter version of the name.\"},\"totalSupply()\":{\"details\":\"See {IERC20-totalSupply}.\"},\"transfer(address,uint256)\":{\"details\":\"See {IERC20-transfer}. Requirements: - `to` cannot be the zero address. - the caller must have a balance of at least `amount`.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC20-transferFrom}. Emits an {Approval} event indicating the updated allowance. This is not required by the EIP. See the note at the beginning of {ERC20}. NOTE: Does not update the allowance if the current allowance is the maximum `uint256`. Requirements: - `from` and `to` cannot be the zero address. - `from` must have a balance of at least `amount`. - the caller must have allowance for ``from``'s tokens of at least `amount`.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/mocks/USDCMock.sol\":\"USDCMock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/token/ERC20/ERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC20.sol\\\";\\nimport \\\"./extensions/IERC20Metadata.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC20} interface.\\n *\\n * This implementation is agnostic to the way tokens are created. This means\\n * that a supply mechanism has to be added in a derived contract using {_mint}.\\n * For a generic mechanism see {ERC20PresetMinterPauser}.\\n *\\n * TIP: For a detailed writeup see our guide\\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\\n * to implement supply mechanisms].\\n *\\n * The default value of {decimals} is 18. To change this, you should override\\n * this function so it returns a different value.\\n *\\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\\n * instead returning `false` on failure. This behavior is nonetheless\\n * conventional and does not conflict with the expectations of ERC20\\n * applications.\\n *\\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\\n * This allows applications to reconstruct the allowance for all accounts just\\n * by listening to said events. Other implementations of the EIP may not emit\\n * these events, as it isn't required by the specification.\\n *\\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\\n * functions have been added to mitigate the well-known issues around setting\\n * allowances. See {IERC20-approve}.\\n */\\ncontract ERC20 is Context, IERC20, IERC20Metadata {\\n mapping(address => uint256) private _balances;\\n\\n mapping(address => mapping(address => uint256)) private _allowances;\\n\\n uint256 private _totalSupply;\\n\\n string private _name;\\n string private _symbol;\\n\\n /**\\n * @dev Sets the values for {name} and {symbol}.\\n *\\n * All two of these values are immutable: they can only be set once during\\n * construction.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev Returns the symbol of the token, usually a shorter version of the\\n * name.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev Returns the number of decimals used to get its user representation.\\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\\n *\\n * Tokens usually opt for a value of 18, imitating the relationship between\\n * Ether and Wei. This is the default value returned by this function, unless\\n * it's overridden.\\n *\\n * NOTE: This information is only used for _display_ purposes: it in\\n * no way affects any of the arithmetic of the contract, including\\n * {IERC20-balanceOf} and {IERC20-transfer}.\\n */\\n function decimals() public view virtual override returns (uint8) {\\n return 18;\\n }\\n\\n /**\\n * @dev See {IERC20-totalSupply}.\\n */\\n function totalSupply() public view virtual override returns (uint256) {\\n return _totalSupply;\\n }\\n\\n /**\\n * @dev See {IERC20-balanceOf}.\\n */\\n function balanceOf(address account) public view virtual override returns (uint256) {\\n return _balances[account];\\n }\\n\\n /**\\n * @dev See {IERC20-transfer}.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - the caller must have a balance of at least `amount`.\\n */\\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _transfer(owner, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-allowance}.\\n */\\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\\n return _allowances[owner][spender];\\n }\\n\\n /**\\n * @dev See {IERC20-approve}.\\n *\\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\\n * `transferFrom`. This is semantically equivalent to an infinite approval.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, amount);\\n return true;\\n }\\n\\n /**\\n * @dev See {IERC20-transferFrom}.\\n *\\n * Emits an {Approval} event indicating the updated allowance. This is not\\n * required by the EIP. See the note at the beginning of {ERC20}.\\n *\\n * NOTE: Does not update the allowance if the current allowance\\n * is the maximum `uint256`.\\n *\\n * Requirements:\\n *\\n * - `from` and `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n * - the caller must have allowance for ``from``'s tokens of at least\\n * `amount`.\\n */\\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\\n address spender = _msgSender();\\n _spendAllowance(from, spender, amount);\\n _transfer(from, to, amount);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically increases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n */\\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n _approve(owner, spender, allowance(owner, spender) + addedValue);\\n return true;\\n }\\n\\n /**\\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\\n *\\n * This is an alternative to {approve} that can be used as a mitigation for\\n * problems described in {IERC20-approve}.\\n *\\n * Emits an {Approval} event indicating the updated allowance.\\n *\\n * Requirements:\\n *\\n * - `spender` cannot be the zero address.\\n * - `spender` must have allowance for the caller of at least\\n * `subtractedValue`.\\n */\\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\\n address owner = _msgSender();\\n uint256 currentAllowance = allowance(owner, spender);\\n require(currentAllowance >= subtractedValue, \\\"ERC20: decreased allowance below zero\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - subtractedValue);\\n }\\n\\n return true;\\n }\\n\\n /**\\n * @dev Moves `amount` of tokens from `from` to `to`.\\n *\\n * This internal function is equivalent to {transfer}, and can be used to\\n * e.g. implement automatic token fees, slashing mechanisms, etc.\\n *\\n * Emits a {Transfer} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of at least `amount`.\\n */\\n function _transfer(address from, address to, uint256 amount) internal virtual {\\n require(from != address(0), \\\"ERC20: transfer from the zero address\\\");\\n require(to != address(0), \\\"ERC20: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, amount);\\n\\n uint256 fromBalance = _balances[from];\\n require(fromBalance >= amount, \\\"ERC20: transfer amount exceeds balance\\\");\\n unchecked {\\n _balances[from] = fromBalance - amount;\\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\\n // decrementing then incrementing.\\n _balances[to] += amount;\\n }\\n\\n emit Transfer(from, to, amount);\\n\\n _afterTokenTransfer(from, to, amount);\\n }\\n\\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\\n * the total supply.\\n *\\n * Emits a {Transfer} event with `from` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function _mint(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: mint to the zero address\\\");\\n\\n _beforeTokenTransfer(address(0), account, amount);\\n\\n _totalSupply += amount;\\n unchecked {\\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\\n _balances[account] += amount;\\n }\\n emit Transfer(address(0), account, amount);\\n\\n _afterTokenTransfer(address(0), account, amount);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens from `account`, reducing the\\n * total supply.\\n *\\n * Emits a {Transfer} event with `to` set to the zero address.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n * - `account` must have at least `amount` tokens.\\n */\\n function _burn(address account, uint256 amount) internal virtual {\\n require(account != address(0), \\\"ERC20: burn from the zero address\\\");\\n\\n _beforeTokenTransfer(account, address(0), amount);\\n\\n uint256 accountBalance = _balances[account];\\n require(accountBalance >= amount, \\\"ERC20: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[account] = accountBalance - amount;\\n // Overflow not possible: amount <= accountBalance <= totalSupply.\\n _totalSupply -= amount;\\n }\\n\\n emit Transfer(account, address(0), amount);\\n\\n _afterTokenTransfer(account, address(0), amount);\\n }\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\\n *\\n * This internal function is equivalent to `approve`, and can be used to\\n * e.g. set automatic allowances for certain subsystems, etc.\\n *\\n * Emits an {Approval} event.\\n *\\n * Requirements:\\n *\\n * - `owner` cannot be the zero address.\\n * - `spender` cannot be the zero address.\\n */\\n function _approve(address owner, address spender, uint256 amount) internal virtual {\\n require(owner != address(0), \\\"ERC20: approve from the zero address\\\");\\n require(spender != address(0), \\\"ERC20: approve to the zero address\\\");\\n\\n _allowances[owner][spender] = amount;\\n emit Approval(owner, spender, amount);\\n }\\n\\n /**\\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\\n *\\n * Does not update the allowance amount in case of infinite allowance.\\n * Revert if not enough allowance is available.\\n *\\n * Might emit an {Approval} event.\\n */\\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\\n uint256 currentAllowance = allowance(owner, spender);\\n if (currentAllowance != type(uint256).max) {\\n require(currentAllowance >= amount, \\\"ERC20: insufficient allowance\\\");\\n unchecked {\\n _approve(owner, spender, currentAllowance - amount);\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * will be transferred to `to`.\\n * - when `from` is zero, `amount` tokens will be minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * has been transferred to `to`.\\n * - when `from` is zero, `amount` tokens have been minted for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\\n}\\n\",\"keccak256\":\"0xa56ca923f70c1748830700250b19c61b70db9a683516dc5e216694a50445d99c\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC20 standard as defined in the EIP.\\n */\\ninterface IERC20 {\\n /**\\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\\n * another (`to`).\\n *\\n * Note that `value` may be zero.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 value);\\n\\n /**\\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\\n * a call to {approve}. `value` is the new allowance.\\n */\\n event Approval(address indexed owner, address indexed spender, uint256 value);\\n\\n /**\\n * @dev Returns the amount of tokens in existence.\\n */\\n function totalSupply() external view returns (uint256);\\n\\n /**\\n * @dev Returns the amount of tokens owned by `account`.\\n */\\n function balanceOf(address account) external view returns (uint256);\\n\\n /**\\n * @dev Moves `amount` tokens from the caller's account to `to`.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transfer(address to, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Returns the remaining number of tokens that `spender` will be\\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\\n * zero by default.\\n *\\n * This value changes when {approve} or {transferFrom} are called.\\n */\\n function allowance(address owner, address spender) external view returns (uint256);\\n\\n /**\\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\\n * that someone may use both the old and the new allowance by unfortunate\\n * transaction ordering. One possible solution to mitigate this race\\n * condition is to first reduce the spender's allowance to 0 and set the\\n * desired value afterwards:\\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address spender, uint256 amount) external returns (bool);\\n\\n /**\\n * @dev Moves `amount` tokens from `from` to `to` using the\\n * allowance mechanism. `amount` is then deducted from the caller's\\n * allowance.\\n *\\n * Returns a boolean value indicating whether the operation succeeded.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\\n}\\n\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC20.sol\\\";\\n\\n/**\\n * @dev Interface for the optional metadata functions from the ERC20 standard.\\n *\\n * _Available since v4.1._\\n */\\ninterface IERC20Metadata is IERC20 {\\n /**\\n * @dev Returns the name of the token.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the symbol of the token.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the decimals places of the token.\\n */\\n function decimals() external view returns (uint8);\\n}\\n\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"contracts/mocks/USDCMock.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { ERC20 } from \\\"@openzeppelin/contracts/token/ERC20/ERC20.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract USDCMock is ERC20 {\\n\\n constructor(\\n uint256 _mintAmount,\\n string memory name,\\n string memory symbol\\n )\\n ERC20(name, symbol)\\n {\\n _mint(msg.sender, _mintAmount);\\n }\\n\\n function decimals() public pure override returns (uint8) {\\n return 6;\\n }\\n}\\n\",\"keccak256\":\"0xda097618a7499396c5d4b8bdf4d296d687408a91b442333254f8ef8ba8f29953\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x60806040523462000031576200001f620000186200017b565b91620001a3565b604051610a74620005cb8239610a7490f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200006e57604052565b62000036565b906200008b6200008360405190565b92836200004c565b565b6001600160401b0381116200006e57602090601f01601f19160190565b60005b838110620000be5750506000910152565b8181015183820152602001620000ad565b90929192620000e8620000e2826200008d565b62000074565b9381855260208501908284011162000031576200008b92620000aa565b9080601f83011215620000315781516200012292602001620000cf565b90565b916060838303126200003157825160208401519093906001600160401b0381116200003157836200015891830162000105565b60408201519093906001600160401b038111620000315762000122920162000105565b6200019e6200103f80380380620001928162000074565b92833981019062000125565b909192565b906200008b92620001b491620003bc565b33620004f5565b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015620001f4575b6020831014620001ee57565b620001bb565b91607f1691620001e2565b9160001960089290920291821b911b5b9181191691161790565b6200012262000122620001229290565b91906200023e62000122620002479362000219565b908354620001ff565b9055565b6200008b9160009162000229565b81811062000265575050565b806200027560006001936200024b565b0162000259565b9190601f81116200028c57505050565b620002a06200008b93600052602060002090565b906020601f840181900483019310620002c4575b6020601f90910104019062000259565b9091508190620002b4565b90620002d9815190565b906001600160401b0382116200006e576200030182620002fa8554620001d1565b856200027c565b602090601f831160011462000340576200024792916000918362000334575b5050600019600883021c1916906002021790565b01519050388062000320565b601f198316916200035685600052602060002090565b9260005b81811062000397575091600293918560019694106200037d575b50505002019055565b01516000196008601f8516021c1916905538808062000374565b919360206001819287870151815501950192016200035a565b906200008b91620002cf565b90620003ce6200008b926003620003b0565b6004620003b0565b620003e662000122620001229290565b6001600160a01b031690565b6200012290620003d6565b156200040557565b60405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606490fd5b620001229081565b6200012290546200044a565b634e487b7160e01b600052601160045260246000fd5b919082018092116200048257565b6200045e565b90600019906200020f565b90620004a762000122620002479262000219565b825462000488565b6200012290620003e6906001600160a01b031682565b6200012290620004af565b6200012290620004c5565b90620004e790620004d0565b600052602052604060002090565b60006200057262000557836200050b84620003f2565b936200052e6200051b86620003e6565b6200052684620003e6565b1415620003fd565b62000551620005498862000543600262000452565b62000474565b600262000493565b620004db565b6200056b85620005678362000452565b0190565b9062000493565b620005c5620005ad620005a67fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef93620004d0565b93620004d0565b93620005b860405190565b9182918290815260200190565b0390a356fe6080604052600436101561001257600080fd5b60003560e01c806306fdde03146100c2578063095ea7b3146100bd57806318160ddd146100b857806323b872dd146100b3578063313ce567146100ae57806339509351146100a957806370a08231146100a457806395d89b411461009f578063a457c2d71461009a578063a9059cbb146100955763dd62ed3e036100d25761036a565b61032b565b61030f565b6102f4565b6102d9565b6102a9565b61027a565b61025e565b610202565b6101d4565b610146565b60009103126100d257565b600080fd5b60005b8381106100ea5750506000910152565b81810151838201526020016100da565b61011b61012460209361012e9361010f815190565b80835293849260200190565b958691016100d7565b601f01601f191690565b0190565b6020808252610143929101906100fa565b90565b346100d2576101563660046100c7565b61016d6101616104bb565b60405191829182610132565b0390f35b6001600160a01b031690565b6001600160a01b0381165b036100d257565b9050359061019c8261017d565b565b80610188565b9050359061019c8261019e565b91906040838203126100d257610143906101cb818561018f565b936020016101a4565b346100d25761016d6101f06101ea3660046101b1565b90610579565b60405191829182901515815260200190565b346100d2576102123660046100c7565b61016d61021d6104e0565b6040515b9182918290815260200190565b90916060828403126100d257610143610247848461018f565b93610255816020860161018f565b936040016101a4565b346100d25761016d6101f061027436600461022e565b91610584565b346100d25761028a3660046100c7565b61016d610295610a34565b6040519182918260ff909116815260200190565b346100d25761016d6101f06102bf3660046101b1565b906105bd565b906020828203126100d2576101439161018f565b346100d25761016d61021d6102ef3660046102c5565b610528565b346100d2576103043660046100c7565b61016d6101616104c5565b346100d25761016d6101f06103253660046101b1565b90610636565b346100d25761016d6101f06103413660046101b1565b90610544565b91906040838203126100d25761014390610361818561018f565b9360200161018f565b346100d25761016d61021d610380366004610347565b90610559565b634e487b7160e01b600052602260045260246000fd5b90600160028304921680156103bc575b60208310146103b757565b610386565b91607f16916103ac565b805460009392916103e36103d98361039c565b8085529360200190565b916001811690811561043557506001146103fc57505050565b61040f9192939450600052602060002090565b916000925b8184106104215750500190565b805484840152602090930192600101610414565b92949550505060ff1916825215156020020190565b90610143916103c6565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761048c57604052565b610454565b9061019c6104ab926104a260405190565b9384809261044a565b038361046a565b61014390610491565b61014360036104b2565b61014360046104b2565b6101439081565b61014390546104cf565b61014360026104d6565b61014390610171906001600160a01b031682565b610143906104ea565b610143906104fe565b9061051a90610507565b600052602052604060002090565b61053f61014391610537600090565b506000610510565b6104d6565b61055491903361079e565b61079e565b600190565b6101439161057461053f9261056c600090565b506001610510565b610510565b61055491903361091b565b61055492919061054f8333836109e9565b634e487b7160e01b600052601160045260246000fd5b919082018092116105b857565b610595565b61055491906105d633926105d18385610559565b6105ab565b9161091b565b156105e357565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b61055491906105d6339261064a8385610559565b610656828210156105dc565b0390565b6101716101436101439290565b6101439061065a565b1561067757565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b156106d157565b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b1561072957565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b6101436101436101439290565b9061014361014361079a9261077d565b9055565b6108276108148360006107e56107d46107b683610667565b6101716001600160a01b0382166001600160a01b038a161415610670565b6001600160a01b03841614156106ca565b610574610805886107f961053f8986610510565b61065682821015610722565b61080f8784610510565b61078a565b6108218561012e836104d6565b9061078a565b61086761085d6108577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef93610507565b93610507565b9361022160405190565b0390a3565b1561087357565b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b156108cb57565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b61095a61094961092b6000610667565b6101716001600160a01b0382166001600160a01b038616141561086c565b6001600160a01b03841614156108c4565b61096d8361080f84610574856001610510565b61086761085d6108577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92593610507565b156109a457565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b906109f48183610559565b6000198103610a04575b50505050565b610a18936105d6916106568282101561099d565b388080806109fe565b610a2e6101436101439290565b60ff1690565b6101436006610a2156fea2646970667358221220e80608d1674df26ea48c686f799e4697d708f305deeab4d5adee33c57a3c0fe364736f6c63430008120033", "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806306fdde03146100c2578063095ea7b3146100bd57806318160ddd146100b857806323b872dd146100b3578063313ce567146100ae57806339509351146100a957806370a08231146100a457806395d89b411461009f578063a457c2d71461009a578063a9059cbb146100955763dd62ed3e036100d25761036a565b61032b565b61030f565b6102f4565b6102d9565b6102a9565b61027a565b61025e565b610202565b6101d4565b610146565b60009103126100d257565b600080fd5b60005b8381106100ea5750506000910152565b81810151838201526020016100da565b61011b61012460209361012e9361010f815190565b80835293849260200190565b958691016100d7565b601f01601f191690565b0190565b6020808252610143929101906100fa565b90565b346100d2576101563660046100c7565b61016d6101616104bb565b60405191829182610132565b0390f35b6001600160a01b031690565b6001600160a01b0381165b036100d257565b9050359061019c8261017d565b565b80610188565b9050359061019c8261019e565b91906040838203126100d257610143906101cb818561018f565b936020016101a4565b346100d25761016d6101f06101ea3660046101b1565b90610579565b60405191829182901515815260200190565b346100d2576102123660046100c7565b61016d61021d6104e0565b6040515b9182918290815260200190565b90916060828403126100d257610143610247848461018f565b93610255816020860161018f565b936040016101a4565b346100d25761016d6101f061027436600461022e565b91610584565b346100d25761028a3660046100c7565b61016d610295610a34565b6040519182918260ff909116815260200190565b346100d25761016d6101f06102bf3660046101b1565b906105bd565b906020828203126100d2576101439161018f565b346100d25761016d61021d6102ef3660046102c5565b610528565b346100d2576103043660046100c7565b61016d6101616104c5565b346100d25761016d6101f06103253660046101b1565b90610636565b346100d25761016d6101f06103413660046101b1565b90610544565b91906040838203126100d25761014390610361818561018f565b9360200161018f565b346100d25761016d61021d610380366004610347565b90610559565b634e487b7160e01b600052602260045260246000fd5b90600160028304921680156103bc575b60208310146103b757565b610386565b91607f16916103ac565b805460009392916103e36103d98361039c565b8085529360200190565b916001811690811561043557506001146103fc57505050565b61040f9192939450600052602060002090565b916000925b8184106104215750500190565b805484840152602090930192600101610414565b92949550505060ff1916825215156020020190565b90610143916103c6565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff82111761048c57604052565b610454565b9061019c6104ab926104a260405190565b9384809261044a565b038361046a565b61014390610491565b61014360036104b2565b61014360046104b2565b6101439081565b61014390546104cf565b61014360026104d6565b61014390610171906001600160a01b031682565b610143906104ea565b610143906104fe565b9061051a90610507565b600052602052604060002090565b61053f61014391610537600090565b506000610510565b6104d6565b61055491903361079e565b61079e565b600190565b6101439161057461053f9261056c600090565b506001610510565b610510565b61055491903361091b565b61055492919061054f8333836109e9565b634e487b7160e01b600052601160045260246000fd5b919082018092116105b857565b610595565b61055491906105d633926105d18385610559565b6105ab565b9161091b565b156105e357565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b61055491906105d6339261064a8385610559565b610656828210156105dc565b0390565b6101716101436101439290565b6101439061065a565b1561067757565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b156106d157565b60405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608490fd5b1561072957565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b6101436101436101439290565b9061014361014361079a9261077d565b9055565b6108276108148360006107e56107d46107b683610667565b6101716001600160a01b0382166001600160a01b038a161415610670565b6001600160a01b03841614156106ca565b610574610805886107f961053f8986610510565b61065682821015610722565b61080f8784610510565b61078a565b6108218561012e836104d6565b9061078a565b61086761085d6108577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef93610507565b93610507565b9361022160405190565b0390a3565b1561087357565b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b156108cb57565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b61095a61094961092b6000610667565b6101716001600160a01b0382166001600160a01b038616141561086c565b6001600160a01b03841614156108c4565b61096d8361080f84610574856001610510565b61086761085d6108577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92593610507565b156109a457565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b906109f48183610559565b6000198103610a04575b50505050565b610a18936105d6916106568282101561099d565b388080806109fe565b610a2e6101436101439290565b60ff1690565b6101436006610a2156fea2646970667358221220e80608d1674df26ea48c686f799e4697d708f305deeab4d5adee33c57a3c0fe364736f6c63430008120033", diff --git a/contracts-domain/deployments/sepolia/VerifiedDomainRegistry.json b/contracts-domain/deployments/sepolia/VerifiedDomainRegistry.json index 470ee314c..7ecde8810 100644 --- a/contracts-domain/deployments/sepolia/VerifiedDomainRegistry.json +++ b/contracts-domain/deployments/sepolia/VerifiedDomainRegistry.json @@ -1,5 +1,5 @@ { - "address": "0xf491470B2459d65C92D0E6673A7672E2FFB26F02", + "address": "0xb941e69B6C1A23A88cf9DA7D243bAE1D2Cb8eb6b", "abi": [ { "inputs": [], @@ -727,40 +727,40 @@ "type": "function" } ], - "transactionHash": "0xd0c08f32d0b1f5b5711571d1bacc5c9d152ff56efffadb21209f64f45f98e9c7", + "transactionHash": "0xde4a0a205656019da670947f35e1b25ce66bbdad5514f202f64e4849d344812a", "receipt": { "to": null, "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "contractAddress": "0xf491470B2459d65C92D0E6673A7672E2FFB26F02", - "transactionIndex": 29, + "contractAddress": "0xb941e69B6C1A23A88cf9DA7D243bAE1D2Cb8eb6b", + "transactionIndex": 27, "gasUsed": "2387918", - "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000000000000000000000000000000000010000000000000002000000000000000000000000000000000000000001000800000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000040000000000000000000000", - "blockHash": "0xb10e7252f1a7df41ea047166f97b90eb31a8e2bdc4482781dc04e76df0731072", - "transactionHash": "0xd0c08f32d0b1f5b5711571d1bacc5c9d152ff56efffadb21209f64f45f98e9c7", + "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000080000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000200000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x610bb792147a43e89e83179cea8398650876b29bb74e4e00e9f5159ab351fb0e", + "transactionHash": "0xde4a0a205656019da670947f35e1b25ce66bbdad5514f202f64e4849d344812a", "logs": [ { - "transactionIndex": 29, - "blockNumber": 6678944, - "transactionHash": "0xd0c08f32d0b1f5b5711571d1bacc5c9d152ff56efffadb21209f64f45f98e9c7", - "address": "0xf491470B2459d65C92D0E6673A7672E2FFB26F02", + "transactionIndex": 27, + "blockNumber": 6746722, + "transactionHash": "0xde4a0a205656019da670947f35e1b25ce66bbdad5514f202f64e4849d344812a", + "address": "0xb941e69B6C1A23A88cf9DA7D243bAE1D2Cb8eb6b", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" ], "data": "0x", - "logIndex": 54, - "blockHash": "0xb10e7252f1a7df41ea047166f97b90eb31a8e2bdc4482781dc04e76df0731072" + "logIndex": 80, + "blockHash": "0x610bb792147a43e89e83179cea8398650876b29bb74e4e00e9f5159ab351fb0e" } ], - "blockNumber": 6678944, - "cumulativeGasUsed": "5480459", + "blockNumber": 6746722, + "cumulativeGasUsed": "13177290", "status": 1, "byzantium": true }, "args": [], - "numDeployments": 2, - "solcInputHash": "5430ec5a2a9a288ed108e648fd68abb0", + "numDeployments": 1, + "solcInputHash": "d865a6f49eab8c58036d78b72f5cb448", "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"}],\"name\":\"DomainListed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"}],\"name\":\"DomainListingRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"DomainTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"domainName\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"expiryTime\",\"type\":\"uint256\"}],\"name\":\"DomainVerified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"}],\"name\":\"ExchangeAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"}],\"name\":\"ExchangeRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IVerifyDomainProcessor\",\"name\":\"newVerifyDomainProcessor\",\"type\":\"address\"}],\"name\":\"VerifyDomainProcessorUpdated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_exchange\",\"type\":\"address\"}],\"name\":\"addExchange\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"domains\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"expiryTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"exchanges\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_domainId\",\"type\":\"bytes32\"}],\"name\":\"getDomain\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"expiryTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"}],\"internalType\":\"struct IVerifiedDomainRegistry.Domain\",\"name\":\"domain\",\"type\":\"tuple\"}],\"internalType\":\"struct IVerifiedDomainRegistry.DomainWithId\",\"name\":\"domainInfo\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_domainName\",\"type\":\"string\"}],\"name\":\"getDomainId\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_domainId\",\"type\":\"bytes32\"}],\"name\":\"getDomainOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"_domains\",\"type\":\"bytes32[]\"}],\"name\":\"getDomains\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"expiryTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"}],\"internalType\":\"struct IVerifiedDomainRegistry.Domain\",\"name\":\"domain\",\"type\":\"tuple\"}],\"internalType\":\"struct IVerifiedDomainRegistry.DomainWithId[]\",\"name\":\"domainInfo\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExchanges\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"getUserDomains\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"domainId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"expiryTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"exchange\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"listingId\",\"type\":\"uint256\"}],\"internalType\":\"struct IVerifiedDomainRegistry.Domain\",\"name\":\"domain\",\"type\":\"tuple\"}],\"internalType\":\"struct IVerifiedDomainRegistry.DomainWithId[]\",\"name\":\"domainInfo\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IVerifyDomainProcessor\",\"name\":\"_verifyDomainProcessor\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isExchange\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_domainId\",\"type\":\"bytes32\"}],\"name\":\"removeDomainListing\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_exchange\",\"type\":\"address\"}],\"name\":\"removeExchange\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_domainId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_listingId\",\"type\":\"uint256\"}],\"name\":\"setDomainListing\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_domainId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"updateDomainOnSale\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IVerifyDomainProcessor\",\"name\":\"_verifyDomainProcessor\",\"type\":\"address\"}],\"name\":\"updateVerifyDomainProcessor\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"userDomains\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifyDomainProcessor\",\"outputs\":[{\"internalType\":\"contract IVerifyDomainProcessor\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"provider\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"parameters\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"context\",\"type\":\"string\"}],\"internalType\":\"struct Claims.ClaimInfo\",\"name\":\"claimInfo\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"identifier\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampS\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"internalType\":\"struct Claims.CompleteClaimData\",\"name\":\"claim\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"internalType\":\"struct Claims.SignedClaim\",\"name\":\"signedClaim\",\"type\":\"tuple\"}],\"internalType\":\"struct IProxyBaseProcessor.Proof[]\",\"name\":\"_proofs\",\"type\":\"tuple[]\"}],\"name\":\"verifyDomains\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addExchange(address)\":{\"params\":{\"_exchange\":\"Address of the exchange contract\"}},\"initialize(address)\":{\"params\":{\"_verifyDomainProcessor\":\"Address of the VerifyDomainProcessor contract\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"removeDomainListing(bytes32)\":{\"params\":{\"_domainId\":\"Domain ID to update listing status for\"}},\"removeExchange(address)\":{\"params\":{\"_exchange\":\"Address of the exchange contract\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setDomainListing(bytes32,uint256)\":{\"params\":{\"_domainId\":\"Domain to set listed status for\",\"_listingId\":\"Listing Id of domain on calling exchange\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"updateDomainOnSale(bytes32,address)\":{\"params\":{\"_domainId\":\"Domain ID to update listing status for\",\"_newOwner\":\"New owner of the domain\"}},\"updateVerifyDomainProcessor(address)\":{\"params\":{\"_verifyDomainProcessor\":\"Address of the new VerifyDomainProcessor contract\"}},\"verifyDomains(((string,string,string),((bytes32,address,uint32,uint32),bytes[]))[])\":{\"params\":{\"_proofs\":\"Array of domain ownership TLS proofs\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addExchange(address)\":{\"notice\":\"ONLY OWNER: Add an exchange to the registry. This can only be called after the contract has been initialized. Exchange must not already exist in the registry. \"},\"initialize(address)\":{\"notice\":\"ONLY OWNER: Initialize the contract with the VerifyDomainProcessor and exchange contracts. This can only be called once.\"},\"removeDomainListing(bytes32)\":{\"notice\":\"ONLY EXCHANGE: Remove a listing status from domain. We check that the calling exchange is the one that the domain is listed on. This removes the exchange and listingId from the domain. \"},\"removeExchange(address)\":{\"notice\":\"ONLY OWNER: Remove an exchange from the registry. Exchange must exist in the registry. \"},\"setDomainListing(bytes32,uint256)\":{\"notice\":\"ONLY EXCHANGE: Add a listing status to domain. We check that the domain has been verified and is listed on the calling exchange. This sets the exchange and listingId of the domain. \"},\"updateDomainOnSale(bytes32,address)\":{\"notice\":\"ONLY EXCHANGE: Update domain on sale. We check that the calling exchange is the one that the domain is listed on. This updates the ownership of the domain to the new owner as well as removes the listing status from the domain. \"},\"updateVerifyDomainProcessor(address)\":{\"notice\":\"ONLY OWNER: Update the verify domain processor\"},\"verifyDomains(((string,string,string),((bytes32,address,uint32,uint32),bytes[]))[])\":{\"notice\":\"Verify domains and add them to the registry. If domain is transferred off-chain to another party then they can re-verify the domain and claim ownership of the domain and previous ownership is removed. The existing owner can re-verify the domain, say after the domain has expired to update the expiry time on the domain. Function reverts if: - Domain ownership TLS proofs are invalid \"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/VerifiedDomainRegistry.sol\":\"VerifiedDomainRegistry\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\")\\n mstore(0x1c, hash)\\n message := keccak256(0x00, 0x3c)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40)\\n mstore(ptr, \\\"\\\\x19\\\\x01\\\")\\n mstore(add(ptr, 0x02), domainSeparator)\\n mstore(add(ptr, 0x22), structHash)\\n data := keccak256(ptr, 0x42)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\\n * `validator` and `data` according to the version 0 of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x00\\\", validator, data));\\n }\\n}\\n\",\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"./StringUtils.sol\\\";\\n\\n/**\\n * Library to assist with requesting,\\n * serialising & verifying credentials\\n */\\nlibrary Claims {\\n\\t/** Data required to describe a claim */\\n\\tstruct CompleteClaimData {\\n\\t\\tbytes32 identifier;\\n\\t\\taddress owner;\\n\\t\\tuint32 timestampS;\\n\\t\\tuint32 epoch;\\n\\t}\\n\\n\\tstruct ClaimInfo {\\n\\t\\tstring provider;\\n\\t\\tstring parameters;\\n\\t\\tstring context;\\n\\t}\\n\\n\\t/** Claim with signatures & signer */\\n\\tstruct SignedClaim {\\n\\t\\tCompleteClaimData claim;\\n\\t\\tbytes[] signatures;\\n\\t}\\n\\n\\t/**\\n\\t * Asserts that the claim is signed by the expected witnesses\\n\\t */\\n\\tfunction assertValidSignedClaim(\\n\\t\\tSignedClaim memory self,\\n\\t\\taddress[] memory expectedWitnessAddresses\\n\\t) internal pure {\\n\\t\\trequire(self.signatures.length > 0, \\\"No signatures\\\");\\n\\t\\taddress[] memory signedWitnesses = recoverSignersOfSignedClaim(self);\\n\\t\\tfor (uint256 i = 0; i < expectedWitnessAddresses.length; i++) {\\n\\t\\t\\tbool found = false;\\n\\t\\t\\tfor (uint256 j = 0; j < signedWitnesses.length; j++) {\\n\\t\\t\\t\\tif (signedWitnesses[j] == expectedWitnessAddresses[i]) {\\n\\t\\t\\t\\t\\tfound = true;\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\trequire(found, \\\"Missing witness signature\\\");\\n\\t\\t}\\n\\t}\\n\\n\\t/**\\n\\t * @dev recovers the signer of the claim\\n\\t */\\n\\tfunction recoverSignersOfSignedClaim(\\n\\t\\tSignedClaim memory self\\n\\t) internal pure returns (address[] memory) {\\n\\t\\tbytes memory serialised = serialise(self.claim);\\n\\t\\taddress[] memory signers = new address[](self.signatures.length);\\n\\t\\tfor (uint256 i = 0; i < self.signatures.length; i++) {\\n\\t\\t\\tsigners[i] = verifySignature(serialised, self.signatures[i]);\\n\\t\\t}\\n\\n\\t\\treturn signers;\\n\\t}\\n\\n\\t/**\\n\\t * @dev serialises the credential into a string;\\n\\t * the string is used to verify the signature\\n\\t *\\n\\t * the serialisation is the same as done by the TS library\\n\\t */\\n\\tfunction serialise(\\n\\t\\tCompleteClaimData memory self\\n\\t) internal pure returns (bytes memory) {\\n\\t\\treturn\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\tStringUtils.bytes2str(abi.encodePacked(self.identifier)),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.address2str(self.owner),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.timestampS),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.epoch)\\n\\t\\t\\t);\\n\\t}\\n\\n\\t/**\\n\\t * @dev returns the address of the user that generated the signature\\n\\t */\\n\\tfunction verifySignature(\\n\\t\\tbytes memory content,\\n\\t\\tbytes memory signature\\n\\t) internal pure returns (address signer) {\\n\\t\\tbytes32 signedHash = keccak256(\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\t\\\"\\\\x19Ethereum Signed Message:\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(content.length),\\n\\t\\t\\t\\tcontent\\n\\t\\t\\t)\\n\\t\\t);\\n\\t\\treturn ECDSA.recover(signedHash, signature);\\n\\t}\\n\\n\\tfunction hashClaimInfo(ClaimInfo memory claimInfo) internal pure returns (bytes32) {\\n\\t\\tbytes memory serialised = abi.encodePacked(\\n\\t\\t\\tclaimInfo.provider,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.parameters,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.context\\n\\t\\t);\\n\\t\\treturn keccak256(serialised);\\n\\t}\\n}\\n\",\"keccak256\":\"0x87a41e75d358e86798456ad45e03446cde8f1519c8af17905f6c8b852a5f2da7\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/StringUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/**\\n * Utilities for string manipulation & conversion\\n */\\nlibrary StringUtils {\\n\\tfunction address2str(address x) internal pure returns (string memory) {\\n\\t\\tbytes memory s = new bytes(40);\\n\\t\\tfor (uint i = 0; i < 20; i++) {\\n\\t\\t\\tbytes1 b = bytes1(uint8(uint(uint160(x)) / (2 ** (8 * (19 - i)))));\\n\\t\\t\\tbytes1 hi = bytes1(uint8(b) / 16);\\n\\t\\t\\tbytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));\\n\\t\\t\\ts[2 * i] = getChar(hi);\\n\\t\\t\\ts[2 * i + 1] = getChar(lo);\\n\\t\\t}\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", s));\\n\\t}\\n\\n\\tfunction bytes2str(bytes memory buffer) internal pure returns (string memory) {\\n\\t\\t// Fixed buffer size for hexadecimal convertion\\n\\t\\tbytes memory converted = new bytes(buffer.length * 2);\\n\\t\\tbytes memory _base = \\\"0123456789abcdef\\\";\\n\\n\\t\\tfor (uint256 i = 0; i < buffer.length; i++) {\\n\\t\\t\\tconverted[i * 2] = _base[uint8(buffer[i]) / _base.length];\\n\\t\\t\\tconverted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length];\\n\\t\\t}\\n\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", converted));\\n\\t}\\n\\n\\tfunction getChar(bytes1 b) internal pure returns (bytes1 c) {\\n\\t\\tif (uint8(b) < 10) return bytes1(uint8(b) + 0x30);\\n\\t\\telse return bytes1(uint8(b) + 0x57);\\n\\t}\\n\\n\\tfunction bool2str(bool _b) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_b) {\\n\\t\\t\\treturn \\\"true\\\";\\n\\t\\t} else {\\n\\t\\t\\treturn \\\"false\\\";\\n\\t\\t}\\n\\t}\\n\\n\\tfunction uint2str(uint _i) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_i == 0) {\\n\\t\\t\\treturn \\\"0\\\";\\n\\t\\t}\\n\\t\\tuint j = _i;\\n\\t\\tuint len;\\n\\t\\twhile (j != 0) {\\n\\t\\t\\tlen++;\\n\\t\\t\\tj /= 10;\\n\\t\\t}\\n\\t\\tbytes memory bstr = new bytes(len);\\n\\t\\tuint k = len;\\n\\t\\twhile (_i != 0) {\\n\\t\\t\\tk = k - 1;\\n\\t\\t\\tuint8 temp = (48 + uint8(_i - (_i / 10) * 10));\\n\\t\\t\\tbytes1 b1 = bytes1(temp);\\n\\t\\t\\tbstr[k] = b1;\\n\\t\\t\\t_i /= 10;\\n\\t\\t}\\n\\t\\treturn string(bstr);\\n\\t}\\n\\n\\tfunction areEqual(\\n\\t\\tstring calldata _a,\\n\\t\\tstring storage _b\\n\\t) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction areEqual(string memory _a, string memory _b) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction toLower(string memory str) internal pure returns (string memory) {\\n\\t\\tbytes memory bStr = bytes(str);\\n\\t\\tbytes memory bLower = new bytes(bStr.length);\\n\\t\\tfor (uint i = 0; i < bStr.length; i++) {\\n\\t\\t\\t// Uppercase character...\\n\\t\\t\\tif ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {\\n\\t\\t\\t\\t// So we add 32 to make it lowercase\\n\\t\\t\\t\\tbLower[i] = bytes1(uint8(bStr[i]) + 32);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tbLower[i] = bStr[i];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn string(bLower);\\n\\t}\\n\\n\\tfunction substring(\\n\\t\\tstring memory str,\\n\\t\\tuint startIndex,\\n\\t\\tuint endIndex\\n\\t) internal pure returns (string memory) {\\n\\t\\tbytes memory strBytes = bytes(str);\\n\\t\\tbytes memory result = new bytes(endIndex - startIndex);\\n\\t\\tfor (uint i = startIndex; i < endIndex; i++) {\\n\\t\\t\\tresult[i - startIndex] = strBytes[i];\\n\\t\\t}\\n\\t\\treturn string(result);\\n\\t}\\n}\\n\",\"keccak256\":\"0x15feebafef16d4c74c043b39e652ddae0e121987ceca74b663f6a2d2d7ba8b4b\",\"license\":\"MIT\"},\"contracts/VerifiedDomainRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport { Bytes32ArrayUtils } from \\\"./external/lib/Bytes32ArrayUtils.sol\\\";\\nimport { AddressArrayUtils } from \\\"./external/lib/AddressArrayUtils.sol\\\";\\n\\nimport { IDomainExchange } from \\\"./interfaces/IDomainExchange.sol\\\";\\nimport { IVerifiedDomainRegistry } from \\\"./interfaces/IVerifiedDomainRegistry.sol\\\";\\nimport { IVerifyDomainProcessor } from \\\"./interfaces/IVerifyDomainProcessor.sol\\\";\\n\\n\\npragma solidity ^0.8.18;\\n\\ncontract VerifiedDomainRegistry is IVerifiedDomainRegistry, Ownable {\\n\\n using Bytes32ArrayUtils for bytes32[];\\n using AddressArrayUtils for address[];\\n\\n /* ============ Events ============ */\\n event DomainVerified(\\n bytes32 indexed domainId,\\n address indexed owner,\\n string domainName,\\n uint256 expiryTime\\n );\\n\\n event DomainListed(\\n bytes32 indexed domainId,\\n address indexed exchange,\\n uint256 indexed listingId\\n );\\n\\n event DomainListingRemoved(\\n bytes32 indexed domainId,\\n address indexed exchange\\n );\\n\\n event DomainTransferred(\\n bytes32 indexed domainId,\\n address indexed oldOwner,\\n address indexed newOwner\\n );\\n\\n\\n event VerifyDomainProcessorUpdated(\\n IVerifyDomainProcessor indexed newVerifyDomainProcessor\\n );\\n\\n event ExchangeAdded(address indexed exchange);\\n event ExchangeRemoved(address indexed exchange);\\n\\n /* ============ Modifiers ============ */\\n modifier onlyExchange() {\\n require(isExchange[msg.sender], \\\"Caller must be exchange\\\");\\n _;\\n }\\n\\n modifier onlyInitialized() {\\n require(isInitialized, \\\"Contract must be initialized\\\");\\n _;\\n }\\n\\n /* ============ Public Variables ============ */\\n IVerifyDomainProcessor public verifyDomainProcessor;\\n address[] public exchanges;\\n mapping(address=>bool) public isExchange;\\n\\n bool public isInitialized;\\n\\n mapping(bytes32 => Domain) public domains;\\n mapping(address => bytes32[]) public userDomains;\\n\\n /* ============ Constructor ============ */\\n \\n constructor() Ownable() {}\\n\\n /* ============ Public Functions ============ */\\n\\n /**\\n * @notice Verify domains and add them to the registry. If domain is transferred off-chain to another party \\n * then they can re-verify the domain and claim ownership of the domain and previous ownership is removed.\\n * The existing owner can re-verify the domain, say after the domain has expired to update the expiry time on\\n * the domain. Function reverts if:\\n * - Domain ownership TLS proofs are invalid\\n * \\n * @param _proofs Array of domain ownership TLS proofs\\n */\\n function verifyDomains(IVerifyDomainProcessor.Proof[] memory _proofs) external override\\n onlyInitialized\\n {\\n IVerifyDomainProcessor.DomainRaw[] memory rawDomains = verifyDomainProcessor.verifyProofs(\\n _proofs\\n );\\n\\n for (uint256 i = 0; i < rawDomains.length; i++) {\\n IVerifyDomainProcessor.DomainRaw memory rawDomain = rawDomains[i];\\n bytes32 domainId = getDomainId(rawDomain.name);\\n\\n Domain storage domain = domains[domainId];\\n if (domain.owner == address(0)) {\\n // Case 1.1: Domain has no owner\\n // Add caller as owner\\n userDomains[msg.sender].push(domainId);\\n\\n // Set domain details\\n domains[domainId] = Domain({\\n owner: msg.sender,\\n name: rawDomain.name,\\n expiryTime: rawDomain.expiryTime,\\n exchange: address(0),\\n listingId: 0\\n });\\n } else {\\n // Case 2: Domain has owner\\n // Case 2.1: Caller is owner; skip\\n if (domain.owner == msg.sender) {\\n // No updates to userDomains\\n\\n // Update domain details; Only expiry time can change\\n // Owner and domain name cannot change\\n // Exchange and listingId are kept as is\\n domain.expiryTime = rawDomain.expiryTime;\\n }\\n // Case 2.2: Caller is NOT owner\\n if (domain.owner != msg.sender) {\\n // Remove ownership from old owner\\n userDomains[domain.owner].removeStorage(domainId);\\n\\n // Remove listing on exchange if it exists\\n if (domain.exchange != address(0)) {\\n IDomainExchange(domain.exchange).registryRemoveListing(domain.listingId);\\n }\\n\\n // Add domain to new owner\\n userDomains[msg.sender].push(domainId);\\n\\n // Set domain details except for domain name as it cannot change\\n domain.owner = msg.sender;\\n domain.expiryTime = rawDomain.expiryTime;\\n domain.exchange = address(0);\\n domain.listingId = 0;\\n }\\n }\\n\\n emit DomainVerified(domainId, msg.sender, rawDomain.name, rawDomain.expiryTime);\\n }\\n }\\n\\n // Todo: Add function for relinquishing ownership of domain\\n\\n /**\\n * @notice ONLY EXCHANGE: Add a listing status to domain. We check that the domain has been verified and is\\n * listed on the calling exchange. This sets the exchange and listingId of the domain.\\n * \\n * @param _domainId Domain to set listed status for\\n * @param _listingId Listing Id of domain on calling exchange\\n */\\n function setDomainListing(bytes32 _domainId, uint256 _listingId)\\n external\\n override\\n onlyInitialized\\n onlyExchange\\n {\\n Domain storage domain = domains[_domainId];\\n\\n require(domain.owner != address(0), \\\"Domain must be verified\\\");\\n require(domain.exchange == address(0), \\\"Domain already listed on another exchange\\\");\\n\\n domain.exchange = msg.sender;\\n domain.listingId = _listingId;\\n\\n emit DomainListed(_domainId, msg.sender, _listingId);\\n }\\n\\n /**\\n * @notice ONLY EXCHANGE: Remove a listing status from domain. We check that the calling exchange is the one\\n * that the domain is listed on. This removes the exchange and listingId from the domain.\\n * \\n * @param _domainId Domain ID to update listing status for\\n */\\n function removeDomainListing(bytes32 _domainId) external override onlyInitialized onlyExchange {\\n Domain storage domain = domains[_domainId];\\n require(domain.exchange == msg.sender, \\\"Domain not listed on calling exchange\\\");\\n\\n _removeDomainListing(domain);\\n\\n emit DomainListingRemoved(_domainId, msg.sender);\\n }\\n\\n /**\\n * @notice ONLY EXCHANGE: Update domain on sale. We check that the calling exchange is the one that the domain\\n * is listed on. This updates the ownership of the domain to the new owner as well as removes the listing status\\n * from the domain.\\n * \\n * @param _domainId Domain ID to update listing status for\\n * @param _newOwner New owner of the domain\\n */\\n function updateDomainOnSale(bytes32 _domainId, address _newOwner) \\n external \\n override \\n onlyInitialized \\n onlyExchange \\n {\\n Domain storage domain = domains[_domainId];\\n require(domain.exchange == msg.sender, \\\"Domain not listed on calling exchange\\\");\\n\\n _removeDomainListing(domain);\\n\\n // Update ownership\\n address oldOwner = domain.owner;\\n domain.owner = _newOwner;\\n userDomains[oldOwner].removeStorage(_domainId);\\n userDomains[_newOwner].push(_domainId);\\n\\n emit DomainTransferred(_domainId, oldOwner, _newOwner);\\n }\\n\\n /* ============ Admin Functions ============ */\\n\\n /**\\n * @notice ONLY OWNER: Initialize the contract with the VerifyDomainProcessor and exchange contracts.\\n * This can only be called once.\\n *\\n * @param _verifyDomainProcessor Address of the VerifyDomainProcessor contract\\n */\\n function initialize(\\n IVerifyDomainProcessor _verifyDomainProcessor\\n )\\n external\\n onlyOwner\\n {\\n require(!isInitialized, \\\"Already initialized\\\");\\n\\n verifyDomainProcessor = _verifyDomainProcessor;\\n\\n isInitialized = true;\\n\\n emit VerifyDomainProcessorUpdated(_verifyDomainProcessor);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Add an exchange to the registry. This can only be called after the contract has been initialized.\\n * Exchange must not already exist in the registry.\\n * \\n * @param _exchange Address of the exchange contract\\n */\\n function addExchange(address _exchange) external onlyOwner onlyInitialized {\\n require(!isExchange[_exchange], \\\"Duplicate exchange\\\");\\n\\n isExchange[_exchange] = true;\\n exchanges.push(_exchange);\\n\\n emit ExchangeAdded(_exchange);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Remove an exchange from the registry. Exchange must exist in the registry.\\n * \\n * @param _exchange Address of the exchange contract\\n */\\n function removeExchange(address _exchange) external onlyOwner onlyInitialized {\\n require(isExchange[_exchange], \\\"Exchange does not exist\\\");\\n\\n isExchange[_exchange] = false;\\n exchanges.removeStorage(_exchange);\\n\\n emit ExchangeRemoved(_exchange);\\n }\\n\\n /**\\n * @notice ONLY OWNER: Update the verify domain processor\\n *\\n * @param _verifyDomainProcessor Address of the new VerifyDomainProcessor contract\\n */\\n function updateVerifyDomainProcessor(IVerifyDomainProcessor _verifyDomainProcessor) external onlyOwner {\\n require(address(_verifyDomainProcessor) != address(0), \\\"Invalid address\\\");\\n\\n verifyDomainProcessor = _verifyDomainProcessor;\\n emit VerifyDomainProcessorUpdated(_verifyDomainProcessor);\\n }\\n\\n /* ============ View Functions ============ */\\n\\n function getDomainId(string memory _domainName) public pure override returns (bytes32) {\\n return keccak256(abi.encodePacked(_domainName));\\n }\\n\\n function getDomainOwner(bytes32 _domainId) external view override returns (address) { \\n return domains[_domainId].owner;\\n }\\n\\n function getUserDomains(address _user) external view returns (DomainWithId[] memory domainInfo) {\\n bytes32[] memory domainIds = userDomains[_user];\\n \\n domainInfo = new DomainWithId[](domainIds.length);\\n for (uint256 i = 0; i < domainIds.length; i++) {\\n bytes32 domainId = domainIds[i];\\n domainInfo[i] = DomainWithId({\\n domainId: domainId,\\n domain: domains[domainId]\\n });\\n }\\n }\\n\\n function getDomain(bytes32 _domainId) external view override returns (DomainWithId memory domainInfo) {\\n return DomainWithId({\\n domainId: _domainId,\\n domain: domains[_domainId]\\n });\\n }\\n\\n function getDomains(bytes32[] memory _domains) external view returns (DomainWithId[] memory domainInfo) {\\n domainInfo = new DomainWithId[](_domains.length);\\n for (uint256 i = 0; i < _domains.length; i++) {\\n bytes32 domainId = _domains[i];\\n domainInfo[i] = DomainWithId({\\n domainId: domainId,\\n domain: domains[domainId]\\n });\\n }\\n }\\n\\n function getExchanges() external view returns (address[] memory) {\\n return exchanges;\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n function _removeDomainListing(Domain storage _domain) internal {\\n delete _domain.exchange;\\n delete _domain.listingId;\\n }\\n}\",\"keccak256\":\"0x8162cd31c4aa35caa77d08e3115681bbe33e842a9640b0106816e2ca09137ea8\",\"license\":\"MIT\"},\"contracts/external/interfaces/IProxyBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Claims } from \\\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IProxyBaseProcessor {\\n \\n struct Proof {\\n Claims.ClaimInfo claimInfo;\\n Claims.SignedClaim signedClaim;\\n }\\n}\\n\",\"keccak256\":\"0x65aa00301110dfdf8333bd9bb71ebad241d66ea5840a2db3ac6d4f6037083cb8\",\"license\":\"MIT\"},\"contracts/external/lib/AddressArrayUtils.sol\":{\"content\":\"/*\\n Copyright 2020 Set Labs Inc.\\n\\n Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n you may not use this file except in compliance with the License.\\n You may obtain a copy of the License at\\n\\n http://www.apache.org/licenses/LICENSE-2.0\\n\\n Unless required by applicable law or agreed to in writing, software\\n distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n See the License for the specific language governing permissions and\\n limitations under the License.\\n\\n SPDX-License-Identifier: MIT\\n*/\\n\\npragma solidity ^0.8.17;\\n\\n/**\\n * @title AddressArrayUtils\\n * @author Set Protocol\\n *\\n * Utility functions to handle Address Arrays\\n *\\n * CHANGELOG:\\n * - 4/21/21: Added validatePairsWithArray methods\\n */\\nlibrary AddressArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(address[] memory A, address a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(address[] memory A, address a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns true if there are 2 elements that are the same in an array\\n * @param A The input array to search\\n * @return Returns boolean for the first occurrence of a duplicate\\n */\\n function hasDuplicate(address[] memory A) internal pure returns(bool) {\\n require(A.length > 0, \\\"A is empty\\\");\\n\\n for (uint256 i = 0; i < A.length - 1; i++) {\\n address current = A[i];\\n for (uint256 j = i + 1; j < A.length; j++) {\\n if (current == A[j]) {\\n return true;\\n }\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n * @return Returns the array with the object removed.\\n */\\n function remove(address[] memory A, address a)\\n internal\\n pure\\n returns (address[] memory)\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n (address[] memory _A,) = pop(A, index);\\n return _A;\\n }\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n */\\n function removeStorage(address[] storage A, address a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n\\n /**\\n * Removes specified index from array\\n * @param A The input array to search\\n * @param index The index to remove\\n * @return Returns the new array and the removed entry\\n */\\n function pop(address[] memory A, uint256 index)\\n internal\\n pure\\n returns (address[] memory, address)\\n {\\n uint256 length = A.length;\\n require(index < A.length, \\\"Index must be < A length\\\");\\n address[] memory newAddresses = new address[](length - 1);\\n for (uint256 i = 0; i < index; i++) {\\n newAddresses[i] = A[i];\\n }\\n for (uint256 j = index + 1; j < length; j++) {\\n newAddresses[j - 1] = A[j];\\n }\\n return (newAddresses, A[index]);\\n }\\n}\\n\",\"keccak256\":\"0x486f1a373f33aa167227600ac2d0bf95b37685413d98a3e745107188f00ae405\",\"license\":\"MIT\"},\"contracts/external/lib/Bytes32ArrayUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.17;\\n\\n/**\\n * @title Bytes32ArrayUtils\\n * @author ZKP2P\\n *\\n * Fork of Set Protocol's AddressArrayUtils library adapted for usage with bytes32 arrays.\\n */\\nlibrary Bytes32ArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(bytes32[] memory A, bytes32 a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(bytes32[] memory A, bytes32 a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns true if there are 2 elements that are the same in an array\\n * @param A The input array to search\\n * @return Returns boolean for the first occurrence of a duplicate\\n */\\n function hasDuplicate(bytes32[] memory A) internal pure returns(bool) {\\n require(A.length > 0, \\\"A is empty\\\");\\n\\n for (uint256 i = 0; i < A.length - 1; i++) {\\n bytes32 current = A[i];\\n for (uint256 j = i + 1; j < A.length; j++) {\\n if (current == A[j]) {\\n return true;\\n }\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The bytes32 to remove\\n * @return Returns the array with the object removed.\\n */\\n function remove(bytes32[] memory A, bytes32 a)\\n internal\\n pure\\n returns (bytes32[] memory)\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"bytes32 not in array.\\\");\\n } else {\\n (bytes32[] memory _A,) = pop(A, index);\\n return _A;\\n }\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The bytes32 to remove\\n */\\n function removeStorage(bytes32[] storage A, bytes32 a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"bytes32 not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n\\n /**\\n * Removes specified index from array\\n * @param A The input array to search\\n * @param index The index to remove\\n * @return Returns the new array and the removed entry\\n */\\n function pop(bytes32[] memory A, uint256 index)\\n internal\\n pure\\n returns (bytes32[] memory, bytes32)\\n {\\n uint256 length = A.length;\\n require(index < A.length, \\\"Index must be < A length\\\");\\n bytes32[] memory newBytes = new bytes32[](length - 1);\\n for (uint256 i = 0; i < index; i++) {\\n newBytes[i] = A[i];\\n }\\n for (uint256 j = index + 1; j < length; j++) {\\n newBytes[j - 1] = A[j];\\n }\\n return (newBytes, A[index]);\\n }\\n}\\n\",\"keccak256\":\"0x14d572deda126ff812eb5ab0eed33120e13cc568fd611a4a6bff652f3e8440a8\",\"license\":\"MIT\"},\"contracts/interfaces/IDomainExchange.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.18;\\n\\n\\ninterface IDomainExchange {\\n function registryRemoveListing(uint256 _listingId) external;\\n}\",\"keccak256\":\"0xe9deda400c359c1b42d10c518dc1f01605ea3a466e1be110f1f7c9be4af8253b\",\"license\":\"MIT\"},\"contracts/interfaces/IVerifiedDomainRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { IVerifyDomainProcessor } from \\\"./IVerifyDomainProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IVerifiedDomainRegistry {\\n\\n struct Domain {\\n address owner;\\n string name;\\n uint256 expiryTime;\\n address exchange;\\n uint256 listingId;\\n }\\n\\n struct DomainWithId {\\n bytes32 domainId;\\n Domain domain;\\n }\\n\\n function verifyDomains(IVerifyDomainProcessor.Proof[] memory _proofs) external;\\n \\n function getDomainId(string memory _domainName) external pure returns (bytes32);\\n function getDomainOwner(bytes32 _domainId) external view returns (address);\\n function getDomain(bytes32 _domainId) external view returns (DomainWithId memory);\\n function getDomains(bytes32[] memory _domainId) external view returns (DomainWithId[] memory);\\n \\n function setDomainListing(bytes32 _domainId, uint256 _listingId) external;\\n function removeDomainListing(bytes32 _domainId) external;\\n function updateDomainOnSale(bytes32 _domainId, address _newOwner) external;\\n}\\n\",\"keccak256\":\"0xcc45329e6720b7b9df3c67985b16f8d778528f756c045ba6c2196831b40afe92\",\"license\":\"MIT\"},\"contracts/interfaces/IVerifyDomainProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\nimport { IProxyBaseProcessor } from \\\"../external/interfaces/IProxyBaseProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IVerifyDomainProcessor is IProxyBaseProcessor {\\n \\n struct DomainRaw {\\n string name;\\n uint256 expiryTime;\\n }\\n\\n function verifyProofs(\\n Proof[] memory _proofs\\n ) \\n external \\n returns (DomainRaw[] memory domains);\\n}\",\"keccak256\":\"0xe66335a9d8fb3d03a9ee76bf44fbec775311aeed3f6666862f06124b6605a123\",\"license\":\"MIT\"}},\"version\":1}", "bytecode": "0x6080604052346200002657620000146200002b565b6040516129b06200012682396129b090f35b600080fd5b6200003562000037565b565b6200003533620000c3565b62000054905b6001600160a01b031690565b90565b62000054905462000042565b620000549062000048906001600160a01b031682565b620000549062000063565b620000549062000079565b90620000a362000054620000bf9262000084565b82546001600160a01b0319166001600160a01b03919091161790565b9055565b620000cf600062000057565b90620000dd8160006200008f565b620001146200010d7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09362000084565b9162000084565b916200011f60405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c806236d2d3146101815780630183196b1461017c57806311d4c3a2146101775780631a242547146101725780631e2e3a6b1461016d57806327d335a8146101685780632839fc29146101635780632b8a80021461015e578063392e53cd146101595780635e8441d3146101545780636e74da681461014f578063715018a61461014a5780637f200269146101455780638da5cb5b146101405780638e0be3691461013b5780639f4cb8f0146101365780639f6eb88c14610131578063a9c56e911461012c578063aa10ce2214610127578063b3533dfe14610122578063c4d66de81461011d578063c722f177146101185763f2fde38b036101a757610e91565b610e60565b610c98565b610c71565b610c34565b610c1c565b610951565b610891565b610817565b6107f2565b6107da565b610792565b61077a565b61074f565b61064d565b610628565b6105ea565b61054c565b610502565b610460565b61041a565b6103cc565b610242565b6001600160a01b031690565b90565b6001600160a01b0381165b036101a757565b600080fd5b905035906101b982610195565b565b906020828203126101a757610192916101ac565b61019290610186906001600160a01b031682565b610192906101cf565b610192906101e3565b906101ff906101ec565b600052602052604060002090565b610192916008021c5b60ff1690565b90610192915461020d565b610192906102396003916000926101f5565b61021c565b9052565b346101a75761026f61025d6102583660046101bb565b610227565b60405191829182901515815260200190565b0390f35b60005b8381106102865750506000910152565b8181015183820152602001610276565b6102b76102c06020936102ca936102ab815190565b80835293849260200190565b95869101610273565b601f01601f191690565b0190565b80516001600160a01b0316825290610192906080806102fc60a0840160208701518582036020870152610296565b9461030c60408201516040860152565b6060818101516001600160a01b0316908501520151910152565b80518252610192916040810191602001519060208184039101526102ce565b9061019291610326565b9061036561035b835190565b8083529160200190565b90816103776020830284019460200190565b926000915b83831061038b57505050505090565b909192939460206103ae6103a783856001950387528951610345565b9760200190565b930193019193929061037c565b60208082526101929291019061034f565b346101a75761026f6103e76103e23660046101bb565b612456565b604051918291826103bb565b806101a0565b905035906101b9826103f3565b906020828203126101a757610192916103f9565b346101a75761026f610435610430366004610406565b612258565b604051918291826001600160a01b03909116815260200190565b602080825261019292910190610326565b346101a75761026f61047b610476366004610406565b612507565b6040519182918261044f565b60009103126101a757565b906104b26104ab6104a1845190565b8084529260200190565b9260200190565b9060005b8181106104c35750505090565b9091926104e96104e260019286516001600160a01b0316815260200190565b9460200190565b9291016104b6565b602080825261019292910190610492565b346101a757610512366004610487565b61026f61051d6125f6565b604051918291826104f1565b91906040838203126101a7576101929061054381856103f9565b936020016103f9565b346101a75761056561055f366004610529565b90611cac565b604051005b634e487b7160e01b600052603260045260246000fd5b80548210156105a35761059a600191600052602060002090565b91020190600090565b61056a565b610192916008021c610186565b9061019291546105a8565b600260006105cc825490565b8310156105e75750610192916105e191610580565b906105b5565b80fd5b346101a75761026f610435610600366004610406565b6105c0565b91906040838203126101a7576101929061061f81856103f9565b936020016101ac565b346101a75761056561063b366004610605565b90611e7e565b6101926000600461021c565b346101a75761065d366004610487565b61026f61025d610641565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761069f57604052565b610668565b906101b96106b160405190565b928361067e565b6001600160401b03811161069f57602090601f01601f19160190565b90826000939282370152565b909291926106f56106f0826106b8565b6106a4565b938185526020850190828401116101a7576101b9926106d4565b9080601f830112156101a757816020610192933591016106e0565b906020828203126101a75781356001600160401b0381116101a757610192920161070f565b346101a75761026f61076a61076536600461072a565b61221a565b6040519182918290815260200190565b346101a75761056561078d366004610406565b611da6565b346101a7576107a2366004610487565b610565610ee1565b6001600160a01b0381166101a0565b905035906101b9826107aa565b906020828203126101a757610192916107b9565b346101a7576105656107ed3660046107c6565b6121e7565b346101a757610802366004610487565b61026f6104356000546001600160a01b031690565b346101a75761056561082a3660046101bb565b612161565b91906040838203126101a7576101929061054381856101ac565b610192916008021c81565b906101929154610849565b61086d6006916000926101f5565b90610876825490565b8310156105e757506101929161088b91610580565b90610854565b346101a75761026f61076a6108a736600461082f565b9061085f565b6001600160401b03811161069f5760208091020190565b909291926108d46106f0826108ad565b93818552602080860192028301928184116101a757915b8383106108f85750505050565b6020809161090684866103f9565b8152019201916108eb565b9080601f830112156101a757816020610192933591016108c4565b906020828203126101a75781356001600160401b0381116101a7576101929201610911565b346101a75761026f6103e761096736600461092c565b612531565b9190916060818403126101a75761098360606106a4565b9281356001600160401b0381116101a757816109a091840161070f565b845260208201356001600160401b0381116101a757816109c191840161070f565b602085015260408201356001600160401b0381116101a7576109e3920161070f565b6040830152565b63ffffffff81166101a0565b905035906101b9826109ea565b9190916080818403126101a757610a5c610a1d60806106a4565b936000610a2a82856103f9565b908601526020610a3c828286016101ac565b908601526040610a4e828286016109f6565b9086015260608093016109f6565b90830152565b929190610a716106f0826108ad565b93818552602080860192028101918383116101a75781905b838210610a97575050505050565b81356001600160401b0381116101a757602091610ab7878493870161070f565b815201910190610a89565b9080601f830112156101a75781602061019293359101610a62565b91909160a0818403126101a757610af460406106a4565b926000610b018284610a03565b9085015260808201356001600160401b0381116101a757610b229201610ac2565b6020830152565b9190916040818403126101a757610b4060406106a4565b9281356001600160401b0381116101a75781610b5d91840161096c565b845260208201356001600160401b0381116101a757610b229201610add565b929190610b8b6106f0826108ad565b93818552602080860192028101918383116101a75781905b838210610bb1575050505050565b81356001600160401b0381116101a757602091610bd18784938701610b29565b815201910190610ba3565b9080601f830112156101a75781602061019293359101610b7c565b906020828203126101a75781356001600160401b0381116101a7576101929201610bdc565b346101a757610565610c2f366004610bf7565b611a96565b346101a757610565610c473660046101bb565b61208f565b610192600060016105b5565b61023e906101ec565b6020810192916101b99190610c58565b346101a757610c81366004610487565b61026f610c8c610c4c565b60405191829182610c61565b346101a757610565610cab3660046107c6565b611f65565b906101ff565b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015610cec575b6020831014610ce757565b610cb6565b91607f1691610cdc565b80546000939291610d13610d0983610ccc565b8085529360200190565b9160018116908115610d655750600114610d2c57505050565b610d3f9192939450600052602060002090565b916000925b818410610d515750500190565b805484840152602090930192600101610d44565b92949550505060ff1916825215156020020190565b9061019291610cf6565b906101b9610d9e92610d9560405190565b93848092610d7a565b038361067e565b6101929081565b6101929054610da5565b610dc1906005610cb0565b80546001600160a01b031691610dd960018301610d84565b91610de660028201610dac565b916101926004610e0060038501546001600160a01b031690565b9301610dac565b906101b994610e4c610e44610e5c936080969a99979a610e3760a088019260008901906001600160a01b03169052565b8682036020880152610296565b986040850152565b6001600160a01b03166060830152565b0152565b346101a75761026f610e7b610e76366004610406565b610db6565b91610e8895939560405190565b95869586610e07565b346101a757610565610ea43660046101bb565b611002565b610eb1610f3d565b6101b9610ecf565b6101866101926101929290565b61019290610eb9565b6101b9610edc6000610ec6565b61103b565b6101b9610ea9565b15610ef057565b60405162461bcd60e51b815280610f39600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6101b9610f526000546001600160a01b031690565b610f6b610f5e33610186565b916001600160a01b031690565b14610ee9565b6101b990610f7d610f3d565b610fdd565b15610f8957565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6101b990610edc610ff16101866000610ec6565b6001600160a01b0383161415610f82565b6101b990610f71565b906001600160a01b03905b9181191691161790565b90611030610192611037926101ec565b825461100b565b9055565b6000546001600160a01b031690611053816000611020565b6110866110807f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936101ec565b916101ec565b9161109060405190565b600090a3565b61019290610216565b6101929054611096565b156110b057565b60405162461bcd60e51b815260206004820152601c60248201527f436f6e7472616374206d75737420626520696e697469616c697a6564000000006044820152606490fd5b6101b99061110b611106600461109f565b6110a9565b6116e2565b909291926111206106f0826106b8565b938185526020850190828401116101a7576101b992610273565b9080601f830112156101a757815161019292602001611110565b905051906101b9826103f3565b9190916040818403126101a75761117860406106a4565b815190936001600160401b0382116101a75761119981610a5c93850161113a565b85526020928301611154565b9291906111b46106f0826108ad565b93818552602080860192028101918383116101a75781905b8382106111da575050505050565b81516001600160401b0381116101a7576020916111fa8784938701611161565b8152019101906111cc565b9080601f830112156101a7578151610192926020016111a5565b906020828203126101a75781516001600160401b0381116101a7576101929201611205565b8051606080845261019293916040916112759161126391850190610296565b60208501518482036020860152610296565b920151906040818403910152610296565b805182526020808201516001600160a01b0316908301526101b99190606090819060408181015163ffffffff1690850152015163ffffffff16910152565b9061019291610296565b906112da61035b835190565b90816112ec6020830284019460200190565b926000915b83831061130057505050505090565b9091929394602061131c6103a7838560019503875289516112c4565b93019301919392906112f1565b61019291602060a082019261134660008201516000850190611286565b01519060808184039101526112ce565b8051604080845261019293916020916113729190840190611244565b920151906020818403910152611329565b9061019291611356565b9061139961035b835190565b90816113ab6020830284019460200190565b926000915b8383106113bf57505050505090565b909192939460206113db6103a783856001950387528951611383565b93019301919392906113b0565b60208082526101929291019061138d565b6040513d6000823e3d90fd5b6101926101926101929290565b634e487b7160e01b600052601160045260246000fd5b60001981146114375760010190565b611412565b90611445825190565b8110156105a3576020809102010190565b9060001990611016565b9061147061019261103792611405565b8254611456565b9160001960089290920291821b911b611016565b919061149a6101926110379390565b908354611477565b90815491600160401b83101561069f57826114c59160016101b995018155610580565b9061148b565b61019260a06106a4565b919061149a61019261103793611405565b6101b9916000916114d5565b8181106114fd575050565b8061150b60006001936114e6565b016114f2565b9190601f811161152057505050565b6115326101b993600052602060002090565b906020601f840181900483019310611554575b6020601f9091010401906114f2565b9091508190611545565b90611567815190565b906001600160401b03821161069f5761158a826115848554610ccc565b85611511565b602090601f83116001146115c5576110379291600091836115ba575b5050600019600883021c1916906002021790565b0151905038806115a6565b601f198316916115da85600052602060002090565b9260005b818110611618575091600293918560019694106115ff575b50505002019055565b01516000196008601f8516021c191690553880806115f6565b919360206001819287870151815501950192016115de565b906101b99161155e565b6101b9919061168e906080906004906116648161165e87516001600160a01b031690565b90611020565b61167c60018201611676602088015190565b90611630565b6116946002820161168e604088015190565b90611460565b6116af6003820161165e60608801516001600160a01b031690565b0192015190565b906101b99161163a565b929160206116dd6101b99360408701908782036000890152610296565b940152565b600061172c916117026116fd6001546001600160a01b031690565b6101ec565b61172183637de24fcf61171460405190565b9687958694859360e01b90565b8352600483016113e8565b03925af1908115611a5057600091611a75575b5061174a6000611405565b611755610192835190565b811015611a7157611766818361143c565b5190611775600083015161221a565b916005926117866101928286610cb0565b9361179885546001600160a01b031690565b946117a36000610ec6565b956117b66001600160a01b038816610f5e565b036118b657506118b19461184b83611850936118326006946117e5846117e061019233809a6101f5565b6114a2565b88516118229061181b6117f960208d015190565b916118146118056114cb565b6001600160a01b03909b168b52565b60208a0152565b6040880152565b6001600160a01b03166060860152565b61184661183f6000611405565b6080860152565b610cb0565b6116b6565b33906118626020600085015194015190565b61189361188d7f04c47544b62d97fc6d744e7cc21ed4a24af06a46427efcfd15a0db261dbb27d69390565b936101ec565b936118a96118a060405190565b928392836116c0565b0390a3611428565b61174a565b90506118c981546001600160a01b031690565b6118d233610f5e565b14611a55575b80546001600160a01b03166118ec33610f5e565b036118fd575b506118b19350611850565b6119248261191f61019261191885546001600160a01b031690565b60066101f5565b6128ab565b60038101546001600160a01b03166119446001600160a01b038716610f5e565b036119aa575b6119a4906119916118b196611967856117e06101923360066101f5565b6119713384611020565b61198861197f602088015190565b60028501611460565b60038301611020565b600461199d6000611405565b9101611460565b386118f2565b6119c46116fd6116fd60038401546001600160a01b031690565b90631756c30e6119d660048301610dac565b833b156101a757611a0c936119fe600080946119f160405190565b9788958694859360e01b90565b835260048301526024820190565b03925af18015611a50576118b1966119a49361199192611a32575b50965050905061194a565b611a4a906000611a42818361067e565b810190610487565b38611a27565b6113f9565b611a6c611a63602085015190565b60028301611460565b6118d8565b5050565b611a90913d8091833e611a88818361067e565b81019061121f565b3861173f565b6101b9906110f5565b906101b991611ab1611106600461109f565b611b02565b15611abd57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206d7573742062652065786368616e67650000000000000000006044820152606490fd5b6101b99190611b22611b1d611b183360036101f5565b61109f565b611ab6565b611bd1565b15611b2e57565b60405162461bcd60e51b815260206004820152601760248201527f446f6d61696e206d7573742062652076657269666965640000000000000000006044820152606490fd5b15611b7a57565b60405162461bcd60e51b815260206004820152602960248201527f446f6d61696e20616c7265616479206c6973746564206f6e20616e6f746865726044820152682065786368616e676560b81b6064820152608490fd5b90611be0610192836005610cb0565b611c62826004611bf784546001600160a01b031690565b93611c1f611c056000610ec6565b95611c186001600160a01b038816610f5e565b1415611b27565b611c516003820195611c4b610f5e611c3e89546001600160a01b031690565b926001600160a01b031690565b14611b73565b611c5c338096611020565b01611460565b611c9c611c96611c907f94ec80928933a86cc2847706c09c43fa58866b537c8fce8eef172af4036af5209590565b926101ec565b92611405565b92611ca660405190565b600090a4565b906101b991611a9f565b6101b990611cc7611106600461109f565b6101b990611cdc611b1d611b183360036101f5565b611d3b565b15611ce857565b60405162461bcd60e51b815260206004820152602560248201527f446f6d61696e206e6f74206c6973746564206f6e2063616c6c696e672065786360448201526468616e676560d81b6064820152608490fd5b611d49610192826005610cb0565b611d7b611d6060038301546001600160a01b031690565b339290611d7690611d7085610f5e565b14611ce1565b61260c565b6110866110807ff27bc8e4c954bf9eead2d99629d460313da75ee401666af4d3cb1eb821ddb1f69390565b6101b990611cb6565b906101b991611dc1611106600461109f565b6101b99190611dd7611b1d611b183360036101f5565b906000611de8610192846005610cb0565b611e08611dff60038301546001600160a01b031690565b611d7033610f5e565b611e118161260c565b01611e2d82611e2783546001600160a01b031690565b92611020565b611e50836117e0610192856006611e4b8561191f6101928a856101f5565b6101f5565b611c9c611c90611c907f3275c4afb1638bd20394301d401c788e5091157ddca135fd84970904da6541af9590565b906101b991611daf565b6101b990611e94610f3d565b611efb565b15611ea057565b60405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b9060ff90611016565b90611ef461019261103792151590565b8254611edb565b611f14611f0f611f0b600461109f565b1590565b611e99565b611f1f816001611020565b611f2b60016004611ee4565b611f557f9b7c520e9e227a011fa79baf4082565a9fd780e2bcb20889c0fe36eba4b5c8db916101ec565b90611f5f60405190565b600090a2565b6101b990611e88565b6101b990611f7a610f3d565b6101b990611f8b611106600461109f565b61202c565b15611f9757565b60405162461bcd60e51b81526020600482015260126024820152714475706c69636174652065786368616e676560701b6044820152606490fd5b916001600160a01b0360089290920291821b911b611016565b9190611ffb610192611037936101ec565b908354611fd1565b90815491600160401b83101561069f57826120269160016101b995018155610580565b90611fea565b61205a6003612049612044611f0b611b1886856101f5565b611f90565b612055836001926101f5565b611ee4565b612065816002612003565b611f557f3e535d1ab441ef41c268fd9b52b478aee02d693c5ca2a84b5d26b89e0922e5e1916101ec565b6101b990611f6e565b6101b9906120a4610f3d565b6101b9906120b5611106600461109f565b612106565b156120c157565b60405162461bcd60e51b815260206004820152601760248201527f45786368616e676520646f6573206e6f742065786973740000000000000000006044820152606490fd5b61212c600361212061211b611b1885846101f5565b6120ba565b612055836000926101f5565b6121378160026126e4565b611f557ff50d0d312d501878616eb5e78ebf3ed6dcd3955aaef8165af9c6b057cc4832fb916101ec565b6101b990612098565b6101b990612176610f3d565b6121b9565b1561218257565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b6121dc6121c5826101ec565b6121d5610f5e6101866000610ec6565b141561217b565b611f2b816001611020565b6101b99061216a565b6102ca61220892602092612202815190565b94859290565b93849101610273565b610192916121f0565b61224261222660405190565b8092612236602083019182612211565b9081038252038261067e565b61225461224d825190565b9160200190565b2090565b600061227161019292612269600090565b506005610cb0565b01546001600160a01b031690565b9061229a61228e6104a1845490565b92600052602060002090565b9060005b8181106122ab5750505090565b9091926122cf6122c86001926122c087610dac565b815260200190565b9460010190565b92910161229e565b906101929161227f565b906101b9610d9e926122f260405190565b938480926122d7565b610192906122e1565b906123116106f0836108ad565b918252565b61019260406106a4565b6123286114cb565b906000825260208080808086016060815201600081520160008152016000905250565b905250565b610192612320565b612360612316565b9060008252602080830161234b612350565b610192612358565b60005b82811061238957505050565b602090612394612372565b818401520161237d565b906101b96123b46123ae84612304565b936108ad565b601f19016020840161237a565b906101b961244660046123d26114cb565b946123f46123e782546001600160a01b031690565b6001600160a01b03168752565b61240a61240360018301610d84565b6020880152565b61241961181b60028301610dac565b61244061243060038301546001600160a01b031690565b6001600160a01b03166060880152565b01610dac565b6080840152565b610192906123c1565b61246d61247291612465606090565b5060066101f5565b6122fb565b9061248361247e835190565b61239e565b916000908361249183611405565b61249c610192845190565b81101561250057806124b86124b46124fb938661143c565b5190565b6124e0610b226124c9836005610cb0565b6124db6124d4612316565b948a860152565b61244d565b6124ea828961143c565b526124f5818861143c565b50611428565b612491565b5093505050565b61250f612372565b50610192610b22612521836005610cb0565b6124db61252c612316565b948552565b9061253d61247e835190565b916000908361254b83611405565b612556610192845190565b81101561250057806124b86124b461256e938661143c565b61254b565b9061258261228e6104a1845490565b9060005b8181106125935750505090565b9091926125c16122c86001926125b087546001600160a01b031690565b6001600160a01b0316815260200190565b929101612586565b9061019291612573565b906101b9610d9e926125e460405190565b938480926125c9565b610192906125d3565b61019260026125ed565b6101b991600091611fea565b600060046101b9926126218360038301612600565b016114e6565b9061263661228e6104a1845490565b9060005b8181106126475750505090565b9091926126646122c86001926125b087546001600160a01b031690565b92910161263a565b9061019291612627565b906101b9610d9e9261268760405190565b9384809261266c565b61019290612676565b9190820391821161143757565b634e487b7160e01b600052603160045260246000fd5b805480156126df5760001901906126dc6126d68383610580565b90612600565b55565b6126a6565b6126f9612700926126f483612690565b61279d565b9092901590565b156127425760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b6101b991612761612751835490565b61275b6001611405565b90612699565b90818103612771575b50506126bc565b6120266127846105e161278b9486610580565b9184610580565b388061276a565b610192600019611405565b919082519260006127ad81611405565b855b811015612804576127d06127c3828561143c565b516001600160a01b031690565b6127e26001600160a01b038616610f5e565b146127fa576127f36127af91611428565b90506127ad565b9450505050600190565b5093505050612811612792565b9190565b9061282461228e6104a1845490565b9060005b8181106128355750505090565b90919261284a6122c86001926122c087610dac565b929101612828565b9061019291612815565b906101b9610d9e9261286d60405190565b93848092612852565b6101929061285c565b6101b99160009161148b565b805480156126df5760001901906126dc6128a58383610580565b9061287f565b6126f96128c0926128bb83612876565b61293b565b156129025760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b6044820152606490fd5b6101b991612911612751835490565b90818103612921575b505061288b565b6114c561278461088b6129349486610580565b388061291a565b9190825192600061294b81611405565b855b811015612804576129616124b4828561143c565b84146127fa5761297361294d91611428565b905061294b56fea2646970667358221220a6032f571ac9fa51b48f09a32827ab67ff828148f9996dd432fe8f26a821634c64736f6c63430008120033", "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806236d2d3146101815780630183196b1461017c57806311d4c3a2146101775780631a242547146101725780631e2e3a6b1461016d57806327d335a8146101685780632839fc29146101635780632b8a80021461015e578063392e53cd146101595780635e8441d3146101545780636e74da681461014f578063715018a61461014a5780637f200269146101455780638da5cb5b146101405780638e0be3691461013b5780639f4cb8f0146101365780639f6eb88c14610131578063a9c56e911461012c578063aa10ce2214610127578063b3533dfe14610122578063c4d66de81461011d578063c722f177146101185763f2fde38b036101a757610e91565b610e60565b610c98565b610c71565b610c34565b610c1c565b610951565b610891565b610817565b6107f2565b6107da565b610792565b61077a565b61074f565b61064d565b610628565b6105ea565b61054c565b610502565b610460565b61041a565b6103cc565b610242565b6001600160a01b031690565b90565b6001600160a01b0381165b036101a757565b600080fd5b905035906101b982610195565b565b906020828203126101a757610192916101ac565b61019290610186906001600160a01b031682565b610192906101cf565b610192906101e3565b906101ff906101ec565b600052602052604060002090565b610192916008021c5b60ff1690565b90610192915461020d565b610192906102396003916000926101f5565b61021c565b9052565b346101a75761026f61025d6102583660046101bb565b610227565b60405191829182901515815260200190565b0390f35b60005b8381106102865750506000910152565b8181015183820152602001610276565b6102b76102c06020936102ca936102ab815190565b80835293849260200190565b95869101610273565b601f01601f191690565b0190565b80516001600160a01b0316825290610192906080806102fc60a0840160208701518582036020870152610296565b9461030c60408201516040860152565b6060818101516001600160a01b0316908501520151910152565b80518252610192916040810191602001519060208184039101526102ce565b9061019291610326565b9061036561035b835190565b8083529160200190565b90816103776020830284019460200190565b926000915b83831061038b57505050505090565b909192939460206103ae6103a783856001950387528951610345565b9760200190565b930193019193929061037c565b60208082526101929291019061034f565b346101a75761026f6103e76103e23660046101bb565b612456565b604051918291826103bb565b806101a0565b905035906101b9826103f3565b906020828203126101a757610192916103f9565b346101a75761026f610435610430366004610406565b612258565b604051918291826001600160a01b03909116815260200190565b602080825261019292910190610326565b346101a75761026f61047b610476366004610406565b612507565b6040519182918261044f565b60009103126101a757565b906104b26104ab6104a1845190565b8084529260200190565b9260200190565b9060005b8181106104c35750505090565b9091926104e96104e260019286516001600160a01b0316815260200190565b9460200190565b9291016104b6565b602080825261019292910190610492565b346101a757610512366004610487565b61026f61051d6125f6565b604051918291826104f1565b91906040838203126101a7576101929061054381856103f9565b936020016103f9565b346101a75761056561055f366004610529565b90611cac565b604051005b634e487b7160e01b600052603260045260246000fd5b80548210156105a35761059a600191600052602060002090565b91020190600090565b61056a565b610192916008021c610186565b9061019291546105a8565b600260006105cc825490565b8310156105e75750610192916105e191610580565b906105b5565b80fd5b346101a75761026f610435610600366004610406565b6105c0565b91906040838203126101a7576101929061061f81856103f9565b936020016101ac565b346101a75761056561063b366004610605565b90611e7e565b6101926000600461021c565b346101a75761065d366004610487565b61026f61025d610641565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761069f57604052565b610668565b906101b96106b160405190565b928361067e565b6001600160401b03811161069f57602090601f01601f19160190565b90826000939282370152565b909291926106f56106f0826106b8565b6106a4565b938185526020850190828401116101a7576101b9926106d4565b9080601f830112156101a757816020610192933591016106e0565b906020828203126101a75781356001600160401b0381116101a757610192920161070f565b346101a75761026f61076a61076536600461072a565b61221a565b6040519182918290815260200190565b346101a75761056561078d366004610406565b611da6565b346101a7576107a2366004610487565b610565610ee1565b6001600160a01b0381166101a0565b905035906101b9826107aa565b906020828203126101a757610192916107b9565b346101a7576105656107ed3660046107c6565b6121e7565b346101a757610802366004610487565b61026f6104356000546001600160a01b031690565b346101a75761056561082a3660046101bb565b612161565b91906040838203126101a7576101929061054381856101ac565b610192916008021c81565b906101929154610849565b61086d6006916000926101f5565b90610876825490565b8310156105e757506101929161088b91610580565b90610854565b346101a75761026f61076a6108a736600461082f565b9061085f565b6001600160401b03811161069f5760208091020190565b909291926108d46106f0826108ad565b93818552602080860192028301928184116101a757915b8383106108f85750505050565b6020809161090684866103f9565b8152019201916108eb565b9080601f830112156101a757816020610192933591016108c4565b906020828203126101a75781356001600160401b0381116101a7576101929201610911565b346101a75761026f6103e761096736600461092c565b612531565b9190916060818403126101a75761098360606106a4565b9281356001600160401b0381116101a757816109a091840161070f565b845260208201356001600160401b0381116101a757816109c191840161070f565b602085015260408201356001600160401b0381116101a7576109e3920161070f565b6040830152565b63ffffffff81166101a0565b905035906101b9826109ea565b9190916080818403126101a757610a5c610a1d60806106a4565b936000610a2a82856103f9565b908601526020610a3c828286016101ac565b908601526040610a4e828286016109f6565b9086015260608093016109f6565b90830152565b929190610a716106f0826108ad565b93818552602080860192028101918383116101a75781905b838210610a97575050505050565b81356001600160401b0381116101a757602091610ab7878493870161070f565b815201910190610a89565b9080601f830112156101a75781602061019293359101610a62565b91909160a0818403126101a757610af460406106a4565b926000610b018284610a03565b9085015260808201356001600160401b0381116101a757610b229201610ac2565b6020830152565b9190916040818403126101a757610b4060406106a4565b9281356001600160401b0381116101a75781610b5d91840161096c565b845260208201356001600160401b0381116101a757610b229201610add565b929190610b8b6106f0826108ad565b93818552602080860192028101918383116101a75781905b838210610bb1575050505050565b81356001600160401b0381116101a757602091610bd18784938701610b29565b815201910190610ba3565b9080601f830112156101a75781602061019293359101610b7c565b906020828203126101a75781356001600160401b0381116101a7576101929201610bdc565b346101a757610565610c2f366004610bf7565b611a96565b346101a757610565610c473660046101bb565b61208f565b610192600060016105b5565b61023e906101ec565b6020810192916101b99190610c58565b346101a757610c81366004610487565b61026f610c8c610c4c565b60405191829182610c61565b346101a757610565610cab3660046107c6565b611f65565b906101ff565b634e487b7160e01b600052602260045260246000fd5b9060016002830492168015610cec575b6020831014610ce757565b610cb6565b91607f1691610cdc565b80546000939291610d13610d0983610ccc565b8085529360200190565b9160018116908115610d655750600114610d2c57505050565b610d3f9192939450600052602060002090565b916000925b818410610d515750500190565b805484840152602090930192600101610d44565b92949550505060ff1916825215156020020190565b9061019291610cf6565b906101b9610d9e92610d9560405190565b93848092610d7a565b038361067e565b6101929081565b6101929054610da5565b610dc1906005610cb0565b80546001600160a01b031691610dd960018301610d84565b91610de660028201610dac565b916101926004610e0060038501546001600160a01b031690565b9301610dac565b906101b994610e4c610e44610e5c936080969a99979a610e3760a088019260008901906001600160a01b03169052565b8682036020880152610296565b986040850152565b6001600160a01b03166060830152565b0152565b346101a75761026f610e7b610e76366004610406565b610db6565b91610e8895939560405190565b95869586610e07565b346101a757610565610ea43660046101bb565b611002565b610eb1610f3d565b6101b9610ecf565b6101866101926101929290565b61019290610eb9565b6101b9610edc6000610ec6565b61103b565b6101b9610ea9565b15610ef057565b60405162461bcd60e51b815280610f39600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b6101b9610f526000546001600160a01b031690565b610f6b610f5e33610186565b916001600160a01b031690565b14610ee9565b6101b990610f7d610f3d565b610fdd565b15610f8957565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b6101b990610edc610ff16101866000610ec6565b6001600160a01b0383161415610f82565b6101b990610f71565b906001600160a01b03905b9181191691161790565b90611030610192611037926101ec565b825461100b565b9055565b6000546001600160a01b031690611053816000611020565b6110866110807f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0936101ec565b916101ec565b9161109060405190565b600090a3565b61019290610216565b6101929054611096565b156110b057565b60405162461bcd60e51b815260206004820152601c60248201527f436f6e7472616374206d75737420626520696e697469616c697a6564000000006044820152606490fd5b6101b99061110b611106600461109f565b6110a9565b6116e2565b909291926111206106f0826106b8565b938185526020850190828401116101a7576101b992610273565b9080601f830112156101a757815161019292602001611110565b905051906101b9826103f3565b9190916040818403126101a75761117860406106a4565b815190936001600160401b0382116101a75761119981610a5c93850161113a565b85526020928301611154565b9291906111b46106f0826108ad565b93818552602080860192028101918383116101a75781905b8382106111da575050505050565b81516001600160401b0381116101a7576020916111fa8784938701611161565b8152019101906111cc565b9080601f830112156101a7578151610192926020016111a5565b906020828203126101a75781516001600160401b0381116101a7576101929201611205565b8051606080845261019293916040916112759161126391850190610296565b60208501518482036020860152610296565b920151906040818403910152610296565b805182526020808201516001600160a01b0316908301526101b99190606090819060408181015163ffffffff1690850152015163ffffffff16910152565b9061019291610296565b906112da61035b835190565b90816112ec6020830284019460200190565b926000915b83831061130057505050505090565b9091929394602061131c6103a7838560019503875289516112c4565b93019301919392906112f1565b61019291602060a082019261134660008201516000850190611286565b01519060808184039101526112ce565b8051604080845261019293916020916113729190840190611244565b920151906020818403910152611329565b9061019291611356565b9061139961035b835190565b90816113ab6020830284019460200190565b926000915b8383106113bf57505050505090565b909192939460206113db6103a783856001950387528951611383565b93019301919392906113b0565b60208082526101929291019061138d565b6040513d6000823e3d90fd5b6101926101926101929290565b634e487b7160e01b600052601160045260246000fd5b60001981146114375760010190565b611412565b90611445825190565b8110156105a3576020809102010190565b9060001990611016565b9061147061019261103792611405565b8254611456565b9160001960089290920291821b911b611016565b919061149a6101926110379390565b908354611477565b90815491600160401b83101561069f57826114c59160016101b995018155610580565b9061148b565b61019260a06106a4565b919061149a61019261103793611405565b6101b9916000916114d5565b8181106114fd575050565b8061150b60006001936114e6565b016114f2565b9190601f811161152057505050565b6115326101b993600052602060002090565b906020601f840181900483019310611554575b6020601f9091010401906114f2565b9091508190611545565b90611567815190565b906001600160401b03821161069f5761158a826115848554610ccc565b85611511565b602090601f83116001146115c5576110379291600091836115ba575b5050600019600883021c1916906002021790565b0151905038806115a6565b601f198316916115da85600052602060002090565b9260005b818110611618575091600293918560019694106115ff575b50505002019055565b01516000196008601f8516021c191690553880806115f6565b919360206001819287870151815501950192016115de565b906101b99161155e565b6101b9919061168e906080906004906116648161165e87516001600160a01b031690565b90611020565b61167c60018201611676602088015190565b90611630565b6116946002820161168e604088015190565b90611460565b6116af6003820161165e60608801516001600160a01b031690565b0192015190565b906101b99161163a565b929160206116dd6101b99360408701908782036000890152610296565b940152565b600061172c916117026116fd6001546001600160a01b031690565b6101ec565b61172183637de24fcf61171460405190565b9687958694859360e01b90565b8352600483016113e8565b03925af1908115611a5057600091611a75575b5061174a6000611405565b611755610192835190565b811015611a7157611766818361143c565b5190611775600083015161221a565b916005926117866101928286610cb0565b9361179885546001600160a01b031690565b946117a36000610ec6565b956117b66001600160a01b038816610f5e565b036118b657506118b19461184b83611850936118326006946117e5846117e061019233809a6101f5565b6114a2565b88516118229061181b6117f960208d015190565b916118146118056114cb565b6001600160a01b03909b168b52565b60208a0152565b6040880152565b6001600160a01b03166060860152565b61184661183f6000611405565b6080860152565b610cb0565b6116b6565b33906118626020600085015194015190565b61189361188d7f04c47544b62d97fc6d744e7cc21ed4a24af06a46427efcfd15a0db261dbb27d69390565b936101ec565b936118a96118a060405190565b928392836116c0565b0390a3611428565b61174a565b90506118c981546001600160a01b031690565b6118d233610f5e565b14611a55575b80546001600160a01b03166118ec33610f5e565b036118fd575b506118b19350611850565b6119248261191f61019261191885546001600160a01b031690565b60066101f5565b6128ab565b60038101546001600160a01b03166119446001600160a01b038716610f5e565b036119aa575b6119a4906119916118b196611967856117e06101923360066101f5565b6119713384611020565b61198861197f602088015190565b60028501611460565b60038301611020565b600461199d6000611405565b9101611460565b386118f2565b6119c46116fd6116fd60038401546001600160a01b031690565b90631756c30e6119d660048301610dac565b833b156101a757611a0c936119fe600080946119f160405190565b9788958694859360e01b90565b835260048301526024820190565b03925af18015611a50576118b1966119a49361199192611a32575b50965050905061194a565b611a4a906000611a42818361067e565b810190610487565b38611a27565b6113f9565b611a6c611a63602085015190565b60028301611460565b6118d8565b5050565b611a90913d8091833e611a88818361067e565b81019061121f565b3861173f565b6101b9906110f5565b906101b991611ab1611106600461109f565b611b02565b15611abd57565b60405162461bcd60e51b815260206004820152601760248201527f43616c6c6572206d7573742062652065786368616e67650000000000000000006044820152606490fd5b6101b99190611b22611b1d611b183360036101f5565b61109f565b611ab6565b611bd1565b15611b2e57565b60405162461bcd60e51b815260206004820152601760248201527f446f6d61696e206d7573742062652076657269666965640000000000000000006044820152606490fd5b15611b7a57565b60405162461bcd60e51b815260206004820152602960248201527f446f6d61696e20616c7265616479206c6973746564206f6e20616e6f746865726044820152682065786368616e676560b81b6064820152608490fd5b90611be0610192836005610cb0565b611c62826004611bf784546001600160a01b031690565b93611c1f611c056000610ec6565b95611c186001600160a01b038816610f5e565b1415611b27565b611c516003820195611c4b610f5e611c3e89546001600160a01b031690565b926001600160a01b031690565b14611b73565b611c5c338096611020565b01611460565b611c9c611c96611c907f94ec80928933a86cc2847706c09c43fa58866b537c8fce8eef172af4036af5209590565b926101ec565b92611405565b92611ca660405190565b600090a4565b906101b991611a9f565b6101b990611cc7611106600461109f565b6101b990611cdc611b1d611b183360036101f5565b611d3b565b15611ce857565b60405162461bcd60e51b815260206004820152602560248201527f446f6d61696e206e6f74206c6973746564206f6e2063616c6c696e672065786360448201526468616e676560d81b6064820152608490fd5b611d49610192826005610cb0565b611d7b611d6060038301546001600160a01b031690565b339290611d7690611d7085610f5e565b14611ce1565b61260c565b6110866110807ff27bc8e4c954bf9eead2d99629d460313da75ee401666af4d3cb1eb821ddb1f69390565b6101b990611cb6565b906101b991611dc1611106600461109f565b6101b99190611dd7611b1d611b183360036101f5565b906000611de8610192846005610cb0565b611e08611dff60038301546001600160a01b031690565b611d7033610f5e565b611e118161260c565b01611e2d82611e2783546001600160a01b031690565b92611020565b611e50836117e0610192856006611e4b8561191f6101928a856101f5565b6101f5565b611c9c611c90611c907f3275c4afb1638bd20394301d401c788e5091157ddca135fd84970904da6541af9590565b906101b991611daf565b6101b990611e94610f3d565b611efb565b15611ea057565b60405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606490fd5b9060ff90611016565b90611ef461019261103792151590565b8254611edb565b611f14611f0f611f0b600461109f565b1590565b611e99565b611f1f816001611020565b611f2b60016004611ee4565b611f557f9b7c520e9e227a011fa79baf4082565a9fd780e2bcb20889c0fe36eba4b5c8db916101ec565b90611f5f60405190565b600090a2565b6101b990611e88565b6101b990611f7a610f3d565b6101b990611f8b611106600461109f565b61202c565b15611f9757565b60405162461bcd60e51b81526020600482015260126024820152714475706c69636174652065786368616e676560701b6044820152606490fd5b916001600160a01b0360089290920291821b911b611016565b9190611ffb610192611037936101ec565b908354611fd1565b90815491600160401b83101561069f57826120269160016101b995018155610580565b90611fea565b61205a6003612049612044611f0b611b1886856101f5565b611f90565b612055836001926101f5565b611ee4565b612065816002612003565b611f557f3e535d1ab441ef41c268fd9b52b478aee02d693c5ca2a84b5d26b89e0922e5e1916101ec565b6101b990611f6e565b6101b9906120a4610f3d565b6101b9906120b5611106600461109f565b612106565b156120c157565b60405162461bcd60e51b815260206004820152601760248201527f45786368616e676520646f6573206e6f742065786973740000000000000000006044820152606490fd5b61212c600361212061211b611b1885846101f5565b6120ba565b612055836000926101f5565b6121378160026126e4565b611f557ff50d0d312d501878616eb5e78ebf3ed6dcd3955aaef8165af9c6b057cc4832fb916101ec565b6101b990612098565b6101b990612176610f3d565b6121b9565b1561218257565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b6121dc6121c5826101ec565b6121d5610f5e6101866000610ec6565b141561217b565b611f2b816001611020565b6101b99061216a565b6102ca61220892602092612202815190565b94859290565b93849101610273565b610192916121f0565b61224261222660405190565b8092612236602083019182612211565b9081038252038261067e565b61225461224d825190565b9160200190565b2090565b600061227161019292612269600090565b506005610cb0565b01546001600160a01b031690565b9061229a61228e6104a1845490565b92600052602060002090565b9060005b8181106122ab5750505090565b9091926122cf6122c86001926122c087610dac565b815260200190565b9460010190565b92910161229e565b906101929161227f565b906101b9610d9e926122f260405190565b938480926122d7565b610192906122e1565b906123116106f0836108ad565b918252565b61019260406106a4565b6123286114cb565b906000825260208080808086016060815201600081520160008152016000905250565b905250565b610192612320565b612360612316565b9060008252602080830161234b612350565b610192612358565b60005b82811061238957505050565b602090612394612372565b818401520161237d565b906101b96123b46123ae84612304565b936108ad565b601f19016020840161237a565b906101b961244660046123d26114cb565b946123f46123e782546001600160a01b031690565b6001600160a01b03168752565b61240a61240360018301610d84565b6020880152565b61241961181b60028301610dac565b61244061243060038301546001600160a01b031690565b6001600160a01b03166060880152565b01610dac565b6080840152565b610192906123c1565b61246d61247291612465606090565b5060066101f5565b6122fb565b9061248361247e835190565b61239e565b916000908361249183611405565b61249c610192845190565b81101561250057806124b86124b46124fb938661143c565b5190565b6124e0610b226124c9836005610cb0565b6124db6124d4612316565b948a860152565b61244d565b6124ea828961143c565b526124f5818861143c565b50611428565b612491565b5093505050565b61250f612372565b50610192610b22612521836005610cb0565b6124db61252c612316565b948552565b9061253d61247e835190565b916000908361254b83611405565b612556610192845190565b81101561250057806124b86124b461256e938661143c565b61254b565b9061258261228e6104a1845490565b9060005b8181106125935750505090565b9091926125c16122c86001926125b087546001600160a01b031690565b6001600160a01b0316815260200190565b929101612586565b9061019291612573565b906101b9610d9e926125e460405190565b938480926125c9565b610192906125d3565b61019260026125ed565b6101b991600091611fea565b600060046101b9926126218360038301612600565b016114e6565b9061263661228e6104a1845490565b9060005b8181106126475750505090565b9091926126646122c86001926125b087546001600160a01b031690565b92910161263a565b9061019291612627565b906101b9610d9e9261268760405190565b9384809261266c565b61019290612676565b9190820391821161143757565b634e487b7160e01b600052603160045260246000fd5b805480156126df5760001901906126dc6126d68383610580565b90612600565b55565b6126a6565b6126f9612700926126f483612690565b61279d565b9092901590565b156127425760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b6101b991612761612751835490565b61275b6001611405565b90612699565b90818103612771575b50506126bc565b6120266127846105e161278b9486610580565b9184610580565b388061276a565b610192600019611405565b919082519260006127ad81611405565b855b811015612804576127d06127c3828561143c565b516001600160a01b031690565b6127e26001600160a01b038616610f5e565b146127fa576127f36127af91611428565b90506127ad565b9450505050600190565b5093505050612811612792565b9190565b9061282461228e6104a1845490565b9060005b8181106128355750505090565b90919261284a6122c86001926122c087610dac565b929101612828565b9061019291612815565b906101b9610d9e9261286d60405190565b93848092612852565b6101929061285c565b6101b99160009161148b565b805480156126df5760001901906126dc6128a58383610580565b9061287f565b6126f96128c0926128bb83612876565b61293b565b156129025760405162461bcd60e51b8152602060048201526015602482015274313cba32b99999103737ba1034b71030b93930bc9760591b6044820152606490fd5b6101b991612911612751835490565b90818103612921575b505061288b565b6114c561278461088b6129349486610580565b388061291a565b9190825192600061294b81611405565b855b811015612804576129616124b4828561143c565b84146127fa5761297361294d91611428565b905061294b56fea2646970667358221220a6032f571ac9fa51b48f09a32827ab67ff828148f9996dd432fe8f26a821634c64736f6c63430008120033", @@ -862,15 +862,15 @@ "type": "t_address" }, { - "astId": 5199, + "astId": 7156, "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", "label": "verifyDomainProcessor", "offset": 0, "slot": "1", - "type": "t_contract(IVerifyDomainProcessor)7202" + "type": "t_contract(IVerifyDomainProcessor)11894" }, { - "astId": 5202, + "astId": 7159, "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", "label": "exchanges", "offset": 0, @@ -878,7 +878,7 @@ "type": "t_array(t_address)dyn_storage" }, { - "astId": 5206, + "astId": 7163, "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", "label": "isExchange", "offset": 0, @@ -886,7 +886,7 @@ "type": "t_mapping(t_address,t_bool)" }, { - "astId": 5208, + "astId": 7165, "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", "label": "isInitialized", "offset": 0, @@ -894,15 +894,15 @@ "type": "t_bool" }, { - "astId": 5213, + "astId": 7170, "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", "label": "domains", "offset": 0, "slot": "5", - "type": "t_mapping(t_bytes32,t_struct(Domain)7114_storage)" + "type": "t_mapping(t_bytes32,t_struct(Domain)11806_storage)" }, { - "astId": 5218, + "astId": 7175, "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", "label": "userDomains", "offset": 0, @@ -938,7 +938,7 @@ "label": "bytes32", "numberOfBytes": "32" }, - "t_contract(IVerifyDomainProcessor)7202": { + "t_contract(IVerifyDomainProcessor)11894": { "encoding": "inplace", "label": "contract IVerifyDomainProcessor", "numberOfBytes": "20" @@ -957,24 +957,24 @@ "numberOfBytes": "32", "value": "t_bool" }, - "t_mapping(t_bytes32,t_struct(Domain)7114_storage)": { + "t_mapping(t_bytes32,t_struct(Domain)11806_storage)": { "encoding": "mapping", "key": "t_bytes32", "label": "mapping(bytes32 => struct IVerifiedDomainRegistry.Domain)", "numberOfBytes": "32", - "value": "t_struct(Domain)7114_storage" + "value": "t_struct(Domain)11806_storage" }, "t_string_storage": { "encoding": "bytes", "label": "string", "numberOfBytes": "32" }, - "t_struct(Domain)7114_storage": { + "t_struct(Domain)11806_storage": { "encoding": "inplace", "label": "struct IVerifiedDomainRegistry.Domain", "members": [ { - "astId": 7105, + "astId": 11797, "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", "label": "owner", "offset": 0, @@ -982,7 +982,7 @@ "type": "t_address" }, { - "astId": 7107, + "astId": 11799, "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", "label": "name", "offset": 0, @@ -990,7 +990,7 @@ "type": "t_string_storage" }, { - "astId": 7109, + "astId": 11801, "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", "label": "expiryTime", "offset": 0, @@ -998,7 +998,7 @@ "type": "t_uint256" }, { - "astId": 7111, + "astId": 11803, "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", "label": "exchange", "offset": 0, @@ -1006,7 +1006,7 @@ "type": "t_address" }, { - "astId": 7113, + "astId": 11805, "contract": "contracts/VerifiedDomainRegistry.sol:VerifiedDomainRegistry", "label": "listingId", "offset": 0, diff --git a/contracts-domain/deployments/sepolia/VerifyDomainProcessor.json b/contracts-domain/deployments/sepolia/VerifyDomainProcessor.json index 30bb7037d..02e9cc87f 100644 --- a/contracts-domain/deployments/sepolia/VerifyDomainProcessor.json +++ b/contracts-domain/deployments/sepolia/VerifyDomainProcessor.json @@ -1,5 +1,5 @@ { - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "abi": [ { "inputs": [ @@ -483,1240 +483,1240 @@ "type": "function" } ], - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", "receipt": { "to": null, "from": "0x84e113087C97Cd80eA9D78983D4B8Ff61ECa1929", - "contractAddress": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", - "transactionIndex": 31, + "contractAddress": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", + "transactionIndex": 17, "gasUsed": "15020436", - "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000010000000000000000000000000000000010000000000040000000000000000000000000000000000002000000001000000000000000000000200000000000000020000010000000000000800000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047", - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", + "logsBloom": "0x00000000000000000000000000000000000000000000004000800000000000000000000000000000000000000000000400000000010000000000040000000000000000000000000000000000002000000001000000000000000000000000000000000000020000010000000000000802000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000001000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98", + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", "logs": [ { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000084e113087c97cd80ea9d78983d4b8ff61eca1929" ], "data": "0x", - "logIndex": 65, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 63, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307866643436323230333962653365343238366464333238356433366437373261373164353830613961666130613137313861376536343335333963393532636639000000000000000000000000000000000000000000000000000000000000", - "logIndex": 66, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 64, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839306136343839656666333831343036383961313531333366623538393036613765383437636331383237316166303336393336633865646139316464636338000000000000000000000000000000000000000000000000000000000000", - "logIndex": 67, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 65, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307831346432366430326233616539663236663965363261346438643736656266666630636434613464343632396330386339303961663939656330656234316437000000000000000000000000000000000000000000000000000000000000", - "logIndex": 68, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 66, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836343535386234333633633466386434653763316565316137356534643832663866613736363430653137346230366434656433346533623436656263316137000000000000000000000000000000000000000000000000000000000000", - "logIndex": 69, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 67, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865346163393363663332613538353839376233303065656330643232666464616564373031363539343866376161666431633434333634383035383133303537000000000000000000000000000000000000000000000000000000000000", - "logIndex": 70, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 68, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834613236366664363366353530646236623739313732333235663333343139646636643564383762663932346231373564386231383137663031306132316366000000000000000000000000000000000000000000000000000000000000", - "logIndex": 71, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 69, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864633065363637323466636633386538353139633761623333616239653661303437633735386462333532303462316430383635303066653530333333663731000000000000000000000000000000000000000000000000000000000000", - "logIndex": 72, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 70, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835313561383265333332366239383563613037336435386133626139323930653834666638643032316430373265376234323066643036313662633630396537000000000000000000000000000000000000000000000000000000000000", - "logIndex": 73, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 71, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307862343161353133666464336532623761366238653063303266386137313461613361636131303163643332333635646536636261633930666165333038653036000000000000000000000000000000000000000000000000000000000000", - "logIndex": 74, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 72, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307831666463343733386233323364346333386266363537613333663734663935363138626331313933336663633463653665396633663763393366356134393265000000000000000000000000000000000000000000000000000000000000", - "logIndex": 75, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 73, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835663135323331653537613266613836663565316562316332616264626435343835313039616461363562623633626564383763373234323564636138323835000000000000000000000000000000000000000000000000000000000000", - "logIndex": 76, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 74, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835343539656262656136343664316134613063393339343465363836303063396533353539313861393062333664333532613132393162613535376535353663000000000000000000000000000000000000000000000000000000000000", - "logIndex": 77, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 75, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307866663636633765633166376338316663383333626166623935323263633135626534656635363436323236376338393837393531303530316331626337376664000000000000000000000000000000000000000000000000000000000000", - "logIndex": 78, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 76, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835666161353135303039636137393238303562646630336439353164373533616232343163333231303636653366306362633065653866346330396563623332000000000000000000000000000000000000000000000000000000000000", - "logIndex": 79, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 77, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838303438313862323836653663323034623366313832383262316637613061343062316235353562633339646366323536333432653062346463336632393932000000000000000000000000000000000000000000000000000000000000", - "logIndex": 80, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 78, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835666631363933333461383162386239386261396537626562316566326533383630663739663134386366303735323635323465383239656366366436653564000000000000000000000000000000000000000000000000000000000000", - "logIndex": 81, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 79, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833383938393332396535636564353835396536353039646133396631316636333434633130353232633031393363306362353733653738336539373466626430000000000000000000000000000000000000000000000000000000000000", - "logIndex": 82, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 80, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307861633434316436643165393936326562306162636263383139323331653438363134373836633137393530376664306661616563346361643062356431653062000000000000000000000000000000000000000000000000000000000000", - "logIndex": 83, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 81, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865363265363332396162656664656532346663656366333763613535623131326661396430616261636232633939636437663863306461366337626134366138000000000000000000000000000000000000000000000000000000000000", - "logIndex": 84, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 82, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830393962363732366465313338323336666137643339313766313763616566343265626431396661393364653936623162316661666663373133323635643330000000000000000000000000000000000000000000000000000000000000", - "logIndex": 85, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 83, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864653165333763626232383737306131623165643730643461363833376530656537323739323630363965653866613136333366303365346465326333356364000000000000000000000000000000000000000000000000000000000000", - "logIndex": 86, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 84, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836633065306232333432346437356336313931323039343837613237626463623965653966373438656330356638373262346166643536616636366333366335000000000000000000000000000000000000000000000000000000000000", - "logIndex": 87, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 85, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839663736613234346237333164373235376434636338343666336461393837613632303338363261333261626535643337393738356462656364323335643161000000000000000000000000000000000000000000000000000000000000", - "logIndex": 88, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 86, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865663633656237643064613538303830373761663661386539633136303431366361363664623136373739656633306534393439643331656464373062663039000000000000000000000000000000000000000000000000000000000000", - "logIndex": 89, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 87, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307832623564623037663538386264323764333739353238316336343066643566666536646531313134353033613237653531306134616134626439643030346434000000000000000000000000000000000000000000000000000000000000", - "logIndex": 90, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 88, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837313839393430303730623035613731326663363330353365396337373138373730633536326364376466303834653530613934313636396636383030393061000000000000000000000000000000000000000000000000000000000000", - "logIndex": 91, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 89, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307831363537666161633934646435356530363333363264646662366639356335613664323165373966663735386336613864363037393531306230303462653332000000000000000000000000000000000000000000000000000000000000", - "logIndex": 92, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 90, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836306131386639623861663430356463623930623531653637313966633134623763373932376135393631343434636439376562386563666663376563626439000000000000000000000000000000000000000000000000000000000000", - "logIndex": 93, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 91, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830343066626536386539316134353735616439316437646362393030373766636663313736323765663261313239336635396431373732393539636361656437000000000000000000000000000000000000000000000000000000000000", - "logIndex": 94, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 92, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865326631396633633931643961353930636661663235663436353531623461303233396162343532656635663633386162313732636366626430613063363137000000000000000000000000000000000000000000000000000000000000", - "logIndex": 95, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 93, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837306138633062353630623436353563336137633638633062623736636639666334323438346133626237336335666564303261356662343239373936356236000000000000000000000000000000000000000000000000000000000000", - "logIndex": 96, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 94, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835366338313264636364383436323032393261313861383239313538626132306665663439653532656661353739346335386437643237383031343866633233000000000000000000000000000000000000000000000000000000000000", - "logIndex": 97, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 95, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837326162373032333736383634646261316562373631613639333761623164396664303265363037303433643764363433346262336633343262323230613733000000000000000000000000000000000000000000000000000000000000", - "logIndex": 98, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 96, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864373865353566303964653963313836393036343133353830376331353134623262376639303562323039636335373065636435326530346230333635386561000000000000000000000000000000000000000000000000000000000000", - "logIndex": 99, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 97, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837353263313535376134656461613734663963366464376331363665643931656663653134656439303634373136343133373366326137623032383463316464000000000000000000000000000000000000000000000000000000000000", - "logIndex": 100, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 98, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830613664393963386535306238363535366162376362383466353133653130303432316662663330626665633637636464313863653732303235353331393933000000000000000000000000000000000000000000000000000000000000", - "logIndex": 101, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 99, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836383133626466356532346536623564626137626634336461383933623839326237373265646536326664343464643262363461333131373333376262663166000000000000000000000000000000000000000000000000000000000000", - "logIndex": 102, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 100, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833646534326637353832333662666237393464663139396439653834353833373964333731326432656336383865326535666633633364663566393538666131000000000000000000000000000000000000000000000000000000000000", - "logIndex": 103, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 101, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307863336464313363656166326639646531323563623233366133646263663739633063316637353861623631383763656461363834653338343535646636316433000000000000000000000000000000000000000000000000000000000000", - "logIndex": 104, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 102, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864393333356236396430613939313235353765316139656465313235313038393331626361623661656536383734663235666633386264376634653135623533000000000000000000000000000000000000000000000000000000000000", - "logIndex": 105, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 103, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307832386634643661313032613432356633323361623039623364663739323435636331303761663132373530333539613361626666363834656461386363616234000000000000000000000000000000000000000000000000000000000000", - "logIndex": 106, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 104, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839366533313166366463373838303933386138333264383137643963376266353336326462316331316231616135633734373730323965633161363766646462000000000000000000000000000000000000000000000000000000000000", - "logIndex": 107, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 105, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836303830343636663738326437396366356533363964376464623964666164306131386433333035663931373566356464613966303138333739646661303962000000000000000000000000000000000000000000000000000000000000", - "logIndex": 108, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 106, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830326530306532323831343432376532353464386633383634653363326663376434646638663561383830613032616364343533653765643236366433346633000000000000000000000000000000000000000000000000000000000000", - "logIndex": 109, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 107, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837323237643039306465353233306239346262313237366233663766383836333763356638316361373836313164643638386162616164386634343466393934000000000000000000000000000000000000000000000000000000000000", - "logIndex": 110, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 108, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833356539383462353539383263356666303532613535366634323232643638633834313862333066656632613439326135346664633239333264333764393232000000000000000000000000000000000000000000000000000000000000", - "logIndex": 111, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 109, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837313338653064646261626330613630616364343562656162326465336233353862353364653734663432333266333964653130376536333835393438353734000000000000000000000000000000000000000000000000000000000000", - "logIndex": 112, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 110, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838653564363532323035343333373561373837383731626637356664393761633565393261623139653465333936366638636431306536323661326136306137000000000000000000000000000000000000000000000000000000000000", - "logIndex": 113, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 111, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839333336386338316131623561653762646461356636643434333861343638643032313437336262383766323439376661393138323931396461346230633934000000000000000000000000000000000000000000000000000000000000", - "logIndex": 114, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 112, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834343237313533343837353339616537333065663865666561383038633037626232303438373432353466316332313232633130303631663435623966336336000000000000000000000000000000000000000000000000000000000000", - "logIndex": 115, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 113, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834333563313132303261633631383562323162386462346662363131323339663838623135613966616264353932383831646364633865316435363939623166000000000000000000000000000000000000000000000000000000000000", - "logIndex": 116, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 114, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307862643839303664306265666436656530303264646535363137383433393135393264383737303064356530353666656235356564656566333739623038313865000000000000000000000000000000000000000000000000000000000000", - "logIndex": 117, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 115, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838623265386330333365363535326663383430393739353937353864323832666566656639316231666231346166343033303030306239623963306534303032000000000000000000000000000000000000000000000000000000000000", - "logIndex": 118, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 116, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307862306263653434636639373735333937613531363538363662613330626433653038643830333336316530376463643133383336623065366261633930313135000000000000000000000000000000000000000000000000000000000000", - "logIndex": 119, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 117, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834643439386665386135633034316135623764623736313933653764386238393266303637316535316365393634323863656231303666663331363961376334000000000000000000000000000000000000000000000000000000000000", - "logIndex": 120, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 118, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833313564383433666231373131363230393163306234386263646639653762366364353031653565376239353933393030383330376531353238666534376239000000000000000000000000000000000000000000000000000000000000", - "logIndex": 121, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 119, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864376466666532633632663535303536346562333963333662636630643663356534326138316234363535383864323133306630656138303639613730333265000000000000000000000000000000000000000000000000000000000000", - "logIndex": 122, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 120, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865393262303463363864353833323938663363346237626363323935306531656238376331663037633364316562623838326635386231633835393536396434000000000000000000000000000000000000000000000000000000000000", - "logIndex": 123, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 121, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838643366306165313535363063363236303230303362336165336163333135323235636533656663356238663130393566383739383734633537333134626261000000000000000000000000000000000000000000000000000000000000", - "logIndex": 124, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 122, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835383638343263353434623236353532356132376632663639623234653865613865303464343439663564613362383338326637376239616266666136653230000000000000000000000000000000000000000000000000000000000000", - "logIndex": 125, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 123, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830396138623230623364653233623866363631653338386536353431616134653138623339656466376532663039323665346233373633633832666565316532000000000000000000000000000000000000000000000000000000000000", - "logIndex": 126, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 124, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307862373930353632383564376436323731386439623166313930383763663234366636666134626435346235396665666236653533363734656230333638313966000000000000000000000000000000000000000000000000000000000000", - "logIndex": 127, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 125, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839313062636330386565636134356631313539336665376233616138303832313361313434646463633935326264343634383065626338323731303064656632000000000000000000000000000000000000000000000000000000000000", - "logIndex": 128, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 126, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307862323336353536616164396539323363343535306665653862626138316334316337353336383533333534656264363764663264663339643038303564626331000000000000000000000000000000000000000000000000000000000000", - "logIndex": 129, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 127, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834663437333835353334643834343336356439656331363432333133373133646637623530323030643139333466663835303066303231613465353066306531000000000000000000000000000000000000000000000000000000000000", - "logIndex": 130, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 128, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307863323334653761616137306633353338316363653465643631656235666464656262383661316362303064656434336461366266363065316461373566666535000000000000000000000000000000000000000000000000000000000000", - "logIndex": 131, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 129, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307832636334633339623732373466383430373139633037613635663630303461343361323835343530353266623739363131353638623934663866323836323436000000000000000000000000000000000000000000000000000000000000", - "logIndex": 132, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 130, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830646465343061356238613634353961393033613639633338306538646431663565323230343833346462373235376439313964303563663566623562363065000000000000000000000000000000000000000000000000000000000000", - "logIndex": 133, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 131, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830393437373132623835333464316339346463393962656234343731623566663861383239313436616338303561383438393935313662613763326239323162000000000000000000000000000000000000000000000000000000000000", - "logIndex": 134, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 132, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838396561636431663063646462383862376565663565323966623465633032656332633138303931653033326130633637383138336635323565393632653162000000000000000000000000000000000000000000000000000000000000", - "logIndex": 135, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 133, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833633935646532623935396566313034663532333765376337643832376338346237363039653163363533643535386438376330643235393139343830633262000000000000000000000000000000000000000000000000000000000000", - "logIndex": 136, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 134, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838343239336165343230633236396433633663313534356139323564653831313061323638326430353538306330323930386562353939643933653838393333000000000000000000000000000000000000000000000000000000000000", - "logIndex": 137, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 135, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307835313761656530623465623536383365613265653665656137316162313138356130643966636266646633323633356662376533613030623433656436313035000000000000000000000000000000000000000000000000000000000000", - "logIndex": 138, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 136, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837646165653239343961633835643266336463626134633264343561343834316334666635336336663932383066303136323765393731323066646665396461000000000000000000000000000000000000000000000000000000000000", - "logIndex": 139, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 137, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307865653933306431383732623332376466333836306563643733323330663934376536663538306163366430646164633638326137346463386134393832646339000000000000000000000000000000000000000000000000000000000000", - "logIndex": 140, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 138, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833303264643966623138643765623432616536666233333838356664323964313966363939346666666364636239616566326437636437333661643632343937000000000000000000000000000000000000000000000000000000000000", - "logIndex": 141, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 139, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307863613662353732636331343639323935336261633261633361313232626238323564656532313764326663303661333662343563613235393839663730303139000000000000000000000000000000000000000000000000000000000000", - "logIndex": 142, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 140, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307831316463376138623231336262353836353764383464613064356133636466663837336464653138626531396232623634346366306233653131356236366431000000000000000000000000000000000000000000000000000000000000", - "logIndex": 143, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 141, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838353030643233373239343732663063333232363432373930383162656536356536333263393333636463386638636635356537363333373566323035666462000000000000000000000000000000000000000000000000000000000000", - "logIndex": 144, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 142, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830316264323736666133343535383361666536393030646430616463613031316632343033363938373733623838353935396239613032396630356233633537000000000000000000000000000000000000000000000000000000000000", - "logIndex": 145, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 143, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307832643861376637353466393036316535393365306363306332383337636363633338356235663862373863303232396330626462393839366438386234343333000000000000000000000000000000000000000000000000000000000000", - "logIndex": 146, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 144, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307837616261623931313531323366396535373431616561333865613036376337346466613862363039326338353332646263633839383966376138643833613932000000000000000000000000000000000000000000000000000000000000", - "logIndex": 147, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 145, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307834373262323532373933323536393563383138363066653064363461633862373034326431633834656138653835396339376534616362613964353836393235000000000000000000000000000000000000000000000000000000000000", - "logIndex": 148, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 146, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307836303666366135643831346136666530653139653039326231356164613333343438653862346165376465393731393364333966623838623565323261326263000000000000000000000000000000000000000000000000000000000000", - "logIndex": 149, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 147, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830323636323063323736353737313534326632626265343364646531626263643139363164376361343261656538373862373030336264353866626364666135000000000000000000000000000000000000000000000000000000000000", - "logIndex": 150, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 148, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307861376235653462633438663430636332653665373133366564353333356231653731346233313038626661336533386261313133333732363062636334613131000000000000000000000000000000000000000000000000000000000000", - "logIndex": 151, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 149, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838343530616230336262363864636566386130326465303739656134333038353964386665366236373664323736366432643065396235316566393864656233000000000000000000000000000000000000000000000000000000000000", - "logIndex": 152, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 150, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307866346361646164326265326162393039613637663634653630393263616138303735386236633730356336393439393366653735316336306134333965313934000000000000000000000000000000000000000000000000000000000000", - "logIndex": 153, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 151, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307838353366646635396233653064396438666139643035393038646633643231306434653061636538393632336438633064323633646634653263323864323965000000000000000000000000000000000000000000000000000000000000", - "logIndex": 154, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 152, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307863663837396337656439336665643366666533323839366132663066343762303462303631613335353362316132393133373838356532633263653839313337000000000000000000000000000000000000000000000000000000000000", - "logIndex": 155, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 153, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307839306565333836623438633166333865643462643738393266373962343330356139386633663766643664336236666630383637333764636632376363353764000000000000000000000000000000000000000000000000000000000000", - "logIndex": 156, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 154, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307861396261653735316666666636623364326336616666313037366133613865633833663939336639633130336337383363353962633664393934663930336166000000000000000000000000000000000000000000000000000000000000", - "logIndex": 157, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 155, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307866326261343837646666383661646364623364653534376662333739633736633532396433653238316166386334663061343130373738626438326431363637000000000000000000000000000000000000000000000000000000000000", - "logIndex": 158, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 156, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307861323035393836346462363537643837336230313433643364376430303833353739316565616437316264353162336139663535353265656334323232623465000000000000000000000000000000000000000000000000000000000000", - "logIndex": 159, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 157, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830313135313863326462343936636137616164313164383532623037353034373033393235666135653036386466393030323438306166343962623561396366000000000000000000000000000000000000000000000000000000000000", - "logIndex": 160, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 158, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307861393435323661326665633162306661643035636262623830396237353732663434383966616432366562313836393030663032396239313331373334353837000000000000000000000000000000000000000000000000000000000000", - "logIndex": 161, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 159, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307830613163386561343632333431356130303565303163326239623764313632626539623939396237356133636137633235623931396265363361353635336537000000000000000000000000000000000000000000000000000000000000", - "logIndex": 162, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 160, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307833386433393064666361373435633964333230333264623834356334353530653637666232373130363562303432373738636330346339346435383864336565000000000000000000000000000000000000000000000000000000000000", - "logIndex": 163, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 161, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307864623335373565363265646233303332626264616565343561376136356432323866633766356363613263356237616130393535636339646638613039656362000000000000000000000000000000000000000000000000000000000000", - "logIndex": 164, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 162, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" }, { - "transactionIndex": 31, - "blockNumber": 6678945, - "transactionHash": "0xaa7052b09db8d67ac6bd9f90150cbe73f39b9f607a015b8d80c5651fcfc7803a", - "address": "0x2C951a10dB664b488d4d63DC449DFbEBfB6f9F87", + "transactionIndex": 17, + "blockNumber": 6746723, + "transactionHash": "0x3c7b61609a7fdedc12a518117480aff5af749c11734ee60f8eb9532e4d2b78fe", + "address": "0x7a07D610C4cfFBf90F7fe35A6A4008602DEFd388", "topics": [ "0xc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096" ], "data": "0x00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000042307863323764353138666435613639663266373931373938383136326533623730376235326534633137313433666630373733376131353866313964323732383139000000000000000000000000000000000000000000000000000000000000", - "logIndex": 165, - "blockHash": "0x42b1f2ae3140103327f40bf59bebdff98ad262ed855e9f4c4e4cd8cfc934c047" + "logIndex": 163, + "blockHash": "0x217621fef1b3d412a45f6b81d22d7534df43d19ff1906385c7589ec9a2567b98" } ], - "blockNumber": 6678945, - "cumulativeGasUsed": "19516881", + "blockNumber": 6746723, + "cumulativeGasUsed": "23935083", "status": 1, "byzantium": true }, "args": [ - "0xf491470B2459d65C92D0E6673A7672E2FFB26F02", - "0x5eDB64B6FF3Fe18CE0bf7a890a6cC6a7D236c925", + "0xb941e69B6C1A23A88cf9DA7D243bAE1D2Cb8eb6b", + "0xCE6454f272127ba69e8C8128B92F2388Ca343257", [ "0xfd4622039be3e4286dd3285d36d772a71d580a9afa0a1718a7e643539c952cf9", "0x90a6489eff38140689a15133fb58906a7e847cc18271af036936c8eda91ddcc8", @@ -1820,13 +1820,13 @@ "0xc27d518fd5a69f2f7917988162e3b707b52e4c17143ff07737a158f19d272819" ] ], - "numDeployments": 2, - "solcInputHash": "2d5447dc2e8fb3a2517c08b948266497", + "numDeployments": 1, + "solcInputHash": "d865a6f49eab8c58036d78b72f5cb448", "metadata": "{\"compiler\":{\"version\":\"0.8.18+commit.87f61d96\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_registry\",\"type\":\"address\"},{\"internalType\":\"contract INullifierRegistry\",\"name\":\"_nullifierRegistry\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"_providerHashes\",\"type\":\"string[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"providerHash\",\"type\":\"string\"}],\"name\":\"ProviderHashAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"providerHash\",\"type\":\"string\"}],\"name\":\"ProviderHashRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"witness\",\"type\":\"address\"}],\"name\":\"WitnessAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"witness\",\"type\":\"address\"}],\"name\":\"WitnessRemoved\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_newProviderHash\",\"type\":\"string\"}],\"name\":\"addProviderHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newWitness\",\"type\":\"address\"}],\"name\":\"addWitness\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getProviderHashes\",\"outputs\":[{\"internalType\":\"string[]\",\"name\":\"\",\"type\":\"string[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getWitnesses\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"name\":\"isProviderHash\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isWitness\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nullifierRegistry\",\"outputs\":[{\"internalType\":\"contract INullifierRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"providerHashes\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_removeProviderHash\",\"type\":\"string\"}],\"name\":\"removeProviderHash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_removeWitness\",\"type\":\"address\"}],\"name\":\"removeWitness\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"provider\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"parameters\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"context\",\"type\":\"string\"}],\"internalType\":\"struct Claims.ClaimInfo\",\"name\":\"claimInfo\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"identifier\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampS\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"internalType\":\"struct Claims.CompleteClaimData\",\"name\":\"claim\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"internalType\":\"struct Claims.SignedClaim\",\"name\":\"signedClaim\",\"type\":\"tuple\"}],\"internalType\":\"struct IProxyBaseProcessor.Proof\",\"name\":\"proof\",\"type\":\"tuple\"}],\"name\":\"verifyProofSignatures\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"provider\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"parameters\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"context\",\"type\":\"string\"}],\"internalType\":\"struct Claims.ClaimInfo\",\"name\":\"claimInfo\",\"type\":\"tuple\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"identifier\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"timestampS\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"internalType\":\"struct Claims.CompleteClaimData\",\"name\":\"claim\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"signatures\",\"type\":\"bytes[]\"}],\"internalType\":\"struct Claims.SignedClaim\",\"name\":\"signedClaim\",\"type\":\"tuple\"}],\"internalType\":\"struct IProxyBaseProcessor.Proof[]\",\"name\":\"_proofs\",\"type\":\"tuple[]\"}],\"name\":\"verifyProofs\",\"outputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"expiryTime\",\"type\":\"uint256\"}],\"internalType\":\"struct IVerifyDomainProcessor.DomainRaw[]\",\"name\":\"domains\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"witnesses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"addProviderHash(string)\":{\"params\":{\"_newProviderHash\":\"New provider hash to be added\"}},\"addWitness(address)\":{\"params\":{\"_newWitness\":\"Address of the new witness\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"removeProviderHash(string)\":{\"params\":{\"_removeProviderHash\":\"Provider hash to be removed\"}},\"removeWitness(address)\":{\"params\":{\"_removeWitness\":\"Address of witness to be removed\"}},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"verifyProofSignatures(((string,string,string),((bytes32,address,uint32,uint32),bytes[])))\":{\"params\":{\"proof\":\"Proof to be verified\"}},\"verifyProofs(((string,string,string),((bytes32,address,uint32,uint32),bytes[]))[])\":{\"params\":{\"_proofs\":\"Proofs to be verified\"},\"returns\":{\"domains\":\" Array of Domain structs\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addProviderHash(string)\":{\"notice\":\"ONLY OWNER: Add provider hash string. Provider hash must not have been previously added.\"},\"addWitness(address)\":{\"notice\":\"ONLY OWNER: Add witness address. Witness must not have been previously added.\"},\"removeProviderHash(string)\":{\"notice\":\"ONLY OWNER: Remove provider hash string. Provider hash must have been previously added.\"},\"removeWitness(address)\":{\"notice\":\"ONLY OWNER: Remove witness address. Witness must have been previously added.\"},\"verifyProofSignatures(((string,string,string),((bytes32,address,uint32,uint32),bytes[])))\":{\"notice\":\"Verify proof generated by witnesses. Claim is constructed by hashing claimInfo (provider, context, parameters) to get the identifier. And then signing on (identifier, owner, timestamp, epoch) to get claim signature. This function verifies a claim by performing the following checks on the claim - Calculates the hash of the claimInfo and checks if it matches the identifier in the claim - Checks if the signatures are valid and from the witnesses This function reverts if - No signatures are found on the proof - Number of signatures is not equal to the number of witnesses - ClaimInfo hash does not match the identifier in the claim - Signatures are invalid (not from the witnesses) DEV NOTE: This function does NOT validate that the claim provider hash is valid. That is the responsibility of the caller. Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code \"},\"verifyProofs(((string,string,string),((bytes32,address,uint32,uint32),bytes[]))[])\":{\"notice\":\"ONLY REGISTRY: Verifies proofs. Extracts values and formats them into Domain structs.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/VerifyDomainProcessor.sol\":\"VerifyDomainProcessor\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"details\":{\"constantOptimizer\":true,\"cse\":true,\"deduplicate\":true,\"inliner\":true,\"jumpdestRemover\":true,\"orderLiterals\":true,\"peephole\":true,\"yul\":true,\"yulDetails\":{\"optimizerSteps\":\"u:fDnTOc\",\"stackAllocation\":true}},\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby disabling any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xba43b97fba0d32eb4254f6a5a297b39a19a247082a02d6e69349e071e2946218\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n function _contextSuffixLength() internal view virtual returns (uint256) {\\n return 0;\\n }\\n}\\n\",\"keccak256\":\"0xa92e4fa126feb6907daa0513ddd816b2eb91f30a808de54f63c17d0e162c3439\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./math/Math.sol\\\";\\nimport \\\"./math/SignedMath.sol\\\";\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n uint256 length = Math.log10(value) + 1;\\n string memory buffer = new string(length);\\n uint256 ptr;\\n /// @solidity memory-safe-assembly\\n assembly {\\n ptr := add(buffer, add(32, length))\\n }\\n while (true) {\\n ptr--;\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\\n }\\n value /= 10;\\n if (value == 0) break;\\n }\\n return buffer;\\n }\\n }\\n\\n /**\\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\\n */\\n function toString(int256 value) internal pure returns (string memory) {\\n return string(abi.encodePacked(value < 0 ? \\\"-\\\" : \\\"\\\", toString(SignedMath.abs(value))));\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n unchecked {\\n return toHexString(value, Math.log256(value) + 1);\\n }\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n\\n /**\\n * @dev Returns true if the two strings are equal.\\n */\\n function equal(string memory a, string memory b) internal pure returns (bool) {\\n return keccak256(bytes(a)) == keccak256(bytes(b));\\n }\\n}\\n\",\"keccak256\":\"0x3088eb2868e8d13d89d16670b5f8612c4ab9ff8956272837d8e90106c59c14a0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Strings.sol\\\";\\n\\n/**\\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\\n *\\n * These functions can be used to verify that a message was signed by the holder\\n * of the private keys of a given address.\\n */\\nlibrary ECDSA {\\n enum RecoverError {\\n NoError,\\n InvalidSignature,\\n InvalidSignatureLength,\\n InvalidSignatureS,\\n InvalidSignatureV // Deprecated in v4.8\\n }\\n\\n function _throwError(RecoverError error) private pure {\\n if (error == RecoverError.NoError) {\\n return; // no error: do nothing\\n } else if (error == RecoverError.InvalidSignature) {\\n revert(\\\"ECDSA: invalid signature\\\");\\n } else if (error == RecoverError.InvalidSignatureLength) {\\n revert(\\\"ECDSA: invalid signature length\\\");\\n } else if (error == RecoverError.InvalidSignatureS) {\\n revert(\\\"ECDSA: invalid signature 's' value\\\");\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature` or error string. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n *\\n * Documentation for signature generation:\\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n // ecrecover takes the signature parameters, and the only way to get them\\n // currently is to use assembly.\\n /// @solidity memory-safe-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n return tryRecover(hash, v, r, s);\\n } else {\\n return (address(0), RecoverError.InvalidSignatureLength);\\n }\\n }\\n\\n /**\\n * @dev Returns the address that signed a hashed message (`hash`) with\\n * `signature`. This address can then be used for verification purposes.\\n *\\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\\n * this function rejects them by requiring the `s` value to be in the lower\\n * half order, and the `v` value to be either 27 or 28.\\n *\\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\\n * verification to be secure: it is possible to craft signatures that\\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\\n * this is by receiving a hash of the original message (which may otherwise\\n * be too long), and then calling {toEthSignedMessageHash} on it.\\n */\\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, signature);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\\n *\\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\\n uint8 v = uint8((uint256(vs) >> 255) + 27);\\n return tryRecover(hash, v, r, s);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\\n *\\n * _Available since v4.2._\\n */\\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n *\\n * _Available since v4.3._\\n */\\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\\n // the valid range for s in (301): 0 < s < secp256k1n \\u00f7 2 + 1, and for v in (302): v \\u2208 {27, 28}. Most\\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\\n //\\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\\n // these malleable signatures as well.\\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\\n return (address(0), RecoverError.InvalidSignatureS);\\n }\\n\\n // If the signature is valid (and not malleable), return the signer address\\n address signer = ecrecover(hash, v, r, s);\\n if (signer == address(0)) {\\n return (address(0), RecoverError.InvalidSignature);\\n }\\n\\n return (signer, RecoverError.NoError);\\n }\\n\\n /**\\n * @dev Overload of {ECDSA-recover} that receives the `v`,\\n * `r` and `s` signature fields separately.\\n */\\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\\n _throwError(error);\\n return recovered;\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\\n // 32 is the length in bytes of hash,\\n // enforced by the type signature above\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\")\\n mstore(0x1c, hash)\\n message := keccak256(0x00, 0x3c)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Message, created from `s`. This\\n * produces hash corresponding to the one signed with the\\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\\n * JSON-RPC method as part of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19Ethereum Signed Message:\\\\n\\\", Strings.toString(s.length), s));\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Typed Data, created from a\\n * `domainSeparator` and a `structHash`. This produces hash corresponding\\n * to the one signed with the\\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\\n * JSON-RPC method as part of EIP-712.\\n *\\n * See {recover}.\\n */\\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n let ptr := mload(0x40)\\n mstore(ptr, \\\"\\\\x19\\\\x01\\\")\\n mstore(add(ptr, 0x02), domainSeparator)\\n mstore(add(ptr, 0x22), structHash)\\n data := keccak256(ptr, 0x42)\\n }\\n }\\n\\n /**\\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\\n * `validator` and `data` according to the version 0 of EIP-191.\\n *\\n * See {recover}.\\n */\\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(\\\"\\\\x19\\\\x00\\\", validator, data));\\n }\\n}\\n\",\"keccak256\":\"0x809bc3edb4bcbef8263fa616c1b60ee0004b50a8a1bfa164d8f57fd31f520c58\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/Math.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard math utilities missing in the Solidity language.\\n */\\nlibrary Math {\\n enum Rounding {\\n Down, // Toward negative infinity\\n Up, // Toward infinity\\n Zero // Toward zero\\n }\\n\\n /**\\n * @dev Returns the largest of two numbers.\\n */\\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two numbers.\\n */\\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two numbers. The result is rounded towards\\n * zero.\\n */\\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b) / 2 can overflow.\\n return (a & b) + (a ^ b) / 2;\\n }\\n\\n /**\\n * @dev Returns the ceiling of the division of two numbers.\\n *\\n * This differs from standard division with `/` in that it rounds up instead\\n * of rounding down.\\n */\\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\\n // (a + b - 1) / b can overflow on addition, so we distribute.\\n return a == 0 ? 0 : (a - 1) / b + 1;\\n }\\n\\n /**\\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\\n * with further edits by Uniswap Labs also under MIT license.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\\n unchecked {\\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\\n // variables such that product = prod1 * 2^256 + prod0.\\n uint256 prod0; // Least significant 256 bits of the product\\n uint256 prod1; // Most significant 256 bits of the product\\n assembly {\\n let mm := mulmod(x, y, not(0))\\n prod0 := mul(x, y)\\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\\n }\\n\\n // Handle non-overflow cases, 256 by 256 division.\\n if (prod1 == 0) {\\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\\n // The surrounding unchecked block does not change this fact.\\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\\n return prod0 / denominator;\\n }\\n\\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\\n require(denominator > prod1, \\\"Math: mulDiv overflow\\\");\\n\\n ///////////////////////////////////////////////\\n // 512 by 256 division.\\n ///////////////////////////////////////////////\\n\\n // Make division exact by subtracting the remainder from [prod1 prod0].\\n uint256 remainder;\\n assembly {\\n // Compute remainder using mulmod.\\n remainder := mulmod(x, y, denominator)\\n\\n // Subtract 256 bit number from 512 bit number.\\n prod1 := sub(prod1, gt(remainder, prod0))\\n prod0 := sub(prod0, remainder)\\n }\\n\\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\\n // See https://cs.stackexchange.com/q/138556/92363.\\n\\n // Does not overflow because the denominator cannot be zero at this stage in the function.\\n uint256 twos = denominator & (~denominator + 1);\\n assembly {\\n // Divide denominator by twos.\\n denominator := div(denominator, twos)\\n\\n // Divide [prod1 prod0] by twos.\\n prod0 := div(prod0, twos)\\n\\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\\n twos := add(div(sub(0, twos), twos), 1)\\n }\\n\\n // Shift in bits from prod1 into prod0.\\n prod0 |= prod1 * twos;\\n\\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\\n // four bits. That is, denominator * inv = 1 mod 2^4.\\n uint256 inverse = (3 * denominator) ^ 2;\\n\\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\\n // in modular arithmetic, doubling the correct bits in each step.\\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\\n\\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\\n // is no longer required.\\n result = prod0 * inverse;\\n return result;\\n }\\n }\\n\\n /**\\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\\n */\\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\\n uint256 result = mulDiv(x, y, denominator);\\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\\n result += 1;\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\\n *\\n * Inspired by Henry S. Warren, Jr.'s \\\"Hacker's Delight\\\" (Chapter 11).\\n */\\n function sqrt(uint256 a) internal pure returns (uint256) {\\n if (a == 0) {\\n return 0;\\n }\\n\\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\\n //\\n // We know that the \\\"msb\\\" (most significant bit) of our target number `a` is a power of 2 such that we have\\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\\n //\\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\\n // \\u2192 `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\\n // \\u2192 `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\\n //\\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\\n uint256 result = 1 << (log2(a) >> 1);\\n\\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\\n // into the expected uint128 result.\\n unchecked {\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n result = (result + a / result) >> 1;\\n return min(result, a / result);\\n }\\n }\\n\\n /**\\n * @notice Calculates sqrt(a), following the selected rounding direction.\\n */\\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = sqrt(a);\\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 2, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 128;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 64;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 32;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 16;\\n }\\n if (value >> 8 > 0) {\\n value >>= 8;\\n result += 8;\\n }\\n if (value >> 4 > 0) {\\n value >>= 4;\\n result += 4;\\n }\\n if (value >> 2 > 0) {\\n value >>= 2;\\n result += 2;\\n }\\n if (value >> 1 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log2(value);\\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 10, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >= 10 ** 64) {\\n value /= 10 ** 64;\\n result += 64;\\n }\\n if (value >= 10 ** 32) {\\n value /= 10 ** 32;\\n result += 32;\\n }\\n if (value >= 10 ** 16) {\\n value /= 10 ** 16;\\n result += 16;\\n }\\n if (value >= 10 ** 8) {\\n value /= 10 ** 8;\\n result += 8;\\n }\\n if (value >= 10 ** 4) {\\n value /= 10 ** 4;\\n result += 4;\\n }\\n if (value >= 10 ** 2) {\\n value /= 10 ** 2;\\n result += 2;\\n }\\n if (value >= 10 ** 1) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log10(value);\\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\\n }\\n }\\n\\n /**\\n * @dev Return the log in base 256, rounded down, of a positive value.\\n * Returns 0 if given 0.\\n *\\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\\n */\\n function log256(uint256 value) internal pure returns (uint256) {\\n uint256 result = 0;\\n unchecked {\\n if (value >> 128 > 0) {\\n value >>= 128;\\n result += 16;\\n }\\n if (value >> 64 > 0) {\\n value >>= 64;\\n result += 8;\\n }\\n if (value >> 32 > 0) {\\n value >>= 32;\\n result += 4;\\n }\\n if (value >> 16 > 0) {\\n value >>= 16;\\n result += 2;\\n }\\n if (value >> 8 > 0) {\\n result += 1;\\n }\\n }\\n return result;\\n }\\n\\n /**\\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\\n * Returns 0 if given 0.\\n */\\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\\n unchecked {\\n uint256 result = log256(value);\\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xe4455ac1eb7fc497bb7402579e7b4d64d928b846fce7d2b6fde06d366f21c2b3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/math/SignedMath.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Standard signed math utilities missing in the Solidity language.\\n */\\nlibrary SignedMath {\\n /**\\n * @dev Returns the largest of two signed numbers.\\n */\\n function max(int256 a, int256 b) internal pure returns (int256) {\\n return a > b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the smallest of two signed numbers.\\n */\\n function min(int256 a, int256 b) internal pure returns (int256) {\\n return a < b ? a : b;\\n }\\n\\n /**\\n * @dev Returns the average of two signed numbers without overflow.\\n * The result is rounded towards zero.\\n */\\n function average(int256 a, int256 b) internal pure returns (int256) {\\n // Formula from the book \\\"Hacker's Delight\\\"\\n int256 x = (a & b) + ((a ^ b) >> 1);\\n return x + (int256(uint256(x) >> 255) & (a ^ b));\\n }\\n\\n /**\\n * @dev Returns the absolute unsigned value of a signed value.\\n */\\n function abs(int256 n) internal pure returns (uint256) {\\n unchecked {\\n // must be unchecked in order to support `n = type(int256).min`\\n return uint256(n >= 0 ? n : -n);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf92515413956f529d95977adc9b0567d583c6203fc31ab1c23824c35187e3ddc\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\\\";\\nimport \\\"./StringUtils.sol\\\";\\n\\n/**\\n * Library to assist with requesting,\\n * serialising & verifying credentials\\n */\\nlibrary Claims {\\n\\t/** Data required to describe a claim */\\n\\tstruct CompleteClaimData {\\n\\t\\tbytes32 identifier;\\n\\t\\taddress owner;\\n\\t\\tuint32 timestampS;\\n\\t\\tuint32 epoch;\\n\\t}\\n\\n\\tstruct ClaimInfo {\\n\\t\\tstring provider;\\n\\t\\tstring parameters;\\n\\t\\tstring context;\\n\\t}\\n\\n\\t/** Claim with signatures & signer */\\n\\tstruct SignedClaim {\\n\\t\\tCompleteClaimData claim;\\n\\t\\tbytes[] signatures;\\n\\t}\\n\\n\\t/**\\n\\t * Asserts that the claim is signed by the expected witnesses\\n\\t */\\n\\tfunction assertValidSignedClaim(\\n\\t\\tSignedClaim memory self,\\n\\t\\taddress[] memory expectedWitnessAddresses\\n\\t) internal pure {\\n\\t\\trequire(self.signatures.length > 0, \\\"No signatures\\\");\\n\\t\\taddress[] memory signedWitnesses = recoverSignersOfSignedClaim(self);\\n\\t\\tfor (uint256 i = 0; i < expectedWitnessAddresses.length; i++) {\\n\\t\\t\\tbool found = false;\\n\\t\\t\\tfor (uint256 j = 0; j < signedWitnesses.length; j++) {\\n\\t\\t\\t\\tif (signedWitnesses[j] == expectedWitnessAddresses[i]) {\\n\\t\\t\\t\\t\\tfound = true;\\n\\t\\t\\t\\t\\tbreak;\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\trequire(found, \\\"Missing witness signature\\\");\\n\\t\\t}\\n\\t}\\n\\n\\t/**\\n\\t * @dev recovers the signer of the claim\\n\\t */\\n\\tfunction recoverSignersOfSignedClaim(\\n\\t\\tSignedClaim memory self\\n\\t) internal pure returns (address[] memory) {\\n\\t\\tbytes memory serialised = serialise(self.claim);\\n\\t\\taddress[] memory signers = new address[](self.signatures.length);\\n\\t\\tfor (uint256 i = 0; i < self.signatures.length; i++) {\\n\\t\\t\\tsigners[i] = verifySignature(serialised, self.signatures[i]);\\n\\t\\t}\\n\\n\\t\\treturn signers;\\n\\t}\\n\\n\\t/**\\n\\t * @dev serialises the credential into a string;\\n\\t * the string is used to verify the signature\\n\\t *\\n\\t * the serialisation is the same as done by the TS library\\n\\t */\\n\\tfunction serialise(\\n\\t\\tCompleteClaimData memory self\\n\\t) internal pure returns (bytes memory) {\\n\\t\\treturn\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\tStringUtils.bytes2str(abi.encodePacked(self.identifier)),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.address2str(self.owner),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.timestampS),\\n\\t\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(self.epoch)\\n\\t\\t\\t);\\n\\t}\\n\\n\\t/**\\n\\t * @dev returns the address of the user that generated the signature\\n\\t */\\n\\tfunction verifySignature(\\n\\t\\tbytes memory content,\\n\\t\\tbytes memory signature\\n\\t) internal pure returns (address signer) {\\n\\t\\tbytes32 signedHash = keccak256(\\n\\t\\t\\tabi.encodePacked(\\n\\t\\t\\t\\t\\\"\\\\x19Ethereum Signed Message:\\\\n\\\",\\n\\t\\t\\t\\tStringUtils.uint2str(content.length),\\n\\t\\t\\t\\tcontent\\n\\t\\t\\t)\\n\\t\\t);\\n\\t\\treturn ECDSA.recover(signedHash, signature);\\n\\t}\\n\\n\\tfunction hashClaimInfo(ClaimInfo memory claimInfo) internal pure returns (bytes32) {\\n\\t\\tbytes memory serialised = abi.encodePacked(\\n\\t\\t\\tclaimInfo.provider,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.parameters,\\n\\t\\t\\t\\\"\\\\n\\\",\\n\\t\\t\\tclaimInfo.context\\n\\t\\t);\\n\\t\\treturn keccak256(serialised);\\n\\t}\\n}\\n\",\"keccak256\":\"0x87a41e75d358e86798456ad45e03446cde8f1519c8af17905f6c8b852a5f2da7\",\"license\":\"MIT\"},\"@reclaimprotocol/verifier-solidity-sdk/contracts/StringUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/**\\n * Utilities for string manipulation & conversion\\n */\\nlibrary StringUtils {\\n\\tfunction address2str(address x) internal pure returns (string memory) {\\n\\t\\tbytes memory s = new bytes(40);\\n\\t\\tfor (uint i = 0; i < 20; i++) {\\n\\t\\t\\tbytes1 b = bytes1(uint8(uint(uint160(x)) / (2 ** (8 * (19 - i)))));\\n\\t\\t\\tbytes1 hi = bytes1(uint8(b) / 16);\\n\\t\\t\\tbytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));\\n\\t\\t\\ts[2 * i] = getChar(hi);\\n\\t\\t\\ts[2 * i + 1] = getChar(lo);\\n\\t\\t}\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", s));\\n\\t}\\n\\n\\tfunction bytes2str(bytes memory buffer) internal pure returns (string memory) {\\n\\t\\t// Fixed buffer size for hexadecimal convertion\\n\\t\\tbytes memory converted = new bytes(buffer.length * 2);\\n\\t\\tbytes memory _base = \\\"0123456789abcdef\\\";\\n\\n\\t\\tfor (uint256 i = 0; i < buffer.length; i++) {\\n\\t\\t\\tconverted[i * 2] = _base[uint8(buffer[i]) / _base.length];\\n\\t\\t\\tconverted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length];\\n\\t\\t}\\n\\n\\t\\treturn string(abi.encodePacked(\\\"0x\\\", converted));\\n\\t}\\n\\n\\tfunction getChar(bytes1 b) internal pure returns (bytes1 c) {\\n\\t\\tif (uint8(b) < 10) return bytes1(uint8(b) + 0x30);\\n\\t\\telse return bytes1(uint8(b) + 0x57);\\n\\t}\\n\\n\\tfunction bool2str(bool _b) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_b) {\\n\\t\\t\\treturn \\\"true\\\";\\n\\t\\t} else {\\n\\t\\t\\treturn \\\"false\\\";\\n\\t\\t}\\n\\t}\\n\\n\\tfunction uint2str(uint _i) internal pure returns (string memory _uintAsString) {\\n\\t\\tif (_i == 0) {\\n\\t\\t\\treturn \\\"0\\\";\\n\\t\\t}\\n\\t\\tuint j = _i;\\n\\t\\tuint len;\\n\\t\\twhile (j != 0) {\\n\\t\\t\\tlen++;\\n\\t\\t\\tj /= 10;\\n\\t\\t}\\n\\t\\tbytes memory bstr = new bytes(len);\\n\\t\\tuint k = len;\\n\\t\\twhile (_i != 0) {\\n\\t\\t\\tk = k - 1;\\n\\t\\t\\tuint8 temp = (48 + uint8(_i - (_i / 10) * 10));\\n\\t\\t\\tbytes1 b1 = bytes1(temp);\\n\\t\\t\\tbstr[k] = b1;\\n\\t\\t\\t_i /= 10;\\n\\t\\t}\\n\\t\\treturn string(bstr);\\n\\t}\\n\\n\\tfunction areEqual(\\n\\t\\tstring calldata _a,\\n\\t\\tstring storage _b\\n\\t) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction areEqual(string memory _a, string memory _b) internal pure returns (bool) {\\n\\t\\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\\n\\t}\\n\\n\\tfunction toLower(string memory str) internal pure returns (string memory) {\\n\\t\\tbytes memory bStr = bytes(str);\\n\\t\\tbytes memory bLower = new bytes(bStr.length);\\n\\t\\tfor (uint i = 0; i < bStr.length; i++) {\\n\\t\\t\\t// Uppercase character...\\n\\t\\t\\tif ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {\\n\\t\\t\\t\\t// So we add 32 to make it lowercase\\n\\t\\t\\t\\tbLower[i] = bytes1(uint8(bStr[i]) + 32);\\n\\t\\t\\t} else {\\n\\t\\t\\t\\tbLower[i] = bStr[i];\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\treturn string(bLower);\\n\\t}\\n\\n\\tfunction substring(\\n\\t\\tstring memory str,\\n\\t\\tuint startIndex,\\n\\t\\tuint endIndex\\n\\t) internal pure returns (string memory) {\\n\\t\\tbytes memory strBytes = bytes(str);\\n\\t\\tbytes memory result = new bytes(endIndex - startIndex);\\n\\t\\tfor (uint i = startIndex; i < endIndex; i++) {\\n\\t\\t\\tresult[i - startIndex] = strBytes[i];\\n\\t\\t}\\n\\t\\treturn string(result);\\n\\t}\\n}\\n\",\"keccak256\":\"0x15feebafef16d4c74c043b39e652ddae0e121987ceca74b663f6a2d2d7ba8b4b\",\"license\":\"MIT\"},\"contracts/VerifyDomainProcessor.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\nimport { ClaimVerifier } from \\\"./external/ClaimVerifier.sol\\\";\\nimport { INullifierRegistry } from \\\"./external/interfaces/INullifierRegistry.sol\\\";\\nimport { ProxyBaseProcessor } from \\\"./external/processors/ProxyBaseProcessor.sol\\\";\\nimport { StringConversionUtils } from \\\"./external/lib/StringConversionUtils.sol\\\";\\nimport { TicketmasterDataParsing } from \\\"./external/TicketmasterDataParsing.sol\\\";\\n\\nimport { IVerifyDomainProcessor } from \\\"./interfaces/IVerifyDomainProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\n\\ncontract VerifyDomainProcessor is IVerifyDomainProcessor, ProxyBaseProcessor {\\n\\n using StringConversionUtils for string;\\n\\n /* ============ Constants ============ */\\n uint8 constant MAX_EXTRACT_VALUES = 5;\\n\\n /* ============ State Variables ============ */\\n address public immutable registry;\\n\\n /* ============ Constructor ============ */\\n constructor(\\n address _registry,\\n INullifierRegistry _nullifierRegistry,\\n string[] memory _providerHashes\\n ) \\n ProxyBaseProcessor(_nullifierRegistry, _providerHashes)\\n {\\n registry = _registry;\\n }\\n\\n /* ============ External Functions ============ */\\n\\n /**\\n * ONLY REGISTRY: Verifies proofs. Extracts values and formats them into Domain structs.\\n *\\n * @param _proofs Proofs to be verified\\n * @return domains Array of Domain structs\\n */\\n function verifyProofs(\\n Proof[] memory _proofs\\n ) \\n external \\n override\\n returns (DomainRaw[] memory domains)\\n {\\n require(msg.sender == registry, \\\"Only registry can call\\\");\\n\\n domains = new DomainRaw[](_proofs.length);\\n\\n for (uint256 i = 0; i < _proofs.length; i++) {\\n Proof memory proof = _proofs[i];\\n\\n verifyProofSignatures(proof);\\n\\n (\\n string memory domainName,\\n string memory expiryTimeStr,\\n string memory providerHash\\n ) = _extractValues(proof);\\n\\n // Check provider hash\\n require(_validateProviderHash(providerHash), \\\"No valid providerHash\\\");\\n\\n _validateAndAddNullifier(proof.signedClaim.signatures);\\n\\n domains[i] = DomainRaw({\\n name: domainName,\\n // The TicketmasterDataParsing library's date parsing logic is pretty generic, and works for domain \\n // expiry dates as well. Similar to Ticketmaster dates, the expiry time is of the format \\\"YYYY-MM-DDTHH:MM:SS\\\"\\n // and returns UTC timestamps.\\n expiryTime: TicketmasterDataParsing._dateStringToTimestamp(expiryTimeStr)\\n });\\n }\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n /**\\n * Extracts all values from the proof context.\\n *\\n * @param _proof The proof containing the context to extract values from.\\n */\\n function _extractValues(Proof memory _proof) internal pure returns (\\n string memory domainName,\\n string memory expiryTime,\\n string memory providerHash\\n ) {\\n string[] memory values = ClaimVerifier.extractAllFromContext(\\n _proof.claimInfo.context, \\n MAX_EXTRACT_VALUES, \\n true\\n );\\n\\n return (\\n values[0], // domainName\\n values[1], // expiryTime\\n values[2] // providerHash\\n );\\n }\\n}\\n\",\"keccak256\":\"0x34c84f99070a4b76cca1d63b5d8eee8edd8a0e98ace63cca4681d71327f4c18a\",\"license\":\"MIT\"},\"contracts/external/ClaimVerifier.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Claims } from \\\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\nlibrary ClaimVerifier {\\n\\n /**\\n * Find the end index of target string in the data string. Returns the end index + 1 if\\n * the target string in the data string if found. Returns type(uint256).max if:\\n * - Target is longer than data\\n * - Target is not found\\n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\\n */\\n function findSubstringEndIndex(\\n string memory data,\\n string memory target\\n ) public pure returns (uint256) {\\n bytes memory dataBytes = bytes(data);\\n bytes memory targetBytes = bytes(target);\\n\\n if (dataBytes.length < targetBytes.length) {\\n return type(uint256).max;\\n }\\n\\n // Find start of target\\n for (uint i = 0; i <= dataBytes.length - targetBytes.length; i++) {\\n bool isMatch = true;\\n\\n for (uint j = 0; j < targetBytes.length && isMatch; j++) {\\n if (dataBytes[i + j] != targetBytes[j]) {\\n isMatch = false;\\n break;\\n }\\n }\\n\\n if (isMatch) {\\n return i + targetBytes.length; // Return end index + 1\\n }\\n }\\n\\n return type(uint256).max;\\n }\\n\\n /**\\n * Extracts given target field value from context in claims. Extracts only ONE value.\\n * Pass prefix formatted with quotes, for example '\\\"providerHash\\\\\\\":\\\\\\\"'\\n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\\n *\\n * @param data Context string from which target value needs to be extracted\\n * @param prefix Prefix of the target value that needs to be extracted \\n */\\n function extractFieldFromContext(\\n string memory data,\\n string memory prefix\\n ) public pure returns (string memory) {\\n // Find end index of prefix; which is the start index of the value\\n uint256 start = findSubstringEndIndex(data, prefix);\\n\\n bytes memory dataBytes = bytes(data);\\n if (start == dataBytes.length) {\\n return \\\"\\\"; // Prefix not found. Malformed or missing message\\n }\\n \\n // Find the end of the VALUE, assuming it ends with a quote not preceded by a backslash\\n uint256 end = start;\\n while (\\n end < dataBytes.length &&\\n !(dataBytes[end] == '\\\"' && dataBytes[end - 1] != \\\"\\\\\\\\\\\")\\n ) {\\n end++;\\n }\\n if (end <= start) {\\n return \\\"\\\"; // Malformed or missing message\\n }\\n bytes memory contextMessage = new bytes(end - start);\\n for (uint i = start; i < end; i++) {\\n contextMessage[i - start] = dataBytes[i];\\n }\\n return string(contextMessage);\\n }\\n\\n\\n /**\\n * Extracts ALL values from context in a single pass. Context is stored as serialized JSON string with \\n * two keys: extractedParameters and providerHash. ExtractedParameters itself is a JSON string with \\n * key-value pairs. This function returns extracted individual values from extractedParameters along \\n * with providerHash (if extractProviderHash is true). Use maxValues to limit the number of expected values\\n * to be extracted from extractedParameters. In most cases, one would need to extract all values from\\n * extractedParameters and providerHash, hence use this function over calling extractFieldFromContext \\n * multiple times.\\n * \\n * @param data Context string from which target value needs to be extracted\\n * @param maxValues Maximum number of values to be extracted from extractedParameters\\n * @param extractProviderHash Extracts and returns providerHash if true\\n */\\n function extractAllFromContext(\\n string memory data,\\n uint8 maxValues,\\n bool extractProviderHash\\n ) public pure returns (string[] memory) {\\n \\n require(maxValues > 0, \\\"Max values must be greater than 0\\\");\\n\\n bytes memory dataBytes = bytes(data);\\n uint index = 0;\\n\\n bytes memory extractedParametersBytes = bytes('{\\\\\\\"extractedParameters\\\\\\\":{\\\\\\\"');\\n for (uint i = 0; i < extractedParametersBytes.length; i++) {\\n require(dataBytes[index + i] == extractedParametersBytes[i], \\\"Extraction failed. Malformed extractedParameters\\\");\\n }\\n index += extractedParametersBytes.length;\\n\\n bool isValue = false; // starts with a key right after '{\\\\\\\"extractedParameters\\\\\\\":{\\\\\\\"'\\n uint valuesFound = 0;\\n \\n uint[] memory valueIndices = new uint[](extractProviderHash ? 2 * (maxValues + 1): 2 * maxValues);\\n\\n while (\\n index < dataBytes.length\\n ) {\\n // Keep incrementing until '\\\"', escaped quotes are not considered\\n if (!(dataBytes[index] == '\\\"' && dataBytes[index - 1] != \\\"\\\\\\\\\\\")) {\\n index++;\\n continue;\\n }\\n\\n if (!isValue) {\\n // \\\\\\\":\\\\\\\" (3 chars)\\n require(dataBytes[index + 1] == \\\":\\\" && dataBytes[index + 2] == '\\\\\\\"', \\\"Extraction failed. Malformed data 1\\\");\\n index += 3; // move it after \\\\\\\"\\n isValue = true;\\n valueIndices[2 * valuesFound] = index; // start index\\n } else {\\n // \\\\\\\",\\\\\\\" (3 chars) or \\\\\\\"}, (3 chars)\\n // \\\\\\\"}} is not supported, there should always be a providerHash\\n require(\\n dataBytes[index + 1] == \\\",\\\" && dataBytes[index + 2] == '\\\\\\\"' || \\n dataBytes[index + 1] == '}' && dataBytes[index + 2] == \\\",\\\",\\n \\\"Extraction failed. Malformed data 2\\\"\\n );\\n valueIndices[2 * valuesFound + 1] = index; // end index\\n valuesFound++;\\n\\n if (dataBytes[index + 1] == \\\",\\\") {\\n // Revert if valuesFound == maxValues and next char is a comma as there will be more values\\n require(valuesFound != maxValues, \\\"Extraction failed. Exceeded max values\\\");\\n index += 3;\\n isValue = false;\\n } else { // index + 1 = \\\"}\\\"\\n index += 3;\\n break; // end of extractedParameters\\n }\\n }\\n }\\n\\n if (extractProviderHash) {\\n bytes memory providerHashParamBytes = bytes(\\\"\\\\\\\"providerHash\\\\\\\":\\\\\\\"\\\");\\n for (uint i = 0; i < providerHashParamBytes.length; i++) {\\n require(dataBytes[index + i] == providerHashParamBytes[i], \\\"Extraction failed. Malformed providerHash\\\");\\n }\\n index += providerHashParamBytes.length;\\n \\n // final indices tuple in valueIndices will be for star and end indices of provider hash\\n valueIndices[2 * valuesFound] = index;\\n // Keep incrementing until '\\\"'\\n while (\\n index < dataBytes.length && dataBytes[index] != '\\\"'\\n ) {\\n index++;\\n }\\n valueIndices[2 * valuesFound + 1] = index;\\n valuesFound++;\\n } \\n \\n string[] memory values = new string[](valuesFound);\\n \\n for (uint i = 0; i < valuesFound; i++) {\\n uint startIndex = valueIndices[2 * i];\\n uint endIndex = valueIndices[2 * i + 1];\\n bytes memory contextValue = new bytes(endIndex - startIndex);\\n for (uint j = startIndex; j < endIndex; j++) {\\n contextValue[j - startIndex] = dataBytes[j];\\n }\\n values[i] = string(contextValue);\\n }\\n\\n return values;\\n }\\n}\\n\",\"keccak256\":\"0xac6a8d456c3b2c5ab5a475279a2f0f103faff3cb2d6abb2ce2029cd4265b904e\",\"license\":\"MIT\"},\"contracts/external/TicketmasterDataParsing.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { DateTime } from \\\"./lib/DateTime.sol\\\";\\n\\nimport { StringConversionUtils } from \\\"./lib/StringConversionUtils.sol\\\";\\nimport { ClaimVerifier } from \\\"./ClaimVerifier.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\nlibrary TicketmasterDataParsing {\\n \\n using StringConversionUtils for string;\\n\\n /**\\n * @notice Iterates through every character in the date string and splits the string at each dash, \\\"T\\\", or colon. Function will revert\\n * if there are not 6 substrings formed from the split. The substrings are then converted to uints and passed to the DateTime lib\\n * to get the unix timestamp. This function is SPECIFIC TO THE DATE FORMAT USED BY Ticketmaster, not suitable for use with other date\\n * formats. Ticketmaster date format is: \\\"YYYY-MM-DDTHH:MM:SS\\\" and returns UTC timestamps.\\n *\\n * @param _dateString Date string to be converted to a UTC timestamp\\n */\\n function _dateStringToTimestamp(string memory _dateString) internal pure returns (uint256 utcTimestamp) {\\n string[6] memory extractedStrings;\\n uint256 breakCounter;\\n uint256 lastBreak;\\n for (uint256 i = 0; i < bytes(_dateString).length; i++) {\\n if (bytes(_dateString)[i] == 0x2d || bytes(_dateString)[i] == 0x3a || bytes(_dateString)[i] == 0x54) {\\n extractedStrings[breakCounter] = _dateString.substring(lastBreak, i);\\n lastBreak = i + 1;\\n breakCounter++;\\n }\\n }\\n // Add last substring to array\\n extractedStrings[breakCounter] = _dateString.substring(lastBreak, bytes(_dateString).length);\\n\\n // Check that exactly 6 substrings were found (string is split at 5 different places)\\n require(breakCounter == 5, \\\"Invalid date string\\\");\\n\\n utcTimestamp = DateTime.timestampFromDateTime(\\n extractedStrings[0].stringToUint(0), // year\\n extractedStrings[1].stringToUint(0), // month\\n extractedStrings[2].stringToUint(0), // day\\n extractedStrings[3].stringToUint(0), // hour\\n extractedStrings[4].stringToUint(0), // minute\\n 0 // we don't need to the second granularity\\n );\\n }\\n\\n /**\\n * Extract event ID from URL by finding the last slash and taking the substring after it. We assume the\\n * URL is formulated something like: {domainRoot}/.../event/EVENT_ID\\n *\\n * @param _url URL to extract event ID from\\n * @return Event ID extracted from URL\\n */\\n function _extractEventIdFromUrl(string memory _url) internal pure returns (string memory) {\\n string memory prefix = \\\"event/\\\";\\n bytes memory urlBytes = bytes(_url);\\n uint256 urlLength = urlBytes.length;\\n\\n uint256 startIndex = ClaimVerifier.findSubstringEndIndex(_url, prefix);\\n // If the start index is the max value or the URL length, then the event ID was not found\\n if (startIndex == type(uint256).max || startIndex == urlLength) {\\n revert(\\\"Event ID not found in URL\\\");\\n }\\n\\n bytes memory contextMessage = new bytes(urlLength - startIndex);\\n for (uint i = startIndex; i < urlLength; i++) {\\n contextMessage[i - startIndex] = urlBytes[i];\\n }\\n return string(contextMessage);\\n }\\n\\n /**\\n * Parse tickets out of a ticket string of the format: '[\\\"ticket1\\\", \\\"ticket2\\\", \\\"ticket3\\\"]'.\\n * We start by getting the number of tickets in a string by counting the number of commas and adding 1.\\n * Then we iterate through the string and find the ticket IDs by looking for the quotes. We need to extract\\n * from quote to quote so we look for all even-numbered quotes then extract the string between that and the\\n * previous quote index.\\n *\\n * @param _ticketString Stringified array of tickets\\n */\\n function _parseTicketString(string memory _ticketString) internal pure returns (string[] memory ticketIds) {\\n // Assume there is at least one ticket (which means array would not have a comma)\\n // If there is no ticket then the transaction will end up reverting\\n uint256 ticketCount = 1;\\n for (uint256 i = 0; i < bytes(_ticketString).length; i++) {\\n if (bytes(_ticketString)[i] == 0x2C) {\\n ticketCount++;\\n }\\n }\\n\\n ticketIds = new string[](ticketCount);\\n uint256 breakCounter;\\n uint256 lastBreak;\\n for (uint256 i = 0; i < bytes(_ticketString).length; i++) {\\n if (bytes(_ticketString)[i] == 0x22) {\\n breakCounter++;\\n if (breakCounter % 2 == 0) {\\n ticketIds[(breakCounter/2)-1] = _ticketString.substring(lastBreak, i-1);\\n }\\n lastBreak = i + 1;\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x23a87b78bf72170f5e0cee6e4a8c59f68947c50971e00d183580ebe473a148c2\",\"license\":\"MIT\"},\"contracts/external/interfaces/INullifierRegistry.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\ninterface INullifierRegistry {\\n function addNullifier(bytes32 _nullifier) external;\\n function isNullified(bytes32 _nullifier) external view returns(bool);\\n}\\n\",\"keccak256\":\"0x107164bc9a320938b513305878163b7fa884da4cdae58d0c8e81bfbb00c97c5e\",\"license\":\"MIT\"},\"contracts/external/interfaces/IProxyBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\nimport { Claims } from \\\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IProxyBaseProcessor {\\n \\n struct Proof {\\n Claims.ClaimInfo claimInfo;\\n Claims.SignedClaim signedClaim;\\n }\\n}\\n\",\"keccak256\":\"0x65aa00301110dfdf8333bd9bb71ebad241d66ea5840a2db3ac6d4f6037083cb8\",\"license\":\"MIT\"},\"contracts/external/lib/AddressArrayUtils.sol\":{\"content\":\"/*\\n Copyright 2020 Set Labs Inc.\\n\\n Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n you may not use this file except in compliance with the License.\\n You may obtain a copy of the License at\\n\\n http://www.apache.org/licenses/LICENSE-2.0\\n\\n Unless required by applicable law or agreed to in writing, software\\n distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n See the License for the specific language governing permissions and\\n limitations under the License.\\n\\n SPDX-License-Identifier: MIT\\n*/\\n\\npragma solidity ^0.8.17;\\n\\n/**\\n * @title AddressArrayUtils\\n * @author Set Protocol\\n *\\n * Utility functions to handle Address Arrays\\n *\\n * CHANGELOG:\\n * - 4/21/21: Added validatePairsWithArray methods\\n */\\nlibrary AddressArrayUtils {\\n\\n uint256 constant internal MAX_INT = 2**256 - 1;\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(address[] memory A, address a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (A[i] == a) {\\n return (i, true);\\n }\\n }\\n return (MAX_INT, false);\\n }\\n\\n /**\\n * Returns true if the value is present in the list. Uses indexOf internally.\\n * @param A The input array to search\\n * @param a The value to find\\n * @return Returns isIn for the first occurrence starting from index 0\\n */\\n function contains(address[] memory A, address a) internal pure returns (bool) {\\n (, bool isIn) = indexOf(A, a);\\n return isIn;\\n }\\n\\n /**\\n * Returns true if there are 2 elements that are the same in an array\\n * @param A The input array to search\\n * @return Returns boolean for the first occurrence of a duplicate\\n */\\n function hasDuplicate(address[] memory A) internal pure returns(bool) {\\n require(A.length > 0, \\\"A is empty\\\");\\n\\n for (uint256 i = 0; i < A.length - 1; i++) {\\n address current = A[i];\\n for (uint256 j = i + 1; j < A.length; j++) {\\n if (current == A[j]) {\\n return true;\\n }\\n }\\n }\\n return false;\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n * @return Returns the array with the object removed.\\n */\\n function remove(address[] memory A, address a)\\n internal\\n pure\\n returns (address[] memory)\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n (address[] memory _A,) = pop(A, index);\\n return _A;\\n }\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The address to remove\\n */\\n function removeStorage(address[] storage A, address a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"Address not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n\\n /**\\n * Removes specified index from array\\n * @param A The input array to search\\n * @param index The index to remove\\n * @return Returns the new array and the removed entry\\n */\\n function pop(address[] memory A, uint256 index)\\n internal\\n pure\\n returns (address[] memory, address)\\n {\\n uint256 length = A.length;\\n require(index < A.length, \\\"Index must be < A length\\\");\\n address[] memory newAddresses = new address[](length - 1);\\n for (uint256 i = 0; i < index; i++) {\\n newAddresses[i] = A[i];\\n }\\n for (uint256 j = index + 1; j < length; j++) {\\n newAddresses[j - 1] = A[j];\\n }\\n return (newAddresses, A[index]);\\n }\\n}\\n\",\"keccak256\":\"0x486f1a373f33aa167227600ac2d0bf95b37685413d98a3e745107188f00ae405\",\"license\":\"MIT\"},\"contracts/external/lib/DateTime.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n// ----------------------------------------------------------------------------\\n// DateTime Library v2.0\\n//\\n// A gas-efficient Solidity date and time library\\n//\\n// https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary\\n//\\n// Tested date range 1970/01/01 to 2345/12/31\\n//\\n// Conventions:\\n// Unit | Range | Notes\\n// :-------- |:-------------:|:-----\\n// timestamp | >= 0 | Unix timestamp, number of seconds since 1970/01/01 00:00:00 UTC\\n// year | 1970 ... 2345 |\\n// month | 1 ... 12 |\\n// day | 1 ... 31 |\\n// hour | 0 ... 23 |\\n// minute | 0 ... 59 |\\n// second | 0 ... 59 |\\n// dayOfWeek | 1 ... 7 | 1 = Monday, ..., 7 = Sunday\\n//\\n//\\n// Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018-2019. The MIT Licence.\\n//\\n// NOTE: This library has been pruned to keep only functions needed by zkp2p\\n// ----------------------------------------------------------------------------\\n\\nlibrary DateTime {\\n uint256 constant SECONDS_PER_DAY = 24 * 60 * 60;\\n uint256 constant SECONDS_PER_HOUR = 60 * 60;\\n uint256 constant SECONDS_PER_MINUTE = 60;\\n int256 constant OFFSET19700101 = 2440588;\\n\\n uint256 constant DOW_MON = 1;\\n uint256 constant DOW_TUE = 2;\\n uint256 constant DOW_WED = 3;\\n uint256 constant DOW_THU = 4;\\n uint256 constant DOW_FRI = 5;\\n uint256 constant DOW_SAT = 6;\\n uint256 constant DOW_SUN = 7;\\n\\n // ------------------------------------------------------------------------\\n // Calculate the number of days from 1970/01/01 to year/month/day using\\n // the date conversion algorithm from\\n // http://aa.usno.navy.mil/faq/docs/JD_Formula.php\\n // and subtracting the offset 2440588 so that 1970/01/01 is day 0\\n //\\n // days = day\\n // - 32075\\n // + 1461 * (year + 4800 + (month - 14) / 12) / 4\\n // + 367 * (month - 2 - (month - 14) / 12 * 12) / 12\\n // - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4\\n // - offset\\n // ------------------------------------------------------------------------\\n function _daysFromDate(uint256 year, uint256 month, uint256 day) internal pure returns (uint256 _days) {\\n require(year >= 1970);\\n int256 _year = int256(year);\\n int256 _month = int256(month);\\n int256 _day = int256(day);\\n\\n int256 __days = _day - 32075 + (1461 * (_year + 4800 + (_month - 14) / 12)) / 4\\n + (367 * (_month - 2 - ((_month - 14) / 12) * 12)) / 12\\n - (3 * ((_year + 4900 + (_month - 14) / 12) / 100)) / 4 - OFFSET19700101;\\n\\n _days = uint256(__days);\\n }\\n\\n function timestampFromDateTime(\\n uint256 year,\\n uint256 month,\\n uint256 day,\\n uint256 hour,\\n uint256 minute,\\n uint256 second\\n )\\n internal\\n pure\\n returns (uint256 timestamp)\\n {\\n timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + hour * SECONDS_PER_HOUR\\n + minute * SECONDS_PER_MINUTE + second;\\n }\\n}\\n\",\"keccak256\":\"0x64f6113ad342f8bd3c2eb74fde279401d604faf77dd08f6c16c3912c3519f170\",\"license\":\"MIT\"},\"contracts/external/lib/StringArrayUtils.sol\":{\"content\":\"/*\\n Copyright 2020 Set Labs Inc.\\n\\n Licensed under the Apache License, Version 2.0 (the \\\"License\\\");\\n you may not use this file except in compliance with the License.\\n You may obtain a copy of the License at\\n\\n http://www.apache.org/licenses/LICENSE-2.0\\n\\n Unless required by applicable law or agreed to in writing, software\\n distributed under the License is distributed on an \\\"AS IS\\\" BASIS,\\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\\n See the License for the specific language governing permissions and\\n limitations under the License.\\n\\n SPDX-License-Identifier: Apache-2.0\\n*/\\n\\npragma solidity ^0.8.18;\\n\\n/**\\n * @title StringArrayUtils\\n * @author Set Protocol\\n *\\n * Utility functions to handle String Arrays\\n */\\nlibrary StringArrayUtils {\\n\\n /**\\n * Finds the index of the first occurrence of the given element.\\n * @param A The input string to search\\n * @param a The value to find\\n * @return Returns (index and isIn) for the first occurrence starting from index 0\\n */\\n function indexOf(string[] memory A, string memory a) internal pure returns (uint256, bool) {\\n uint256 length = A.length;\\n for (uint256 i = 0; i < length; i++) {\\n if (keccak256(bytes(A[i])) == keccak256(bytes(a))) {\\n return (i, true);\\n }\\n }\\n return (type(uint256).max, false);\\n }\\n\\n /**\\n * @param A The input array to search\\n * @param a The string to remove\\n */\\n function removeStorage(string[] storage A, string memory a)\\n internal\\n {\\n (uint256 index, bool isIn) = indexOf(A, a);\\n if (!isIn) {\\n revert(\\\"String not in array.\\\");\\n } else {\\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\\n if (index != lastIndex) { A[index] = A[lastIndex]; }\\n A.pop();\\n }\\n }\\n}\",\"keccak256\":\"0x249b6dc922e7e1602f3c2e77075d3b9d259d3badc744241ecf2ca2ee1cbcd56c\",\"license\":\"Apache-2.0\"},\"contracts/external/lib/StringConversionUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.18;\\n\\n// Building on zk-email's StringUtils library we add the ability to handle decimals when\\n// converting from string to Uint\\nlibrary StringConversionUtils {\\n \\n /**\\n * @notice Function that parses numbers returned as strings including floating point numbers. Returned floating point\\n * numbers are to have the desired amount of decimal specified. If the stringified version of the floating point\\n * number has more decimal places than desired then the function will revert in order to be maximally safe. If\\n * the returned number has multiple floating points then the function will revert.\\n *\\n * Examples: _s = \\\"12.34\\\", _expectedDecimals = 6 => 12340000\\n * _s = \\\"12.34\\\", _expectedDecimals = 2 => 1234\\n * _s = \\\"12.34\\\", _expectedDecimals = 1 => REVERT (we never want loss of precision only addition)\\n * _s = \\\"12.34.56\\\", _expectedDecimals = 6 => REVERT (Invalid number)\\n *\\n * @param _s String being processed\\n * @param _desiredDecimals Desired amount of decimal places\\n */\\n function stringToUint(string memory _s, uint256 _desiredDecimals) internal pure returns (uint256) {\\n return stringToUint(_s, 0x2E, _desiredDecimals);\\n }\\n\\n function stringToUint(\\n string memory _s,\\n bytes1 _decimalCharacter,\\n uint256 _desiredDecimals\\n )\\n internal\\n pure\\n returns (uint256)\\n {\\n bytes memory b = bytes(_s);\\n\\n uint256 result = 0;\\n uint256 decimalPlaces = 0;\\n\\n bool decimals = false;\\n for (uint256 i = 0; i < b.length; i++) {\\n if (b[i] >= 0x30 && b[i] <= 0x39) {\\n result = result * 10 + (uint256(uint8(b[i])) - 48);\\n }\\n\\n if (decimals) {\\n decimalPlaces++;\\n }\\n\\n if (b[i] == _decimalCharacter) {\\n require(decimals == false, \\\"String has multiple decimals\\\");\\n decimals = true;\\n }\\n }\\n\\n require(decimalPlaces <= _desiredDecimals, \\\"String has too many decimal places\\\");\\n return result * (10 ** (_desiredDecimals - decimalPlaces));\\n }\\n\\n /**\\n * @notice Function that returns a substring from _startIndex to _endIndex (non-inclusive).\\n *\\n * @param _str String being processed\\n * @param _startIndex Index to start parsing from\\n * @param _endIndex Index to stop parsing at (index not included in result)\\n */\\n function substring(string memory _str, uint _startIndex, uint _endIndex) internal pure returns (string memory ) {\\n bytes memory strBytes = bytes(_str);\\n bytes memory result = new bytes(_endIndex-_startIndex);\\n for(uint i = _startIndex; i < _endIndex; i++) {\\n result[i-_startIndex] = strBytes[i];\\n }\\n return string(result);\\n }\\n\\n function replaceString(\\n string memory _str,\\n string memory _lookupValue,\\n string memory _replaceValue\\n )\\n internal\\n pure\\n returns (string memory)\\n {\\n bytes memory strBytes = bytes(_str);\\n bytes memory lookupBytes = bytes(_lookupValue);\\n\\n uint256 lookupIndex = indexOf(_str, _lookupValue);\\n if (lookupIndex == type(uint256).max) {\\n return _str;\\n }\\n\\n // Split the original string into two parts: before and after the keyword\\n string memory beforeKeyword = substring(_str, 0, lookupIndex);\\n string memory afterKeyword = substring(_str, lookupIndex + lookupBytes.length, strBytes.length);\\n \\n return string.concat(beforeKeyword, _replaceValue, afterKeyword);\\n }\\n\\n function indexOf(string memory str, string memory substr) internal pure returns (uint) {\\n bytes memory strBytes = bytes(str);\\n bytes memory substrBytes = bytes(substr);\\n \\n if (strBytes.length < substrBytes.length) return type(uint256).max;\\n \\n for (uint i = 0; i <= strBytes.length - substrBytes.length; i++) {\\n bool found = true;\\n for (uint j = 0; j < substrBytes.length; j++) {\\n if (strBytes[i + j] != substrBytes[j]) {\\n found = false;\\n break;\\n }\\n }\\n if (found) return i;\\n }\\n \\n return type(uint256).max;\\n }\\n\\n function stringComparison(string memory _a, string memory _b) internal pure returns (bool) {\\n return (keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b)));\\n }\\n}\\n\",\"keccak256\":\"0xfcdfb3c2c8d5a6b7f480f827049782a70fb98f8b3838dcad0e0bb95237b94a0c\",\"license\":\"MIT\"},\"contracts/external/processors/ProxyBaseProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport { Claims } from \\\"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\\\";\\n\\nimport { AddressArrayUtils } from \\\"../lib/AddressArrayUtils.sol\\\";\\nimport { StringArrayUtils } from \\\"../lib/StringArrayUtils.sol\\\";\\nimport { INullifierRegistry } from \\\"../interfaces/INullifierRegistry.sol\\\";\\nimport { IProxyBaseProcessor } from \\\"../interfaces/IProxyBaseProcessor.sol\\\";\\nimport { ClaimVerifier } from \\\"../ClaimVerifier.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ncontract ProxyBaseProcessor is IProxyBaseProcessor, Ownable {\\n\\n using AddressArrayUtils for address[];\\n using StringArrayUtils for string[];\\n\\n /* ============ State Variables ============ */\\n mapping(address => bool) public isWitness;\\n address[] public witnesses;\\n mapping(string => bool) public isProviderHash;\\n string[] public providerHashes; // Set of provider hashes that these proofs should be for\\n INullifierRegistry public immutable nullifierRegistry;\\n\\n /* ============ Events ============ */\\n event WitnessAdded(address witness);\\n event WitnessRemoved(address witness);\\n event ProviderHashAdded(string providerHash);\\n event ProviderHashRemoved(string providerHash);\\n\\n /* ============ Constructor ============ */\\n constructor(\\n INullifierRegistry _nulliferRegistry,\\n string[] memory _providerHashes\\n )\\n Ownable()\\n {\\n nullifierRegistry = _nulliferRegistry;\\n\\n for (uint256 i = 0; i < _providerHashes.length; i++) {\\n require(!isProviderHash[_providerHashes[i]], \\\"Provider hash already added\\\");\\n isProviderHash[_providerHashes[i]] = true;\\n providerHashes.push(_providerHashes[i]);\\n\\n emit ProviderHashAdded(_providerHashes[i]);\\n }\\n }\\n\\n /* ============ Admin Functions ============ */\\n\\n /**\\n * ONLY OWNER: Add witness address. Witness must not have been previously added.\\n *\\n * @param _newWitness Address of the new witness\\n */\\n function addWitness(address _newWitness) external onlyOwner {\\n require(!isWitness[_newWitness], \\\"Address is already a witness\\\");\\n\\n isWitness[_newWitness] = true;\\n witnesses.push(_newWitness);\\n\\n emit WitnessAdded(_newWitness);\\n }\\n\\n /**\\n * ONLY OWNER: Remove witness address. Witness must have been previously added.\\n *\\n * @param _removeWitness Address of witness to be removed\\n */\\n function removeWitness(address _removeWitness) external onlyOwner {\\n require(isWitness[_removeWitness], \\\"Address is not a witness\\\");\\n\\n delete isWitness[_removeWitness];\\n witnesses.removeStorage(_removeWitness);\\n\\n emit WitnessRemoved(_removeWitness);\\n }\\n\\n /**\\n * ONLY OWNER: Add provider hash string. Provider hash must not have been previously added.\\n *\\n * @param _newProviderHash New provider hash to be added\\n */\\n function addProviderHash(string memory _newProviderHash) external onlyOwner {\\n require(!isProviderHash[_newProviderHash], \\\"Provider hash already added\\\");\\n\\n isProviderHash[_newProviderHash] = true;\\n providerHashes.push(_newProviderHash);\\n\\n emit ProviderHashAdded(_newProviderHash);\\n }\\n\\n /**\\n * ONLY OWNER: Remove provider hash string. Provider hash must have been previously added.\\n *\\n * @param _removeProviderHash Provider hash to be removed\\n */\\n function removeProviderHash(string memory _removeProviderHash) external onlyOwner {\\n require(isProviderHash[_removeProviderHash], \\\"Provider hash not found\\\");\\n\\n delete isProviderHash[_removeProviderHash];\\n providerHashes.removeStorage(_removeProviderHash);\\n\\n emit ProviderHashRemoved(_removeProviderHash);\\n }\\n\\n /* ============ Public Functions ============ */\\n \\n /**\\n * Verify proof generated by witnesses. Claim is constructed by hashing claimInfo (provider, context, parameters)\\n * to get the identifier. And then signing on (identifier, owner, timestamp, epoch) to get claim signature. \\n * This function verifies a claim by performing the following checks on the claim\\n * - Calculates the hash of the claimInfo and checks if it matches the identifier in the claim\\n * - Checks if the signatures are valid and from the witnesses\\n * This function reverts if\\n * - No signatures are found on the proof\\n * - Number of signatures is not equal to the number of witnesses\\n * - ClaimInfo hash does not match the identifier in the claim\\n * - Signatures are invalid (not from the witnesses)\\n * \\n * DEV NOTE: This function does NOT validate that the claim provider hash is valid. That is the \\n * responsibility of the caller.\\n * \\n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\\n * \\n * @param proof Proof to be verified\\n */\\n function verifyProofSignatures(Proof memory proof) public view returns (bool) {\\n\\n // create signed claim using claimData and signature.\\n require(proof.signedClaim.signatures.length > 0, \\\"No signatures\\\");\\n Claims.SignedClaim memory signed = Claims.SignedClaim(\\n proof.signedClaim.claim,\\n proof.signedClaim.signatures\\n );\\n\\n // check if the hash from the claimInfo is equal to the infoHash in the claimData\\n bytes32 hashed = Claims.hashClaimInfo(proof.claimInfo);\\n require(proof.signedClaim.claim.identifier == hashed, \\\"ClaimInfo hash doesn't match\\\");\\n\\n // Recover signers of the signed claim\\n address[] memory signedWitnesses = Claims.recoverSignersOfSignedClaim(signed);\\n\\n // check if the number of signatures is equal to the number of witnesses\\n require(\\n signedWitnesses.length == witnesses.length,\\n \\\"Number of signatures not equal to number of witnesses\\\"\\n );\\n\\n // Check signatures are from witnesses\\n for (uint256 i = 0; i < signed.signatures.length; i++) {\\n bool found = false;\\n for (uint j = 0; j < witnesses.length; j++) {\\n if (signedWitnesses[i] == witnesses[j]) {\\n found = true;\\n break;\\n }\\n }\\n require(found, \\\"Signature not appropriate\\\");\\n }\\n\\n return true;\\n }\\n\\n\\n /* ============ View Functions ============ */\\n\\n function getWitnesses() external view returns (address[] memory) {\\n return witnesses;\\n }\\n\\n function getProviderHashes() external view returns (string[] memory) {\\n return providerHashes;\\n }\\n\\n /* ============ Internal Functions ============ */\\n\\n function _validateProviderHash(string memory _providerHash) internal view returns (bool) {\\n return isProviderHash[_providerHash];\\n }\\n \\n function _validateAndAddNullifier(bytes[] memory _sigArray) internal {\\n bytes32 nullifier = keccak256(abi.encode(_sigArray));\\n require(!nullifierRegistry.isNullified(nullifier), \\\"Nullifier has already been used\\\");\\n nullifierRegistry.addNullifier(nullifier);\\n }\\n}\\n\",\"keccak256\":\"0xbfbe301dc003e40793876e36d29ac7da3b294031dc74d26f4e41fcdf3deb1144\",\"license\":\"MIT\"},\"contracts/interfaces/IVerifyDomainProcessor.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\nimport { IProxyBaseProcessor } from \\\"../external/interfaces/IProxyBaseProcessor.sol\\\";\\n\\npragma solidity ^0.8.18;\\n\\ninterface IVerifyDomainProcessor is IProxyBaseProcessor {\\n \\n struct DomainRaw {\\n string name;\\n uint256 expiryTime;\\n }\\n\\n function verifyProofs(\\n Proof[] memory _proofs\\n ) \\n external \\n returns (DomainRaw[] memory domains);\\n}\",\"keccak256\":\"0xe66335a9d8fb3d03a9ee76bf44fbec775311aeed3f6666862f06124b6605a123\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60c06040523462000051576200001f620000186200027f565b91620002a7565b6040516136af620008888239608051818181610b4a015261357d015260a0518181816108a50152610fff01526136af90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200008e57604052565b62000056565b90620000ab620000a360405190565b92836200006c565b565b6001600160a01b031690565b90565b6001600160a01b0381165b036200005157565b90505190620000ab82620000bc565b6001600160a01b038116620000c7565b90505190620000ab82620000de565b6001600160401b0381116200008e5760208091020190565b6001600160401b0381116200008e57602090601f01601f19160190565b0190565b60005b8381106200014a5750506000910152565b818101518382015260200162000139565b90929192620001746200016e8262000115565b62000094565b938185526020850190828401116200005157620000ab9262000136565b9080601f8301121562000051578151620000b9926020016200015b565b929190620001c06200016e82620000fd565b9381855260208086019202810191838311620000515781905b838210620001e8575050505050565b81516001600160401b03811162000051576020916200020b878493870162000191565b815201910190620001d9565b9080601f8301121562000051578151620000b992602001620001ae565b9160608383031262000051576200024c8284620000cf565b926200025c8360208301620000ee565b60408201519093906001600160401b0381116200005157620000b9920162000217565b620002a262003f3780380380620002968162000094565b92833981019062000234565b909192565b91620002b391620006bb565b60a052565b620000b9620000b9620000b99290565b634e487b7160e01b600052601160045260246000fd5b6000198114620002ee5760010190565b620002c8565b634e487b7160e01b600052603260045260246000fd5b9062000314825190565b81101562000326576020809102010190565b620002f4565b62000132620003479260209262000341815190565b94859290565b9384910162000136565b620003646200013291602094936200032c565b918252565b620003816200037760405190565b9283928362000351565b03902090565b620000b99162000369565b156200039a57565b60405162461bcd60e51b815260206004820152601b60248201527f50726f7669646572206861736820616c726561647920616464656400000000006044820152606490fd5b9060ff905b9181191691161790565b9062000401620000b96200040992151590565b8254620003df565b9055565b8054821015620003265762000429600191600052602060002090565b91020190600090565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801562000481575b60208310146200047b57565b62000448565b91607f16916200046f565b9160001960089290920291821b911b620003e4565b9190620004b6620000b96200040993620002b8565b9083546200048c565b620000ab91600091620004a1565b818110620004d9575050565b80620004e96000600193620004bf565b01620004cd565b9190601f81116200050057505050565b62000514620000ab93600052602060002090565b906020601f84018190048301931062000538575b6020601f909101040190620004cd565b909150819062000528565b906200054d815190565b906001600160401b0382116200008e5762000575826200056e85546200045e565b85620004f0565b602090601f8311600114620005b45762000409929160009183620005a8575b5050600019600883021c1916906002021790565b01519050388062000594565b601f19831691620005ca85600052602060002090565b9260005b8181106200060b57509160029391856001969410620005f1575b50505002019055565b01516000196008601f8516021c19169055388080620005e8565b91936020600181928787015181550195019201620005ce565b91906200063657620000ab9162000543565b62000432565b90815491680100000000000000008310156200008e578262000668916001620000ab950181556200040d565b9062000624565b620006946200069e602093620001329362000688815190565b80835293849260200190565b9586910162000136565b601f01601f191690565b6020808252620000b9929101906200066f565b919091620006c8620007c2565b608052620006d76000620002b8565b620006e4620000b9845190565b811015620007bd57620007b7906200074d60036200072c62000726620007226200071b62000713878b6200030a565b518562000387565b5460ff1690565b1590565b62000392565b620007476001916200073f85896200030a565b519062000387565b620003ee565b6200076760046200075f83876200030a565b51906200063c565b6200077381856200030a565b51620007ae7fc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f409691620007a460405190565b91829182620006a8565b0390a1620002de565b620006d7565b509050565b620000ab3362000825565b906001600160a01b0390620003e4565b620000b990620000ad906001600160a01b031682565b620000b990620007dd565b620000b990620007f3565b906200081d620000b96200040992620007fe565b8254620007cd565b6000546001600160a01b0316906200083f81600062000809565b620008766200086f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093620007fe565b91620007fe565b916200088160405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c80631cba9bed146101225780632ca6927d1461011d57806350262c001461011857806357c6e12a1461011357806359e26be11461010e578063670a8cb714610109578063715018a6146101045780637b103999146100ff5780637de24fcf146100fa5780638da5cb5b146100f557806396d195bd146100f0578063b870676c146100eb578063bd6e7741146100e6578063c2107e73146100e1578063ee2f13cd146100dc578063f2fde38b146100d75763fa7643f4036101d457610c7e565b610c3c565b610c24565b610bfd565b610b6f565b610b31565b610acb565b610a40565b610a19565b610890565b610878565b610837565b6107d9565b61079d565b6105a6565b6102ef565b61021c565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761015e57604052565b610127565b9061017761017060405190565b928361013d565b565b6001600160401b03811161015e57602090601f01601f19160190565b0190565b90826000939282370152565b909291926101ba6101b582610179565b610163565b938185526020850190828401116101d45761017792610199565b600080fd5b9080601f830112156101d4578160206101f4933591016101a5565b90565b906020828203126101d45781356001600160401b0381116101d4576101f492016101d9565b346101d45761023461022f3660046101f7565b612392565b604051005b0390f35b60005b8381106102505750506000910152565b8181015183820152602001610240565b61019561027892602092610272815190565b94859290565b9384910161023d565b9052565b6102956101959160209493610260565b918252565b6102af6102a660405190565b92839283610285565b03902090565b6101f49161029a565b6101f4916008021c5b60ff1690565b906101f491546102be565b6101f4906102ea6003916000926102b5565b6102cd565b346101d45761023961030a6103053660046101f7565b6102d8565b60405191829182901515815260200190565b9190916060818403126101d4576103336060610163565b9281356001600160401b0381116101d457816103509184016101d9565b845260208201356001600160401b0381116101d457816103719184016101d9565b602085015260408201356001600160401b0381116101d45761039392016101d9565b6040830152565b805b036101d457565b905035906101778261039a565b6001600160a01b031690565b6001600160a01b03811661039c565b90503590610177826103bc565b63ffffffff811661039c565b90503590610177826103d8565b9190916080818403126101d45761044a61040b6080610163565b93600061041882856103a3565b90860152602061042a828286016103cb565b90860152604061043c828286016103e4565b9086015260608093016103e4565b90830152565b6001600160401b03811161015e5760208091020190565b9291906104766101b582610450565b93818552602080860192028101918383116101d45781905b83821061049c575050505050565b81356001600160401b0381116101d4576020916104bc87849387016101d9565b81520191019061048e565b9080601f830112156101d4578160206101f493359101610467565b91909160a0818403126101d4576104f96040610163565b92600061050682846103f1565b9085015260808201356001600160401b0381116101d45761052792016104c7565b6020830152565b9190916040818403126101d4576105456040610163565b9281356001600160401b0381116101d4578161056291840161031c565b845260208201356001600160401b0381116101d45761052792016104e2565b906020828203126101d45781356001600160401b0381116101d4576101f4920161052e565b346101d45761023961030a6105bc366004610581565b6128f5565b906020828203126101d4576101f4916103a3565b634e487b7160e01b600052603260045260246000fd5b805482101561060e57610605600191600052602060002090565b91020190600090565b6105d5565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561065f575b602083101461065a57565b610629565b91607f169161064f565b8054600093929161068661067c8361063f565b8085529360200190565b91600181169081156106d8575060011461069f57505050565b6106b29192939450600052602060002090565b916000925b8184106106c45750500190565b8054848401526020909301926001016106b7565b92949550505060ff1916825215156020020190565b906101f491610669565b906101776107119261070860405190565b938480926106ed565b038361013d565b90600010610729576101f4906106f7565b610613565b6004600061073a825490565b83101561075557506101f49161074f916105eb565b90610718565b80fd5b6107796107826020936101959361076d815190565b80835293849260200190565b9586910161023d565b601f01601f191690565b60208082526101f492910190610758565b346101d4576102396107b86107b33660046105c1565b61072e565b6040515b9182918261078c565b906020828203126101d4576101f4916103cb565b346101d4576102346107ec3660046107c5565b611d4f565b6101f4916008021c6001600160a01b031690565b906101f491546107f1565b6002600061081c825490565b83101561075557506101f491610831916105eb565b90610805565b346101d45761023961085261084d3660046105c1565b610810565b6040515b918291826001600160a01b03909116815260200190565b60009103126101d457565b346101d45761088836600461086d565b610234610cee565b346101d4576108a036600461086d565b6102397f0000000000000000000000000000000000000000000000000000000000000000610852565b9291906108d86101b582610450565b93818552602080860192028101918383116101d45781905b8382106108fe575050505050565b81356001600160401b0381116101d45760209161091e878493870161052e565b8152019101906108f0565b9080601f830112156101d4578160206101f4933591016108c9565b906020828203126101d45781356001600160401b0381116101d4576101f49201610929565b906101f49060208061098a6040840160008701518582036000870152610758565b940151910152565b906101f491610969565b906109b26109a8835190565b8083529160200190565b90816109c46020830284019460200190565b926000915b8383106109d857505050505090565b909192939460206109fb6109f483856001950387528951610992565b9760200190565b93019301919392906109c9565b60208082526101f49291019061099c565b346101d457610239610a34610a2f366004610944565b610fed565b60405191829182610a08565b346101d457610a5036600461086d565b610239610852610cac565b90610a7b610a74610a6a845190565b8084529260200190565b9260200190565b9060005b818110610a8c5750505090565b909192610ab2610aab60019286516001600160a01b0316815260200190565b9460200190565b929101610a7f565b60208082526101f492910190610a5b565b346101d457610adb36600461086d565b610239610ae66133e7565b60405191829182610aba565b6101f4906103b0906001600160a01b031682565b6101f490610af2565b6101f490610b06565b61028190610b0f565b6020810192916101779190610b18565b346101d457610b4136600461086d565b604051806102397f000000000000000000000000000000000000000000000000000000000000000082610b21565b346101d457610234610b823660046101f7565b6122ce565b906101f491610758565b90610b9d6109a8835190565b9081610baf6020830284019460200190565b926000915b838310610bc357505050505090565b90919293946020610bdf6109f483856001950387528951610b87565b9301930191939290610bb4565b60208082526101f492910190610b91565b346101d457610c0d36600461086d565b610239610c1861344e565b60405191829182610bec565b346101d457610234610c373660046107c5565b611e51565b346101d457610234610c4f3660046107c5565b610e05565b90610c5e90610b0f565b600052602052604060002090565b6101f4906102ea600191600092610c54565b346101d45761023961030a610c943660046107c5565b610c6c565b6101f4906103b0565b6101f49054610c99565b6101f46000610ca2565b610cbe610d4a565b610177610cdc565b6103b06101f46101f49290565b6101f490610cc6565b610177610ce96000610cd3565b610e3e565b610177610cb6565b15610cfd57565b60405162461bcd60e51b815280610d46600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b610177610d55610cac565b610d6e610d61336103b0565b916001600160a01b031690565b14610cf6565b61017790610d80610d4a565b610de0565b15610d8c57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61017790610ce9610df46103b06000610cd3565b6001600160a01b0383161415610d85565b61017790610d74565b906001600160a01b03905b9181191691161790565b90610e336101f4610e3a92610b0f565b8254610e0e565b9055565b610e486000610ca2565b90610e54816000610e23565b610e87610e817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610b0f565b91610b0f565b91610e9160405190565b600090a3565b15610e9e57565b60405162461bcd60e51b815260206004820152601660248201527513db9b1e481c9959da5cdd1c9e4818d85b8818d85b1b60521b6044820152606490fd5b906102956101b583610450565b6101f46040610163565b610efb610ee9565b906060825260006020830152565b6101f4610ef3565b60005b828110610f2057505050565b602090610f2b610f09565b8184015201610f14565b90610177610f4b610f4584610edc565b93610450565b601f190160208401610f11565b6101f46101f46101f49290565b634e487b7160e01b600052601160045260246000fd5b6000198114610f8a5760010190565b610f65565b90610f98825190565b81101561060e576020809102010190565b15610fb057565b60405162461bcd60e51b815260206004820152601560248201527409cde40ecc2d8d2c840e0e4deecd2c8cae490c2e6d605b1b6044820152606490fd5b9061102a336110246001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016610d61565b14610e97565b61103a611035835190565b610f35565b916000908361104883610f58565b6110536101f4845190565b8110156110de578061109e6110be6110ac6110996110a760208061107a6110d9998c610f8f565b51611084816128f5565b5061108e81611221565b999199969096613458565b610fa9565b01510151613550565b6113f1565b6105276110b7610ee9565b9389850152565b6110c88289610f8f565b526110d38188610f8f565b50610f7b565b611048565b5093505050565b6102c76101f46101f49290565b6101f460056110e5565b9092919261110c6101b582610179565b938185526020850190828401116101d4576101779261023d565b9080601f830112156101d45781516101f4926020016110fc565b92919061114f6101b582610450565b93818552602080860192028101918383116101d45781905b838210611175575050505050565b81516001600160401b0381116101d4576020916111958784938701611126565b815201910190611167565b9080601f830112156101d45781516101f492602001611140565b906020828203126101d45781516001600160401b0381116101d4576101f492016111a0565b60409061120d6112016101779597969460608401908482036000860152610758565b60ff9097166020830152565b019015159052565b6040513d6000823e3d90fd5b5160400151738985018D19DcB645ddC3Eb486c434CB5f5EdA5C291634be6d4f89160009061124d6110f2565b9461126e6001956112798761126160405190565b998a968795869560e01b90565b8552600485016111df565b03915af49283156112f2576000936112cf575b506112c86112b66112b06112a96112a36000610f58565b87610f8f565b5194610f58565b85610f8f565b51936112c26002610f58565b90610f8f565b5191929190565b6112eb91933d8091833e6112e3818361013d565b8101906111ba565b913861128c565b611215565b6001600160401b03811161015e5760200290565b6101b56101f4916112f7565b60005b82811061132657505050565b60608282015260200161131a565b9061017761134a6113448461130b565b936112f7565b83611317565b6101f46006611334565b90611363825190565b81101561060e570160200190565b61138461137e6101f49290565b60f81b90565b6001600160f81b03191690565b90600681101561060e576020020190565b91908201809211610f8a57565b156113b657565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206461746520737472696e6760681b6044820152606490fd5b906000916113fd611350565b8390600061140a81610f58565b846114166101f4825190565b82101561150a578161143961142b828461135a565b516001600160f81b03191690565b611454611446602d611371565b916001600160f81b03191690565b149182156114e7575b82156114c3575b5050611479575b61147490610f7b565b61140a565b9295836114869186611b86565b6114908784611391565b5261149b8683611391565b506114746114bb6114b56114af6001610f58565b866113a2565b97610f7b565b93905061146b565b6114d292509061142b9161135a565b6114df6114466054611371565b148138611464565b91506114f661142b828461135a565b611503611446603a611371565b149161145d565b5050929161152f61155c92936101f496976115296115258390565b5190565b91611b86565b6115398285611391565b526115448184611391565b506115566115526005610f58565b9190565b146113af565b61158261157b61157461156e85610f58565b84611391565b5193610f58565b8093611905565b9061159a8361159461156e6001610f58565b51611905565b6115b1846115946115ab6002610f58565b85611391565b906115e1856115946115d0826115946115ca6003610f58565b89611391565b956115db6004610f58565b90611391565b9361161b565b6101f462015180610f58565b81810292918115918404141715610f8a57565b6101f4610e10610f58565b6101f4603c610f58565b61166a9361165b6116526116446101f499989661165b966116619661163e600090565b50611712565b61164c6115e7565b906115f3565b9161164c611606565b906113a2565b9161164c611611565b6113a2565b156101d457565b91908083039260009091128015828513169184121617610f8a57565b919082810192600013801591841291821691151617610f8a57565b634e487b7160e01b600052601260045260246000fd5b81156116de57600160ff1b8114600019831416610f8a570590565b6116ad565b8181029291600160ff1b81146000831216610f8a578184051490151715610f8a57565b6101f462253d8c610f58565b61171d6107b2610f58565b8110156117299061166f565b61173290610f58565b9061173c90610f58565b9161174690610f58565b611751617d4b610f58565b61175a91611676565b906105b56117696112c0610f58565b6117739083611692565b600e9161177f83610f58565b6117899087611676565b91600c9261179684610f58565b61179f916116c3565b6117a891611692565b906117b290610f58565b906117bc916116e3565b936004946117c986610f58565b6117d2916116c3565b6117db91611692565b61016f6117e86002610f58565b6117f29088611676565b6117fb85610f58565b6118059089611676565b61180e85610f58565b611817916116c3565b61182085610f58565b611829916116e3565b61183291611676565b9061183c90610f58565b90611846916116e3565b61184f83610f58565b611858916116c3565b61186191611692565b94600393611870611324610f58565b61187991611692565b9261188390610f58565b61188c91611676565b9061189690610f58565b61189f916116c3565b6118a891611692565b6118b26064610f58565b6118bb916116c3565b906118c590610f58565b906118cf916116e3565b906118d990610f58565b6118e2916116c3565b6118eb91611676565b6118f3611706565b6118fc91611676565b6101f490610f58565b6101f49190611914602e611371565b90611a04565b6102c76101f46101f49260ff1690565b6101f49060f81c61191a565b6101f46101f46101f49260ff1690565b91908203918211610f8a57565b1561195a57565b60405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606490fd5b156119a657565b60405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608490fd5b604d8111610f8a57600a0a90565b92600091611a1183610f58565b808493815b611a216101f48a5190565b811015611b22578589611a3761142b848361135a565b603090611a4661144683611371565b101580611b00575b611ab6575b5050611aa6575b611a6761142b828b61135a565b611a7a6001600160f81b03198716611446565b14611a8e575b611a8990610f7b565b611a16565b94611a9e90151587151514611953565b600194611a80565b92611ab090610f7b565b92611a5a565b61165b90611af2611aec611ae7611ae261142b89611adc611af89a9d61164c600a610f58565b9861135a565b61192a565b611936565b91610f58565b90611946565b928938611a53565b50611b0e61142b858461135a565b611b1b6114466039611371565b1115611a4e565b509650935061164c9250611b4c91506101f494611b47611b3f8290565b83111561199f565b611946565b6119f6565b906102956101b583610179565b369037565b90610177611b79611b7384611b51565b93610179565b601f190160208401611b5e565b909290611b9b611b968585611946565b611b63565b91845b845b811015611be057611bd981611bbb61142b611ba0948761135a565b611bd3611bc88a84611946565b9160001a918861135a565b53610f7b565b9050611b9e565b509350506101f4915090565b61017790611bf8610d4a565b611cdc565b6101f4906102c7565b6101f49054611bfd565b15611c1757565b60405162461bcd60e51b815260206004820152601c60248201527f4164647265737320697320616c72656164792061207769746e657373000000006044820152606490fd5b9060ff90610e19565b90611c756101f4610e3a92151590565b8254611c5c565b916001600160a01b0360089290920291821b911b610e19565b921b90565b9190611cab6101f4610e3a93610b0f565b908354611c7c565b90815491600160401b83101561015e5782611cd6916001610177950181556105eb565b90611c9a565b611d116001611d02611cfd611cf9611cf48685610c54565b611c06565b1590565b611c10565b611d0c8382610c54565b611c65565b611d1c816002611cb3565b611d4a7ff5944521c155e80db583372b9992336b6616b14dfb924a5cf6ef97b256d280349161085660405190565b0390a1565b61017790611bec565b61017790611d64610d4a565b611dee565b15611d7057565b60405162461bcd60e51b815260206004820152601860248201527f41646472657373206973206e6f742061207769746e65737300000000000000006044820152606490fd5b91906008610e19910291611c9560ff841b90565b9190611dda6101f4610e3a93151590565b908354611db5565b61017791600091611dc9565b611e186000611e13836001611e0e611e09611cf48484610c54565b611d69565b610c54565b611de2565b611e23816002611f32565b611d4a7f8b5785dce93ca82765b1cc25cedcda1b501288cb23a1fd171c0091d83900f9bd9161085660405190565b61017790611d58565b90611e75611e69610a6a845490565b92600052602060002090565b9060005b818110611e865750505090565b909192611eb3611eac600192611e9b87610ca2565b6001600160a01b0316815260200190565b9460010190565b929101611e79565b906101f491611e5a565b9061017761071192611ed660405190565b93848092611ebb565b6101f490611ec5565b634e487b7160e01b600052603160045260246000fd5b61017791600091611c9a565b80548015611f2d576000190190611f2a611f2483836105eb565b90611efe565b55565b611ee8565b611f47611f4e92611f4283611edf565b611fe5565b9092901590565b15611f905760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b61017791611fa9611f9f835490565b611af26001610f58565b90818103611fb9575b5050611f0a565b611cd6611fcc610831611fd394866105eb565b91846105eb565b3880611fb2565b6101f4600019610f58565b91908251926000611ff581610f58565b855b81101561204c5761201861200b8285610f8f565b516001600160a01b031690565b61202a6001600160a01b038616610d61565b146120425761203b611ff791610f7b565b9050611ff5565b9450505050600190565b5093505050611552611fda565b61017790612065610d4a565b61226c565b1561207157565b60405162461bcd60e51b815260206004820152601b60248201527f50726f7669646572206861736820616c726561647920616464656400000000006044820152606490fd5b9160001960089290920291821b911b610e19565b91906120db6101f4610e3a93610f58565b9083546120b6565b610177916000916120ca565b8181106120fa575050565b8061210860006001936120e3565b016120ef565b9190601f811161211d57505050565b61212f61017793600052602060002090565b906020601f840181900483019310612152575b6020601f909101045b01906120ef565b9091508190612142565b600019600883021c1916906002021790565b90612177815190565b906001600160401b03821161015e5761219a82612194855461063f565b8561210e565b602090601f83116001146121c857610e3a9291600091836121bd575b505061215c565b0151905038806121b6565b601f198316916121dd85600052602060002090565b9260005b81811061221c57509160029391856001969410612202575b50505002019055565b01516000196008601f8516021c19165b90553880806121f9565b919360206001819287870151815501950192016121e1565b9190610729576101779161216e565b90815491600160401b83101561015e5782612266916001610177950181556105eb565b90612234565b6122956003612289612284611cf9611cf486856102b5565b61206a565b611d0c836001926102b5565b6122a0816004612243565b611d4a7fc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096916107bc60405190565b61017790612059565b610177906122e3610d4a565b612334565b156122ef57565b60405162461bcd60e51b815260206004820152601760248201527f50726f76696465722068617368206e6f7420666f756e640000000000000000006044820152606490fd5b6123596000611e1383600361235461234f611cf484846102b5565b6122e8565b6102b5565b6123648160046126aa565b611d4a7f6f594b4b4f0580c66aabba75218163a99fa1fe330a171cc9e2bfd8e167db22f8916107bc60405190565b610177906122d7565b6101f4906106f7565b906123ad825490565b6123b681610edc565b926123ca6020850191600052602060002090565b6000915b8383106123db5750505050565b6001602081926123ea8561239b565b8152019201920191906123ce565b6101f4906123a4565b6101f4905461063f565b908082146124da5761241c81612401565b906001600160401b03821161015e5761243982612194855461063f565b600090601f831160011461246657610e3a92916000918361245b57505061215c565b0154905038806121b6565b9061247b601f19841692600052602060002090565b9061248b85600052602060002090565b92815b8181106124c2575091600293918560019694106124ae5750505002019055565b01546000196008601f8516021c1916612212565b9193600180602092878701548155019501920161248e565b5050565b9190610729576101779161240b565b9061250090600019906020036008021c90565b8154169055565b9060009161252561251d82600052602060002090565b92835461215c565b905555565b919290602082101561258257601f841160011461254c57610e3a92935061215c565b509061257d61017793600161257461256985600052602060002090565b92601f602091010490565b820191016120ef565b612507565b506125bb8293612599600194600052602060002090565b61214b6020601f860104820192601f8616806125c3575b50601f602091010490565b600202179055565b6125cf908886036124ed565b386125b0565b929091600160401b821161015e576020111561261c5760208110156125fd57610e3a9161215c565b60019160ff191661261384600052602060002090565b55600202019055565b60019150600202019055565b9081546126348161063f565b9081831161265d575b81831061264b575b50505050565b6126549361252a565b38808080612645565b612669838383876125d5565b61263d565b600061017791612628565b90600003610729576101779061266e565b80548015611f2d576000190190611f2a6126a483836105eb565b90612679565b611f476126bf926126ba836123f8565b612744565b156127005760405162461bcd60e51b815260206004820152601460248201527329ba3934b733903737ba1034b71030b93930bc9760611b6044820152606490fd5b6101779161270f611f9f835490565b9081810361271f575b505061268a565b61273761272f61273d93856105eb565b5091846105eb565b906124de565b3880612718565b9190825192600061275481610f58565b855b8110156127ac5761276a6115258285610f8f565b61277c612775825190565b9160200190565b20612794611552865b612790612775825190565b2090565b14612042576127a561275691610f7b565b9050612754565b509350505081199190565b156127be57565b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b156127fa57565b60405162461bcd60e51b815260206004820152601c60248201527f436c61696d496e666f206861736820646f65736e2774206d61746368000000006044820152606490fd5b1561284657565b60405162461bcd60e51b815260206004820152603560248201527f4e756d626572206f66207369676e617475726573206e6f7420657175616c20746044820152746f206e756d626572206f66207769746e657373657360581b6064820152608490fd5b156128b057565b60405162461bcd60e51b815260206004820152601960248201527f5369676e6174757265206e6f7420617070726f707269617465000000000000006044820152606490fd5b906020820190815160200151612909905190565b9160009261291684610f58565b10612920906127b7565b828080808451015196845160200151612937610ee9565b98838a01906129439152565b6020890152015161295390612efe565b925101510161296190611525565b1461296b906127f3565b61297483612a5b565b805191600292612982845490565b1461298c9061283f565b61299584610f58565b935b6129a66101f460208801515190565b851015612a405780956129b882610f58565b6129c36101f4875490565b811015612a28576129d761200b8887610f8f565b6129ea610d616103b0610831858b6105eb565b146129fd576129f890610f7b565b6129b8565b50946129a69196506020612a1d6101f492612a1860016128a9565b610f7b565b969792505050612997565b50946020612a1d6101f492612a186129a6959a6128a9565b509350505050600190565b90610177611b79610f4584610edc565b6020612a6a6000830151612b2b565b910190612a7e612a7983515190565b612a4b565b91612a896000610f58565b612a956101f483515190565b811015612ad55780612a18612ab8612ab1612ad0948651610f8f565b5186612c02565b612ac28388610f8f565b906001600160a01b03169052565b612a89565b50505090565b610195816020939052565b6101f46101f46101f49263ffffffff1690565b92612b25612b18612b2594612b25612b186101f49998612b1897610260565b600560f91b815260010190565b90610260565b6101f4612b67612b3a83611525565b612b62612b4660405190565b8092612b56602083019182612adb565b9081038252038261013d565b613130565b612b83612b7e60208501516001600160a01b031690565b612fb9565b90612b56612bbf612bae612ba96060612bb3612bae612ba960408c015163ffffffff1690565b612ae6565b61329e565b98015163ffffffff1690565b604051958694602086019485612af9565b7f19457468657265756d205369676e6564204d6573736167653a0a00000000000081526101f49291612b2591601a0182565b90612b56612c326101f493612c15600090565b50612c21612bae825190565b604051938492602084019283612bd0565b612c3d612775825190565b206101f491612c4b91612dc1565b919091612c82565b634e487b7160e01b600052602160045260246000fd5b60051115612c7357565b612c53565b9061017782612c69565b612c8c6000612c78565b612c9582612c78565b03612c9d5750565b612ca76001612c78565b612cb082612c78565b03612cfa5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b612d046002612c78565b612d0d82612c78565b03612d575760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b612d6a612d646003612c78565b91612c78565b14612d7157565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b908051612dd16115526041610f58565b03612df757612df3916020820151906060604084015193015160001a90612e36565b9091565b5050612e036000610cd3565b90600290565b612e3261017794610393606094989795612e28608086019a6000870152565b60ff166020850152565b0152565b919291612e42836118fc565b612e6e6115527f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0610f58565b11612ed257612e8e600093602095612e8560405190565b94859485612e09565b838052039060015afa156112f25760005190600091612eac83610cd3565b6001600160a01b0381166001600160a01b03831614612eca57509190565b925050600190565b50505050612ee06000610cd3565b90600390565b6101f49392612b25612b18612b1893612b2595610260565b8051602082015160409283015192516127859290612b5690948593602085019384612ee6565b6101f49081906001600160a01b031681565b60ff8111610f8a5760020a90565b905b9081156116de570490565b61138461137e6101f49260ff1690565b612f469060ff165b9160ff1690565b612f7c9060ff16612f69565b029060ff8216918203610f8a57565b612f979060ff16612f69565b90039060ff8211610f8a57565b61060f60f31b81526101f49190600201612b25565b90612fc7611b966028610f58565b600092612fd384610f58565b612fdd6014610f58565b8110156130d45780613037611bd36130c56130bb6130cf956130376130b58c8b6130af613051611ae261304c8f61301e61301961304792610b06565b612f24565b61304161303c6008613037611aec8f611b476013610f58565b6115f3565b612f36565b90612f44565b6110e5565b612f51565b9261309a61309461304c60109661308e61307661304c6130708b6110e5565b84612f61565b986130896130838b61192a565b916110e5565b612f70565b90612f8b565b9461323a565b6130a78860029d8e610f58565b911a9261135a565b5361323a565b95610f58565b61165b6001610f58565b91881a918661135a565b612fd3565b50506101f49192506101f46130e860405190565b8092612b56602083019182612fa4565b6131026010611b51565b6f181899199a1a9b1b9c1cb0b131b232b360811b602082015290565b6101f46130f8565b81156116de570690565b90815191613146611b9660029461164c86610f58565b9061314f61311e565b60009161315b83610f58565b6131666101f4835190565b81101561320c57806131a661142b6131a061318a611ae261142b613207978961135a565b61319b613195895190565b91611936565b612f44565b8661135a565b6131c56131bb6131b58b610f58565b846115f3565b91871a918861135a565b536131ef61142b6131a06131df611ae261142b868961135a565b6131ea613195895190565b613126565b611bd36131bb6130bb6132018c610f58565b856115f3565b61315b565b505050506101f49192506101f46130e860405190565b61322e9060ff16612f69565b019060ff8211610f8a57565b6132439061192a565b61324d600a6110e5565b60ff8216101561326e5761304c6101f49161326860306110e5565b90613222565b61304c6101f49161326860576110e5565b6132896001611b51565b600360fc1b602082015290565b6101f461327f565b6000916132aa83610f58565b821461337257908060005b6132be85610f58565b83146132e1576132d06132db91610f7b565b92613041600a610f58565b916132b5565b91506132ec82611b63565b915b6132f785610f58565b82146133675761330e61336191611af26001610f58565b91613041600a8461335b61335261304c603061334d61308361304761334761333e6133388b610f58565b8d612f44565b61164c8b610f58565b8b611946565b613222565b8a1a918861135a565b53610f58565b906132ee565b50506101f491925090565b9150506101f4613296565b9061338c611e69610a6a845490565b9060005b81811061339d5750505090565b9091926133b2611eac600192611e9b87610ca2565b929101613390565b906101f49161337d565b90610177610711926133d560405190565b938480926133ba565b6101f4906133c4565b6101f460026133de565b906133fa825490565b61340381610edc565b926134176020850191600052602060002090565b6000915b8383106134285750505050565b6001602081926134378561239b565b81520192019201919061341b565b6101f4906133f1565b6101f46004613445565b611cf46101f491613467600090565b5060036102b5565b9061347b6109a8835190565b908161348d6020830284019460200190565b926000915b8383106134a157505050505090565b909192939460206134bd6109f483856001950387528951610b87565b9301930191939290613492565b60208082526101f49291019061346f565b80151561039c565b90505190610177826134db565b906020828203126101d4576101f4916134e3565b1561350b57565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b61356c61355c60405190565b8092612b566020830191826134ca565b613577612775825190565b206135a17f0000000000000000000000000000000000000000000000000000000000000000610b0f565b9063169394bb6135ba6135b360405190565b9160e01b90565b815260048101829052602081602481865afa9081156112f2576135ec916135e79160009161365157501590565b613504565b635bd4df3290823b156101d4576136289261361a6000809461360d60405190565b9687958694859360e01b90565b835260048301526024820190565b03925af180156112f2576136395750565b610177906000613649818361013d565b81019061086d565b611cf9915060203d8111613672575b61366a818361013d565b8101906134f0565b503d61366056fea2646970667358221220ac32ca16a78f612ec68240d59214076e1784464c21ff8fabfeff4b46fd239e1c64736f6c63430008120033", + "bytecode": "0x60c06040523462000051576200001f620000186200027f565b91620002a7565b6040516136af620008888239608051818181610b4a015261357d015260a0518181816108a50152610fff01526136af90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b038211176200008e57604052565b62000056565b90620000ab620000a360405190565b92836200006c565b565b6001600160a01b031690565b90565b6001600160a01b0381165b036200005157565b90505190620000ab82620000bc565b6001600160a01b038116620000c7565b90505190620000ab82620000de565b6001600160401b0381116200008e5760208091020190565b6001600160401b0381116200008e57602090601f01601f19160190565b0190565b60005b8381106200014a5750506000910152565b818101518382015260200162000139565b90929192620001746200016e8262000115565b62000094565b938185526020850190828401116200005157620000ab9262000136565b9080601f8301121562000051578151620000b9926020016200015b565b929190620001c06200016e82620000fd565b9381855260208086019202810191838311620000515781905b838210620001e8575050505050565b81516001600160401b03811162000051576020916200020b878493870162000191565b815201910190620001d9565b9080601f8301121562000051578151620000b992602001620001ae565b9160608383031262000051576200024c8284620000cf565b926200025c8360208301620000ee565b60408201519093906001600160401b0381116200005157620000b9920162000217565b620002a262003f3780380380620002968162000094565b92833981019062000234565b909192565b91620002b391620006bb565b60a052565b620000b9620000b9620000b99290565b634e487b7160e01b600052601160045260246000fd5b6000198114620002ee5760010190565b620002c8565b634e487b7160e01b600052603260045260246000fd5b9062000314825190565b81101562000326576020809102010190565b620002f4565b62000132620003479260209262000341815190565b94859290565b9384910162000136565b620003646200013291602094936200032c565b918252565b620003816200037760405190565b9283928362000351565b03902090565b620000b99162000369565b156200039a57565b60405162461bcd60e51b815260206004820152601b60248201527f50726f7669646572206861736820616c726561647920616464656400000000006044820152606490fd5b9060ff905b9181191691161790565b9062000401620000b96200040992151590565b8254620003df565b9055565b8054821015620003265762000429600191600052602060002090565b91020190600090565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801562000481575b60208310146200047b57565b62000448565b91607f16916200046f565b9160001960089290920291821b911b620003e4565b9190620004b6620000b96200040993620002b8565b9083546200048c565b620000ab91600091620004a1565b818110620004d9575050565b80620004e96000600193620004bf565b01620004cd565b9190601f81116200050057505050565b62000514620000ab93600052602060002090565b906020601f84018190048301931062000538575b6020601f909101040190620004cd565b909150819062000528565b906200054d815190565b906001600160401b0382116200008e5762000575826200056e85546200045e565b85620004f0565b602090601f8311600114620005b45762000409929160009183620005a8575b5050600019600883021c1916906002021790565b01519050388062000594565b601f19831691620005ca85600052602060002090565b9260005b8181106200060b57509160029391856001969410620005f1575b50505002019055565b01516000196008601f8516021c19169055388080620005e8565b91936020600181928787015181550195019201620005ce565b91906200063657620000ab9162000543565b62000432565b90815491680100000000000000008310156200008e578262000668916001620000ab950181556200040d565b9062000624565b620006946200069e602093620001329362000688815190565b80835293849260200190565b9586910162000136565b601f01601f191690565b6020808252620000b9929101906200066f565b919091620006c8620007c2565b608052620006d76000620002b8565b620006e4620000b9845190565b811015620007bd57620007b7906200074d60036200072c62000726620007226200071b62000713878b6200030a565b518562000387565b5460ff1690565b1590565b62000392565b620007476001916200073f85896200030a565b519062000387565b620003ee565b6200076760046200075f83876200030a565b51906200063c565b6200077381856200030a565b51620007ae7fc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f409691620007a460405190565b91829182620006a8565b0390a1620002de565b620006d7565b509050565b620000ab3362000825565b906001600160a01b0390620003e4565b620000b990620000ad906001600160a01b031682565b620000b990620007dd565b620000b990620007f3565b906200081d620000b96200040992620007fe565b8254620007cd565b6000546001600160a01b0316906200083f81600062000809565b620008766200086f7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093620007fe565b91620007fe565b916200088160405190565b600090a356fe6080604052600436101561001257600080fd5b60003560e01c80631cba9bed146101225780632ca6927d1461011d57806350262c001461011857806357c6e12a1461011357806359e26be11461010e578063670a8cb714610109578063715018a6146101045780637b103999146100ff5780637de24fcf146100fa5780638da5cb5b146100f557806396d195bd146100f0578063b870676c146100eb578063bd6e7741146100e6578063c2107e73146100e1578063ee2f13cd146100dc578063f2fde38b146100d75763fa7643f4036101d457610c7e565b610c3c565b610c24565b610bfd565b610b6f565b610b31565b610acb565b610a40565b610a19565b610890565b610878565b610837565b6107d9565b61079d565b6105a6565b6102ef565b61021c565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761015e57604052565b610127565b9061017761017060405190565b928361013d565b565b6001600160401b03811161015e57602090601f01601f19160190565b0190565b90826000939282370152565b909291926101ba6101b582610179565b610163565b938185526020850190828401116101d45761017792610199565b600080fd5b9080601f830112156101d4578160206101f4933591016101a5565b90565b906020828203126101d45781356001600160401b0381116101d4576101f492016101d9565b346101d45761023461022f3660046101f7565b612392565b604051005b0390f35b60005b8381106102505750506000910152565b8181015183820152602001610240565b61019561027892602092610272815190565b94859290565b9384910161023d565b9052565b6102956101959160209493610260565b918252565b6102af6102a660405190565b92839283610285565b03902090565b6101f49161029a565b6101f4916008021c5b60ff1690565b906101f491546102be565b6101f4906102ea6003916000926102b5565b6102cd565b346101d45761023961030a6103053660046101f7565b6102d8565b60405191829182901515815260200190565b9190916060818403126101d4576103336060610163565b9281356001600160401b0381116101d457816103509184016101d9565b845260208201356001600160401b0381116101d457816103719184016101d9565b602085015260408201356001600160401b0381116101d45761039392016101d9565b6040830152565b805b036101d457565b905035906101778261039a565b6001600160a01b031690565b6001600160a01b03811661039c565b90503590610177826103bc565b63ffffffff811661039c565b90503590610177826103d8565b9190916080818403126101d45761044a61040b6080610163565b93600061041882856103a3565b90860152602061042a828286016103cb565b90860152604061043c828286016103e4565b9086015260608093016103e4565b90830152565b6001600160401b03811161015e5760208091020190565b9291906104766101b582610450565b93818552602080860192028101918383116101d45781905b83821061049c575050505050565b81356001600160401b0381116101d4576020916104bc87849387016101d9565b81520191019061048e565b9080601f830112156101d4578160206101f493359101610467565b91909160a0818403126101d4576104f96040610163565b92600061050682846103f1565b9085015260808201356001600160401b0381116101d45761052792016104c7565b6020830152565b9190916040818403126101d4576105456040610163565b9281356001600160401b0381116101d4578161056291840161031c565b845260208201356001600160401b0381116101d45761052792016104e2565b906020828203126101d45781356001600160401b0381116101d4576101f4920161052e565b346101d45761023961030a6105bc366004610581565b6128f5565b906020828203126101d4576101f4916103a3565b634e487b7160e01b600052603260045260246000fd5b805482101561060e57610605600191600052602060002090565b91020190600090565b6105d5565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561065f575b602083101461065a57565b610629565b91607f169161064f565b8054600093929161068661067c8361063f565b8085529360200190565b91600181169081156106d8575060011461069f57505050565b6106b29192939450600052602060002090565b916000925b8184106106c45750500190565b8054848401526020909301926001016106b7565b92949550505060ff1916825215156020020190565b906101f491610669565b906101776107119261070860405190565b938480926106ed565b038361013d565b90600010610729576101f4906106f7565b610613565b6004600061073a825490565b83101561075557506101f49161074f916105eb565b90610718565b80fd5b6107796107826020936101959361076d815190565b80835293849260200190565b9586910161023d565b601f01601f191690565b60208082526101f492910190610758565b346101d4576102396107b86107b33660046105c1565b61072e565b6040515b9182918261078c565b906020828203126101d4576101f4916103cb565b346101d4576102346107ec3660046107c5565b611d4f565b6101f4916008021c6001600160a01b031690565b906101f491546107f1565b6002600061081c825490565b83101561075557506101f491610831916105eb565b90610805565b346101d45761023961085261084d3660046105c1565b610810565b6040515b918291826001600160a01b03909116815260200190565b60009103126101d457565b346101d45761088836600461086d565b610234610cee565b346101d4576108a036600461086d565b6102397f0000000000000000000000000000000000000000000000000000000000000000610852565b9291906108d86101b582610450565b93818552602080860192028101918383116101d45781905b8382106108fe575050505050565b81356001600160401b0381116101d45760209161091e878493870161052e565b8152019101906108f0565b9080601f830112156101d4578160206101f4933591016108c9565b906020828203126101d45781356001600160401b0381116101d4576101f49201610929565b906101f49060208061098a6040840160008701518582036000870152610758565b940151910152565b906101f491610969565b906109b26109a8835190565b8083529160200190565b90816109c46020830284019460200190565b926000915b8383106109d857505050505090565b909192939460206109fb6109f483856001950387528951610992565b9760200190565b93019301919392906109c9565b60208082526101f49291019061099c565b346101d457610239610a34610a2f366004610944565b610fed565b60405191829182610a08565b346101d457610a5036600461086d565b610239610852610cac565b90610a7b610a74610a6a845190565b8084529260200190565b9260200190565b9060005b818110610a8c5750505090565b909192610ab2610aab60019286516001600160a01b0316815260200190565b9460200190565b929101610a7f565b60208082526101f492910190610a5b565b346101d457610adb36600461086d565b610239610ae66133e7565b60405191829182610aba565b6101f4906103b0906001600160a01b031682565b6101f490610af2565b6101f490610b06565b61028190610b0f565b6020810192916101779190610b18565b346101d457610b4136600461086d565b604051806102397f000000000000000000000000000000000000000000000000000000000000000082610b21565b346101d457610234610b823660046101f7565b6122ce565b906101f491610758565b90610b9d6109a8835190565b9081610baf6020830284019460200190565b926000915b838310610bc357505050505090565b90919293946020610bdf6109f483856001950387528951610b87565b9301930191939290610bb4565b60208082526101f492910190610b91565b346101d457610c0d36600461086d565b610239610c1861344e565b60405191829182610bec565b346101d457610234610c373660046107c5565b611e51565b346101d457610234610c4f3660046107c5565b610e05565b90610c5e90610b0f565b600052602052604060002090565b6101f4906102ea600191600092610c54565b346101d45761023961030a610c943660046107c5565b610c6c565b6101f4906103b0565b6101f49054610c99565b6101f46000610ca2565b610cbe610d4a565b610177610cdc565b6103b06101f46101f49290565b6101f490610cc6565b610177610ce96000610cd3565b610e3e565b610177610cb6565b15610cfd57565b60405162461bcd60e51b815280610d46600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b610177610d55610cac565b610d6e610d61336103b0565b916001600160a01b031690565b14610cf6565b61017790610d80610d4a565b610de0565b15610d8c57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61017790610ce9610df46103b06000610cd3565b6001600160a01b0383161415610d85565b61017790610d74565b906001600160a01b03905b9181191691161790565b90610e336101f4610e3a92610b0f565b8254610e0e565b9055565b610e486000610ca2565b90610e54816000610e23565b610e87610e817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610b0f565b91610b0f565b91610e9160405190565b600090a3565b15610e9e57565b60405162461bcd60e51b815260206004820152601660248201527513db9b1e481c9959da5cdd1c9e4818d85b8818d85b1b60521b6044820152606490fd5b906102956101b583610450565b6101f46040610163565b610efb610ee9565b906060825260006020830152565b6101f4610ef3565b60005b828110610f2057505050565b602090610f2b610f09565b8184015201610f14565b90610177610f4b610f4584610edc565b93610450565b601f190160208401610f11565b6101f46101f46101f49290565b634e487b7160e01b600052601160045260246000fd5b6000198114610f8a5760010190565b610f65565b90610f98825190565b81101561060e576020809102010190565b15610fb057565b60405162461bcd60e51b815260206004820152601560248201527409cde40ecc2d8d2c840e0e4deecd2c8cae490c2e6d605b1b6044820152606490fd5b9061102a336110246001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016610d61565b14610e97565b61103a611035835190565b610f35565b916000908361104883610f58565b6110536101f4845190565b8110156110de578061109e6110be6110ac6110996110a760208061107a6110d9998c610f8f565b51611084816128f5565b5061108e81611221565b999199969096613458565b610fa9565b01510151613550565b6113f1565b6105276110b7610ee9565b9389850152565b6110c88289610f8f565b526110d38188610f8f565b50610f7b565b611048565b5093505050565b6102c76101f46101f49290565b6101f460056110e5565b9092919261110c6101b582610179565b938185526020850190828401116101d4576101779261023d565b9080601f830112156101d45781516101f4926020016110fc565b92919061114f6101b582610450565b93818552602080860192028101918383116101d45781905b838210611175575050505050565b81516001600160401b0381116101d4576020916111958784938701611126565b815201910190611167565b9080601f830112156101d45781516101f492602001611140565b906020828203126101d45781516001600160401b0381116101d4576101f492016111a0565b60409061120d6112016101779597969460608401908482036000860152610758565b60ff9097166020830152565b019015159052565b6040513d6000823e3d90fd5b51604001517371D6e2056e7138F1F489EE98658D4832348b343591634be6d4f89160009061124d6110f2565b9461126e6001956112798761126160405190565b998a968795869560e01b90565b8552600485016111df565b03915af49283156112f2576000936112cf575b506112c86112b66112b06112a96112a36000610f58565b87610f8f565b5194610f58565b85610f8f565b51936112c26002610f58565b90610f8f565b5191929190565b6112eb91933d8091833e6112e3818361013d565b8101906111ba565b913861128c565b611215565b6001600160401b03811161015e5760200290565b6101b56101f4916112f7565b60005b82811061132657505050565b60608282015260200161131a565b9061017761134a6113448461130b565b936112f7565b83611317565b6101f46006611334565b90611363825190565b81101561060e570160200190565b61138461137e6101f49290565b60f81b90565b6001600160f81b03191690565b90600681101561060e576020020190565b91908201809211610f8a57565b156113b657565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206461746520737472696e6760681b6044820152606490fd5b906000916113fd611350565b8390600061140a81610f58565b846114166101f4825190565b82101561150a578161143961142b828461135a565b516001600160f81b03191690565b611454611446602d611371565b916001600160f81b03191690565b149182156114e7575b82156114c3575b5050611479575b61147490610f7b565b61140a565b9295836114869186611b86565b6114908784611391565b5261149b8683611391565b506114746114bb6114b56114af6001610f58565b866113a2565b97610f7b565b93905061146b565b6114d292509061142b9161135a565b6114df6114466054611371565b148138611464565b91506114f661142b828461135a565b611503611446603a611371565b149161145d565b5050929161152f61155c92936101f496976115296115258390565b5190565b91611b86565b6115398285611391565b526115448184611391565b506115566115526005610f58565b9190565b146113af565b61158261157b61157461156e85610f58565b84611391565b5193610f58565b8093611905565b9061159a8361159461156e6001610f58565b51611905565b6115b1846115946115ab6002610f58565b85611391565b906115e1856115946115d0826115946115ca6003610f58565b89611391565b956115db6004610f58565b90611391565b9361161b565b6101f462015180610f58565b81810292918115918404141715610f8a57565b6101f4610e10610f58565b6101f4603c610f58565b61166a9361165b6116526116446101f499989661165b966116619661163e600090565b50611712565b61164c6115e7565b906115f3565b9161164c611606565b906113a2565b9161164c611611565b6113a2565b156101d457565b91908083039260009091128015828513169184121617610f8a57565b919082810192600013801591841291821691151617610f8a57565b634e487b7160e01b600052601260045260246000fd5b81156116de57600160ff1b8114600019831416610f8a570590565b6116ad565b8181029291600160ff1b81146000831216610f8a578184051490151715610f8a57565b6101f462253d8c610f58565b61171d6107b2610f58565b8110156117299061166f565b61173290610f58565b9061173c90610f58565b9161174690610f58565b611751617d4b610f58565b61175a91611676565b906105b56117696112c0610f58565b6117739083611692565b600e9161177f83610f58565b6117899087611676565b91600c9261179684610f58565b61179f916116c3565b6117a891611692565b906117b290610f58565b906117bc916116e3565b936004946117c986610f58565b6117d2916116c3565b6117db91611692565b61016f6117e86002610f58565b6117f29088611676565b6117fb85610f58565b6118059089611676565b61180e85610f58565b611817916116c3565b61182085610f58565b611829916116e3565b61183291611676565b9061183c90610f58565b90611846916116e3565b61184f83610f58565b611858916116c3565b61186191611692565b94600393611870611324610f58565b61187991611692565b9261188390610f58565b61188c91611676565b9061189690610f58565b61189f916116c3565b6118a891611692565b6118b26064610f58565b6118bb916116c3565b906118c590610f58565b906118cf916116e3565b906118d990610f58565b6118e2916116c3565b6118eb91611676565b6118f3611706565b6118fc91611676565b6101f490610f58565b6101f49190611914602e611371565b90611a04565b6102c76101f46101f49260ff1690565b6101f49060f81c61191a565b6101f46101f46101f49260ff1690565b91908203918211610f8a57565b1561195a57565b60405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606490fd5b156119a657565b60405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608490fd5b604d8111610f8a57600a0a90565b92600091611a1183610f58565b808493815b611a216101f48a5190565b811015611b22578589611a3761142b848361135a565b603090611a4661144683611371565b101580611b00575b611ab6575b5050611aa6575b611a6761142b828b61135a565b611a7a6001600160f81b03198716611446565b14611a8e575b611a8990610f7b565b611a16565b94611a9e90151587151514611953565b600194611a80565b92611ab090610f7b565b92611a5a565b61165b90611af2611aec611ae7611ae261142b89611adc611af89a9d61164c600a610f58565b9861135a565b61192a565b611936565b91610f58565b90611946565b928938611a53565b50611b0e61142b858461135a565b611b1b6114466039611371565b1115611a4e565b509650935061164c9250611b4c91506101f494611b47611b3f8290565b83111561199f565b611946565b6119f6565b906102956101b583610179565b369037565b90610177611b79611b7384611b51565b93610179565b601f190160208401611b5e565b909290611b9b611b968585611946565b611b63565b91845b845b811015611be057611bd981611bbb61142b611ba0948761135a565b611bd3611bc88a84611946565b9160001a918861135a565b53610f7b565b9050611b9e565b509350506101f4915090565b61017790611bf8610d4a565b611cdc565b6101f4906102c7565b6101f49054611bfd565b15611c1757565b60405162461bcd60e51b815260206004820152601c60248201527f4164647265737320697320616c72656164792061207769746e657373000000006044820152606490fd5b9060ff90610e19565b90611c756101f4610e3a92151590565b8254611c5c565b916001600160a01b0360089290920291821b911b610e19565b921b90565b9190611cab6101f4610e3a93610b0f565b908354611c7c565b90815491600160401b83101561015e5782611cd6916001610177950181556105eb565b90611c9a565b611d116001611d02611cfd611cf9611cf48685610c54565b611c06565b1590565b611c10565b611d0c8382610c54565b611c65565b611d1c816002611cb3565b611d4a7ff5944521c155e80db583372b9992336b6616b14dfb924a5cf6ef97b256d280349161085660405190565b0390a1565b61017790611bec565b61017790611d64610d4a565b611dee565b15611d7057565b60405162461bcd60e51b815260206004820152601860248201527f41646472657373206973206e6f742061207769746e65737300000000000000006044820152606490fd5b91906008610e19910291611c9560ff841b90565b9190611dda6101f4610e3a93151590565b908354611db5565b61017791600091611dc9565b611e186000611e13836001611e0e611e09611cf48484610c54565b611d69565b610c54565b611de2565b611e23816002611f32565b611d4a7f8b5785dce93ca82765b1cc25cedcda1b501288cb23a1fd171c0091d83900f9bd9161085660405190565b61017790611d58565b90611e75611e69610a6a845490565b92600052602060002090565b9060005b818110611e865750505090565b909192611eb3611eac600192611e9b87610ca2565b6001600160a01b0316815260200190565b9460010190565b929101611e79565b906101f491611e5a565b9061017761071192611ed660405190565b93848092611ebb565b6101f490611ec5565b634e487b7160e01b600052603160045260246000fd5b61017791600091611c9a565b80548015611f2d576000190190611f2a611f2483836105eb565b90611efe565b55565b611ee8565b611f47611f4e92611f4283611edf565b611fe5565b9092901590565b15611f905760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b61017791611fa9611f9f835490565b611af26001610f58565b90818103611fb9575b5050611f0a565b611cd6611fcc610831611fd394866105eb565b91846105eb565b3880611fb2565b6101f4600019610f58565b91908251926000611ff581610f58565b855b81101561204c5761201861200b8285610f8f565b516001600160a01b031690565b61202a6001600160a01b038616610d61565b146120425761203b611ff791610f7b565b9050611ff5565b9450505050600190565b5093505050611552611fda565b61017790612065610d4a565b61226c565b1561207157565b60405162461bcd60e51b815260206004820152601b60248201527f50726f7669646572206861736820616c726561647920616464656400000000006044820152606490fd5b9160001960089290920291821b911b610e19565b91906120db6101f4610e3a93610f58565b9083546120b6565b610177916000916120ca565b8181106120fa575050565b8061210860006001936120e3565b016120ef565b9190601f811161211d57505050565b61212f61017793600052602060002090565b906020601f840181900483019310612152575b6020601f909101045b01906120ef565b9091508190612142565b600019600883021c1916906002021790565b90612177815190565b906001600160401b03821161015e5761219a82612194855461063f565b8561210e565b602090601f83116001146121c857610e3a9291600091836121bd575b505061215c565b0151905038806121b6565b601f198316916121dd85600052602060002090565b9260005b81811061221c57509160029391856001969410612202575b50505002019055565b01516000196008601f8516021c19165b90553880806121f9565b919360206001819287870151815501950192016121e1565b9190610729576101779161216e565b90815491600160401b83101561015e5782612266916001610177950181556105eb565b90612234565b6122956003612289612284611cf9611cf486856102b5565b61206a565b611d0c836001926102b5565b6122a0816004612243565b611d4a7fc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096916107bc60405190565b61017790612059565b610177906122e3610d4a565b612334565b156122ef57565b60405162461bcd60e51b815260206004820152601760248201527f50726f76696465722068617368206e6f7420666f756e640000000000000000006044820152606490fd5b6123596000611e1383600361235461234f611cf484846102b5565b6122e8565b6102b5565b6123648160046126aa565b611d4a7f6f594b4b4f0580c66aabba75218163a99fa1fe330a171cc9e2bfd8e167db22f8916107bc60405190565b610177906122d7565b6101f4906106f7565b906123ad825490565b6123b681610edc565b926123ca6020850191600052602060002090565b6000915b8383106123db5750505050565b6001602081926123ea8561239b565b8152019201920191906123ce565b6101f4906123a4565b6101f4905461063f565b908082146124da5761241c81612401565b906001600160401b03821161015e5761243982612194855461063f565b600090601f831160011461246657610e3a92916000918361245b57505061215c565b0154905038806121b6565b9061247b601f19841692600052602060002090565b9061248b85600052602060002090565b92815b8181106124c2575091600293918560019694106124ae5750505002019055565b01546000196008601f8516021c1916612212565b9193600180602092878701548155019501920161248e565b5050565b9190610729576101779161240b565b9061250090600019906020036008021c90565b8154169055565b9060009161252561251d82600052602060002090565b92835461215c565b905555565b919290602082101561258257601f841160011461254c57610e3a92935061215c565b509061257d61017793600161257461256985600052602060002090565b92601f602091010490565b820191016120ef565b612507565b506125bb8293612599600194600052602060002090565b61214b6020601f860104820192601f8616806125c3575b50601f602091010490565b600202179055565b6125cf908886036124ed565b386125b0565b929091600160401b821161015e576020111561261c5760208110156125fd57610e3a9161215c565b60019160ff191661261384600052602060002090565b55600202019055565b60019150600202019055565b9081546126348161063f565b9081831161265d575b81831061264b575b50505050565b6126549361252a565b38808080612645565b612669838383876125d5565b61263d565b600061017791612628565b90600003610729576101779061266e565b80548015611f2d576000190190611f2a6126a483836105eb565b90612679565b611f476126bf926126ba836123f8565b612744565b156127005760405162461bcd60e51b815260206004820152601460248201527329ba3934b733903737ba1034b71030b93930bc9760611b6044820152606490fd5b6101779161270f611f9f835490565b9081810361271f575b505061268a565b61273761272f61273d93856105eb565b5091846105eb565b906124de565b3880612718565b9190825192600061275481610f58565b855b8110156127ac5761276a6115258285610f8f565b61277c612775825190565b9160200190565b20612794611552865b612790612775825190565b2090565b14612042576127a561275691610f7b565b9050612754565b509350505081199190565b156127be57565b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b156127fa57565b60405162461bcd60e51b815260206004820152601c60248201527f436c61696d496e666f206861736820646f65736e2774206d61746368000000006044820152606490fd5b1561284657565b60405162461bcd60e51b815260206004820152603560248201527f4e756d626572206f66207369676e617475726573206e6f7420657175616c20746044820152746f206e756d626572206f66207769746e657373657360581b6064820152608490fd5b156128b057565b60405162461bcd60e51b815260206004820152601960248201527f5369676e6174757265206e6f7420617070726f707269617465000000000000006044820152606490fd5b906020820190815160200151612909905190565b9160009261291684610f58565b10612920906127b7565b828080808451015196845160200151612937610ee9565b98838a01906129439152565b6020890152015161295390612efe565b925101510161296190611525565b1461296b906127f3565b61297483612a5b565b805191600292612982845490565b1461298c9061283f565b61299584610f58565b935b6129a66101f460208801515190565b851015612a405780956129b882610f58565b6129c36101f4875490565b811015612a28576129d761200b8887610f8f565b6129ea610d616103b0610831858b6105eb565b146129fd576129f890610f7b565b6129b8565b50946129a69196506020612a1d6101f492612a1860016128a9565b610f7b565b969792505050612997565b50946020612a1d6101f492612a186129a6959a6128a9565b509350505050600190565b90610177611b79610f4584610edc565b6020612a6a6000830151612b2b565b910190612a7e612a7983515190565b612a4b565b91612a896000610f58565b612a956101f483515190565b811015612ad55780612a18612ab8612ab1612ad0948651610f8f565b5186612c02565b612ac28388610f8f565b906001600160a01b03169052565b612a89565b50505090565b610195816020939052565b6101f46101f46101f49263ffffffff1690565b92612b25612b18612b2594612b25612b186101f49998612b1897610260565b600560f91b815260010190565b90610260565b6101f4612b67612b3a83611525565b612b62612b4660405190565b8092612b56602083019182612adb565b9081038252038261013d565b613130565b612b83612b7e60208501516001600160a01b031690565b612fb9565b90612b56612bbf612bae612ba96060612bb3612bae612ba960408c015163ffffffff1690565b612ae6565b61329e565b98015163ffffffff1690565b604051958694602086019485612af9565b7f19457468657265756d205369676e6564204d6573736167653a0a00000000000081526101f49291612b2591601a0182565b90612b56612c326101f493612c15600090565b50612c21612bae825190565b604051938492602084019283612bd0565b612c3d612775825190565b206101f491612c4b91612dc1565b919091612c82565b634e487b7160e01b600052602160045260246000fd5b60051115612c7357565b612c53565b9061017782612c69565b612c8c6000612c78565b612c9582612c78565b03612c9d5750565b612ca76001612c78565b612cb082612c78565b03612cfa5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b612d046002612c78565b612d0d82612c78565b03612d575760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b612d6a612d646003612c78565b91612c78565b14612d7157565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b908051612dd16115526041610f58565b03612df757612df3916020820151906060604084015193015160001a90612e36565b9091565b5050612e036000610cd3565b90600290565b612e3261017794610393606094989795612e28608086019a6000870152565b60ff166020850152565b0152565b919291612e42836118fc565b612e6e6115527f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0610f58565b11612ed257612e8e600093602095612e8560405190565b94859485612e09565b838052039060015afa156112f25760005190600091612eac83610cd3565b6001600160a01b0381166001600160a01b03831614612eca57509190565b925050600190565b50505050612ee06000610cd3565b90600390565b6101f49392612b25612b18612b1893612b2595610260565b8051602082015160409283015192516127859290612b5690948593602085019384612ee6565b6101f49081906001600160a01b031681565b60ff8111610f8a5760020a90565b905b9081156116de570490565b61138461137e6101f49260ff1690565b612f469060ff165b9160ff1690565b612f7c9060ff16612f69565b029060ff8216918203610f8a57565b612f979060ff16612f69565b90039060ff8211610f8a57565b61060f60f31b81526101f49190600201612b25565b90612fc7611b966028610f58565b600092612fd384610f58565b612fdd6014610f58565b8110156130d45780613037611bd36130c56130bb6130cf956130376130b58c8b6130af613051611ae261304c8f61301e61301961304792610b06565b612f24565b61304161303c6008613037611aec8f611b476013610f58565b6115f3565b612f36565b90612f44565b6110e5565b612f51565b9261309a61309461304c60109661308e61307661304c6130708b6110e5565b84612f61565b986130896130838b61192a565b916110e5565b612f70565b90612f8b565b9461323a565b6130a78860029d8e610f58565b911a9261135a565b5361323a565b95610f58565b61165b6001610f58565b91881a918661135a565b612fd3565b50506101f49192506101f46130e860405190565b8092612b56602083019182612fa4565b6131026010611b51565b6f181899199a1a9b1b9c1cb0b131b232b360811b602082015290565b6101f46130f8565b81156116de570690565b90815191613146611b9660029461164c86610f58565b9061314f61311e565b60009161315b83610f58565b6131666101f4835190565b81101561320c57806131a661142b6131a061318a611ae261142b613207978961135a565b61319b613195895190565b91611936565b612f44565b8661135a565b6131c56131bb6131b58b610f58565b846115f3565b91871a918861135a565b536131ef61142b6131a06131df611ae261142b868961135a565b6131ea613195895190565b613126565b611bd36131bb6130bb6132018c610f58565b856115f3565b61315b565b505050506101f49192506101f46130e860405190565b61322e9060ff16612f69565b019060ff8211610f8a57565b6132439061192a565b61324d600a6110e5565b60ff8216101561326e5761304c6101f49161326860306110e5565b90613222565b61304c6101f49161326860576110e5565b6132896001611b51565b600360fc1b602082015290565b6101f461327f565b6000916132aa83610f58565b821461337257908060005b6132be85610f58565b83146132e1576132d06132db91610f7b565b92613041600a610f58565b916132b5565b91506132ec82611b63565b915b6132f785610f58565b82146133675761330e61336191611af26001610f58565b91613041600a8461335b61335261304c603061334d61308361304761334761333e6133388b610f58565b8d612f44565b61164c8b610f58565b8b611946565b613222565b8a1a918861135a565b53610f58565b906132ee565b50506101f491925090565b9150506101f4613296565b9061338c611e69610a6a845490565b9060005b81811061339d5750505090565b9091926133b2611eac600192611e9b87610ca2565b929101613390565b906101f49161337d565b90610177610711926133d560405190565b938480926133ba565b6101f4906133c4565b6101f460026133de565b906133fa825490565b61340381610edc565b926134176020850191600052602060002090565b6000915b8383106134285750505050565b6001602081926134378561239b565b81520192019201919061341b565b6101f4906133f1565b6101f46004613445565b611cf46101f491613467600090565b5060036102b5565b9061347b6109a8835190565b908161348d6020830284019460200190565b926000915b8383106134a157505050505090565b909192939460206134bd6109f483856001950387528951610b87565b9301930191939290613492565b60208082526101f49291019061346f565b80151561039c565b90505190610177826134db565b906020828203126101d4576101f4916134e3565b1561350b57565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b61356c61355c60405190565b8092612b566020830191826134ca565b613577612775825190565b206135a17f0000000000000000000000000000000000000000000000000000000000000000610b0f565b9063169394bb6135ba6135b360405190565b9160e01b90565b815260048101829052602081602481865afa9081156112f2576135ec916135e79160009161365157501590565b613504565b635bd4df3290823b156101d4576136289261361a6000809461360d60405190565b9687958694859360e01b90565b835260048301526024820190565b03925af180156112f2576136395750565b610177906000613649818361013d565b81019061086d565b611cf9915060203d8111613672575b61366a818361013d565b8101906134f0565b503d61366056fea2646970667358221220ac32ca16a78f612ec68240d59214076e1784464c21ff8fabfeff4b46fd239e1c64736f6c63430008120033", "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c80631cba9bed146101225780632ca6927d1461011d57806350262c001461011857806357c6e12a1461011357806359e26be11461010e578063670a8cb714610109578063715018a6146101045780637b103999146100ff5780637de24fcf146100fa5780638da5cb5b146100f557806396d195bd146100f0578063b870676c146100eb578063bd6e7741146100e6578063c2107e73146100e1578063ee2f13cd146100dc578063f2fde38b146100d75763fa7643f4036101d457610c7e565b610c3c565b610c24565b610bfd565b610b6f565b610b31565b610acb565b610a40565b610a19565b610890565b610878565b610837565b6107d9565b61079d565b6105a6565b6102ef565b61021c565b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b0382111761015e57604052565b610127565b9061017761017060405190565b928361013d565b565b6001600160401b03811161015e57602090601f01601f19160190565b0190565b90826000939282370152565b909291926101ba6101b582610179565b610163565b938185526020850190828401116101d45761017792610199565b600080fd5b9080601f830112156101d4578160206101f4933591016101a5565b90565b906020828203126101d45781356001600160401b0381116101d4576101f492016101d9565b346101d45761023461022f3660046101f7565b612392565b604051005b0390f35b60005b8381106102505750506000910152565b8181015183820152602001610240565b61019561027892602092610272815190565b94859290565b9384910161023d565b9052565b6102956101959160209493610260565b918252565b6102af6102a660405190565b92839283610285565b03902090565b6101f49161029a565b6101f4916008021c5b60ff1690565b906101f491546102be565b6101f4906102ea6003916000926102b5565b6102cd565b346101d45761023961030a6103053660046101f7565b6102d8565b60405191829182901515815260200190565b9190916060818403126101d4576103336060610163565b9281356001600160401b0381116101d457816103509184016101d9565b845260208201356001600160401b0381116101d457816103719184016101d9565b602085015260408201356001600160401b0381116101d45761039392016101d9565b6040830152565b805b036101d457565b905035906101778261039a565b6001600160a01b031690565b6001600160a01b03811661039c565b90503590610177826103bc565b63ffffffff811661039c565b90503590610177826103d8565b9190916080818403126101d45761044a61040b6080610163565b93600061041882856103a3565b90860152602061042a828286016103cb565b90860152604061043c828286016103e4565b9086015260608093016103e4565b90830152565b6001600160401b03811161015e5760208091020190565b9291906104766101b582610450565b93818552602080860192028101918383116101d45781905b83821061049c575050505050565b81356001600160401b0381116101d4576020916104bc87849387016101d9565b81520191019061048e565b9080601f830112156101d4578160206101f493359101610467565b91909160a0818403126101d4576104f96040610163565b92600061050682846103f1565b9085015260808201356001600160401b0381116101d45761052792016104c7565b6020830152565b9190916040818403126101d4576105456040610163565b9281356001600160401b0381116101d4578161056291840161031c565b845260208201356001600160401b0381116101d45761052792016104e2565b906020828203126101d45781356001600160401b0381116101d4576101f4920161052e565b346101d45761023961030a6105bc366004610581565b6128f5565b906020828203126101d4576101f4916103a3565b634e487b7160e01b600052603260045260246000fd5b805482101561060e57610605600191600052602060002090565b91020190600090565b6105d5565b634e487b7160e01b600052600060045260246000fd5b634e487b7160e01b600052602260045260246000fd5b906001600283049216801561065f575b602083101461065a57565b610629565b91607f169161064f565b8054600093929161068661067c8361063f565b8085529360200190565b91600181169081156106d8575060011461069f57505050565b6106b29192939450600052602060002090565b916000925b8184106106c45750500190565b8054848401526020909301926001016106b7565b92949550505060ff1916825215156020020190565b906101f491610669565b906101776107119261070860405190565b938480926106ed565b038361013d565b90600010610729576101f4906106f7565b610613565b6004600061073a825490565b83101561075557506101f49161074f916105eb565b90610718565b80fd5b6107796107826020936101959361076d815190565b80835293849260200190565b9586910161023d565b601f01601f191690565b60208082526101f492910190610758565b346101d4576102396107b86107b33660046105c1565b61072e565b6040515b9182918261078c565b906020828203126101d4576101f4916103cb565b346101d4576102346107ec3660046107c5565b611d4f565b6101f4916008021c6001600160a01b031690565b906101f491546107f1565b6002600061081c825490565b83101561075557506101f491610831916105eb565b90610805565b346101d45761023961085261084d3660046105c1565b610810565b6040515b918291826001600160a01b03909116815260200190565b60009103126101d457565b346101d45761088836600461086d565b610234610cee565b346101d4576108a036600461086d565b6102397f0000000000000000000000000000000000000000000000000000000000000000610852565b9291906108d86101b582610450565b93818552602080860192028101918383116101d45781905b8382106108fe575050505050565b81356001600160401b0381116101d45760209161091e878493870161052e565b8152019101906108f0565b9080601f830112156101d4578160206101f4933591016108c9565b906020828203126101d45781356001600160401b0381116101d4576101f49201610929565b906101f49060208061098a6040840160008701518582036000870152610758565b940151910152565b906101f491610969565b906109b26109a8835190565b8083529160200190565b90816109c46020830284019460200190565b926000915b8383106109d857505050505090565b909192939460206109fb6109f483856001950387528951610992565b9760200190565b93019301919392906109c9565b60208082526101f49291019061099c565b346101d457610239610a34610a2f366004610944565b610fed565b60405191829182610a08565b346101d457610a5036600461086d565b610239610852610cac565b90610a7b610a74610a6a845190565b8084529260200190565b9260200190565b9060005b818110610a8c5750505090565b909192610ab2610aab60019286516001600160a01b0316815260200190565b9460200190565b929101610a7f565b60208082526101f492910190610a5b565b346101d457610adb36600461086d565b610239610ae66133e7565b60405191829182610aba565b6101f4906103b0906001600160a01b031682565b6101f490610af2565b6101f490610b06565b61028190610b0f565b6020810192916101779190610b18565b346101d457610b4136600461086d565b604051806102397f000000000000000000000000000000000000000000000000000000000000000082610b21565b346101d457610234610b823660046101f7565b6122ce565b906101f491610758565b90610b9d6109a8835190565b9081610baf6020830284019460200190565b926000915b838310610bc357505050505090565b90919293946020610bdf6109f483856001950387528951610b87565b9301930191939290610bb4565b60208082526101f492910190610b91565b346101d457610c0d36600461086d565b610239610c1861344e565b60405191829182610bec565b346101d457610234610c373660046107c5565b611e51565b346101d457610234610c4f3660046107c5565b610e05565b90610c5e90610b0f565b600052602052604060002090565b6101f4906102ea600191600092610c54565b346101d45761023961030a610c943660046107c5565b610c6c565b6101f4906103b0565b6101f49054610c99565b6101f46000610ca2565b610cbe610d4a565b610177610cdc565b6103b06101f46101f49290565b6101f490610cc6565b610177610ce96000610cd3565b610e3e565b610177610cb6565b15610cfd57565b60405162461bcd60e51b815280610d46600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b0390fd5b610177610d55610cac565b610d6e610d61336103b0565b916001600160a01b031690565b14610cf6565b61017790610d80610d4a565b610de0565b15610d8c57565b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b61017790610ce9610df46103b06000610cd3565b6001600160a01b0383161415610d85565b61017790610d74565b906001600160a01b03905b9181191691161790565b90610e336101f4610e3a92610b0f565b8254610e0e565b9055565b610e486000610ca2565b90610e54816000610e23565b610e87610e817f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093610b0f565b91610b0f565b91610e9160405190565b600090a3565b15610e9e57565b60405162461bcd60e51b815260206004820152601660248201527513db9b1e481c9959da5cdd1c9e4818d85b8818d85b1b60521b6044820152606490fd5b906102956101b583610450565b6101f46040610163565b610efb610ee9565b906060825260006020830152565b6101f4610ef3565b60005b828110610f2057505050565b602090610f2b610f09565b8184015201610f14565b90610177610f4b610f4584610edc565b93610450565b601f190160208401610f11565b6101f46101f46101f49290565b634e487b7160e01b600052601160045260246000fd5b6000198114610f8a5760010190565b610f65565b90610f98825190565b81101561060e576020809102010190565b15610fb057565b60405162461bcd60e51b815260206004820152601560248201527409cde40ecc2d8d2c840e0e4deecd2c8cae490c2e6d605b1b6044820152606490fd5b9061102a336110246001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016610d61565b14610e97565b61103a611035835190565b610f35565b916000908361104883610f58565b6110536101f4845190565b8110156110de578061109e6110be6110ac6110996110a760208061107a6110d9998c610f8f565b51611084816128f5565b5061108e81611221565b999199969096613458565b610fa9565b01510151613550565b6113f1565b6105276110b7610ee9565b9389850152565b6110c88289610f8f565b526110d38188610f8f565b50610f7b565b611048565b5093505050565b6102c76101f46101f49290565b6101f460056110e5565b9092919261110c6101b582610179565b938185526020850190828401116101d4576101779261023d565b9080601f830112156101d45781516101f4926020016110fc565b92919061114f6101b582610450565b93818552602080860192028101918383116101d45781905b838210611175575050505050565b81516001600160401b0381116101d4576020916111958784938701611126565b815201910190611167565b9080601f830112156101d45781516101f492602001611140565b906020828203126101d45781516001600160401b0381116101d4576101f492016111a0565b60409061120d6112016101779597969460608401908482036000860152610758565b60ff9097166020830152565b019015159052565b6040513d6000823e3d90fd5b516040015173__$5b71c94e19686701747fb081826a62a8ff$__91634be6d4f89160009061124d6110f2565b9461126e6001956112798761126160405190565b998a968795869560e01b90565b8552600485016111df565b03915af49283156112f2576000936112cf575b506112c86112b66112b06112a96112a36000610f58565b87610f8f565b5194610f58565b85610f8f565b51936112c26002610f58565b90610f8f565b5191929190565b6112eb91933d8091833e6112e3818361013d565b8101906111ba565b913861128c565b611215565b6001600160401b03811161015e5760200290565b6101b56101f4916112f7565b60005b82811061132657505050565b60608282015260200161131a565b9061017761134a6113448461130b565b936112f7565b83611317565b6101f46006611334565b90611363825190565b81101561060e570160200190565b61138461137e6101f49290565b60f81b90565b6001600160f81b03191690565b90600681101561060e576020020190565b91908201809211610f8a57565b156113b657565b60405162461bcd60e51b8152602060048201526013602482015272496e76616c6964206461746520737472696e6760681b6044820152606490fd5b906000916113fd611350565b8390600061140a81610f58565b846114166101f4825190565b82101561150a578161143961142b828461135a565b516001600160f81b03191690565b611454611446602d611371565b916001600160f81b03191690565b149182156114e7575b82156114c3575b5050611479575b61147490610f7b565b61140a565b9295836114869186611b86565b6114908784611391565b5261149b8683611391565b506114746114bb6114b56114af6001610f58565b866113a2565b97610f7b565b93905061146b565b6114d292509061142b9161135a565b6114df6114466054611371565b148138611464565b91506114f661142b828461135a565b611503611446603a611371565b149161145d565b5050929161152f61155c92936101f496976115296115258390565b5190565b91611b86565b6115398285611391565b526115448184611391565b506115566115526005610f58565b9190565b146113af565b61158261157b61157461156e85610f58565b84611391565b5193610f58565b8093611905565b9061159a8361159461156e6001610f58565b51611905565b6115b1846115946115ab6002610f58565b85611391565b906115e1856115946115d0826115946115ca6003610f58565b89611391565b956115db6004610f58565b90611391565b9361161b565b6101f462015180610f58565b81810292918115918404141715610f8a57565b6101f4610e10610f58565b6101f4603c610f58565b61166a9361165b6116526116446101f499989661165b966116619661163e600090565b50611712565b61164c6115e7565b906115f3565b9161164c611606565b906113a2565b9161164c611611565b6113a2565b156101d457565b91908083039260009091128015828513169184121617610f8a57565b919082810192600013801591841291821691151617610f8a57565b634e487b7160e01b600052601260045260246000fd5b81156116de57600160ff1b8114600019831416610f8a570590565b6116ad565b8181029291600160ff1b81146000831216610f8a578184051490151715610f8a57565b6101f462253d8c610f58565b61171d6107b2610f58565b8110156117299061166f565b61173290610f58565b9061173c90610f58565b9161174690610f58565b611751617d4b610f58565b61175a91611676565b906105b56117696112c0610f58565b6117739083611692565b600e9161177f83610f58565b6117899087611676565b91600c9261179684610f58565b61179f916116c3565b6117a891611692565b906117b290610f58565b906117bc916116e3565b936004946117c986610f58565b6117d2916116c3565b6117db91611692565b61016f6117e86002610f58565b6117f29088611676565b6117fb85610f58565b6118059089611676565b61180e85610f58565b611817916116c3565b61182085610f58565b611829916116e3565b61183291611676565b9061183c90610f58565b90611846916116e3565b61184f83610f58565b611858916116c3565b61186191611692565b94600393611870611324610f58565b61187991611692565b9261188390610f58565b61188c91611676565b9061189690610f58565b61189f916116c3565b6118a891611692565b6118b26064610f58565b6118bb916116c3565b906118c590610f58565b906118cf916116e3565b906118d990610f58565b6118e2916116c3565b6118eb91611676565b6118f3611706565b6118fc91611676565b6101f490610f58565b6101f49190611914602e611371565b90611a04565b6102c76101f46101f49260ff1690565b6101f49060f81c61191a565b6101f46101f46101f49260ff1690565b91908203918211610f8a57565b1561195a57565b60405162461bcd60e51b815260206004820152601c60248201527f537472696e6720686173206d756c7469706c6520646563696d616c73000000006044820152606490fd5b156119a657565b60405162461bcd60e51b815260206004820152602260248201527f537472696e672068617320746f6f206d616e7920646563696d616c20706c6163604482015261657360f01b6064820152608490fd5b604d8111610f8a57600a0a90565b92600091611a1183610f58565b808493815b611a216101f48a5190565b811015611b22578589611a3761142b848361135a565b603090611a4661144683611371565b101580611b00575b611ab6575b5050611aa6575b611a6761142b828b61135a565b611a7a6001600160f81b03198716611446565b14611a8e575b611a8990610f7b565b611a16565b94611a9e90151587151514611953565b600194611a80565b92611ab090610f7b565b92611a5a565b61165b90611af2611aec611ae7611ae261142b89611adc611af89a9d61164c600a610f58565b9861135a565b61192a565b611936565b91610f58565b90611946565b928938611a53565b50611b0e61142b858461135a565b611b1b6114466039611371565b1115611a4e565b509650935061164c9250611b4c91506101f494611b47611b3f8290565b83111561199f565b611946565b6119f6565b906102956101b583610179565b369037565b90610177611b79611b7384611b51565b93610179565b601f190160208401611b5e565b909290611b9b611b968585611946565b611b63565b91845b845b811015611be057611bd981611bbb61142b611ba0948761135a565b611bd3611bc88a84611946565b9160001a918861135a565b53610f7b565b9050611b9e565b509350506101f4915090565b61017790611bf8610d4a565b611cdc565b6101f4906102c7565b6101f49054611bfd565b15611c1757565b60405162461bcd60e51b815260206004820152601c60248201527f4164647265737320697320616c72656164792061207769746e657373000000006044820152606490fd5b9060ff90610e19565b90611c756101f4610e3a92151590565b8254611c5c565b916001600160a01b0360089290920291821b911b610e19565b921b90565b9190611cab6101f4610e3a93610b0f565b908354611c7c565b90815491600160401b83101561015e5782611cd6916001610177950181556105eb565b90611c9a565b611d116001611d02611cfd611cf9611cf48685610c54565b611c06565b1590565b611c10565b611d0c8382610c54565b611c65565b611d1c816002611cb3565b611d4a7ff5944521c155e80db583372b9992336b6616b14dfb924a5cf6ef97b256d280349161085660405190565b0390a1565b61017790611bec565b61017790611d64610d4a565b611dee565b15611d7057565b60405162461bcd60e51b815260206004820152601860248201527f41646472657373206973206e6f742061207769746e65737300000000000000006044820152606490fd5b91906008610e19910291611c9560ff841b90565b9190611dda6101f4610e3a93151590565b908354611db5565b61017791600091611dc9565b611e186000611e13836001611e0e611e09611cf48484610c54565b611d69565b610c54565b611de2565b611e23816002611f32565b611d4a7f8b5785dce93ca82765b1cc25cedcda1b501288cb23a1fd171c0091d83900f9bd9161085660405190565b61017790611d58565b90611e75611e69610a6a845490565b92600052602060002090565b9060005b818110611e865750505090565b909192611eb3611eac600192611e9b87610ca2565b6001600160a01b0316815260200190565b9460010190565b929101611e79565b906101f491611e5a565b9061017761071192611ed660405190565b93848092611ebb565b6101f490611ec5565b634e487b7160e01b600052603160045260246000fd5b61017791600091611c9a565b80548015611f2d576000190190611f2a611f2483836105eb565b90611efe565b55565b611ee8565b611f47611f4e92611f4283611edf565b611fe5565b9092901590565b15611f905760405162461bcd60e51b815260206004820152601560248201527420b2323932b9b9903737ba1034b71030b93930bc9760591b6044820152606490fd5b61017791611fa9611f9f835490565b611af26001610f58565b90818103611fb9575b5050611f0a565b611cd6611fcc610831611fd394866105eb565b91846105eb565b3880611fb2565b6101f4600019610f58565b91908251926000611ff581610f58565b855b81101561204c5761201861200b8285610f8f565b516001600160a01b031690565b61202a6001600160a01b038616610d61565b146120425761203b611ff791610f7b565b9050611ff5565b9450505050600190565b5093505050611552611fda565b61017790612065610d4a565b61226c565b1561207157565b60405162461bcd60e51b815260206004820152601b60248201527f50726f7669646572206861736820616c726561647920616464656400000000006044820152606490fd5b9160001960089290920291821b911b610e19565b91906120db6101f4610e3a93610f58565b9083546120b6565b610177916000916120ca565b8181106120fa575050565b8061210860006001936120e3565b016120ef565b9190601f811161211d57505050565b61212f61017793600052602060002090565b906020601f840181900483019310612152575b6020601f909101045b01906120ef565b9091508190612142565b600019600883021c1916906002021790565b90612177815190565b906001600160401b03821161015e5761219a82612194855461063f565b8561210e565b602090601f83116001146121c857610e3a9291600091836121bd575b505061215c565b0151905038806121b6565b601f198316916121dd85600052602060002090565b9260005b81811061221c57509160029391856001969410612202575b50505002019055565b01516000196008601f8516021c19165b90553880806121f9565b919360206001819287870151815501950192016121e1565b9190610729576101779161216e565b90815491600160401b83101561015e5782612266916001610177950181556105eb565b90612234565b6122956003612289612284611cf9611cf486856102b5565b61206a565b611d0c836001926102b5565b6122a0816004612243565b611d4a7fc9e1c78701d1853eeb1eb35ad3449e4b336281f672d5837243d21239dc6f4096916107bc60405190565b61017790612059565b610177906122e3610d4a565b612334565b156122ef57565b60405162461bcd60e51b815260206004820152601760248201527f50726f76696465722068617368206e6f7420666f756e640000000000000000006044820152606490fd5b6123596000611e1383600361235461234f611cf484846102b5565b6122e8565b6102b5565b6123648160046126aa565b611d4a7f6f594b4b4f0580c66aabba75218163a99fa1fe330a171cc9e2bfd8e167db22f8916107bc60405190565b610177906122d7565b6101f4906106f7565b906123ad825490565b6123b681610edc565b926123ca6020850191600052602060002090565b6000915b8383106123db5750505050565b6001602081926123ea8561239b565b8152019201920191906123ce565b6101f4906123a4565b6101f4905461063f565b908082146124da5761241c81612401565b906001600160401b03821161015e5761243982612194855461063f565b600090601f831160011461246657610e3a92916000918361245b57505061215c565b0154905038806121b6565b9061247b601f19841692600052602060002090565b9061248b85600052602060002090565b92815b8181106124c2575091600293918560019694106124ae5750505002019055565b01546000196008601f8516021c1916612212565b9193600180602092878701548155019501920161248e565b5050565b9190610729576101779161240b565b9061250090600019906020036008021c90565b8154169055565b9060009161252561251d82600052602060002090565b92835461215c565b905555565b919290602082101561258257601f841160011461254c57610e3a92935061215c565b509061257d61017793600161257461256985600052602060002090565b92601f602091010490565b820191016120ef565b612507565b506125bb8293612599600194600052602060002090565b61214b6020601f860104820192601f8616806125c3575b50601f602091010490565b600202179055565b6125cf908886036124ed565b386125b0565b929091600160401b821161015e576020111561261c5760208110156125fd57610e3a9161215c565b60019160ff191661261384600052602060002090565b55600202019055565b60019150600202019055565b9081546126348161063f565b9081831161265d575b81831061264b575b50505050565b6126549361252a565b38808080612645565b612669838383876125d5565b61263d565b600061017791612628565b90600003610729576101779061266e565b80548015611f2d576000190190611f2a6126a483836105eb565b90612679565b611f476126bf926126ba836123f8565b612744565b156127005760405162461bcd60e51b815260206004820152601460248201527329ba3934b733903737ba1034b71030b93930bc9760611b6044820152606490fd5b6101779161270f611f9f835490565b9081810361271f575b505061268a565b61273761272f61273d93856105eb565b5091846105eb565b906124de565b3880612718565b9190825192600061275481610f58565b855b8110156127ac5761276a6115258285610f8f565b61277c612775825190565b9160200190565b20612794611552865b612790612775825190565b2090565b14612042576127a561275691610f7b565b9050612754565b509350505081199190565b156127be57565b60405162461bcd60e51b815260206004820152600d60248201526c4e6f207369676e61747572657360981b6044820152606490fd5b156127fa57565b60405162461bcd60e51b815260206004820152601c60248201527f436c61696d496e666f206861736820646f65736e2774206d61746368000000006044820152606490fd5b1561284657565b60405162461bcd60e51b815260206004820152603560248201527f4e756d626572206f66207369676e617475726573206e6f7420657175616c20746044820152746f206e756d626572206f66207769746e657373657360581b6064820152608490fd5b156128b057565b60405162461bcd60e51b815260206004820152601960248201527f5369676e6174757265206e6f7420617070726f707269617465000000000000006044820152606490fd5b906020820190815160200151612909905190565b9160009261291684610f58565b10612920906127b7565b828080808451015196845160200151612937610ee9565b98838a01906129439152565b6020890152015161295390612efe565b925101510161296190611525565b1461296b906127f3565b61297483612a5b565b805191600292612982845490565b1461298c9061283f565b61299584610f58565b935b6129a66101f460208801515190565b851015612a405780956129b882610f58565b6129c36101f4875490565b811015612a28576129d761200b8887610f8f565b6129ea610d616103b0610831858b6105eb565b146129fd576129f890610f7b565b6129b8565b50946129a69196506020612a1d6101f492612a1860016128a9565b610f7b565b969792505050612997565b50946020612a1d6101f492612a186129a6959a6128a9565b509350505050600190565b90610177611b79610f4584610edc565b6020612a6a6000830151612b2b565b910190612a7e612a7983515190565b612a4b565b91612a896000610f58565b612a956101f483515190565b811015612ad55780612a18612ab8612ab1612ad0948651610f8f565b5186612c02565b612ac28388610f8f565b906001600160a01b03169052565b612a89565b50505090565b610195816020939052565b6101f46101f46101f49263ffffffff1690565b92612b25612b18612b2594612b25612b186101f49998612b1897610260565b600560f91b815260010190565b90610260565b6101f4612b67612b3a83611525565b612b62612b4660405190565b8092612b56602083019182612adb565b9081038252038261013d565b613130565b612b83612b7e60208501516001600160a01b031690565b612fb9565b90612b56612bbf612bae612ba96060612bb3612bae612ba960408c015163ffffffff1690565b612ae6565b61329e565b98015163ffffffff1690565b604051958694602086019485612af9565b7f19457468657265756d205369676e6564204d6573736167653a0a00000000000081526101f49291612b2591601a0182565b90612b56612c326101f493612c15600090565b50612c21612bae825190565b604051938492602084019283612bd0565b612c3d612775825190565b206101f491612c4b91612dc1565b919091612c82565b634e487b7160e01b600052602160045260246000fd5b60051115612c7357565b612c53565b9061017782612c69565b612c8c6000612c78565b612c9582612c78565b03612c9d5750565b612ca76001612c78565b612cb082612c78565b03612cfa5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606490fd5b612d046002612c78565b612d0d82612c78565b03612d575760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606490fd5b612d6a612d646003612c78565b91612c78565b14612d7157565b60405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608490fd5b908051612dd16115526041610f58565b03612df757612df3916020820151906060604084015193015160001a90612e36565b9091565b5050612e036000610cd3565b90600290565b612e3261017794610393606094989795612e28608086019a6000870152565b60ff166020850152565b0152565b919291612e42836118fc565b612e6e6115527f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0610f58565b11612ed257612e8e600093602095612e8560405190565b94859485612e09565b838052039060015afa156112f25760005190600091612eac83610cd3565b6001600160a01b0381166001600160a01b03831614612eca57509190565b925050600190565b50505050612ee06000610cd3565b90600390565b6101f49392612b25612b18612b1893612b2595610260565b8051602082015160409283015192516127859290612b5690948593602085019384612ee6565b6101f49081906001600160a01b031681565b60ff8111610f8a5760020a90565b905b9081156116de570490565b61138461137e6101f49260ff1690565b612f469060ff165b9160ff1690565b612f7c9060ff16612f69565b029060ff8216918203610f8a57565b612f979060ff16612f69565b90039060ff8211610f8a57565b61060f60f31b81526101f49190600201612b25565b90612fc7611b966028610f58565b600092612fd384610f58565b612fdd6014610f58565b8110156130d45780613037611bd36130c56130bb6130cf956130376130b58c8b6130af613051611ae261304c8f61301e61301961304792610b06565b612f24565b61304161303c6008613037611aec8f611b476013610f58565b6115f3565b612f36565b90612f44565b6110e5565b612f51565b9261309a61309461304c60109661308e61307661304c6130708b6110e5565b84612f61565b986130896130838b61192a565b916110e5565b612f70565b90612f8b565b9461323a565b6130a78860029d8e610f58565b911a9261135a565b5361323a565b95610f58565b61165b6001610f58565b91881a918661135a565b612fd3565b50506101f49192506101f46130e860405190565b8092612b56602083019182612fa4565b6131026010611b51565b6f181899199a1a9b1b9c1cb0b131b232b360811b602082015290565b6101f46130f8565b81156116de570690565b90815191613146611b9660029461164c86610f58565b9061314f61311e565b60009161315b83610f58565b6131666101f4835190565b81101561320c57806131a661142b6131a061318a611ae261142b613207978961135a565b61319b613195895190565b91611936565b612f44565b8661135a565b6131c56131bb6131b58b610f58565b846115f3565b91871a918861135a565b536131ef61142b6131a06131df611ae261142b868961135a565b6131ea613195895190565b613126565b611bd36131bb6130bb6132018c610f58565b856115f3565b61315b565b505050506101f49192506101f46130e860405190565b61322e9060ff16612f69565b019060ff8211610f8a57565b6132439061192a565b61324d600a6110e5565b60ff8216101561326e5761304c6101f49161326860306110e5565b90613222565b61304c6101f49161326860576110e5565b6132896001611b51565b600360fc1b602082015290565b6101f461327f565b6000916132aa83610f58565b821461337257908060005b6132be85610f58565b83146132e1576132d06132db91610f7b565b92613041600a610f58565b916132b5565b91506132ec82611b63565b915b6132f785610f58565b82146133675761330e61336191611af26001610f58565b91613041600a8461335b61335261304c603061334d61308361304761334761333e6133388b610f58565b8d612f44565b61164c8b610f58565b8b611946565b613222565b8a1a918861135a565b53610f58565b906132ee565b50506101f491925090565b9150506101f4613296565b9061338c611e69610a6a845490565b9060005b81811061339d5750505090565b9091926133b2611eac600192611e9b87610ca2565b929101613390565b906101f49161337d565b90610177610711926133d560405190565b938480926133ba565b6101f4906133c4565b6101f460026133de565b906133fa825490565b61340381610edc565b926134176020850191600052602060002090565b6000915b8383106134285750505050565b6001602081926134378561239b565b81520192019201919061341b565b6101f4906133f1565b6101f46004613445565b611cf46101f491613467600090565b5060036102b5565b9061347b6109a8835190565b908161348d6020830284019460200190565b926000915b8383106134a157505050505090565b909192939460206134bd6109f483856001950387528951610b87565b9301930191939290613492565b60208082526101f49291019061346f565b80151561039c565b90505190610177826134db565b906020828203126101d4576101f4916134e3565b1561350b57565b60405162461bcd60e51b815260206004820152601f60248201527f4e756c6c69666965722068617320616c7265616479206265656e2075736564006044820152606490fd5b61356c61355c60405190565b8092612b566020830191826134ca565b613577612775825190565b206135a17f0000000000000000000000000000000000000000000000000000000000000000610b0f565b9063169394bb6135ba6135b360405190565b9160e01b90565b815260048101829052602081602481865afa9081156112f2576135ec916135e79160009161365157501590565b613504565b635bd4df3290823b156101d4576136289261361a6000809461360d60405190565b9687958694859360e01b90565b835260048301526024820190565b03925af180156112f2576136395750565b610177906000613649818361013d565b81019061086d565b611cf9915060203d8111613672575b61366a818361013d565b8101906134f0565b503d61366056fea2646970667358221220ac32ca16a78f612ec68240d59214076e1784464c21ff8fabfeff4b46fd239e1c64736f6c63430008120033", "libraries": { - "ClaimVerifier": "0x8985018D19DcB645ddC3Eb486c434CB5f5EdA5C2" + "ClaimVerifier": "0x71D6e2056e7138F1F489EE98658D4832348b3435" }, "devdoc": { "kind": "dev", @@ -1911,7 +1911,7 @@ "type": "t_address" }, { - "astId": 10817, + "astId": 11343, "contract": "contracts/VerifyDomainProcessor.sol:VerifyDomainProcessor", "label": "isWitness", "offset": 0, @@ -1919,7 +1919,7 @@ "type": "t_mapping(t_address,t_bool)" }, { - "astId": 10820, + "astId": 11346, "contract": "contracts/VerifyDomainProcessor.sol:VerifyDomainProcessor", "label": "witnesses", "offset": 0, @@ -1927,7 +1927,7 @@ "type": "t_array(t_address)dyn_storage" }, { - "astId": 10824, + "astId": 11350, "contract": "contracts/VerifyDomainProcessor.sol:VerifyDomainProcessor", "label": "isProviderHash", "offset": 0, @@ -1935,7 +1935,7 @@ "type": "t_mapping(t_string_memory_ptr,t_bool)" }, { - "astId": 10827, + "astId": 11353, "contract": "contracts/VerifyDomainProcessor.sol:VerifyDomainProcessor", "label": "providerHashes", "offset": 0, diff --git a/contracts-domain/deployments/sepolia/solcInputs/94f2ab4a7d0631bb0f005df865d91ba9.json b/contracts-domain/deployments/sepolia/solcInputs/94f2ab4a7d0631bb0f005df865d91ba9.json deleted file mode 100644 index 1cfc648af..000000000 --- a/contracts-domain/deployments/sepolia/solcInputs/94f2ab4a7d0631bb0f005df865d91ba9.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "language": "Solidity", - "sources": { - "@openzeppelin/contracts/access/Ownable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" - }, - "@openzeppelin/contracts/security/Pausable.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract Pausable is Context {\n /**\n * @dev Emitted when the pause is triggered by `account`.\n */\n event Paused(address account);\n\n /**\n * @dev Emitted when the pause is lifted by `account`.\n */\n event Unpaused(address account);\n\n bool private _paused;\n\n /**\n * @dev Initializes the contract in unpaused state.\n */\n constructor() {\n _paused = false;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is not paused.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n modifier whenNotPaused() {\n _requireNotPaused();\n _;\n }\n\n /**\n * @dev Modifier to make a function callable only when the contract is paused.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n modifier whenPaused() {\n _requirePaused();\n _;\n }\n\n /**\n * @dev Returns true if the contract is paused, and false otherwise.\n */\n function paused() public view virtual returns (bool) {\n return _paused;\n }\n\n /**\n * @dev Throws if the contract is paused.\n */\n function _requireNotPaused() internal view virtual {\n require(!paused(), \"Pausable: paused\");\n }\n\n /**\n * @dev Throws if the contract is not paused.\n */\n function _requirePaused() internal view virtual {\n require(paused(), \"Pausable: not paused\");\n }\n\n /**\n * @dev Triggers stopped state.\n *\n * Requirements:\n *\n * - The contract must not be paused.\n */\n function _pause() internal virtual whenNotPaused {\n _paused = true;\n emit Paused(_msgSender());\n }\n\n /**\n * @dev Returns to normal state.\n *\n * Requirements:\n *\n * - The contract must be paused.\n */\n function _unpause() internal virtual whenPaused {\n _paused = false;\n emit Unpaused(_msgSender());\n }\n}\n" - }, - "@openzeppelin/contracts/security/ReentrancyGuard.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == _ENTERED;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Address.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Context.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" - }, - "@openzeppelin/contracts/utils/cryptography/ECDSA.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/cryptography/ECDSA.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Strings.sol\";\n\n/**\n * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.\n *\n * These functions can be used to verify that a message was signed by the holder\n * of the private keys of a given address.\n */\nlibrary ECDSA {\n enum RecoverError {\n NoError,\n InvalidSignature,\n InvalidSignatureLength,\n InvalidSignatureS,\n InvalidSignatureV // Deprecated in v4.8\n }\n\n function _throwError(RecoverError error) private pure {\n if (error == RecoverError.NoError) {\n return; // no error: do nothing\n } else if (error == RecoverError.InvalidSignature) {\n revert(\"ECDSA: invalid signature\");\n } else if (error == RecoverError.InvalidSignatureLength) {\n revert(\"ECDSA: invalid signature length\");\n } else if (error == RecoverError.InvalidSignatureS) {\n revert(\"ECDSA: invalid signature 's' value\");\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature` or error string. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n *\n * Documentation for signature generation:\n * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]\n * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {\n if (signature.length == 65) {\n bytes32 r;\n bytes32 s;\n uint8 v;\n // ecrecover takes the signature parameters, and the only way to get them\n // currently is to use assembly.\n /// @solidity memory-safe-assembly\n assembly {\n r := mload(add(signature, 0x20))\n s := mload(add(signature, 0x40))\n v := byte(0, mload(add(signature, 0x60)))\n }\n return tryRecover(hash, v, r, s);\n } else {\n return (address(0), RecoverError.InvalidSignatureLength);\n }\n }\n\n /**\n * @dev Returns the address that signed a hashed message (`hash`) with\n * `signature`. This address can then be used for verification purposes.\n *\n * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:\n * this function rejects them by requiring the `s` value to be in the lower\n * half order, and the `v` value to be either 27 or 28.\n *\n * IMPORTANT: `hash` _must_ be the result of a hash operation for the\n * verification to be secure: it is possible to craft signatures that\n * recover to arbitrary addresses for non-hashed data. A safe way to ensure\n * this is by receiving a hash of the original message (which may otherwise\n * be too long), and then calling {toEthSignedMessageHash} on it.\n */\n function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, signature);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.\n *\n * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) {\n bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);\n uint8 v = uint8((uint256(vs) >> 255) + 27);\n return tryRecover(hash, v, r, s);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.\n *\n * _Available since v4.2._\n */\n function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, r, vs);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Overload of {ECDSA-tryRecover} that receives the `v`,\n * `r` and `s` signature fields separately.\n *\n * _Available since v4.3._\n */\n function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) {\n // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature\n // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most\n // signatures from current libraries generate a unique signature with an s-value in the lower half order.\n //\n // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value\n // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or\n // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept\n // these malleable signatures as well.\n if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {\n return (address(0), RecoverError.InvalidSignatureS);\n }\n\n // If the signature is valid (and not malleable), return the signer address\n address signer = ecrecover(hash, v, r, s);\n if (signer == address(0)) {\n return (address(0), RecoverError.InvalidSignature);\n }\n\n return (signer, RecoverError.NoError);\n }\n\n /**\n * @dev Overload of {ECDSA-recover} that receives the `v`,\n * `r` and `s` signature fields separately.\n */\n function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {\n (address recovered, RecoverError error) = tryRecover(hash, v, r, s);\n _throwError(error);\n return recovered;\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from a `hash`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) {\n // 32 is the length in bytes of hash,\n // enforced by the type signature above\n /// @solidity memory-safe-assembly\n assembly {\n mstore(0x00, \"\\x19Ethereum Signed Message:\\n32\")\n mstore(0x1c, hash)\n message := keccak256(0x00, 0x3c)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Message, created from `s`. This\n * produces hash corresponding to the one signed with the\n * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]\n * JSON-RPC method as part of EIP-191.\n *\n * See {recover}.\n */\n function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19Ethereum Signed Message:\\n\", Strings.toString(s.length), s));\n }\n\n /**\n * @dev Returns an Ethereum Signed Typed Data, created from a\n * `domainSeparator` and a `structHash`. This produces hash corresponding\n * to the one signed with the\n * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]\n * JSON-RPC method as part of EIP-712.\n *\n * See {recover}.\n */\n function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) {\n /// @solidity memory-safe-assembly\n assembly {\n let ptr := mload(0x40)\n mstore(ptr, \"\\x19\\x01\")\n mstore(add(ptr, 0x02), domainSeparator)\n mstore(add(ptr, 0x22), structHash)\n data := keccak256(ptr, 0x42)\n }\n }\n\n /**\n * @dev Returns an Ethereum Signed Data with intended validator, created from a\n * `validator` and `data` according to the version 0 of EIP-191.\n *\n * See {recover}.\n */\n function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {\n return keccak256(abi.encodePacked(\"\\x19\\x00\", validator, data));\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/Math.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary Math {\n enum Rounding {\n Down, // Toward negative infinity\n Up, // Toward infinity\n Zero // Toward zero\n }\n\n /**\n * @dev Returns the largest of two numbers.\n */\n function max(uint256 a, uint256 b) internal pure returns (uint256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two numbers.\n */\n function min(uint256 a, uint256 b) internal pure returns (uint256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two numbers. The result is rounded towards\n * zero.\n */\n function average(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b) / 2 can overflow.\n return (a & b) + (a ^ b) / 2;\n }\n\n /**\n * @dev Returns the ceiling of the division of two numbers.\n *\n * This differs from standard division with `/` in that it rounds up instead\n * of rounding down.\n */\n function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n // (a + b - 1) / b can overflow on addition, so we distribute.\n return a == 0 ? 0 : (a - 1) / b + 1;\n }\n\n /**\n * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n * with further edits by Uniswap Labs also under MIT license.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n unchecked {\n // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n // variables such that product = prod1 * 2^256 + prod0.\n uint256 prod0; // Least significant 256 bits of the product\n uint256 prod1; // Most significant 256 bits of the product\n assembly {\n let mm := mulmod(x, y, not(0))\n prod0 := mul(x, y)\n prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n }\n\n // Handle non-overflow cases, 256 by 256 division.\n if (prod1 == 0) {\n // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n // The surrounding unchecked block does not change this fact.\n // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n return prod0 / denominator;\n }\n\n // Make sure the result is less than 2^256. Also prevents denominator == 0.\n require(denominator > prod1, \"Math: mulDiv overflow\");\n\n ///////////////////////////////////////////////\n // 512 by 256 division.\n ///////////////////////////////////////////////\n\n // Make division exact by subtracting the remainder from [prod1 prod0].\n uint256 remainder;\n assembly {\n // Compute remainder using mulmod.\n remainder := mulmod(x, y, denominator)\n\n // Subtract 256 bit number from 512 bit number.\n prod1 := sub(prod1, gt(remainder, prod0))\n prod0 := sub(prod0, remainder)\n }\n\n // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n // See https://cs.stackexchange.com/q/138556/92363.\n\n // Does not overflow because the denominator cannot be zero at this stage in the function.\n uint256 twos = denominator & (~denominator + 1);\n assembly {\n // Divide denominator by twos.\n denominator := div(denominator, twos)\n\n // Divide [prod1 prod0] by twos.\n prod0 := div(prod0, twos)\n\n // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n twos := add(div(sub(0, twos), twos), 1)\n }\n\n // Shift in bits from prod1 into prod0.\n prod0 |= prod1 * twos;\n\n // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n // four bits. That is, denominator * inv = 1 mod 2^4.\n uint256 inverse = (3 * denominator) ^ 2;\n\n // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n // in modular arithmetic, doubling the correct bits in each step.\n inverse *= 2 - denominator * inverse; // inverse mod 2^8\n inverse *= 2 - denominator * inverse; // inverse mod 2^16\n inverse *= 2 - denominator * inverse; // inverse mod 2^32\n inverse *= 2 - denominator * inverse; // inverse mod 2^64\n inverse *= 2 - denominator * inverse; // inverse mod 2^128\n inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n // is no longer required.\n result = prod0 * inverse;\n return result;\n }\n }\n\n /**\n * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n */\n function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n uint256 result = mulDiv(x, y, denominator);\n if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n result += 1;\n }\n return result;\n }\n\n /**\n * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n *\n * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n */\n function sqrt(uint256 a) internal pure returns (uint256) {\n if (a == 0) {\n return 0;\n }\n\n // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n //\n // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n //\n // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n //\n // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n uint256 result = 1 << (log2(a) >> 1);\n\n // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n // into the expected uint128 result.\n unchecked {\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n result = (result + a / result) >> 1;\n return min(result, a / result);\n }\n }\n\n /**\n * @notice Calculates sqrt(a), following the selected rounding direction.\n */\n function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = sqrt(a);\n return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 2, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 128;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 64;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 32;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 16;\n }\n if (value >> 8 > 0) {\n value >>= 8;\n result += 8;\n }\n if (value >> 4 > 0) {\n value >>= 4;\n result += 4;\n }\n if (value >> 2 > 0) {\n value >>= 2;\n result += 2;\n }\n if (value >> 1 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log2(value);\n return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 10, rounded down, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >= 10 ** 64) {\n value /= 10 ** 64;\n result += 64;\n }\n if (value >= 10 ** 32) {\n value /= 10 ** 32;\n result += 32;\n }\n if (value >= 10 ** 16) {\n value /= 10 ** 16;\n result += 16;\n }\n if (value >= 10 ** 8) {\n value /= 10 ** 8;\n result += 8;\n }\n if (value >= 10 ** 4) {\n value /= 10 ** 4;\n result += 4;\n }\n if (value >= 10 ** 2) {\n value /= 10 ** 2;\n result += 2;\n }\n if (value >= 10 ** 1) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log10(value);\n return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n }\n }\n\n /**\n * @dev Return the log in base 256, rounded down, of a positive value.\n * Returns 0 if given 0.\n *\n * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n */\n function log256(uint256 value) internal pure returns (uint256) {\n uint256 result = 0;\n unchecked {\n if (value >> 128 > 0) {\n value >>= 128;\n result += 16;\n }\n if (value >> 64 > 0) {\n value >>= 64;\n result += 8;\n }\n if (value >> 32 > 0) {\n value >>= 32;\n result += 4;\n }\n if (value >> 16 > 0) {\n value >>= 16;\n result += 2;\n }\n if (value >> 8 > 0) {\n result += 1;\n }\n }\n return result;\n }\n\n /**\n * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n * Returns 0 if given 0.\n */\n function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n unchecked {\n uint256 result = log256(value);\n return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/math/SignedMath.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMath {\n /**\n * @dev Returns the largest of two signed numbers.\n */\n function max(int256 a, int256 b) internal pure returns (int256) {\n return a > b ? a : b;\n }\n\n /**\n * @dev Returns the smallest of two signed numbers.\n */\n function min(int256 a, int256 b) internal pure returns (int256) {\n return a < b ? a : b;\n }\n\n /**\n * @dev Returns the average of two signed numbers without overflow.\n * The result is rounded towards zero.\n */\n function average(int256 a, int256 b) internal pure returns (int256) {\n // Formula from the book \"Hacker's Delight\"\n int256 x = (a & b) + ((a ^ b) >> 1);\n return x + (int256(uint256(x) >> 255) & (a ^ b));\n }\n\n /**\n * @dev Returns the absolute unsigned value of a signed value.\n */\n function abs(int256 n) internal pure returns (uint256) {\n unchecked {\n // must be unchecked in order to support `n = type(int256).min`\n return uint256(n >= 0 ? n : -n);\n }\n }\n}\n" - }, - "@openzeppelin/contracts/utils/Strings.sol": { - "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/Math.sol\";\nimport \"./math/SignedMath.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary Strings {\n bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n uint8 private constant _ADDRESS_LENGTH = 20;\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n */\n function toString(uint256 value) internal pure returns (string memory) {\n unchecked {\n uint256 length = Math.log10(value) + 1;\n string memory buffer = new string(length);\n uint256 ptr;\n /// @solidity memory-safe-assembly\n assembly {\n ptr := add(buffer, add(32, length))\n }\n while (true) {\n ptr--;\n /// @solidity memory-safe-assembly\n assembly {\n mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n }\n value /= 10;\n if (value == 0) break;\n }\n return buffer;\n }\n }\n\n /**\n * @dev Converts a `int256` to its ASCII `string` decimal representation.\n */\n function toString(int256 value) internal pure returns (string memory) {\n return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMath.abs(value))));\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n */\n function toHexString(uint256 value) internal pure returns (string memory) {\n unchecked {\n return toHexString(value, Math.log256(value) + 1);\n }\n }\n\n /**\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n */\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = _SYMBOLS[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n /**\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n */\n function toHexString(address addr) internal pure returns (string memory) {\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n }\n\n /**\n * @dev Returns true if the two strings are equal.\n */\n function equal(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(bytes(a)) == keccak256(bytes(b));\n }\n}\n" - }, - "@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nimport \"@openzeppelin/contracts/utils/cryptography/ECDSA.sol\";\nimport \"./StringUtils.sol\";\n\n/**\n * Library to assist with requesting,\n * serialising & verifying credentials\n */\nlibrary Claims {\n\t/** Data required to describe a claim */\n\tstruct CompleteClaimData {\n\t\tbytes32 identifier;\n\t\taddress owner;\n\t\tuint32 timestampS;\n\t\tuint32 epoch;\n\t}\n\n\tstruct ClaimInfo {\n\t\tstring provider;\n\t\tstring parameters;\n\t\tstring context;\n\t}\n\n\t/** Claim with signatures & signer */\n\tstruct SignedClaim {\n\t\tCompleteClaimData claim;\n\t\tbytes[] signatures;\n\t}\n\n\t/**\n\t * Asserts that the claim is signed by the expected witnesses\n\t */\n\tfunction assertValidSignedClaim(\n\t\tSignedClaim memory self,\n\t\taddress[] memory expectedWitnessAddresses\n\t) internal pure {\n\t\trequire(self.signatures.length > 0, \"No signatures\");\n\t\taddress[] memory signedWitnesses = recoverSignersOfSignedClaim(self);\n\t\tfor (uint256 i = 0; i < expectedWitnessAddresses.length; i++) {\n\t\t\tbool found = false;\n\t\t\tfor (uint256 j = 0; j < signedWitnesses.length; j++) {\n\t\t\t\tif (signedWitnesses[j] == expectedWitnessAddresses[i]) {\n\t\t\t\t\tfound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\trequire(found, \"Missing witness signature\");\n\t\t}\n\t}\n\n\t/**\n\t * @dev recovers the signer of the claim\n\t */\n\tfunction recoverSignersOfSignedClaim(\n\t\tSignedClaim memory self\n\t) internal pure returns (address[] memory) {\n\t\tbytes memory serialised = serialise(self.claim);\n\t\taddress[] memory signers = new address[](self.signatures.length);\n\t\tfor (uint256 i = 0; i < self.signatures.length; i++) {\n\t\t\tsigners[i] = verifySignature(serialised, self.signatures[i]);\n\t\t}\n\n\t\treturn signers;\n\t}\n\n\t/**\n\t * @dev serialises the credential into a string;\n\t * the string is used to verify the signature\n\t *\n\t * the serialisation is the same as done by the TS library\n\t */\n\tfunction serialise(\n\t\tCompleteClaimData memory self\n\t) internal pure returns (bytes memory) {\n\t\treturn\n\t\t\tabi.encodePacked(\n\t\t\t\tStringUtils.bytes2str(abi.encodePacked(self.identifier)),\n\t\t\t\t\"\\n\",\n\t\t\t\tStringUtils.address2str(self.owner),\n\t\t\t\t\"\\n\",\n\t\t\t\tStringUtils.uint2str(self.timestampS),\n\t\t\t\t\"\\n\",\n\t\t\t\tStringUtils.uint2str(self.epoch)\n\t\t\t);\n\t}\n\n\t/**\n\t * @dev returns the address of the user that generated the signature\n\t */\n\tfunction verifySignature(\n\t\tbytes memory content,\n\t\tbytes memory signature\n\t) internal pure returns (address signer) {\n\t\tbytes32 signedHash = keccak256(\n\t\t\tabi.encodePacked(\n\t\t\t\t\"\\x19Ethereum Signed Message:\\n\",\n\t\t\t\tStringUtils.uint2str(content.length),\n\t\t\t\tcontent\n\t\t\t)\n\t\t);\n\t\treturn ECDSA.recover(signedHash, signature);\n\t}\n\n\tfunction hashClaimInfo(ClaimInfo memory claimInfo) internal pure returns (bytes32) {\n\t\tbytes memory serialised = abi.encodePacked(\n\t\t\tclaimInfo.provider,\n\t\t\t\"\\n\",\n\t\t\tclaimInfo.parameters,\n\t\t\t\"\\n\",\n\t\t\tclaimInfo.context\n\t\t);\n\t\treturn keccak256(serialised);\n\t}\n}\n" - }, - "@reclaimprotocol/verifier-solidity-sdk/contracts/StringUtils.sol": { - "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/**\n * Utilities for string manipulation & conversion\n */\nlibrary StringUtils {\n\tfunction address2str(address x) internal pure returns (string memory) {\n\t\tbytes memory s = new bytes(40);\n\t\tfor (uint i = 0; i < 20; i++) {\n\t\t\tbytes1 b = bytes1(uint8(uint(uint160(x)) / (2 ** (8 * (19 - i)))));\n\t\t\tbytes1 hi = bytes1(uint8(b) / 16);\n\t\t\tbytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));\n\t\t\ts[2 * i] = getChar(hi);\n\t\t\ts[2 * i + 1] = getChar(lo);\n\t\t}\n\t\treturn string(abi.encodePacked(\"0x\", s));\n\t}\n\n\tfunction bytes2str(bytes memory buffer) internal pure returns (string memory) {\n\t\t// Fixed buffer size for hexadecimal convertion\n\t\tbytes memory converted = new bytes(buffer.length * 2);\n\t\tbytes memory _base = \"0123456789abcdef\";\n\n\t\tfor (uint256 i = 0; i < buffer.length; i++) {\n\t\t\tconverted[i * 2] = _base[uint8(buffer[i]) / _base.length];\n\t\t\tconverted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length];\n\t\t}\n\n\t\treturn string(abi.encodePacked(\"0x\", converted));\n\t}\n\n\tfunction getChar(bytes1 b) internal pure returns (bytes1 c) {\n\t\tif (uint8(b) < 10) return bytes1(uint8(b) + 0x30);\n\t\telse return bytes1(uint8(b) + 0x57);\n\t}\n\n\tfunction bool2str(bool _b) internal pure returns (string memory _uintAsString) {\n\t\tif (_b) {\n\t\t\treturn \"true\";\n\t\t} else {\n\t\t\treturn \"false\";\n\t\t}\n\t}\n\n\tfunction uint2str(uint _i) internal pure returns (string memory _uintAsString) {\n\t\tif (_i == 0) {\n\t\t\treturn \"0\";\n\t\t}\n\t\tuint j = _i;\n\t\tuint len;\n\t\twhile (j != 0) {\n\t\t\tlen++;\n\t\t\tj /= 10;\n\t\t}\n\t\tbytes memory bstr = new bytes(len);\n\t\tuint k = len;\n\t\twhile (_i != 0) {\n\t\t\tk = k - 1;\n\t\t\tuint8 temp = (48 + uint8(_i - (_i / 10) * 10));\n\t\t\tbytes1 b1 = bytes1(temp);\n\t\t\tbstr[k] = b1;\n\t\t\t_i /= 10;\n\t\t}\n\t\treturn string(bstr);\n\t}\n\n\tfunction areEqual(\n\t\tstring calldata _a,\n\t\tstring storage _b\n\t) internal pure returns (bool) {\n\t\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\n\t}\n\n\tfunction areEqual(string memory _a, string memory _b) internal pure returns (bool) {\n\t\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\n\t}\n\n\tfunction toLower(string memory str) internal pure returns (string memory) {\n\t\tbytes memory bStr = bytes(str);\n\t\tbytes memory bLower = new bytes(bStr.length);\n\t\tfor (uint i = 0; i < bStr.length; i++) {\n\t\t\t// Uppercase character...\n\t\t\tif ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {\n\t\t\t\t// So we add 32 to make it lowercase\n\t\t\t\tbLower[i] = bytes1(uint8(bStr[i]) + 32);\n\t\t\t} else {\n\t\t\t\tbLower[i] = bStr[i];\n\t\t\t}\n\t\t}\n\t\treturn string(bLower);\n\t}\n\n\tfunction substring(\n\t\tstring memory str,\n\t\tuint startIndex,\n\t\tuint endIndex\n\t) internal pure returns (string memory) {\n\t\tbytes memory strBytes = bytes(str);\n\t\tbytes memory result = new bytes(endIndex - startIndex);\n\t\tfor (uint i = startIndex; i < endIndex; i++) {\n\t\t\tresult[i - startIndex] = strBytes[i];\n\t\t}\n\t\treturn string(result);\n\t}\n}\n" - }, - "contracts/DomainExchange.sol": { - "content": "// SPDX-License-Identifier: MIT\n\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport { ReentrancyGuard } from \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\nimport { Pausable } from \"@openzeppelin/contracts/security/Pausable.sol\";\n\nimport { AddressAllowList } from \"./external/AddressAllowList.sol\";\nimport { Bytes32ArrayUtils } from \"./external/lib/Bytes32ArrayUtils.sol\";\nimport { Uint256ArrayUtils } from \"./external/lib/Uint256ArrayUtils.sol\";\nimport { IKeyHashAdapterV2 } from \"./external/interfaces/IKeyHashAdapterV2.sol\";\n\nimport { ITransferDomainProcessor } from \"./interfaces/ITransferDomainProcessor.sol\";\nimport { IVerifiedDomainRegistry } from \"./interfaces/IVerifiedDomainRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract DomainExchange is AddressAllowList, ReentrancyGuard, Pausable {\n\n using Address for address payable;\n using Bytes32ArrayUtils for bytes32[];\n using Uint256ArrayUtils for uint256[];\n\n /* ============ Events ============ */\n \n event ListingCreated(\n uint256 indexed listingId, \n address indexed seller, \n bytes32 indexed domainId, \n bytes32 dkimKeyHash,\n uint256 askPrice,\n uint256 minBidPrice,\n address saleEthRecipient\n );\n event ListingUpdated(uint256 indexed listingId, address indexed seller, uint256 newAskPrice, address saleEthRecipient);\n event ListingDeleted(uint256 indexed listingId, address indexed seller);\n \n event BidCreated(uint256 indexed bidId, uint256 indexed listingId, address indexed buyer, uint256 price);\n event BidPriceIncreased(uint256 indexed bidId, address indexed buyer, uint256 newPrice);\n event RefundInitiated(uint256 indexed bidId, address indexed buyer);\n event BidWithdrawn(uint256 indexed bidId, address indexed buyer, uint256 amount);\n \n event SaleFinalized(uint256 indexed bidId, uint256 indexed listingId, uint256 priceNetFees, uint256 fees);\n \n event InstantAcceptUpdated(address indexed buyer, bool instantAccept);\n\n event FeeUpdated(uint256 newFee);\n event FeeRecipientUpdated(address indexed newFeeRecipient);\n event BidSettlementPeriodUpdated(uint256 newBidSettlementPeriod);\n event BidRefundPeriodUpdated(uint256 newBidRefundPeriod);\n event TransferDomainProcessorUpdated(ITransferDomainProcessor indexed newTransferDomainProcessor);\n event MailServerKeyHashAdapterUpdated(IKeyHashAdapterV2 indexed newMailServerKeyHashAdapter);\n\n /* ============ Structs ============ */\n struct Listing {\n address seller;\n address payable saleEthRecipient; // Must be a contract that can receive ETH or an EOA\n bytes32 dkimKeyHash; // Allow for custom DKIM key hash\n bytes encryptionKey;\n bytes32 domainId;\n uint256 createdAt;\n uint256 askPrice;\n uint256 minBidPrice;\n bool isActive; // false by default, set to true when the listing is created\n uint256[] bids;\n }\n\n struct ListingWithId {\n uint256 listingId;\n Listing listing;\n }\n\n struct Bid {\n address buyer;\n uint256 listingId;\n string encryptedBuyerId;\n bytes32 buyerIdHash;\n uint256 createdAt;\n uint256 expiryTimestamp;\n uint256 price;\n bool refundInitiated;\n }\n\n struct BidDetailsWithId {\n uint256 bidId;\n Bid bid;\n bool buyerInstantAcceptEnabled;\n }\n\n /* ============ Modifiers ============ */\n modifier onlyInitialized() {\n require(isInitialized, \"Contract must be initialized\");\n _;\n }\n\n /* ============ Public Variables ============ */\n\n mapping(uint256 => Listing) public listings;\n mapping(address => uint256[]) public userListings;\n mapping(uint256 => Bid) public bids;\n mapping(address => uint256[]) public userBids;\n mapping(bytes32 => uint256) public domainListing;\n mapping(address => bool) public instantAcceptEnabled;\n\n uint256 public fee;\n address payable public feeRecipient;\n uint256 public bidCounter;\n uint256 public listingCounter;\n uint256 public bidSettlementPeriod;\n uint256 public bidRefundPeriod;\n \n bool public isInitialized;\n \n ITransferDomainProcessor public transferDomainProcessor;\n IVerifiedDomainRegistry public verifiedDomainRegistry;\n IKeyHashAdapterV2 public mailServerKeyHashAdapter;\n\n /* ============ Constants ============ */\n uint256 internal constant PRECISE_UNIT = 1e18;\n\n /* ============ Constructor ============ */\n\n constructor(\n address _owner,\n uint256 _fee,\n address payable _feeRecipient,\n uint256 _bidSettlementPeriod,\n uint256 _bidRefundPeriod,\n address[] memory _allowedAddresses\n ) AddressAllowList(_allowedAddresses) {\n fee = _fee;\n feeRecipient = _feeRecipient;\n bidSettlementPeriod = _bidSettlementPeriod;\n bidRefundPeriod = _bidRefundPeriod;\n \n bidCounter = 1;\n listingCounter = 1;\n isInitialized = false;\n \n transferOwnership(_owner);\n }\n\n /* ============ Public Functions ============ */\n\n /**\n * @notice Creates listing for a domain. If ownership of domain changes offchain, the new owner\n * will have to first register the domain on the domain registry contract. Then the new owner\n * can create a listing for the domain. The old listing will be deleted from the old owner's \n * listings and the old listing is marked as NOT active, which prevents any new bids from being\n * created on it and makes the old bids immediately withdrawable. We also allow the seller to\n * specify a custom DKIM key hash for Namecheap if they want to opt out of using the managed DKIM\n * key hash set in the transferDomainProcessor contract. The managed DKIM key hash *can* be \n * updated by us whenever Namecheap rotates their DKIM key.\n *\n * Function reverts if:\n * - Caller is not domain owner on the domain registry contract\n * - Ask price is less than min bid price\n * - Sale ETH recipient is the zero address\n *\n * @param _domainId The unique identifier of the domain\n * @param _askPrice An asking price for the domain\n * @param _minBidPrice The minimum bid price for the domain\n * @param _saleEthRecipient The address to receive the ETH from the sale; must be a contract that can\n * receive ETH or an EOA\n * @param _encryptionKey The encryption key for buyers to encrypt the buyerId to\n * @param _dkimKeyHash The custom DKIM key hash. If empty, the managed DKIM key hash will be used\n */\n function createListing(\n bytes32 _domainId, \n uint256 _askPrice, \n uint256 _minBidPrice, \n address payable _saleEthRecipient, \n bytes memory _encryptionKey,\n bytes32 _dkimKeyHash\n ) \n external\n onlyAllowed\n onlyInitialized \n whenNotPaused\n {\n address domainOwner = verifiedDomainRegistry.getDomainOwner(_domainId);\n require(domainOwner == msg.sender, \"Caller is not domain owner\");\n require(_minBidPrice > 0, \"Minimum bid price is zero\");\n require(_askPrice >= _minBidPrice, \"Ask price is less than min bid price\");\n require(_saleEthRecipient != address(0), \"Invalid sale ETH recipient\");\n\n uint256 listingId = _updateCreateListingState(\n _domainId, _askPrice, _minBidPrice, _saleEthRecipient, _encryptionKey, _dkimKeyHash\n );\n\n emit ListingCreated(listingId, msg.sender, _domainId, _dkimKeyHash, _askPrice, _minBidPrice, _saleEthRecipient);\n }\n\n /**\n * @notice Creates a new bid for a listing. Transfers ETH from the buyer to the contract. Every buyer\n * has a unique identifier, for Namecheap it's their username. The seller needs the raw buyerId\n * to transfer the domain off-chain. To facilitate this, the buyer encrypts their buyerId using the \n * seller's encryption key and sends it along with the bid. The seller then decrypts the buyerId \n * using their private key to get the raw buyerId.\n *\n * DEV NOTE: We do not check that the encrypted buyerId is the same as the hashed buyerId. This must be\n * done in the client! This does not affect the security of the protocol as the encrypted buyerId is only \n * used for communication between the buyer and the seller while maintaining privacy.\n *\n * @param _listingId The unique identifier of the listing to bid on\n * @param _buyerIdHash The hashed buyerId which is also output as part of the transfer proof later\n * @param _encryptedBuyerId The encrypted buyerId. Should be the same as the buyerId hashed\n */\n function createBid(uint256 _listingId, bytes32 _buyerIdHash, string memory _encryptedBuyerId) \n external \n payable\n nonReentrant\n whenNotPaused\n {\n uint256 price = msg.value;\n Listing storage listing = listings[_listingId];\n\n _validateCreateBid(listing, price, _buyerIdHash);\n\n uint256 bidId = _updateCreateBidState(listing, _listingId, price, _buyerIdHash, _encryptedBuyerId);\n\n emit BidCreated(bidId, _listingId, msg.sender, price);\n }\n\n /**\n * @notice ONLY SELLER: Finalizes a sale by verifying the domain transfer and unlocking bid funds to \n * the listing owner. The seller can also finalize the sale with bids that have initiated a refund \n * including the ones that have expired based on timestamp but not withdrawn yet.\n *\n * @param _proof The zk-email proof of domain transfer\n */\n function finalizeSale(ITransferDomainProcessor.TransferProof calldata _proof) \n external\n onlyInitialized\n nonReentrant\n whenNotPaused\n {\n // Check\n (\n bytes32 dkimKeyHash,\n bytes32 hashedReceiverId, \n string memory domainName, \n uint256 bidId\n ) = transferDomainProcessor.processProof(_proof);\n\n Bid storage bid = bids[bidId];\n Listing storage listing = listings[bid.listingId];\n \n _validateFinalizeSale(bid, listing, dkimKeyHash, hashedReceiverId, domainName);\n \n // Effect\n uint256 transferValue = bid.price;\n address payable recipient = listing.saleEthRecipient;\n uint256 listingId = bid.listingId;\n _updateFinalizeSaleState(bid, bidId, listing);\n\n // Interaction\n uint256 feeAmount = _settleSale(recipient, transferValue);\n \n emit SaleFinalized(bidId, listingId, transferValue - feeAmount, feeAmount);\n }\n\n /**\n * @notice ONLY BUYER: Finalize a sale by releasing funds to the seller. Proof of transfer is not required\n * because it is not in the buyer's interest to release funds unless they have received the domain. Note that the\n * bid can be in ANY STATE when this function is called. Upon calling this function funds will be transferred to\n * the seller and fees will be taken by the protocol. The listing and the bid will be deleted. The function will\n * revert if:\n * - The bid is not owned by the caller\n * - The listing is not active (sold or withdrawn)\n *\n * @param _bidId The unique identifier of the bid to release funds for\n */\n function buyerReleaseFunds(uint256 _bidId) \n external\n nonReentrant\n {\n // Check\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n require(bid.buyer == msg.sender, \"Caller is not bid owner\");\n require(listing.isActive, \"Listing not active\");\n\n // Effect\n uint256 transferValue = bid.price;\n address payable recipient = listing.saleEthRecipient;\n uint256 listingId = bid.listingId;\n \n _updateFinalizeSaleState(bid, _bidId, listing);\n\n // Interaction\n uint256 feeAmount = _settleSale(recipient, transferValue);\n\n emit SaleFinalized(_bidId, listingId, transferValue - feeAmount, feeAmount);\n }\n\n /**\n * @notice ONLY SELLER: Updates the asking price of an existing listing. We don't update\n * the existing bids against the listing because the newAskPrice is an indicative value.\n * The new ask price must be greater than or equal to the existing min bid price. If seller\n * wants to update the min bid price, they should delete the listing and create a new one with\n * the new min bid price.\n *\n * @param _listingId The unique identifier of the listing to update\n * @param _newAskPrice The new asking price for the listing\n * @param _saleEthRecipient The new address to receive the ETH from the sale; must be a contract that can\n * receive ETH or an EOA\n */\n function updateListing(uint256 _listingId, uint256 _newAskPrice, address payable _saleEthRecipient) external whenNotPaused {\n Listing storage listing = listings[_listingId];\n \n require(listing.seller == msg.sender, \"Caller is not listing owner\");\n require(listing.isActive, \"Listing not active\");\n require(_newAskPrice >= listing.minBidPrice, \"Ask price is less than min bid price\");\n require(_saleEthRecipient != address(0), \"Invalid sale ETH recipient\");\n \n listing.askPrice = _newAskPrice;\n listing.saleEthRecipient = _saleEthRecipient;\n\n emit ListingUpdated(_listingId, msg.sender, _newAskPrice, _saleEthRecipient);\n }\n\n /**\n * @notice ONLY SELLER: Marks a listing as NOT active. Removes the listing from the seller's listings array\n * and domain listing. If the listing has no bids, it is deleted from the exchange. Bids against the listing\n * are left as is to allow the buyer to withdraw the bid.\n *\n * @param _listingId The unique identifier of the listing to delete\n */\n function deleteListing(uint256 _listingId) external {\n Listing storage listing = listings[_listingId];\n \n require(listing.seller == msg.sender, \"Caller is not listing owner\");\n require(listing.isActive, \"Listing not active\");\n \n _pruneListing(listing, _listingId);\n\n emit ListingDeleted(_listingId, msg.sender);\n }\n\n /**\n * @notice ONLY BUYER: Increases the price of an existing bid. The new price can ONLY be higher \n * than the old price. The buyer must send the additional amount of ETH. The function reverts if\n * - bid has initiated refund, caller is not bid owner or listing is not active\n * - the new price is less than old price\n * - msg.value is NOT STRICTLY EQUAL to than new price - old price\n *\n * @param _bidId The unique identifier of the bid to increase the price for\n * @param _newPrice The new price for the bid\n */\n function increaseBidPrice(uint256 _bidId, uint256 _newPrice)\n external\n payable\n nonReentrant\n whenNotPaused\n {\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n // Check\n _validateIncreaseBidPrice(bid, listing, _newPrice);\n \n // Effect\n bid.price = _newPrice;\n\n emit BidPriceIncreased(_bidId, msg.sender, _newPrice);\n }\n\n /**\n * @notice Enables the instant accept flag for the buyer. This flag is used to indicate if the buyer has \n * configured their Namecheap account to accept ownership of domains immediately upon transfer.\n * \n * DEV NOTE: We can not check that the buyer has actually enabled instant accept on Namecheap. It is only \n * an indicative flag to help the seller know if they can finalize the sale immediately or not. The seller\n * may get tricked by a malicious buyer to initiate a transfer to them assuming instant accept is on. But\n * if the buyer does not have instant accept enabled, the seller will get immediate feedback and they can \n * cancel the transfer immediately.\n */\n function enableInstantAccept() external onlyInitialized {\n require(instantAcceptEnabled[msg.sender] == false, \"Instant accept already enabled\");\n \n instantAcceptEnabled[msg.sender] = true; \n emit InstantAcceptUpdated(msg.sender, true);\n }\n\n /**\n * @notice Disables the instant accept flag for the buyer.\n */\n function disableInstantAccept() external onlyInitialized {\n require(instantAcceptEnabled[msg.sender] == true, \"Instant accept already disabled\");\n\n instantAcceptEnabled[msg.sender] = false;\n emit InstantAcceptUpdated(msg.sender, false);\n }\n\n /**\n * @notice ONLY BUYER: Initiates the refund process for a bid. Can only be called by the bid owner \n * after the initial bid expiry period has passed.\n *\n * @param _bidId The unique identifier of the bid to initiate refund for\n */\n function initiateRefund(uint256 _bidId) external {\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n _validateInitiateRefund(bid, listing);\n\n bid.expiryTimestamp = block.timestamp + bidRefundPeriod;\n bid.refundInitiated = true;\n\n emit RefundInitiated(_bidId, bid.buyer);\n }\n\n /**\n * @notice ONLY BUYER: Withdraws a bid after the refund period has ended. Transfers ETH back to the buyer.\n *\n * @param _bidId The unique identifier of the bid to withdraw\n */\n function withdrawBid(uint256 _bidId) external nonReentrant {\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n // Check\n _validateWithdrawBid(bid, listing);\n\n // Effect\n uint256 refundAmount = bid.price;\n _pruneBid(bid, _bidId, listing);\n \n // Interaction\n payable(msg.sender).sendValue(refundAmount);\n\n emit BidWithdrawn(_bidId, msg.sender, refundAmount);\n }\n\n /* ============ Admin Functions ============ */\n\n /**\n * @notice Initializes the contract with domain verification and transfer processors. Can \n * only be called once by the contract owner\n * \n * @param _transferDomainProcessor The address of the domain transfer processor contract\n * @param _verifiedDomainRegistry The address of the verified domain registry contract\n * @param _mailServerKeyHashAdapter The address of the mail server key hash adapter contract\n */\n function initialize(\n ITransferDomainProcessor _transferDomainProcessor,\n IVerifiedDomainRegistry _verifiedDomainRegistry,\n IKeyHashAdapterV2 _mailServerKeyHashAdapter\n ) external onlyOwner {\n require(!isInitialized, \"Already initialized\");\n transferDomainProcessor = _transferDomainProcessor;\n verifiedDomainRegistry = _verifiedDomainRegistry;\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\n isInitialized = true;\n }\n\n /**\n * @notice ONLY OWNER: Pauses listing and proof submission functionality for the marketplace. \n * Functionalites that are paused:\n * - Listing creation and update\n * - Bid creation and update\n * - Sale finalization\n * \n * Functinonalites that remain unpaused to allow users to retrieve funds in contract:\n * - Bid refund initiation and withdrawal\n * - Listing deletion\n * - Manual settlement between buyer and seller\n */\n function pauseMarketplace() external onlyOwner {\n _pause();\n }\n\n /**\n * @notice ONLY OWNER: Restarts paused functionality for the marketplace.\n */\n function unpauseMarketplace() external onlyOwner {\n _unpause();\n }\n\n /**\n * @notice ONLY OWNER: Update the transfer domain processor\n *\n * @param _transferDomainProcessor The new transfer domain processor\n */\n function updateTransferDomainProcessor(ITransferDomainProcessor _transferDomainProcessor) external onlyOwner {\n require(address(_transferDomainProcessor) != address(0), \"Invalid address\");\n \n transferDomainProcessor = _transferDomainProcessor;\n emit TransferDomainProcessorUpdated(_transferDomainProcessor);\n }\n\n /**\n * @notice ONLY OWNER: Update the managed mail server key hash adapter\n *\n * @param _mailServerKeyHashAdapter The new mail server key hash adapter\n */\n function updateMailServerKeyHashAdapter(IKeyHashAdapterV2 _mailServerKeyHashAdapter) external onlyOwner {\n require(address(_mailServerKeyHashAdapter) != address(0), \"Invalid address\");\n \n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\n emit MailServerKeyHashAdapterUpdated(_mailServerKeyHashAdapter);\n }\n\n /**\n * @notice ONLY OWNER: Updates the fee percentage for the marketplace\n *\n * @param _newFee The new fee percentage (in basis points)\n */\n function updateFee(uint256 _newFee) external onlyOwner {\n fee = _newFee;\n emit FeeUpdated(_newFee);\n }\n\n /**\n * @notice ONLY OWNER: Updates the fee recipient address\n *\n * @param _newFeeRecipient The new address to receive fees\n */\n function updateFeeRecipient(address payable _newFeeRecipient) external onlyOwner {\n require(_newFeeRecipient != address(0), \"Invalid address\");\n feeRecipient = _newFeeRecipient;\n emit FeeRecipientUpdated(_newFeeRecipient);\n }\n\n /**\n * @notice ONLY OWNER: Updates the minimum bid active period\n *\n * @param _newBidSettlementPeriod The new bid settlement period in seconds\n */\n function updateBidSettlementPeriod(uint256 _newBidSettlementPeriod) external onlyOwner {\n require(_newBidSettlementPeriod > 0, \"Bid settlement period must be greater than 0\");\n bidSettlementPeriod = _newBidSettlementPeriod;\n emit BidSettlementPeriodUpdated(_newBidSettlementPeriod);\n }\n\n /**\n * @notice ONLY OWNER: Updates the bid refund period\n *\n * @param _newBidRefundPeriod The new bid refund period in seconds\n */\n function updateBidRefundPeriod(uint256 _newBidRefundPeriod) external onlyOwner {\n require(_newBidRefundPeriod > 0, \"Bid refund period must be greater than 0\");\n bidRefundPeriod = _newBidRefundPeriod;\n emit BidRefundPeriodUpdated(_newBidRefundPeriod);\n }\n\n /* ============ View Functions ============ */ \n\n /**\n * @notice Get listing information with listingId for a list of listingIds\n * @param _listingIds An array of listingIds to fetch details for\n */\n function getListings(uint256[] memory _listingIds)\n external \n view \n returns (ListingWithId[] memory listingInfo) \n {\n listingInfo = new ListingWithId[](_listingIds.length);\n for (uint256 i = 0; i < _listingIds.length; i++) {\n listingInfo[i] = ListingWithId({\n listingId: _listingIds[i],\n listing: listings[_listingIds[i]]\n });\n }\n }\n\n /**\n * @notice Returns all listings created by a user\n * @param _user The address of the user to fetch listings for\n */\n function getUserListings(address _user) external view returns (ListingWithId[] memory listingInfo) {\n uint256[] memory userListingIds = userListings[_user];\n listingInfo = new ListingWithId[](userListingIds.length);\n for (uint256 i = 0; i < userListingIds.length; i++) {\n uint256 listingId = userListingIds[i];\n listingInfo[i] = ListingWithId({\n listingId: listingId,\n listing: listings[listingId]\n });\n }\n }\n\n /**\n * @notice Returns the bids created by a user\n * @param _user The address of the user to fetch bids for\n */\n function getUserBids(address _user) external view returns (BidDetailsWithId[] memory bidInfo) {\n uint256[] memory userBidIds = userBids[_user];\n bidInfo = new BidDetailsWithId[](userBidIds.length);\n for (uint256 i = 0; i < userBidIds.length; i++) {\n uint256 bidId = userBidIds[i];\n bidInfo[i] = BidDetailsWithId({\n bidId: bidId,\n bid: bids[bidId],\n buyerInstantAcceptEnabled: instantAcceptEnabled[_user]\n });\n }\n }\n\n /**\n * @notice Returns the bids for given listingIds\n * @param _listingIds An array of listingIds to fetch bids for\n */\n function getListingBids(uint256[] memory _listingIds) external view returns (BidDetailsWithId[][] memory bidInfo) {\n bidInfo = new BidDetailsWithId[][](_listingIds.length);\n for (uint256 i = 0; i < _listingIds.length; i++) {\n uint256 listingId = _listingIds[i];\n uint256[] memory listingBidIds = listings[listingId].bids;\n bidInfo[i] = new BidDetailsWithId[](listingBidIds.length);\n for (uint256 j = 0; j < listingBidIds.length; j++) {\n uint256 bidId = listingBidIds[j];\n bidInfo[i][j] = BidDetailsWithId({\n bidId: bidId,\n bid: bids[bidId],\n buyerInstantAcceptEnabled: instantAcceptEnabled[bids[bidId].buyer]\n });\n }\n }\n }\n\n /**\n * @notice Get all allowed sellers\n */\n function getAllowedSellers() external view returns (address[] memory) {\n return _getAllowedAddresses();\n }\n\n /**\n * @notice Get the active listing for given domain id\n * @param _domainId The domain id to fetch the active listing for\n */\n function getDomainListing(bytes32 _domainId) external view returns (ListingWithId memory) {\n uint256 listingId = domainListing[_domainId];\n return ListingWithId({\n listingId: listingId,\n listing: listings[listingId]\n });\n }\n\n /* ============ Internal Functions ============ */\n\n function _updateCreateListingState(\n bytes32 _domainId, \n uint256 _askPrice, \n uint256 _minBidPrice,\n address payable _saleEthRecipient,\n bytes memory _encryptionKey,\n bytes32 _dkimKeyHash\n ) internal returns (uint256 listingId) {\n \n // If listing already exists, delete the old listing\n uint256 oldListingId = domainListing[_domainId];\n if (oldListingId != 0) {\n Listing storage listing = listings[oldListingId];\n _pruneListing(listing, oldListingId);\n }\n \n // New listing\n listingId = listingCounter;\n listings[listingId] = Listing({\n seller: msg.sender,\n saleEthRecipient: _saleEthRecipient,\n encryptionKey: _encryptionKey,\n dkimKeyHash: _dkimKeyHash,\n askPrice: _askPrice,\n minBidPrice: _minBidPrice,\n domainId: _domainId,\n createdAt: block.timestamp,\n isActive: true,\n bids: new uint256[](0)\n });\n userListings[msg.sender].push(listingId);\n domainListing[_domainId] = listingId;\n\n // Increment listingCounter\n listingCounter = listingCounter + 1;\n }\n\n function _validateCreateBid(Listing storage _listing, uint256 _price, bytes32 _buyerIdHash) internal view {\n require(_listing.seller != address(0), \"Listing does not exist\");\n require(_listing.isActive, \"Listing not active\");\n \n // Validate inputs\n require(_price >= _listing.minBidPrice, \"Bid price is less than min bid price\");\n require(_buyerIdHash != bytes32(0), \"Buyer ID hash cannot be empty\");\n }\n\n function _updateCreateBidState(\n Listing storage _listing, \n uint256 _listingId, \n uint256 _price, \n bytes32 _buyerIdHash, \n string memory _encryptedBuyerId\n ) internal returns (uint256 bidId) {\n bidId = bidCounter;\n bids[bidId] = Bid({\n buyer: msg.sender,\n listingId: _listingId,\n encryptedBuyerId: _encryptedBuyerId,\n buyerIdHash: _buyerIdHash,\n createdAt: block.timestamp,\n expiryTimestamp: type(uint256).max,\n price: _price,\n refundInitiated: false\n });\n userBids[msg.sender].push(bidId);\n _listing.bids.push(bidId);\n\n // Increment bidCounter\n bidCounter = bidCounter + 1;\n }\n\n function _validateFinalizeSale(\n Bid storage _bid, \n Listing storage _listing,\n bytes32 _dkimKeyHash,\n bytes32 _hashedReceiverId, \n string memory _transferredDomainName\n ) internal view {\n require(_bid.buyer != address(0), \"Bid does not exist\");\n require(_listing.seller == msg.sender, \"Caller is not listing owner\");\n require(_listing.isActive, \"Listing not active\");\n\n // Validate namecheap DKIM key\n if (_listing.dkimKeyHash != bytes32(0)) {\n require(_dkimKeyHash == _listing.dkimKeyHash, \"Invalid custom DKIM key hash\");\n } else {\n require(\n mailServerKeyHashAdapter.isMailServerKeyHash(_dkimKeyHash), \n \"Invalid managed DKIM key hash\"\n );\n }\n\n // Validate domain and receiver\n bytes32 transferredDomainId = keccak256(abi.encodePacked(_transferredDomainName));\n require(_bid.buyerIdHash == _hashedReceiverId, \"Invalid receiver\");\n require(_listing.domainId == transferredDomainId, \"Invalid domain\");\n }\n\n function _updateFinalizeSaleState(Bid storage _bid, uint256 _bidId, Listing storage _listing) internal {\n uint256 listingId = _bid.listingId;\n \n _pruneBid(_bid, _bidId, _listing);\n _pruneListing(_listing, listingId);\n }\n\n function _validateIncreaseBidPrice(\n Bid storage _bid, \n Listing storage _listing, \n uint256 _newPrice\n ) internal view {\n require(_bid.buyer == msg.sender, \"Caller is not bid owner\");\n require(!_bid.refundInitiated, \"Refund already initiated\");\n require(_listing.isActive, \"Listing not active\");\n\n // Validate new price\n require(_newPrice > _bid.price, \"New price not greater than old price\");\n require(msg.value == _newPrice - _bid.price, \"Incorrect amount of ETH sent\");\n }\n\n function _validateInitiateRefund(Bid storage _bid, Listing storage _listing) internal view {\n require(_bid.buyer == msg.sender, \"Caller is not bid owner\");\n require(!_bid.refundInitiated, \"Refund already initiated\");\n require(block.timestamp > bidSettlementPeriod + _bid.createdAt, \"Refund period not started\");\n require(_listing.isActive, \"Listing expired. Bid can be withdrawn directly\");\n }\n\n function _validateWithdrawBid(Bid storage _bid, Listing storage _listing) internal view {\n require(_bid.buyer == msg.sender, \"Caller is not bid owner\");\n if (_listing.isActive) {\n require(_bid.refundInitiated, \"Refund not initiated\");\n require(block.timestamp >= _bid.expiryTimestamp, \"Refund period not ended\");\n }\n }\n\n function _settleSale(address payable _recipient, uint256 _amount) internal returns (uint256 feeAmount) {\n feeAmount = (_amount * fee) / PRECISE_UNIT;\n _recipient.sendValue(_amount - feeAmount);\n\n if (feeAmount > 0) {\n feeRecipient.sendValue(feeAmount);\n }\n }\n\n /**\n * @notice Deletes a bid from the exchange. Removes the bid from the listing's bids array and the buyer's\n * bids array. Deletes the listing if it is expired and has no bids.\n */\n function _pruneBid(Bid storage _bid, uint256 _bidId, Listing storage _listing) internal {\n userBids[_bid.buyer].removeStorage(_bidId);\n _listing.bids.removeStorage(_bidId);\n if (!_listing.isActive && _listing.bids.length == 0) {\n delete listings[_bid.listingId];\n }\n delete bids[_bidId];\n }\n\n /**\n * @notice Marks a listing as expired. Removes the listing from the seller's listings array and domain listing.\n * If the listing has no bids, it is deleted from the exchange.\n */\n function _pruneListing(Listing storage _listing, uint256 _listingId) internal {\n _listing.isActive = false;\n userListings[_listing.seller].removeStorage(_listingId);\n delete domainListing[_listing.domainId];\n if (_listing.bids.length == 0) {\n delete listings[_listingId];\n }\n }\n}\n" - }, - "contracts/external/AddressAllowList.sol": { - "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { AddressArrayUtils } from \"./lib/AddressArrayUtils.sol\";\n\npragma solidity ^0.8.18;\n\ncontract AddressAllowList is Ownable {\n\n using AddressArrayUtils for address[];\n\n /* ============ Events ============ */\n event AddressAddedToAllowlist(address indexed allowedAddress);\n event AddressRemovedFromAllowlist(address indexed allowedAddress);\n event AllowlistEnabled();\n event AllowlistDisabled();\n \n /* ============ Modifier ============ */\n modifier onlyAllowed() {\n require(isEnabled ? isAllowed[msg.sender] : true, \"Address is not allowed\");\n _;\n }\n \n /* ============ State Variables ============ */\n bool public isEnabled; // Boolean indicating if the allowlist is enabled\n address[] public allowedAddresses; // Array of addresses that are allowed from taking depositors liquidity\n mapping(address => bool) public isAllowed; // Mapping of address to boolean indicating if the user is allowed\n\n /* ============ Constructor ============ */\n constructor(address[] memory _allowedAddresses) Ownable() {\n for (uint256 i = 0; i < _allowedAddresses.length; i++) {\n address allowedAddress = _allowedAddresses[i];\n\n require(!isAllowed[allowedAddress], \"Address is already allowed\");\n isAllowed[allowedAddress] = true;\n emit AddressAddedToAllowlist(allowedAddress);\n }\n allowedAddresses = _allowedAddresses;\n isEnabled = true;\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice Adds passed addresses to an allow list. Addresses on the allow list are able to call allow listed\n * functions.\n *\n * @param _allowedAddresses List of addresses allowed to call allow listed functions\n */\n function addAddressesToAllowlist(address[] memory _allowedAddresses) external onlyOwner {\n for(uint256 i = 0; i < _allowedAddresses.length; i++) {\n address allowedAddress = _allowedAddresses[i];\n\n require(!isAllowed[allowedAddress], \"Address already on allowlist\");\n\n isAllowed[allowedAddress] = true;\n allowedAddresses.push(allowedAddress);\n\n emit AddressAddedToAllowlist(allowedAddress);\n }\n }\n\n /**\n * @notice Removes passed addresses from an allow list. Addresses not on the allow list are unable to call\n * allow listed functions.\n *\n * @param _disallowedAddresses List of addresses being disallowed from calling allow listed functions\n */\n function removeAddressesFromAllowlist(address[] memory _disallowedAddresses) external onlyOwner {\n for(uint256 i = 0; i < _disallowedAddresses.length; i++) {\n address disallowedAddress = _disallowedAddresses[i];\n\n require(isAllowed[disallowedAddress], \"Address already disallowed\");\n\n isAllowed[disallowedAddress] = false;\n allowedAddresses.removeStorage(disallowedAddress);\n\n emit AddressRemovedFromAllowlist(disallowedAddress);\n }\n }\n\n /**\n * @notice Enable the allow list. When the allow list is enabled, only approved addresses are allowed to\n * functions with onlyAllowed modifier.\n */\n function enableAllowlist() external onlyOwner {\n require(!isEnabled, \"Allow list is already enabled\");\n\n isEnabled = true;\n emit AllowlistEnabled();\n }\n\n /**\n * @notice Disable the allow list. When the allow list is disabled, any address is allowed to call functions\n * with onlyAllowed modifier.\n */\n function disableAllowlist() external onlyOwner {\n require(isEnabled, \"Allow list is already disabled\");\n\n isEnabled = false;\n emit AllowlistDisabled();\n }\n\n /* ============ View Functions ============ */\n\n function _getAllowedAddresses() internal view returns (address[] memory) {\n return allowedAddresses;\n }\n}\n" - }, - "contracts/external/interfaces/IKeyHashAdapterV2.sol": { - "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IKeyHashAdapterV2 {\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external;\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external;\n function getMailServerKeyHashes() external view returns (bytes32[] memory);\n function isMailServerKeyHash(bytes32 _mailserverKeyHash) external view returns (bool);\n}\n" - }, - "contracts/external/interfaces/IProxyBaseProcessor.sol": { - "content": "//SPDX-License-Identifier: MIT\n\nimport { Claims } from \"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\";\n\npragma solidity ^0.8.18;\n\ninterface IProxyBaseProcessor {\n \n struct Proof {\n Claims.ClaimInfo claimInfo;\n Claims.SignedClaim signedClaim;\n }\n}\n" - }, - "contracts/external/lib/AddressArrayUtils.sol": { - "content": "/*\n Copyright 2020 Set Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n SPDX-License-Identifier: MIT\n*/\n\npragma solidity ^0.8.17;\n\n/**\n * @title AddressArrayUtils\n * @author Set Protocol\n *\n * Utility functions to handle Address Arrays\n *\n * CHANGELOG:\n * - 4/21/21: Added validatePairsWithArray methods\n */\nlibrary AddressArrayUtils {\n\n uint256 constant internal MAX_INT = 2**256 - 1;\n\n /**\n * Finds the index of the first occurrence of the given element.\n * @param A The input array to search\n * @param a The value to find\n * @return Returns (index and isIn) for the first occurrence starting from index 0\n */\n function indexOf(address[] memory A, address a) internal pure returns (uint256, bool) {\n uint256 length = A.length;\n for (uint256 i = 0; i < length; i++) {\n if (A[i] == a) {\n return (i, true);\n }\n }\n return (MAX_INT, false);\n }\n\n /**\n * Returns true if the value is present in the list. Uses indexOf internally.\n * @param A The input array to search\n * @param a The value to find\n * @return Returns isIn for the first occurrence starting from index 0\n */\n function contains(address[] memory A, address a) internal pure returns (bool) {\n (, bool isIn) = indexOf(A, a);\n return isIn;\n }\n\n /**\n * Returns true if there are 2 elements that are the same in an array\n * @param A The input array to search\n * @return Returns boolean for the first occurrence of a duplicate\n */\n function hasDuplicate(address[] memory A) internal pure returns(bool) {\n require(A.length > 0, \"A is empty\");\n\n for (uint256 i = 0; i < A.length - 1; i++) {\n address current = A[i];\n for (uint256 j = i + 1; j < A.length; j++) {\n if (current == A[j]) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * @param A The input array to search\n * @param a The address to remove\n * @return Returns the array with the object removed.\n */\n function remove(address[] memory A, address a)\n internal\n pure\n returns (address[] memory)\n {\n (uint256 index, bool isIn) = indexOf(A, a);\n if (!isIn) {\n revert(\"Address not in array.\");\n } else {\n (address[] memory _A,) = pop(A, index);\n return _A;\n }\n }\n\n /**\n * @param A The input array to search\n * @param a The address to remove\n */\n function removeStorage(address[] storage A, address a)\n internal\n {\n (uint256 index, bool isIn) = indexOf(A, a);\n if (!isIn) {\n revert(\"Address not in array.\");\n } else {\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\n if (index != lastIndex) { A[index] = A[lastIndex]; }\n A.pop();\n }\n }\n\n /**\n * Removes specified index from array\n * @param A The input array to search\n * @param index The index to remove\n * @return Returns the new array and the removed entry\n */\n function pop(address[] memory A, uint256 index)\n internal\n pure\n returns (address[] memory, address)\n {\n uint256 length = A.length;\n require(index < A.length, \"Index must be < A length\");\n address[] memory newAddresses = new address[](length - 1);\n for (uint256 i = 0; i < index; i++) {\n newAddresses[i] = A[i];\n }\n for (uint256 j = index + 1; j < length; j++) {\n newAddresses[j - 1] = A[j];\n }\n return (newAddresses, A[index]);\n }\n}\n" - }, - "contracts/external/lib/Bytes32ArrayUtils.sol": { - "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.17;\n\n/**\n * @title Bytes32ArrayUtils\n * @author ZKP2P\n *\n * Fork of Set Protocol's AddressArrayUtils library adapted for usage with bytes32 arrays.\n */\nlibrary Bytes32ArrayUtils {\n\n uint256 constant internal MAX_INT = 2**256 - 1;\n\n /**\n * Finds the index of the first occurrence of the given element.\n * @param A The input array to search\n * @param a The value to find\n * @return Returns (index and isIn) for the first occurrence starting from index 0\n */\n function indexOf(bytes32[] memory A, bytes32 a) internal pure returns (uint256, bool) {\n uint256 length = A.length;\n for (uint256 i = 0; i < length; i++) {\n if (A[i] == a) {\n return (i, true);\n }\n }\n return (MAX_INT, false);\n }\n\n /**\n * Returns true if the value is present in the list. Uses indexOf internally.\n * @param A The input array to search\n * @param a The value to find\n * @return Returns isIn for the first occurrence starting from index 0\n */\n function contains(bytes32[] memory A, bytes32 a) internal pure returns (bool) {\n (, bool isIn) = indexOf(A, a);\n return isIn;\n }\n\n /**\n * Returns true if there are 2 elements that are the same in an array\n * @param A The input array to search\n * @return Returns boolean for the first occurrence of a duplicate\n */\n function hasDuplicate(bytes32[] memory A) internal pure returns(bool) {\n require(A.length > 0, \"A is empty\");\n\n for (uint256 i = 0; i < A.length - 1; i++) {\n bytes32 current = A[i];\n for (uint256 j = i + 1; j < A.length; j++) {\n if (current == A[j]) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * @param A The input array to search\n * @param a The bytes32 to remove\n * @return Returns the array with the object removed.\n */\n function remove(bytes32[] memory A, bytes32 a)\n internal\n pure\n returns (bytes32[] memory)\n {\n (uint256 index, bool isIn) = indexOf(A, a);\n if (!isIn) {\n revert(\"bytes32 not in array.\");\n } else {\n (bytes32[] memory _A,) = pop(A, index);\n return _A;\n }\n }\n\n /**\n * @param A The input array to search\n * @param a The bytes32 to remove\n */\n function removeStorage(bytes32[] storage A, bytes32 a)\n internal\n {\n (uint256 index, bool isIn) = indexOf(A, a);\n if (!isIn) {\n revert(\"bytes32 not in array.\");\n } else {\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\n if (index != lastIndex) { A[index] = A[lastIndex]; }\n A.pop();\n }\n }\n\n /**\n * Removes specified index from array\n * @param A The input array to search\n * @param index The index to remove\n * @return Returns the new array and the removed entry\n */\n function pop(bytes32[] memory A, uint256 index)\n internal\n pure\n returns (bytes32[] memory, bytes32)\n {\n uint256 length = A.length;\n require(index < A.length, \"Index must be < A length\");\n bytes32[] memory newBytes = new bytes32[](length - 1);\n for (uint256 i = 0; i < index; i++) {\n newBytes[i] = A[i];\n }\n for (uint256 j = index + 1; j < length; j++) {\n newBytes[j - 1] = A[j];\n }\n return (newBytes, A[index]);\n }\n}\n" - }, - "contracts/external/lib/Uint256ArrayUtils.sol": { - "content": "/*\n Copyright 2020 Set Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n SPDX-License-Identifier: Apache-2.0\n*/\n\npragma solidity ^0.8.18;\n\n/**\n * @title Uint256ArrayUtils\n * @author Set Protocol\n *\n * Utility functions to handle Uint256 Arrays\n */\nlibrary Uint256ArrayUtils {\n\n uint256 constant internal MAX_INT = 2**256 - 1;\n\n /**\n * Finds the index of the first occurrence of the given element.\n * @param A The input array to search\n * @param a The value to find\n * @return Returns (index and isIn) for the first occurrence starting from index 0\n */\n function indexOf(uint256[] memory A, uint256 a) internal pure returns (uint256, bool) {\n uint256 length = A.length;\n for (uint256 i = 0; i < length; i++) {\n if (A[i] == a) {\n return (i, true);\n }\n }\n return (MAX_INT, false);\n }\n\n /**\n * Returns true if the value is present in the list. Uses indexOf internally.\n * @param A The input array to search\n * @param a The value to find\n * @return Returns isIn for the first occurrence starting from index 0\n */\n function contains(uint256[] memory A, uint256 a) internal pure returns (bool) {\n (, bool isIn) = indexOf(A, a);\n return isIn;\n }\n\n /**\n * Returns the combination of the two arrays\n * @param A The first array\n * @param B The second array\n * @return Returns A extended by B\n */\n function extend(uint256[] memory A, uint256[] memory B) internal pure returns (uint256[] memory) {\n uint256 aLength = A.length;\n uint256 bLength = B.length;\n uint256[] memory newUints = new uint256[](aLength + bLength);\n for (uint256 i = 0; i < aLength; i++) {\n newUints[i] = A[i];\n }\n for (uint256 j = 0; j < bLength; j++) {\n newUints[aLength + j] = B[j];\n }\n return newUints;\n }\n\n /**\n * @param A The input array to search\n * @param a The bytes32 to remove\n */\n function removeStorage(uint256[] storage A, uint256 a)\n internal\n {\n (uint256 index, bool isIn) = indexOf(A, a);\n if (!isIn) {\n revert(\"uint256 not in array.\");\n } else {\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\n if (index != lastIndex) { A[index] = A[lastIndex]; }\n A.pop();\n }\n }\n}\n" - }, - "contracts/interfaces/ITransferDomainProcessor.sol": { - "content": "//SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\n\ninterface ITransferDomainProcessor {\n\n struct TransferProof {\n uint256[2] a;\n uint256[2][2] b;\n uint256[2] c;\n uint256[10] signals;\n }\n\n function processProof(\n TransferProof calldata _proof\n ) \n external \n returns (\n bytes32 dkimKeyHash, \n bytes32 hashedReceiverId, \n string memory domainName, \n uint256 bidId\n );\n}" - }, - "contracts/interfaces/IVerifiedDomainRegistry.sol": { - "content": "//SPDX-License-Identifier: MIT\n\nimport { IVerifyDomainProcessor } from \"./IVerifyDomainProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ninterface IVerifiedDomainRegistry {\n\n struct Domain {\n address owner;\n string name;\n uint256 expiryTime;\n }\n\n struct DomainWithId {\n bytes32 domainId;\n Domain domain;\n }\n\n function verifyDomains(IVerifyDomainProcessor.Proof[] memory _proofs) external;\n function getDomainId(string memory _domainName) external pure returns (bytes32);\n function getDomainOwner(bytes32 _domainId) external view returns (address);\n}\n" - }, - "contracts/interfaces/IVerifyDomainProcessor.sol": { - "content": "//SPDX-License-Identifier: MIT\nimport { IProxyBaseProcessor } from \"../external/interfaces/IProxyBaseProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ninterface IVerifyDomainProcessor is IProxyBaseProcessor {\n \n struct DomainRaw {\n string name;\n uint256 expiryTime;\n }\n\n function verifyProofs(\n Proof[] memory _proofs\n ) \n external \n returns (DomainRaw[] memory domains);\n}" - } - }, - "settings": { - "viaIR": true, - "optimizer": { - "enabled": true, - "runs": 200, - "details": { - "yulDetails": { - "optimizerSteps": "u" - } - } - }, - "outputSelection": { - "*": { - "*": [ - "abi", - "evm.bytecode", - "evm.deployedBytecode", - "evm.methodIdentifiers", - "metadata", - "devdoc", - "userdoc", - "storageLayout", - "evm.gasEstimates" - ], - "": [ - "ast" - ] - } - }, - "metadata": { - "useLiteralContent": true - } - } -} \ No newline at end of file diff --git a/contracts-domain/deployments/sepolia/solcInputs/a43d75c8fa53cbd70612f5013c5d17a2.json b/contracts-domain/deployments/sepolia/solcInputs/a43d75c8fa53cbd70612f5013c5d17a2.json new file mode 100644 index 000000000..0a9b68d56 --- /dev/null +++ b/contracts-domain/deployments/sepolia/solcInputs/a43d75c8fa53cbd70612f5013c5d17a2.json @@ -0,0 +1,68 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby disabling any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n\n function _contextSuffixLength() internal view virtual returns (uint256) {\n return 0;\n }\n}\n" + }, + "@zk-email/contracts/utils/StringUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.7.6;\n\n// https://github.com/nalinbhardwaj/ethdosnumber/blob/main/ethdos-contracts/src/HexStrings.sol\nlibrary StringUtils {\n bytes16 internal constant ALPHABET = \"0123456789abcdef\";\n uint256 internal constant DEFAULT_PACK_SIZE = 31;\n\n /// @notice Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n /// @dev Credit to Open Zeppelin under MIT license https://github.com/OpenZeppelin/openzeppelin-contracts/blob/243adff49ce1700e0ecb99fe522fb16cff1d1ddc/contracts/utils/Strings.sol#L55\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = ALPHABET[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n function toHexStringNoPrefix(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length);\n for (uint256 i = buffer.length; i > 0; i--) {\n buffer[i - 1] = ALPHABET[value & 0xf];\n value >>= 4;\n }\n return string(buffer);\n }\n\n function toString(uint256 value) internal pure returns (string memory) {\n return toString(abi.encodePacked(value));\n }\n\n function toString(bytes32 value) internal pure returns (string memory) {\n return toString(abi.encodePacked(value));\n }\n\n function toString(address account) internal pure returns (string memory) {\n return toString(abi.encodePacked(account));\n }\n\n function stringEq(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));\n }\n\n function toString(bytes memory data) internal pure returns (string memory) {\n bytes memory alphabet = \"0123456789abcdef\";\n\n bytes memory str = new bytes(2 + data.length * 2);\n str[0] = \"0\";\n str[1] = \"x\";\n for (uint256 i = 0; i < data.length; i++) {\n str[2 + i * 2] = alphabet[uint256(uint8(data[i] >> 4))];\n str[3 + i * 2] = alphabet[uint256(uint8(data[i] & 0x0f))];\n }\n return string(str);\n }\n\n // 1 packed byte = packSize (usually 31) normal bytes, all in one 255/256-bit value\n // Note that this is not 32 due to the field modulus of circom\n function convertPackedByteToString(uint256 packedByte, uint256 packSize)\n internal\n pure\n returns (string memory extractedString)\n {\n uint256[] memory packedBytes = new uint256[](1);\n packedBytes[0] = packedByte;\n return convertPackedBytesToString(packedBytes, packSize, packSize);\n }\n\n // Note: This convenience function removes the max string length check, which may cause misalignment with the circom\n // If using this, then the circom needs to rangecheck packed length in the circuit itself\n // This defaults to 31 bytes per packed byte\n function convertPackedBytesToString(uint256[] memory packedBytes) \n internal\n pure\n returns (string memory extractedString)\n {\n return convertPackedBytesToString(packedBytes, packedBytes.length * DEFAULT_PACK_SIZE, DEFAULT_PACK_SIZE);\n }\n\n // Unpacks uint256s into bytes and then extracts the non-zero characters\n // Only extracts contiguous non-zero characters and ensures theres only 1 such state\n // Note that unpackedLen may be more than packedBytes.length * 8 since there may be 0s\n // signals is the total number of signals (i.e. bytes) packed into the packedBytes. it defaults to packedBytes.length * packSize\n function convertPackedBytesToString(uint256[] memory packedBytes, uint256 signals, uint256 packSize)\n internal\n pure\n returns (string memory extractedString)\n {\n uint8 state = 0;\n // bytes: 0 0 0 0 y u s h _ g 0 0 0\n // state: 0 0 0 0 1 1 1 1 1 1 2 2 2\n bytes memory nonzeroBytesArray = new bytes(packedBytes.length * packSize);\n uint256 nonzeroBytesArrayIndex = 0;\n for (uint16 i = 0; i < packedBytes.length; i++) {\n uint256 packedByte = packedBytes[i];\n uint8[] memory unpackedBytes = new uint8[](packSize);\n for (uint256 j = 0; j < packSize; j++) {\n unpackedBytes[j] = uint8(packedByte >> (j * 8));\n }\n for (uint256 j = 0; j < packSize; j++) {\n uint256 unpackedByte = unpackedBytes[j]; //unpackedBytes[j];\n if (unpackedByte != 0) {\n nonzeroBytesArray[nonzeroBytesArrayIndex] = bytes1(uint8(unpackedByte));\n nonzeroBytesArrayIndex++;\n if (state % 2 == 0) {\n state += 1;\n }\n } else {\n if (state % 2 == 1) {\n state += 1;\n }\n }\n packedByte = packedByte >> 8;\n }\n }\n // TODO: You might want to assert that the state is exactly 1 or 2\n // If not, that means empty bytse have been removed from the middle and things have been concatenated.\n // We removed due to some tests failing, but this is not ideal and the require should be uncommented as soon as tests pass with it.\n\n // require(state == 1 || state == 2, \"Invalid final state of packed bytes in email; more than two non-zero regions found!\");\n require(state >= 1, \"No packed bytes found! Invalid final state of packed bytes in email; value is likely 0!\");\n require(nonzeroBytesArrayIndex <= signals, \"Packed bytes more than allowed max number of signals!\");\n string memory returnValue = removeTrailingZeros(string(nonzeroBytesArray));\n return returnValue;\n // Have to end at the end of the email -- state cannot be 1 since there should be an email footer\n }\n\n function bytes32ToString(bytes32 input) internal pure returns (string memory) {\n uint256 i;\n for (i = 0; i < 32 && input[i] != 0; i++) {}\n bytes memory resultBytes = new bytes(i);\n for (i = 0; i < 32 && input[i] != 0; i++) {\n resultBytes[i] = input[i];\n }\n return string(resultBytes);\n }\n\n // sliceArray is used to slice an array of uint256s from start-end into a new array of uint256s\n function sliceArray(uint256[] memory input, uint256 start, uint256 end) internal pure returns (uint256[] memory) {\n require(start <= end && end <= input.length, \"Invalid slice indices\");\n uint256[] memory result = new uint256[](end - start);\n for (uint256 i = start; i < end; i++) {\n result[i - start] = input[i];\n }\n return result;\n }\n\n // stringToUint is used to convert a string like \"45\" to a uint256 4\n function stringToUint(string memory s) internal pure returns (uint256) {\n bytes memory b = bytes(s);\n uint256 result = 0;\n for (uint256 i = 0; i < b.length; i++) {\n if (b[i] >= 0x30 && b[i] <= 0x39) {\n result = result * 10 + (uint256(uint8(b[i])) - 48);\n }\n\n // TODO: Currently truncates decimals\n if (b[i] == 0x2E) {\n return result;\n }\n }\n return result;\n }\n\n // getDomainFromEmail is used to extract the domain from an email i.e. the part after the @\n function getDomainFromEmail(string memory fromEmail) internal pure returns (string memory) {\n bytes memory emailBytes = bytes(fromEmail);\n uint256 atIndex;\n for (uint256 i = 0; i < emailBytes.length; i++) {\n if (emailBytes[i] == \"@\") {\n atIndex = i;\n break;\n }\n }\n\n bytes memory domainBytes = new bytes(emailBytes.length - atIndex - 1);\n for (uint256 j = 0; j < domainBytes.length; j++) {\n domainBytes[j] = emailBytes[atIndex + 1 + j];\n }\n return bytes32ToString(bytes32(bytes(domainBytes)));\n }\n\n function removeTrailingZeros(string memory input) public pure returns (string memory) {\n bytes memory inputBytes = bytes(input);\n uint256 endIndex = inputBytes.length;\n\n for (uint256 i = 0; i < inputBytes.length; i++) {\n if (inputBytes[i] == 0) {\n endIndex = i;\n break;\n }\n }\n\n bytes memory resultBytes = new bytes(endIndex);\n for (uint256 i = 0; i < endIndex; i++) {\n resultBytes[i] = inputBytes[i];\n }\n\n return string(resultBytes);\n }\n\n // Upper/lower string utils from https://github.com/willitscale/solidity-util/blob/master/lib/Strings.sol\n /**\n * Upper\n *\n * Converts all the values of a string to their corresponding upper case\n * value.\n *\n * @param _base When being used for a data type this is the extended object\n * otherwise this is the string base to convert to upper case\n * @return string\n */\n function upper(string memory _base) public pure returns (string memory) {\n bytes memory _baseBytes = bytes(_base);\n for (uint256 i = 0; i < _baseBytes.length; i++) {\n _baseBytes[i] = _upper(_baseBytes[i]);\n }\n return string(_baseBytes);\n }\n\n /**\n * Lower\n *\n * Converts all the values of a string to their corresponding lower case\n * value.\n *\n * @param _base When being used for a data type this is the extended object\n * otherwise this is the string base to convert to lower case\n * @return string\n */\n function lower(string memory _base) public pure returns (string memory) {\n bytes memory _baseBytes = bytes(_base);\n for (uint256 i = 0; i < _baseBytes.length; i++) {\n _baseBytes[i] = _lower(_baseBytes[i]);\n }\n return string(_baseBytes);\n }\n\n /**\n * Upper\n *\n * Convert an alphabetic character to upper case and return the original\n * value when not alphabetic\n *\n * @param _b1 The byte to be converted to upper case\n * @return bytes1 The converted value if the passed value was alphabetic\n * and in a lower case otherwise returns the original value\n */\n function _upper(bytes1 _b1) private pure returns (bytes1) {\n if (_b1 >= 0x61 && _b1 <= 0x7A) {\n return bytes1(uint8(_b1) - 32);\n }\n\n return _b1;\n }\n\n /**\n * Lower\n *\n * Convert an alphabetic character to lower case and return the original\n * value when not alphabetic\n *\n * @param _b1 The byte to be converted to lower case\n * @return bytes1 The converted value if the passed value was alphabetic\n * and in a upper case otherwise returns the original value\n */\n function _lower(bytes1 _b1) private pure returns (bytes1) {\n if (_b1 >= 0x41 && _b1 <= 0x5A) {\n return bytes1(uint8(_b1) + 32);\n }\n\n return _b1;\n }\n}\n" + }, + "contracts/external/interfaces/IKeyHashAdapterV2.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IKeyHashAdapterV2 {\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external;\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external;\n function getMailServerKeyHashes() external view returns (bytes32[] memory);\n function isMailServerKeyHash(bytes32 _mailserverKeyHash) external view returns (bool);\n}\n" + }, + "contracts/external/interfaces/INullifierRegistry.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface INullifierRegistry {\n function addNullifier(bytes32 _nullifier) external;\n function isNullified(bytes32 _nullifier) external view returns(bool);\n}\n" + }, + "contracts/external/lib/StringConversionUtils.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\n// Building on zk-email's StringUtils library we add the ability to handle decimals when\n// converting from string to Uint\nlibrary StringConversionUtils {\n \n /**\n * @notice Function that parses numbers returned as strings including floating point numbers. Returned floating point\n * numbers are to have the desired amount of decimal specified. If the stringified version of the floating point\n * number has more decimal places than desired then the function will revert in order to be maximally safe. If\n * the returned number has multiple floating points then the function will revert.\n *\n * Examples: _s = \"12.34\", _expectedDecimals = 6 => 12340000\n * _s = \"12.34\", _expectedDecimals = 2 => 1234\n * _s = \"12.34\", _expectedDecimals = 1 => REVERT (we never want loss of precision only addition)\n * _s = \"12.34.56\", _expectedDecimals = 6 => REVERT (Invalid number)\n *\n * @param _s String being processed\n * @param _desiredDecimals Desired amount of decimal places\n */\n function stringToUint(string memory _s, uint256 _desiredDecimals) internal pure returns (uint256) {\n return stringToUint(_s, 0x2E, _desiredDecimals);\n }\n\n function stringToUint(\n string memory _s,\n bytes1 _decimalCharacter,\n uint256 _desiredDecimals\n )\n internal\n pure\n returns (uint256)\n {\n bytes memory b = bytes(_s);\n\n uint256 result = 0;\n uint256 decimalPlaces = 0;\n\n bool decimals = false;\n for (uint256 i = 0; i < b.length; i++) {\n if (b[i] >= 0x30 && b[i] <= 0x39) {\n result = result * 10 + (uint256(uint8(b[i])) - 48);\n }\n\n if (decimals) {\n decimalPlaces++;\n }\n\n if (b[i] == _decimalCharacter) {\n require(decimals == false, \"String has multiple decimals\");\n decimals = true;\n }\n }\n\n require(decimalPlaces <= _desiredDecimals, \"String has too many decimal places\");\n return result * (10 ** (_desiredDecimals - decimalPlaces));\n }\n\n /**\n * @notice Function that returns a substring from _startIndex to _endIndex (non-inclusive).\n *\n * @param _str String being processed\n * @param _startIndex Index to start parsing from\n * @param _endIndex Index to stop parsing at (index not included in result)\n */\n function substring(string memory _str, uint _startIndex, uint _endIndex) internal pure returns (string memory ) {\n bytes memory strBytes = bytes(_str);\n bytes memory result = new bytes(_endIndex-_startIndex);\n for(uint i = _startIndex; i < _endIndex; i++) {\n result[i-_startIndex] = strBytes[i];\n }\n return string(result);\n }\n\n function replaceString(\n string memory _str,\n string memory _lookupValue,\n string memory _replaceValue\n )\n internal\n pure\n returns (string memory)\n {\n bytes memory strBytes = bytes(_str);\n bytes memory lookupBytes = bytes(_lookupValue);\n\n uint256 lookupIndex = indexOf(_str, _lookupValue);\n if (lookupIndex == type(uint256).max) {\n return _str;\n }\n\n // Split the original string into two parts: before and after the keyword\n string memory beforeKeyword = substring(_str, 0, lookupIndex);\n string memory afterKeyword = substring(_str, lookupIndex + lookupBytes.length, strBytes.length);\n \n return string.concat(beforeKeyword, _replaceValue, afterKeyword);\n }\n\n function indexOf(string memory str, string memory substr) internal pure returns (uint) {\n bytes memory strBytes = bytes(str);\n bytes memory substrBytes = bytes(substr);\n \n if (strBytes.length < substrBytes.length) return type(uint256).max;\n \n for (uint i = 0; i <= strBytes.length - substrBytes.length; i++) {\n bool found = true;\n for (uint j = 0; j < substrBytes.length; j++) {\n if (strBytes[i + j] != substrBytes[j]) {\n found = false;\n break;\n }\n }\n if (found) return i;\n }\n \n return type(uint256).max;\n }\n\n function stringComparison(string memory _a, string memory _b) internal pure returns (bool) {\n return (keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b)));\n }\n}\n" + }, + "contracts/external/processors/EmailBaseProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { IKeyHashAdapterV2 } from \"../interfaces/IKeyHashAdapterV2.sol\";\nimport { INullifierRegistry } from \"../interfaces/INullifierRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract EmailBaseProcessor is Ownable {\n\n /* ============ Modifiers ============ */\n modifier onlyExchange() {\n require(msg.sender == exchange, \"Only exchange can call this function\");\n _;\n }\n\n /* ============ State Variables ============ */\n address public immutable exchange;\n INullifierRegistry public nullifierRegistry;\n bytes public emailFromAddress;\n uint256 public timestampBuffer;\n\n /* ============ Constructor ============ */\n constructor(\n address _exchange,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Ownable()\n {\n exchange = _exchange;\n nullifierRegistry = _nullifierRegistry;\n emailFromAddress = bytes(_emailFromAddress);\n timestampBuffer = _timestampBuffer;\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice ONLY OWNER: Sets the from email address for validated emails. Check that email address is properly\n * padded (if necessary). Padding will be dependent on if unpacking functions cut trailing 0s or not.\n *\n * @param _emailFromAddress The from email address for validated emails, MUST BE PROPERLY PADDED\n */\n function setEmailFromAddress(string memory _emailFromAddress) external onlyOwner {\n emailFromAddress = bytes(_emailFromAddress);\n }\n\n /**\n * @notice ONLY OWNER: Sets the timestamp buffer for validated emails. This is the amount of time in seconds\n * that the timestamp can be off by and still be considered valid. Necessary to build in flexibility with L2\n * timestamps.\n *\n * @param _timestampBuffer The timestamp buffer for validated emails\n */\n function setTimestampBuffer(uint256 _timestampBuffer) external onlyOwner {\n timestampBuffer = _timestampBuffer;\n }\n\n /* ============ External Getters ============ */\n\n function getEmailFromAddress() external view returns (bytes memory) {\n return emailFromAddress;\n }\n\n\n /* ============ Internal Functions ============ */\n\n function _validateAndAddNullifier(bytes32 _nullifier) internal {\n require(!nullifierRegistry.isNullified(_nullifier), \"Nullifier has already been used\");\n nullifierRegistry.addNullifier(_nullifier);\n }\n}\n" + }, + "contracts/interfaces/ITransferDomainProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\n\ninterface ITransferDomainProcessor {\n\n struct TransferProof {\n uint256[2] a;\n uint256[2][2] b;\n uint256[2] c;\n uint256[10] signals;\n }\n\n function processProof(\n TransferProof calldata _proof\n ) \n external \n returns (\n bytes32 dkimKeyHash, \n bytes32 hashedReceiverId, \n string memory domainName, \n uint256 bidId\n );\n}" + }, + "contracts/TransferDomainProcessor.sol": { + "content": "// SPDX-License-Identifier: MIT\n\nimport { StringUtils } from \"@zk-email/contracts/utils/StringUtils.sol\";\n\nimport { EmailBaseProcessor } from \"./external/processors/EmailBaseProcessor.sol\";\nimport { INullifierRegistry } from \"./external/interfaces/INullifierRegistry.sol\";\nimport { StringConversionUtils } from \"./external/lib/StringConversionUtils.sol\";\n\nimport { Groth16Verifier } from \"./verifiers/namecheap_transfer_verifier.sol\";\nimport { ITransferDomainProcessor } from \"./interfaces/ITransferDomainProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract TransferDomainProcessor is Groth16Verifier, ITransferDomainProcessor, EmailBaseProcessor {\n \n using StringUtils for uint256[];\n using StringConversionUtils for string;\n\n /* ============ Constants ============ */\n uint256 constant PACK_SIZE = 31;\n\n /* ============ Constructor ============ */\n constructor(\n address _exchange,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Groth16Verifier()\n EmailBaseProcessor(\n _exchange,\n _nullifierRegistry,\n _emailFromAddress,\n _timestampBuffer\n )\n {}\n \n /* ============ External Functions ============ */\n\n function processProof(\n TransferProof calldata _proof\n )\n external\n override\n onlyExchange\n returns (\n bytes32 dkimKeyHash,\n bytes32 hashedReceiverId,\n string memory domainName, \n uint256 bidId\n )\n {\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \"Invalid Proof\");\n\n // Signal [0] is the DKIM key hash\n dkimKeyHash = bytes32(_proof.signals[0]);\n\n // Signals [1:2] are the packed from email address\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 2);\n require(\n keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \n \"Invalid email from address\"\n );\n \n // Signals [2:7] are packed domain name\n domainName = _parseSignalArray(_proof.signals, 2, 7);\n\n // Signal [7] is packed hashed namecheap id to which domain was transferred\n hashedReceiverId = bytes32(_proof.signals[7]);\n\n // Check if email has been used previously, if not nullify it so it can't be used again\n _validateAndAddNullifier(bytes32(_proof.signals[8]));\n\n // Signal [9] is bidId\n bidId = _proof.signals[9];\n }\n \n /* ============ Internal Functions ============ */\n\n function _parseSignalArray(uint256[10] calldata _signals, uint8 _from, uint8 _to) \n internal \n pure \n returns (string memory) \n {\n uint256[] memory signalArray = new uint256[](_to - _from);\n for (uint256 i = _from; i < _to; i++) {\n signalArray[i - _from] = _signals[i];\n }\n\n return signalArray.convertPackedBytesToString(signalArray.length * PACK_SIZE, PACK_SIZE);\n }\n}\n" + }, + "contracts/verifiers/namecheap_transfer_verifier.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n/*\n Copyright 2021 0KIMS association.\n\n This file is generated with [snarkJS](https://github.com/iden3/snarkjs).\n\n snarkJS is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n snarkJS is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with snarkJS. If not, see .\n*/\n\npragma solidity >=0.7.0 <0.9.0;\n\ncontract Groth16Verifier {\n // Scalar field size\n uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n // Base field size\n uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\n\n // Verification Key data\n uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042;\n uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958;\n uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132;\n uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731;\n uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679;\n uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856;\n uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\n uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\n uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\n uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\n uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\n uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\n uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\n uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\n\n \n uint256 constant IC0x = 12718791721466586474772975178991944367361898681403889293050590835735829974174;\n uint256 constant IC0y = 6579614210328804738196110281777440845203538387714672921854127346802897741731;\n \n uint256 constant IC1x = 15050971342023334328313633330499885418161248915553086390701402242486225179368;\n uint256 constant IC1y = 5024764877577619588829734526990256704181621131776349449360023481477820279987;\n \n uint256 constant IC2x = 7494265978725599958916265753653166549633529129800692658333846839504191651648;\n uint256 constant IC2y = 6331829577874431053631060489192183034310045972687441697179743819760334117448;\n \n uint256 constant IC3x = 19001722242244131321371144536562173279385056519981716838131699446018662048085;\n uint256 constant IC3y = 8148711952593941450664988855383229951630582602775661040234820121548658879338;\n \n uint256 constant IC4x = 3624352076627862068761560802183636400416483488844158805038644908873200708814;\n uint256 constant IC4y = 20894074159790604892251457333772898092352374489464929653588484093719978460605;\n \n uint256 constant IC5x = 2098287694939727519558784139808406325855172668407809961967029546183317335265;\n uint256 constant IC5y = 5659241113472526955215440521431168972841548603376846026887752206139550832697;\n \n uint256 constant IC6x = 17054571586962694690567468783102453574497782768524521043534058966826398455175;\n uint256 constant IC6y = 4087439525418017845490176926142509334113265173570304433911881676407144081865;\n \n uint256 constant IC7x = 7441928267847731392209447389119131741297268634643246304512516729270550734194;\n uint256 constant IC7y = 15714253901405577134617988311525363228461039013850912155558149694323922788327;\n \n uint256 constant IC8x = 11989172231499636764423272601594485978016807201316866170676011918612131765820;\n uint256 constant IC8y = 15918479982497737545158513843427772249925445687882255296587424450200131669618;\n \n uint256 constant IC9x = 19827744545534206076315711984525184804508732918768894016552346430789516516368;\n uint256 constant IC9y = 16361460611570894490152793347002588479282989223552655286979659973731335376509;\n \n uint256 constant IC10x = 10898965818757221383985300751768263931593441442012024286290119328446015154272;\n uint256 constant IC10y = 6989418820395701171656324073128354251482680955655018162117108617053607002569;\n \n \n // Memory data\n uint16 constant pVk = 0;\n uint16 constant pPairing = 128;\n\n uint16 constant pLastMem = 896;\n\n function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[10] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, r)) {\n mstore(0, 0)\n return(0, 0x20)\n }\n }\n \n // G1 function to multiply a G1 value(x,y) to value in an address\n function g1_mulAccC(pR, x, y, s) {\n let success\n let mIn := mload(0x40)\n mstore(mIn, x)\n mstore(add(mIn, 32), y)\n mstore(add(mIn, 64), s)\n\n success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)\n\n if iszero(success) {\n mstore(0, 0)\n return(0, 0x20)\n }\n\n mstore(add(mIn, 64), mload(pR))\n mstore(add(mIn, 96), mload(add(pR, 32)))\n\n success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)\n\n if iszero(success) {\n mstore(0, 0)\n return(0, 0x20)\n }\n }\n\n function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {\n let _pPairing := add(pMem, pPairing)\n let _pVk := add(pMem, pVk)\n\n mstore(_pVk, IC0x)\n mstore(add(_pVk, 32), IC0y)\n\n // Compute the linear combination vk_x\n \n g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))\n \n g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))\n \n g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))\n \n g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))\n \n g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))\n \n g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)))\n \n g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)))\n \n g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)))\n \n g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)))\n \n g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288)))\n \n\n // -A\n mstore(_pPairing, calldataload(pA))\n mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q))\n\n // B\n mstore(add(_pPairing, 64), calldataload(pB))\n mstore(add(_pPairing, 96), calldataload(add(pB, 32)))\n mstore(add(_pPairing, 128), calldataload(add(pB, 64)))\n mstore(add(_pPairing, 160), calldataload(add(pB, 96)))\n\n // alpha1\n mstore(add(_pPairing, 192), alphax)\n mstore(add(_pPairing, 224), alphay)\n\n // beta2\n mstore(add(_pPairing, 256), betax1)\n mstore(add(_pPairing, 288), betax2)\n mstore(add(_pPairing, 320), betay1)\n mstore(add(_pPairing, 352), betay2)\n\n // vk_x\n mstore(add(_pPairing, 384), mload(add(pMem, pVk)))\n mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))\n\n\n // gamma2\n mstore(add(_pPairing, 448), gammax1)\n mstore(add(_pPairing, 480), gammax2)\n mstore(add(_pPairing, 512), gammay1)\n mstore(add(_pPairing, 544), gammay2)\n\n // C\n mstore(add(_pPairing, 576), calldataload(pC))\n mstore(add(_pPairing, 608), calldataload(add(pC, 32)))\n\n // delta2\n mstore(add(_pPairing, 640), deltax1)\n mstore(add(_pPairing, 672), deltax2)\n mstore(add(_pPairing, 704), deltay1)\n mstore(add(_pPairing, 736), deltay2)\n\n\n let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20)\n\n isOk := and(success, mload(_pPairing))\n }\n\n let pMem := mload(0x40)\n mstore(0x40, add(pMem, pLastMem))\n\n // Validate that all evaluations ∈ F\n \n checkField(calldataload(add(_pubSignals, 0)))\n \n checkField(calldataload(add(_pubSignals, 32)))\n \n checkField(calldataload(add(_pubSignals, 64)))\n \n checkField(calldataload(add(_pubSignals, 96)))\n \n checkField(calldataload(add(_pubSignals, 128)))\n \n checkField(calldataload(add(_pubSignals, 160)))\n \n checkField(calldataload(add(_pubSignals, 192)))\n \n checkField(calldataload(add(_pubSignals, 224)))\n \n checkField(calldataload(add(_pubSignals, 256)))\n \n checkField(calldataload(add(_pubSignals, 288)))\n \n checkField(calldataload(add(_pubSignals, 320)))\n \n\n // Validate all evaluations\n let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)\n\n mstore(0, isValid)\n return(0, 0x20)\n }\n }\n }\n" + } + }, + "settings": { + "viaIR": true, + "optimizer": { + "enabled": true, + "runs": 200, + "details": { + "yulDetails": { + "optimizerSteps": "u" + } + } + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/contracts-domain/deployments/sepolia/solcInputs/5430ec5a2a9a288ed108e648fd68abb0.json b/contracts-domain/deployments/sepolia/solcInputs/d865a6f49eab8c58036d78b72f5cb448.json similarity index 57% rename from contracts-domain/deployments/sepolia/solcInputs/5430ec5a2a9a288ed108e648fd68abb0.json rename to contracts-domain/deployments/sepolia/solcInputs/d865a6f49eab8c58036d78b72f5cb448.json index 73506b0ad..1bf0b3e3a 100644 --- a/contracts-domain/deployments/sepolia/solcInputs/5430ec5a2a9a288ed108e648fd68abb0.json +++ b/contracts-domain/deployments/sepolia/solcInputs/d865a6f49eab8c58036d78b72f5cb448.json @@ -10,6 +10,15 @@ "@openzeppelin/contracts/security/ReentrancyGuard.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n // Booleans are more expensive than uint256 or any type that takes up a full\n // word because each write operation emits an extra SLOAD to first read the\n // slot's contents, replace the bits taken up by the boolean, and then write\n // back. This is the compiler's defense against contract upgrades and\n // pointer aliasing, and it cannot be disabled.\n\n // The values being non-zero value makes deployment a bit more expensive,\n // but in exchange the refund on every call to nonReentrant will be lower in\n // amount. Since refunds are capped to a percentage of the total\n // transaction's gas, it is best to keep them low in cases like this one, to\n // increase the likelihood of the full refund coming into effect.\n uint256 private constant _NOT_ENTERED = 1;\n uint256 private constant _ENTERED = 2;\n\n uint256 private _status;\n\n constructor() {\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Prevents a contract from calling itself, directly or indirectly.\n * Calling a `nonReentrant` function from another `nonReentrant`\n * function is not supported. It is possible to prevent this from happening\n * by making the `nonReentrant` function external, and making it call a\n * `private` function that does the actual work.\n */\n modifier nonReentrant() {\n _nonReentrantBefore();\n _;\n _nonReentrantAfter();\n }\n\n function _nonReentrantBefore() private {\n // On the first call to nonReentrant, _status will be _NOT_ENTERED\n require(_status != _ENTERED, \"ReentrancyGuard: reentrant call\");\n\n // Any calls to nonReentrant after this point will fail\n _status = _ENTERED;\n }\n\n function _nonReentrantAfter() private {\n // By storing the original value once again, a refund is triggered (see\n // https://eips.ethereum.org/EIPS/eip-2200)\n _status = _NOT_ENTERED;\n }\n\n /**\n * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n * `nonReentrant` function in the call stack.\n */\n function _reentrancyGuardEntered() internal view returns (bool) {\n return _status == _ENTERED;\n }\n}\n" }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(address from, address to, uint256 amount) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n /**\n * @dev Returns the name of the token.\n */\n function name() external view returns (string memory);\n\n /**\n * @dev Returns the symbol of the token.\n */\n function symbol() external view returns (string memory);\n\n /**\n * @dev Returns the decimals places of the token.\n */\n function decimals() external view returns (uint8);\n}\n" + }, + "@openzeppelin/contracts/token/ERC20/IERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n /**\n * @dev Emitted when `value` tokens are moved from one account (`from`) to\n * another (`to`).\n *\n * Note that `value` may be zero.\n */\n event Transfer(address indexed from, address indexed to, uint256 value);\n\n /**\n * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n * a call to {approve}. `value` is the new allowance.\n */\n event Approval(address indexed owner, address indexed spender, uint256 value);\n\n /**\n * @dev Returns the amount of tokens in existence.\n */\n function totalSupply() external view returns (uint256);\n\n /**\n * @dev Returns the amount of tokens owned by `account`.\n */\n function balanceOf(address account) external view returns (uint256);\n\n /**\n * @dev Moves `amount` tokens from the caller's account to `to`.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transfer(address to, uint256 amount) external returns (bool);\n\n /**\n * @dev Returns the remaining number of tokens that `spender` will be\n * allowed to spend on behalf of `owner` through {transferFrom}. This is\n * zero by default.\n *\n * This value changes when {approve} or {transferFrom} are called.\n */\n function allowance(address owner, address spender) external view returns (uint256);\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * IMPORTANT: Beware that changing an allowance with this method brings the risk\n * that someone may use both the old and the new allowance by unfortunate\n * transaction ordering. One possible solution to mitigate this race\n * condition is to first reduce the spender's allowance to 0 and set the\n * desired value afterwards:\n * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n *\n * Emits an {Approval} event.\n */\n function approve(address spender, uint256 amount) external returns (bool);\n\n /**\n * @dev Moves `amount` tokens from `from` to `to` using the\n * allowance mechanism. `amount` is then deducted from the caller's\n * allowance.\n *\n * Returns a boolean value indicating whether the operation succeeded.\n *\n * Emits a {Transfer} event.\n */\n function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n" + }, "@openzeppelin/contracts/utils/Address.sol": { "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n *\n * Furthermore, `isContract` will also return true if the target contract within\n * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n * which only has an effect at the end of a transaction.\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" }, @@ -34,15 +43,24 @@ "@reclaimprotocol/verifier-solidity-sdk/contracts/StringUtils.sol": { "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\n/**\n * Utilities for string manipulation & conversion\n */\nlibrary StringUtils {\n\tfunction address2str(address x) internal pure returns (string memory) {\n\t\tbytes memory s = new bytes(40);\n\t\tfor (uint i = 0; i < 20; i++) {\n\t\t\tbytes1 b = bytes1(uint8(uint(uint160(x)) / (2 ** (8 * (19 - i)))));\n\t\t\tbytes1 hi = bytes1(uint8(b) / 16);\n\t\t\tbytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));\n\t\t\ts[2 * i] = getChar(hi);\n\t\t\ts[2 * i + 1] = getChar(lo);\n\t\t}\n\t\treturn string(abi.encodePacked(\"0x\", s));\n\t}\n\n\tfunction bytes2str(bytes memory buffer) internal pure returns (string memory) {\n\t\t// Fixed buffer size for hexadecimal convertion\n\t\tbytes memory converted = new bytes(buffer.length * 2);\n\t\tbytes memory _base = \"0123456789abcdef\";\n\n\t\tfor (uint256 i = 0; i < buffer.length; i++) {\n\t\t\tconverted[i * 2] = _base[uint8(buffer[i]) / _base.length];\n\t\t\tconverted[i * 2 + 1] = _base[uint8(buffer[i]) % _base.length];\n\t\t}\n\n\t\treturn string(abi.encodePacked(\"0x\", converted));\n\t}\n\n\tfunction getChar(bytes1 b) internal pure returns (bytes1 c) {\n\t\tif (uint8(b) < 10) return bytes1(uint8(b) + 0x30);\n\t\telse return bytes1(uint8(b) + 0x57);\n\t}\n\n\tfunction bool2str(bool _b) internal pure returns (string memory _uintAsString) {\n\t\tif (_b) {\n\t\t\treturn \"true\";\n\t\t} else {\n\t\t\treturn \"false\";\n\t\t}\n\t}\n\n\tfunction uint2str(uint _i) internal pure returns (string memory _uintAsString) {\n\t\tif (_i == 0) {\n\t\t\treturn \"0\";\n\t\t}\n\t\tuint j = _i;\n\t\tuint len;\n\t\twhile (j != 0) {\n\t\t\tlen++;\n\t\t\tj /= 10;\n\t\t}\n\t\tbytes memory bstr = new bytes(len);\n\t\tuint k = len;\n\t\twhile (_i != 0) {\n\t\t\tk = k - 1;\n\t\t\tuint8 temp = (48 + uint8(_i - (_i / 10) * 10));\n\t\t\tbytes1 b1 = bytes1(temp);\n\t\t\tbstr[k] = b1;\n\t\t\t_i /= 10;\n\t\t}\n\t\treturn string(bstr);\n\t}\n\n\tfunction areEqual(\n\t\tstring calldata _a,\n\t\tstring storage _b\n\t) internal pure returns (bool) {\n\t\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\n\t}\n\n\tfunction areEqual(string memory _a, string memory _b) internal pure returns (bool) {\n\t\treturn keccak256(abi.encodePacked((_a))) == keccak256(abi.encodePacked((_b)));\n\t}\n\n\tfunction toLower(string memory str) internal pure returns (string memory) {\n\t\tbytes memory bStr = bytes(str);\n\t\tbytes memory bLower = new bytes(bStr.length);\n\t\tfor (uint i = 0; i < bStr.length; i++) {\n\t\t\t// Uppercase character...\n\t\t\tif ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {\n\t\t\t\t// So we add 32 to make it lowercase\n\t\t\t\tbLower[i] = bytes1(uint8(bStr[i]) + 32);\n\t\t\t} else {\n\t\t\t\tbLower[i] = bStr[i];\n\t\t\t}\n\t\t}\n\t\treturn string(bLower);\n\t}\n\n\tfunction substring(\n\t\tstring memory str,\n\t\tuint startIndex,\n\t\tuint endIndex\n\t) internal pure returns (string memory) {\n\t\tbytes memory strBytes = bytes(str);\n\t\tbytes memory result = new bytes(endIndex - startIndex);\n\t\tfor (uint i = startIndex; i < endIndex; i++) {\n\t\t\tresult[i - startIndex] = strBytes[i];\n\t\t}\n\t\treturn string(result);\n\t}\n}\n" }, + "@zk-email/contracts/utils/StringUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.7.6;\n\n// https://github.com/nalinbhardwaj/ethdosnumber/blob/main/ethdos-contracts/src/HexStrings.sol\nlibrary StringUtils {\n bytes16 internal constant ALPHABET = \"0123456789abcdef\";\n uint256 internal constant DEFAULT_PACK_SIZE = 31;\n\n /// @notice Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n /// @dev Credit to Open Zeppelin under MIT license https://github.com/OpenZeppelin/openzeppelin-contracts/blob/243adff49ce1700e0ecb99fe522fb16cff1d1ddc/contracts/utils/Strings.sol#L55\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length + 2);\n buffer[0] = \"0\";\n buffer[1] = \"x\";\n for (uint256 i = 2 * length + 1; i > 1; --i) {\n buffer[i] = ALPHABET[value & 0xf];\n value >>= 4;\n }\n require(value == 0, \"Strings: hex length insufficient\");\n return string(buffer);\n }\n\n function toHexStringNoPrefix(uint256 value, uint256 length) internal pure returns (string memory) {\n bytes memory buffer = new bytes(2 * length);\n for (uint256 i = buffer.length; i > 0; i--) {\n buffer[i - 1] = ALPHABET[value & 0xf];\n value >>= 4;\n }\n return string(buffer);\n }\n\n function toString(uint256 value) internal pure returns (string memory) {\n return toString(abi.encodePacked(value));\n }\n\n function toString(bytes32 value) internal pure returns (string memory) {\n return toString(abi.encodePacked(value));\n }\n\n function toString(address account) internal pure returns (string memory) {\n return toString(abi.encodePacked(account));\n }\n\n function stringEq(string memory a, string memory b) internal pure returns (bool) {\n return keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b));\n }\n\n function toString(bytes memory data) internal pure returns (string memory) {\n bytes memory alphabet = \"0123456789abcdef\";\n\n bytes memory str = new bytes(2 + data.length * 2);\n str[0] = \"0\";\n str[1] = \"x\";\n for (uint256 i = 0; i < data.length; i++) {\n str[2 + i * 2] = alphabet[uint256(uint8(data[i] >> 4))];\n str[3 + i * 2] = alphabet[uint256(uint8(data[i] & 0x0f))];\n }\n return string(str);\n }\n\n // 1 packed byte = packSize (usually 31) normal bytes, all in one 255/256-bit value\n // Note that this is not 32 due to the field modulus of circom\n function convertPackedByteToString(uint256 packedByte, uint256 packSize)\n internal\n pure\n returns (string memory extractedString)\n {\n uint256[] memory packedBytes = new uint256[](1);\n packedBytes[0] = packedByte;\n return convertPackedBytesToString(packedBytes, packSize, packSize);\n }\n\n // Note: This convenience function removes the max string length check, which may cause misalignment with the circom\n // If using this, then the circom needs to rangecheck packed length in the circuit itself\n // This defaults to 31 bytes per packed byte\n function convertPackedBytesToString(uint256[] memory packedBytes) \n internal\n pure\n returns (string memory extractedString)\n {\n return convertPackedBytesToString(packedBytes, packedBytes.length * DEFAULT_PACK_SIZE, DEFAULT_PACK_SIZE);\n }\n\n // Unpacks uint256s into bytes and then extracts the non-zero characters\n // Only extracts contiguous non-zero characters and ensures theres only 1 such state\n // Note that unpackedLen may be more than packedBytes.length * 8 since there may be 0s\n // signals is the total number of signals (i.e. bytes) packed into the packedBytes. it defaults to packedBytes.length * packSize\n function convertPackedBytesToString(uint256[] memory packedBytes, uint256 signals, uint256 packSize)\n internal\n pure\n returns (string memory extractedString)\n {\n uint8 state = 0;\n // bytes: 0 0 0 0 y u s h _ g 0 0 0\n // state: 0 0 0 0 1 1 1 1 1 1 2 2 2\n bytes memory nonzeroBytesArray = new bytes(packedBytes.length * packSize);\n uint256 nonzeroBytesArrayIndex = 0;\n for (uint16 i = 0; i < packedBytes.length; i++) {\n uint256 packedByte = packedBytes[i];\n uint8[] memory unpackedBytes = new uint8[](packSize);\n for (uint256 j = 0; j < packSize; j++) {\n unpackedBytes[j] = uint8(packedByte >> (j * 8));\n }\n for (uint256 j = 0; j < packSize; j++) {\n uint256 unpackedByte = unpackedBytes[j]; //unpackedBytes[j];\n if (unpackedByte != 0) {\n nonzeroBytesArray[nonzeroBytesArrayIndex] = bytes1(uint8(unpackedByte));\n nonzeroBytesArrayIndex++;\n if (state % 2 == 0) {\n state += 1;\n }\n } else {\n if (state % 2 == 1) {\n state += 1;\n }\n }\n packedByte = packedByte >> 8;\n }\n }\n // TODO: You might want to assert that the state is exactly 1 or 2\n // If not, that means empty bytse have been removed from the middle and things have been concatenated.\n // We removed due to some tests failing, but this is not ideal and the require should be uncommented as soon as tests pass with it.\n\n // require(state == 1 || state == 2, \"Invalid final state of packed bytes in email; more than two non-zero regions found!\");\n require(state >= 1, \"No packed bytes found! Invalid final state of packed bytes in email; value is likely 0!\");\n require(nonzeroBytesArrayIndex <= signals, \"Packed bytes more than allowed max number of signals!\");\n string memory returnValue = removeTrailingZeros(string(nonzeroBytesArray));\n return returnValue;\n // Have to end at the end of the email -- state cannot be 1 since there should be an email footer\n }\n\n function bytes32ToString(bytes32 input) internal pure returns (string memory) {\n uint256 i;\n for (i = 0; i < 32 && input[i] != 0; i++) {}\n bytes memory resultBytes = new bytes(i);\n for (i = 0; i < 32 && input[i] != 0; i++) {\n resultBytes[i] = input[i];\n }\n return string(resultBytes);\n }\n\n // sliceArray is used to slice an array of uint256s from start-end into a new array of uint256s\n function sliceArray(uint256[] memory input, uint256 start, uint256 end) internal pure returns (uint256[] memory) {\n require(start <= end && end <= input.length, \"Invalid slice indices\");\n uint256[] memory result = new uint256[](end - start);\n for (uint256 i = start; i < end; i++) {\n result[i - start] = input[i];\n }\n return result;\n }\n\n // stringToUint is used to convert a string like \"45\" to a uint256 4\n function stringToUint(string memory s) internal pure returns (uint256) {\n bytes memory b = bytes(s);\n uint256 result = 0;\n for (uint256 i = 0; i < b.length; i++) {\n if (b[i] >= 0x30 && b[i] <= 0x39) {\n result = result * 10 + (uint256(uint8(b[i])) - 48);\n }\n\n // TODO: Currently truncates decimals\n if (b[i] == 0x2E) {\n return result;\n }\n }\n return result;\n }\n\n // getDomainFromEmail is used to extract the domain from an email i.e. the part after the @\n function getDomainFromEmail(string memory fromEmail) internal pure returns (string memory) {\n bytes memory emailBytes = bytes(fromEmail);\n uint256 atIndex;\n for (uint256 i = 0; i < emailBytes.length; i++) {\n if (emailBytes[i] == \"@\") {\n atIndex = i;\n break;\n }\n }\n\n bytes memory domainBytes = new bytes(emailBytes.length - atIndex - 1);\n for (uint256 j = 0; j < domainBytes.length; j++) {\n domainBytes[j] = emailBytes[atIndex + 1 + j];\n }\n return bytes32ToString(bytes32(bytes(domainBytes)));\n }\n\n function removeTrailingZeros(string memory input) public pure returns (string memory) {\n bytes memory inputBytes = bytes(input);\n uint256 endIndex = inputBytes.length;\n\n for (uint256 i = 0; i < inputBytes.length; i++) {\n if (inputBytes[i] == 0) {\n endIndex = i;\n break;\n }\n }\n\n bytes memory resultBytes = new bytes(endIndex);\n for (uint256 i = 0; i < endIndex; i++) {\n resultBytes[i] = inputBytes[i];\n }\n\n return string(resultBytes);\n }\n\n // Upper/lower string utils from https://github.com/willitscale/solidity-util/blob/master/lib/Strings.sol\n /**\n * Upper\n *\n * Converts all the values of a string to their corresponding upper case\n * value.\n *\n * @param _base When being used for a data type this is the extended object\n * otherwise this is the string base to convert to upper case\n * @return string\n */\n function upper(string memory _base) public pure returns (string memory) {\n bytes memory _baseBytes = bytes(_base);\n for (uint256 i = 0; i < _baseBytes.length; i++) {\n _baseBytes[i] = _upper(_baseBytes[i]);\n }\n return string(_baseBytes);\n }\n\n /**\n * Lower\n *\n * Converts all the values of a string to their corresponding lower case\n * value.\n *\n * @param _base When being used for a data type this is the extended object\n * otherwise this is the string base to convert to lower case\n * @return string\n */\n function lower(string memory _base) public pure returns (string memory) {\n bytes memory _baseBytes = bytes(_base);\n for (uint256 i = 0; i < _baseBytes.length; i++) {\n _baseBytes[i] = _lower(_baseBytes[i]);\n }\n return string(_baseBytes);\n }\n\n /**\n * Upper\n *\n * Convert an alphabetic character to upper case and return the original\n * value when not alphabetic\n *\n * @param _b1 The byte to be converted to upper case\n * @return bytes1 The converted value if the passed value was alphabetic\n * and in a lower case otherwise returns the original value\n */\n function _upper(bytes1 _b1) private pure returns (bytes1) {\n if (_b1 >= 0x61 && _b1 <= 0x7A) {\n return bytes1(uint8(_b1) - 32);\n }\n\n return _b1;\n }\n\n /**\n * Lower\n *\n * Convert an alphabetic character to lower case and return the original\n * value when not alphabetic\n *\n * @param _b1 The byte to be converted to lower case\n * @return bytes1 The converted value if the passed value was alphabetic\n * and in a upper case otherwise returns the original value\n */\n function _lower(bytes1 _b1) private pure returns (bytes1) {\n if (_b1 >= 0x41 && _b1 <= 0x5A) {\n return bytes1(uint8(_b1) + 32);\n }\n\n return _b1;\n }\n}\n" + }, "contracts/DomainExchange.sol": { "content": "// SPDX-License-Identifier: MIT\n\nimport { Address } from \"@openzeppelin/contracts/utils/Address.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport { ReentrancyGuard } from \"@openzeppelin/contracts/security/ReentrancyGuard.sol\";\nimport { Pausable } from \"@openzeppelin/contracts/security/Pausable.sol\";\n\nimport { AddressAllowList } from \"./external/AddressAllowList.sol\";\nimport { Bytes32ArrayUtils } from \"./external/lib/Bytes32ArrayUtils.sol\";\nimport { Uint256ArrayUtils } from \"./external/lib/Uint256ArrayUtils.sol\";\nimport { IKeyHashAdapterV2 } from \"./external/interfaces/IKeyHashAdapterV2.sol\";\n\nimport { IDomainExchange } from \"./interfaces/IDomainExchange.sol\";\nimport { ITransferDomainProcessor } from \"./interfaces/ITransferDomainProcessor.sol\";\nimport { IVerifiedDomainRegistry } from \"./interfaces/IVerifiedDomainRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract DomainExchange is IDomainExchange, AddressAllowList, ReentrancyGuard, Pausable {\n\n using Address for address payable;\n using Bytes32ArrayUtils for bytes32[];\n using Uint256ArrayUtils for uint256[];\n\n /* ============ Events ============ */\n \n event ListingCreated(\n uint256 indexed listingId, \n address indexed seller, \n bytes32 indexed domainId, \n bytes32 dkimKeyHash,\n uint256 askPrice,\n uint256 minBidPrice,\n address saleEthRecipient\n );\n event ListingUpdated(uint256 indexed listingId, address indexed seller, uint256 newAskPrice, address saleEthRecipient);\n event ListingDeleted(uint256 indexed listingId, address indexed seller);\n event ListingDeletedByRegistry(uint256 indexed listingId);\n \n event BidCreated(uint256 indexed bidId, uint256 indexed listingId, address indexed buyer, uint256 price);\n event BidPriceIncreased(uint256 indexed bidId, address indexed buyer, uint256 newPrice);\n event RefundInitiated(uint256 indexed bidId, address indexed buyer);\n event BidWithdrawn(uint256 indexed bidId, address indexed buyer, uint256 amount);\n \n event SaleFinalized(uint256 indexed bidId, uint256 indexed listingId, uint256 priceNetFees, uint256 fees);\n \n event InstantAcceptUpdated(address indexed buyer, bool instantAccept);\n\n event FeeUpdated(uint256 newFee);\n event FeeRecipientUpdated(address indexed newFeeRecipient);\n event BidSettlementPeriodUpdated(uint256 newBidSettlementPeriod);\n event BidRefundPeriodUpdated(uint256 newBidRefundPeriod);\n event TransferDomainProcessorUpdated(ITransferDomainProcessor indexed newTransferDomainProcessor);\n event MailServerKeyHashAdapterUpdated(IKeyHashAdapterV2 indexed newMailServerKeyHashAdapter);\n\n /* ============ Structs ============ */\n struct Listing {\n address seller;\n address payable saleEthRecipient; // Must be a contract that can receive ETH or an EOA\n bytes32 dkimKeyHash; // Allow for custom DKIM key hash\n bytes encryptionKey;\n bytes32 domainId;\n uint256 createdAt;\n uint256 askPrice;\n uint256 minBidPrice;\n bool isActive; // false by default, set to true when the listing is created\n uint256[] bids;\n }\n\n struct ListingWithId {\n uint256 listingId;\n Listing listing;\n }\n\n struct Bid {\n address buyer;\n uint256 listingId;\n string encryptedBuyerId;\n bytes32 buyerIdHash;\n uint256 createdAt;\n uint256 expiryTimestamp;\n uint256 price;\n bool refundInitiated;\n }\n\n struct BidDetailsWithId {\n uint256 bidId;\n Bid bid;\n bool buyerInstantAcceptEnabled;\n }\n\n /* ============ Modifiers ============ */\n modifier onlyInitialized() {\n require(isInitialized, \"Contract must be initialized\");\n _;\n }\n\n /* ============ Public Variables ============ */\n\n mapping(uint256 => Listing) public listings;\n mapping(address => uint256[]) public userListings;\n mapping(uint256 => Bid) public bids;\n mapping(address => uint256[]) public userBids;\n mapping(address => bool) public instantAcceptEnabled;\n\n uint256 public fee;\n address payable public feeRecipient;\n uint256 public bidCounter;\n uint256 public listingCounter;\n uint256 public bidSettlementPeriod;\n uint256 public bidRefundPeriod;\n \n bool public isInitialized;\n \n ITransferDomainProcessor public transferDomainProcessor;\n IVerifiedDomainRegistry public verifiedDomainRegistry;\n IKeyHashAdapterV2 public mailServerKeyHashAdapter;\n\n /* ============ Constants ============ */\n uint256 internal constant PRECISE_UNIT = 1e18;\n\n /* ============ Constructor ============ */\n\n constructor(\n address _owner,\n uint256 _fee,\n address payable _feeRecipient,\n uint256 _bidSettlementPeriod,\n uint256 _bidRefundPeriod,\n address[] memory _allowedAddresses\n ) AddressAllowList(_allowedAddresses) {\n fee = _fee;\n feeRecipient = _feeRecipient;\n bidSettlementPeriod = _bidSettlementPeriod;\n bidRefundPeriod = _bidRefundPeriod;\n \n bidCounter = 1;\n listingCounter = 1;\n isInitialized = false;\n \n transferOwnership(_owner);\n }\n\n /* ============ Public Functions ============ */\n\n /**\n * @notice Creates listing for a domain. If ownership of domain changes offchain, the new owner\n * will have to first register the domain on the domain registry contract. Then the new owner\n * can create a listing for the domain. The old listing will be deleted from the old owner's \n * listings and the old listing is marked as NOT active, which prevents any new bids from being\n * created on it and makes the old bids immediately withdrawable. We also allow the seller to\n * specify a custom DKIM key hash for Namecheap if they want to opt out of using the managed DKIM\n * key hash set in the transferDomainProcessor contract. The managed DKIM key hash *can* be \n * updated by us whenever Namecheap rotates their DKIM key.\n *\n * Function reverts if:\n * - Caller is not domain owner on the domain registry contract\n * - Ask price is less than min bid price\n * - Sale ETH recipient is the zero address\n *\n * @param _domainId The unique identifier of the domain\n * @param _askPrice An asking price for the domain\n * @param _minBidPrice The minimum bid price for the domain\n * @param _saleEthRecipient The address to receive the ETH from the sale; must be a contract that can\n * receive ETH or an EOA\n * @param _encryptionKey The encryption key for buyers to encrypt the buyerId to\n * @param _dkimKeyHash The custom DKIM key hash. If empty, the managed DKIM key hash will be used\n */\n function createListing(\n bytes32 _domainId, \n uint256 _askPrice, \n uint256 _minBidPrice, \n address payable _saleEthRecipient, \n bytes memory _encryptionKey,\n bytes32 _dkimKeyHash\n ) \n external\n onlyAllowed\n onlyInitialized \n whenNotPaused\n {\n _verifyCreateListing(_domainId, _minBidPrice, _askPrice, _saleEthRecipient);\n\n uint256 listingId = _updateCreateListingState(\n _domainId, _askPrice, _minBidPrice, _saleEthRecipient, _encryptionKey, _dkimKeyHash\n );\n\n verifiedDomainRegistry.setDomainListing(_domainId, listingId);\n\n emit ListingCreated(listingId, msg.sender, _domainId, _dkimKeyHash, _askPrice, _minBidPrice, _saleEthRecipient);\n }\n\n /**\n * @notice Creates a new bid for a listing. Transfers ETH from the buyer to the contract. Every buyer\n * has a unique identifier, for Namecheap it's their username. The seller needs the raw buyerId\n * to transfer the domain off-chain. To facilitate this, the buyer encrypts their buyerId using the \n * seller's encryption key and sends it along with the bid. The seller then decrypts the buyerId \n * using their private key to get the raw buyerId.\n *\n * DEV NOTE: We do not check that the encrypted buyerId is the same as the hashed buyerId. This must be\n * done in the client! This does not affect the security of the protocol as the encrypted buyerId is only \n * used for communication between the buyer and the seller while maintaining privacy.\n *\n * @param _listingId The unique identifier of the listing to bid on\n * @param _buyerIdHash The hashed buyerId which is also output as part of the transfer proof later\n * @param _encryptedBuyerId The encrypted buyerId. Should be the same as the buyerId hashed\n */\n function createBid(uint256 _listingId, bytes32 _buyerIdHash, string memory _encryptedBuyerId) \n external \n payable\n nonReentrant\n whenNotPaused\n {\n uint256 price = msg.value;\n Listing storage listing = listings[_listingId];\n\n _validateCreateBid(listing, price, _buyerIdHash);\n\n uint256 bidId = _updateCreateBidState(listing, _listingId, price, _buyerIdHash, _encryptedBuyerId);\n\n emit BidCreated(bidId, _listingId, msg.sender, price);\n }\n\n /**\n * @notice ONLY SELLER: Finalizes a sale by verifying the domain transfer and unlocking bid funds to \n * the listing owner. The seller can also finalize the sale with bids that have initiated a refund \n * including the ones that have expired based on timestamp but not withdrawn yet.\n *\n * @param _proof The zk-email proof of domain transfer\n */\n function finalizeSale(ITransferDomainProcessor.TransferProof calldata _proof) \n external\n onlyInitialized\n nonReentrant\n whenNotPaused\n {\n // Check\n (\n bytes32 dkimKeyHash,\n bytes32 hashedReceiverId, \n string memory domainName, \n uint256 bidId\n ) = transferDomainProcessor.processProof(_proof);\n\n Bid storage bid = bids[bidId];\n Listing storage listing = listings[bid.listingId];\n \n _validateFinalizeSale(bid, listing, dkimKeyHash, hashedReceiverId, domainName);\n \n // Effect\n verifiedDomainRegistry.updateDomainOnSale(listing.domainId, bid.buyer);\n\n uint256 transferValue = bid.price;\n address payable recipient = listing.saleEthRecipient;\n uint256 listingId = bid.listingId;\n _updateFinalizeSaleState(bid, bidId, listing);\n\n // Interaction\n uint256 feeAmount = _settleSale(recipient, transferValue);\n \n emit SaleFinalized(bidId, listingId, transferValue - feeAmount, feeAmount);\n }\n\n /**\n * @notice ONLY BUYER: Finalize a sale by releasing funds to the seller. Proof of transfer is not required\n * because it is not in the buyer's interest to release funds unless they have received the domain. Note that the\n * bid can be in ANY STATE when this function is called. Upon calling this function funds will be transferred to\n * the seller and fees will be taken by the protocol. The listing and the bid will be deleted. The function will\n * revert if:\n * - The bid is not owned by the caller\n * - The listing is not active (sold or withdrawn)\n *\n * @param _bidId The unique identifier of the bid to release funds for\n */\n function buyerReleaseFunds(uint256 _bidId) \n external\n nonReentrant\n {\n // Check\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n require(bid.buyer == msg.sender, \"Caller is not bid owner\");\n require(listing.isActive, \"Listing not active\");\n\n // Effect\n verifiedDomainRegistry.updateDomainOnSale(listing.domainId, bid.buyer);\n\n uint256 transferValue = bid.price;\n address payable recipient = listing.saleEthRecipient;\n uint256 listingId = bid.listingId;\n \n _updateFinalizeSaleState(bid, _bidId, listing);\n\n // Interaction\n uint256 feeAmount = _settleSale(recipient, transferValue);\n\n emit SaleFinalized(_bidId, listingId, transferValue - feeAmount, feeAmount);\n }\n\n /**\n * @notice ONLY SELLER: Updates the asking price of an existing listing. We don't update\n * the existing bids against the listing because the newAskPrice is an indicative value.\n * The new ask price must be greater than or equal to the existing min bid price. If seller\n * wants to update the min bid price, they should delete the listing and create a new one with\n * the new min bid price.\n *\n * @param _listingId The unique identifier of the listing to update\n * @param _newAskPrice The new asking price for the listing\n * @param _saleEthRecipient The new address to receive the ETH from the sale; must be a contract that can\n * receive ETH or an EOA\n */\n function updateListing(uint256 _listingId, uint256 _newAskPrice, address payable _saleEthRecipient) external whenNotPaused {\n Listing storage listing = listings[_listingId];\n \n require(listing.seller == msg.sender, \"Caller is not listing owner\");\n require(listing.isActive, \"Listing not active\");\n require(_newAskPrice >= listing.minBidPrice, \"Ask price is less than min bid price\");\n require(_saleEthRecipient != address(0), \"Invalid sale ETH recipient\");\n \n listing.askPrice = _newAskPrice;\n listing.saleEthRecipient = _saleEthRecipient;\n\n emit ListingUpdated(_listingId, msg.sender, _newAskPrice, _saleEthRecipient);\n }\n\n /**\n * @notice ONLY SELLER: Marks a listing as NOT active. Removes the listing from the seller's listings array\n * and domain listing. If the listing has no bids, it is deleted from the exchange. Bids against the listing\n * are left as is to allow the buyer to withdraw the bid.\n *\n * @param _listingId The unique identifier of the listing to delete\n */\n function deleteListing(uint256 _listingId) external {\n Listing storage listing = listings[_listingId];\n \n require(listing.seller == msg.sender, \"Caller is not listing owner\");\n require(listing.isActive, \"Listing not active\");\n \n verifiedDomainRegistry.removeDomainListing(listing.domainId);\n\n _pruneListing(listing, _listingId);\n\n emit ListingDeleted(_listingId, msg.sender);\n }\n\n /**\n * @notice ONLY EXCHANGE: Remove a listing for domain when ownership changes on the registry.\n * \n * @param _listingId Listing Id to remove\n */\n function registryRemoveListing(uint256 _listingId) external override {\n Listing storage listing = listings[_listingId];\n\n require(address(verifiedDomainRegistry) == msg.sender, \"Caller is not registry\");\n // If listing is NOT active, this function will NOT be called because the listing status\n // would have already been removed from the registry beforehand; so there is no need to \n // check if listing is active\n \n _pruneListing(listing, _listingId);\n\n emit ListingDeletedByRegistry(_listingId);\n }\n\n /**\n * @notice ONLY BUYER: Increases the price of an existing bid. The new price can ONLY be higher \n * than the old price. The buyer must send the additional amount of ETH. The function reverts if\n * - bid has initiated refund, caller is not bid owner or listing is not active\n * - the new price is less than old price\n * - msg.value is NOT STRICTLY EQUAL to than new price - old price\n *\n * @param _bidId The unique identifier of the bid to increase the price for\n * @param _newPrice The new price for the bid\n */\n function increaseBidPrice(uint256 _bidId, uint256 _newPrice)\n external\n payable\n nonReentrant\n whenNotPaused\n {\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n // Check\n _validateIncreaseBidPrice(bid, listing, _newPrice);\n \n // Effect\n bid.price = _newPrice;\n\n emit BidPriceIncreased(_bidId, msg.sender, _newPrice);\n }\n\n /**\n * @notice Enables the instant accept flag for the buyer. This flag is used to indicate if the buyer has \n * configured their Namecheap account to accept ownership of domains immediately upon transfer.\n * \n * DEV NOTE: We can not check that the buyer has actually enabled instant accept on Namecheap. It is only \n * an indicative flag to help the seller know if they can finalize the sale immediately or not. The seller\n * may get tricked by a malicious buyer to initiate a transfer to them assuming instant accept is on. But\n * if the buyer does not have instant accept enabled, the seller will get immediate feedback and they can \n * cancel the transfer immediately.\n */\n function enableInstantAccept() external onlyInitialized {\n require(!instantAcceptEnabled[msg.sender], \"Instant accept already enabled\");\n \n instantAcceptEnabled[msg.sender] = true; \n emit InstantAcceptUpdated(msg.sender, true);\n }\n\n /**\n * @notice Disables the instant accept flag for the buyer.\n */\n function disableInstantAccept() external onlyInitialized {\n require(instantAcceptEnabled[msg.sender], \"Instant accept already disabled\");\n\n instantAcceptEnabled[msg.sender] = false;\n emit InstantAcceptUpdated(msg.sender, false);\n }\n\n /**\n * @notice ONLY BUYER: Initiates the refund process for a bid. Can only be called by the bid owner \n * after the initial bid expiry period has passed.\n *\n * @param _bidId The unique identifier of the bid to initiate refund for\n */\n function initiateRefund(uint256 _bidId) external {\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n _validateInitiateRefund(bid, listing);\n\n bid.expiryTimestamp = block.timestamp + bidRefundPeriod;\n bid.refundInitiated = true;\n\n emit RefundInitiated(_bidId, bid.buyer);\n }\n\n /**\n * @notice ONLY BUYER: Withdraws a bid after the refund period has ended. Transfers ETH back to the buyer.\n *\n * @param _bidId The unique identifier of the bid to withdraw\n */\n function withdrawBid(uint256 _bidId) external nonReentrant {\n Bid storage bid = bids[_bidId];\n Listing storage listing = listings[bid.listingId];\n\n // Check\n _validateWithdrawBid(bid, listing);\n\n // Effect\n uint256 refundAmount = bid.price;\n _pruneBid(bid, _bidId, listing);\n \n // Interaction\n payable(msg.sender).sendValue(refundAmount);\n\n emit BidWithdrawn(_bidId, msg.sender, refundAmount);\n }\n\n /* ============ Admin Functions ============ */\n\n /**\n * @notice Initializes the contract with domain verification and transfer processors. Can \n * only be called once by the contract owner\n * \n * @param _transferDomainProcessor The address of the domain transfer processor contract\n * @param _verifiedDomainRegistry The address of the verified domain registry contract\n * @param _mailServerKeyHashAdapter The address of the mail server key hash adapter contract\n */\n function initialize(\n ITransferDomainProcessor _transferDomainProcessor,\n IVerifiedDomainRegistry _verifiedDomainRegistry,\n IKeyHashAdapterV2 _mailServerKeyHashAdapter\n ) external onlyOwner {\n require(!isInitialized, \"Already initialized\");\n transferDomainProcessor = _transferDomainProcessor;\n verifiedDomainRegistry = _verifiedDomainRegistry;\n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\n isInitialized = true;\n }\n\n /**\n * @notice ONLY OWNER: Pauses listing and proof submission functionality for the marketplace. \n * Functionalites that are paused:\n * - Listing creation and update\n * - Bid creation and update\n * - Sale finalization\n * \n * Functinonalites that remain unpaused to allow users to retrieve funds in contract:\n * - Bid refund initiation and withdrawal\n * - Listing deletion\n * - Manual settlement between buyer and seller\n */\n function pauseMarketplace() external onlyOwner {\n _pause();\n }\n\n /**\n * @notice ONLY OWNER: Restarts paused functionality for the marketplace.\n */\n function unpauseMarketplace() external onlyOwner {\n _unpause();\n }\n\n /**\n * @notice ONLY OWNER: Update the transfer domain processor\n *\n * @param _transferDomainProcessor The new transfer domain processor\n */\n function updateTransferDomainProcessor(ITransferDomainProcessor _transferDomainProcessor) external onlyOwner {\n require(address(_transferDomainProcessor) != address(0), \"Invalid address\");\n \n transferDomainProcessor = _transferDomainProcessor;\n emit TransferDomainProcessorUpdated(_transferDomainProcessor);\n }\n\n /**\n * @notice ONLY OWNER: Update the managed mail server key hash adapter\n *\n * @param _mailServerKeyHashAdapter The new mail server key hash adapter\n */\n function updateMailServerKeyHashAdapter(IKeyHashAdapterV2 _mailServerKeyHashAdapter) external onlyOwner {\n require(address(_mailServerKeyHashAdapter) != address(0), \"Invalid address\");\n \n mailServerKeyHashAdapter = _mailServerKeyHashAdapter;\n emit MailServerKeyHashAdapterUpdated(_mailServerKeyHashAdapter);\n }\n\n /**\n * @notice ONLY OWNER: Updates the fee percentage for the marketplace\n *\n * @param _newFee The new fee percentage (in basis points)\n */\n function updateFee(uint256 _newFee) external onlyOwner {\n fee = _newFee;\n emit FeeUpdated(_newFee);\n }\n\n /**\n * @notice ONLY OWNER: Updates the fee recipient address\n *\n * @param _newFeeRecipient The new address to receive fees\n */\n function updateFeeRecipient(address payable _newFeeRecipient) external onlyOwner {\n require(_newFeeRecipient != address(0), \"Invalid address\");\n feeRecipient = _newFeeRecipient;\n emit FeeRecipientUpdated(_newFeeRecipient);\n }\n\n /**\n * @notice ONLY OWNER: Updates the minimum bid active period\n *\n * @param _newBidSettlementPeriod The new bid settlement period in seconds\n */\n function updateBidSettlementPeriod(uint256 _newBidSettlementPeriod) external onlyOwner {\n require(_newBidSettlementPeriod > 0, \"Bid settlement period must be greater than 0\");\n bidSettlementPeriod = _newBidSettlementPeriod;\n emit BidSettlementPeriodUpdated(_newBidSettlementPeriod);\n }\n\n /**\n * @notice ONLY OWNER: Updates the bid refund period\n *\n * @param _newBidRefundPeriod The new bid refund period in seconds\n */\n function updateBidRefundPeriod(uint256 _newBidRefundPeriod) external onlyOwner {\n require(_newBidRefundPeriod > 0, \"Bid refund period must be greater than 0\");\n bidRefundPeriod = _newBidRefundPeriod;\n emit BidRefundPeriodUpdated(_newBidRefundPeriod);\n }\n\n /* ============ View Functions ============ */ \n\n /**\n * @notice Get listing information with listingId for a list of listingIds\n * @param _listingIds An array of listingIds to fetch details for\n */\n function getListings(uint256[] memory _listingIds)\n external \n view \n returns (ListingWithId[] memory listingInfo) \n {\n listingInfo = new ListingWithId[](_listingIds.length);\n for (uint256 i = 0; i < _listingIds.length; i++) {\n listingInfo[i] = ListingWithId({\n listingId: _listingIds[i],\n listing: listings[_listingIds[i]]\n });\n }\n }\n\n /**\n * @notice Returns all listings created by a user\n * @param _user The address of the user to fetch listings for\n */\n function getUserListings(address _user) external view returns (ListingWithId[] memory listingInfo) {\n uint256[] memory userListingIds = userListings[_user];\n listingInfo = new ListingWithId[](userListingIds.length);\n for (uint256 i = 0; i < userListingIds.length; i++) {\n uint256 listingId = userListingIds[i];\n listingInfo[i] = ListingWithId({\n listingId: listingId,\n listing: listings[listingId]\n });\n }\n }\n\n /**\n * @notice Returns the bids created by a user\n * @param _user The address of the user to fetch bids for\n */\n function getUserBids(address _user) external view returns (BidDetailsWithId[] memory bidInfo) {\n uint256[] memory userBidIds = userBids[_user];\n bidInfo = new BidDetailsWithId[](userBidIds.length);\n for (uint256 i = 0; i < userBidIds.length; i++) {\n uint256 bidId = userBidIds[i];\n bidInfo[i] = BidDetailsWithId({\n bidId: bidId,\n bid: bids[bidId],\n buyerInstantAcceptEnabled: instantAcceptEnabled[_user]\n });\n }\n }\n\n /**\n * @notice Returns the bids for given listingIds\n * @param _listingIds An array of listingIds to fetch bids for\n */\n function getListingBids(uint256[] memory _listingIds) external view returns (BidDetailsWithId[][] memory bidInfo) {\n bidInfo = new BidDetailsWithId[][](_listingIds.length);\n for (uint256 i = 0; i < _listingIds.length; i++) {\n uint256 listingId = _listingIds[i];\n uint256[] memory listingBidIds = listings[listingId].bids;\n bidInfo[i] = new BidDetailsWithId[](listingBidIds.length);\n for (uint256 j = 0; j < listingBidIds.length; j++) {\n uint256 bidId = listingBidIds[j];\n bidInfo[i][j] = BidDetailsWithId({\n bidId: bidId,\n bid: bids[bidId],\n buyerInstantAcceptEnabled: instantAcceptEnabled[bids[bidId].buyer]\n });\n }\n }\n }\n\n /**\n * @notice Get all allowed sellers\n */\n function getAllowedSellers() external view returns (address[] memory) {\n return _getAllowedAddresses();\n }\n\n\n /* ============ Internal Functions ============ */\n\n function _verifyCreateListing(\n bytes32 _domainId, \n uint256 _minBidPrice, \n uint256 _askPrice, \n address _saleEthRecipient\n ) internal view {\n IVerifiedDomainRegistry.DomainWithId memory domainWithId = verifiedDomainRegistry.getDomain(_domainId);\n require(domainWithId.domain.owner == msg.sender, \"Caller is not domain owner\");\n require(domainWithId.domain.exchange == address(0), \"Domain already listed on registry\");\n\n require(_minBidPrice > 0, \"Minimum bid price is zero\");\n require(_askPrice >= _minBidPrice, \"Ask price is less than min bid price\");\n require(_saleEthRecipient != address(0), \"Invalid sale ETH recipient\");\n }\n\n function _updateCreateListingState(\n bytes32 _domainId, \n uint256 _askPrice, \n uint256 _minBidPrice,\n address payable _saleEthRecipient,\n bytes memory _encryptionKey,\n bytes32 _dkimKeyHash\n ) internal returns (uint256 listingId) {\n \n // New listing\n listingId = listingCounter;\n listings[listingId] = Listing({\n seller: msg.sender,\n saleEthRecipient: _saleEthRecipient,\n encryptionKey: _encryptionKey,\n dkimKeyHash: _dkimKeyHash,\n askPrice: _askPrice,\n minBidPrice: _minBidPrice,\n domainId: _domainId,\n createdAt: block.timestamp,\n isActive: true,\n bids: new uint256[](0)\n });\n userListings[msg.sender].push(listingId);\n\n // Increment listingCounter\n listingCounter = listingCounter + 1;\n }\n\n function _validateCreateBid(Listing storage _listing, uint256 _price, bytes32 _buyerIdHash) internal view {\n require(_listing.seller != address(0), \"Listing does not exist\");\n require(_listing.isActive, \"Listing not active\");\n \n // Validate inputs\n require(_price >= _listing.minBidPrice, \"Bid price is less than min bid price\");\n require(_buyerIdHash != bytes32(0), \"Buyer ID hash cannot be empty\");\n }\n\n function _updateCreateBidState(\n Listing storage _listing, \n uint256 _listingId, \n uint256 _price, \n bytes32 _buyerIdHash, \n string memory _encryptedBuyerId\n ) internal returns (uint256 bidId) {\n bidId = bidCounter;\n bids[bidId] = Bid({\n buyer: msg.sender,\n listingId: _listingId,\n encryptedBuyerId: _encryptedBuyerId,\n buyerIdHash: _buyerIdHash,\n createdAt: block.timestamp,\n expiryTimestamp: type(uint256).max,\n price: _price,\n refundInitiated: false\n });\n userBids[msg.sender].push(bidId);\n _listing.bids.push(bidId);\n\n // Increment bidCounter\n bidCounter = bidCounter + 1;\n }\n\n function _validateFinalizeSale(\n Bid storage _bid, \n Listing storage _listing,\n bytes32 _dkimKeyHash,\n bytes32 _hashedReceiverId, \n string memory _transferredDomainName\n ) internal view {\n require(_bid.buyer != address(0), \"Bid does not exist\");\n require(_listing.seller == msg.sender, \"Caller is not listing owner\");\n require(_listing.isActive, \"Listing not active\");\n\n // Validate namecheap DKIM key\n if (_listing.dkimKeyHash != bytes32(0)) {\n require(_dkimKeyHash == _listing.dkimKeyHash, \"Invalid custom DKIM key hash\");\n } else {\n require(\n mailServerKeyHashAdapter.isMailServerKeyHash(_dkimKeyHash), \n \"Invalid managed DKIM key hash\"\n );\n }\n\n // Validate domain and receiver\n bytes32 transferredDomainId = keccak256(abi.encodePacked(_transferredDomainName));\n require(_bid.buyerIdHash == _hashedReceiverId, \"Invalid receiver\");\n require(_listing.domainId == transferredDomainId, \"Invalid domain\");\n }\n\n function _updateFinalizeSaleState(Bid storage _bid, uint256 _bidId, Listing storage _listing) internal {\n uint256 listingId = _bid.listingId;\n \n _pruneBid(_bid, _bidId, _listing);\n _pruneListing(_listing, listingId);\n }\n\n function _validateIncreaseBidPrice(\n Bid storage _bid, \n Listing storage _listing, \n uint256 _newPrice\n ) internal view {\n require(_bid.buyer == msg.sender, \"Caller is not bid owner\");\n require(!_bid.refundInitiated, \"Refund already initiated\");\n require(_listing.isActive, \"Listing not active\");\n\n // Validate new price\n require(_newPrice > _bid.price, \"New price not greater than old price\");\n require(msg.value == _newPrice - _bid.price, \"Incorrect amount of ETH sent\");\n }\n\n function _validateInitiateRefund(Bid storage _bid, Listing storage _listing) internal view {\n require(_bid.buyer == msg.sender, \"Caller is not bid owner\");\n require(!_bid.refundInitiated, \"Refund already initiated\");\n require(block.timestamp > bidSettlementPeriod + _bid.createdAt, \"Refund period not started\");\n require(_listing.isActive, \"Listing expired. Bid can be withdrawn directly\");\n }\n\n function _validateWithdrawBid(Bid storage _bid, Listing storage _listing) internal view {\n require(_bid.buyer == msg.sender, \"Caller is not bid owner\");\n if (_listing.isActive) {\n require(_bid.refundInitiated, \"Refund not initiated\");\n require(block.timestamp >= _bid.expiryTimestamp, \"Refund period not ended\");\n }\n }\n\n function _settleSale(address payable _recipient, uint256 _amount) internal returns (uint256 feeAmount) {\n feeAmount = (_amount * fee) / PRECISE_UNIT;\n _recipient.sendValue(_amount - feeAmount);\n\n if (feeAmount > 0) {\n feeRecipient.sendValue(feeAmount);\n }\n }\n\n /**\n * @notice Deletes a bid from the exchange. Removes the bid from the listing's bids array and the buyer's\n * bids array. Deletes the listing if it is expired and has no bids.\n */\n function _pruneBid(Bid storage _bid, uint256 _bidId, Listing storage _listing) internal {\n userBids[_bid.buyer].removeStorage(_bidId);\n _listing.bids.removeStorage(_bidId);\n if (!_listing.isActive && _listing.bids.length == 0) {\n delete listings[_bid.listingId];\n }\n delete bids[_bidId];\n }\n\n /**\n * @notice Marks a listing as expired. Removes the listing from the seller's listings array and domain listing.\n * If the listing has no bids, it is deleted from the exchange.\n */\n function _pruneListing(Listing storage _listing, uint256 _listingId) internal {\n _listing.isActive = false;\n userListings[_listing.seller].removeStorage(_listingId);\n if (_listing.bids.length == 0) {\n delete listings[_listingId];\n }\n }\n}\n" }, "contracts/external/AddressAllowList.sol": { "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { AddressArrayUtils } from \"./lib/AddressArrayUtils.sol\";\n\npragma solidity ^0.8.18;\n\ncontract AddressAllowList is Ownable {\n\n using AddressArrayUtils for address[];\n\n /* ============ Events ============ */\n event AddressAddedToAllowlist(address indexed allowedAddress);\n event AddressRemovedFromAllowlist(address indexed allowedAddress);\n event AllowlistEnabled();\n event AllowlistDisabled();\n \n /* ============ Modifier ============ */\n modifier onlyAllowed() {\n require(isEnabled ? isAllowed[msg.sender] : true, \"Address is not allowed\");\n _;\n }\n \n /* ============ State Variables ============ */\n bool public isEnabled; // Boolean indicating if the allowlist is enabled\n address[] public allowedAddresses; // Array of addresses that are allowed from taking depositors liquidity\n mapping(address => bool) public isAllowed; // Mapping of address to boolean indicating if the user is allowed\n\n /* ============ Constructor ============ */\n constructor(address[] memory _allowedAddresses) Ownable() {\n for (uint256 i = 0; i < _allowedAddresses.length; i++) {\n address allowedAddress = _allowedAddresses[i];\n\n require(!isAllowed[allowedAddress], \"Address is already allowed\");\n isAllowed[allowedAddress] = true;\n emit AddressAddedToAllowlist(allowedAddress);\n }\n allowedAddresses = _allowedAddresses;\n isEnabled = true;\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice Adds passed addresses to an allow list. Addresses on the allow list are able to call allow listed\n * functions.\n *\n * @param _allowedAddresses List of addresses allowed to call allow listed functions\n */\n function addAddressesToAllowlist(address[] memory _allowedAddresses) external onlyOwner {\n for(uint256 i = 0; i < _allowedAddresses.length; i++) {\n address allowedAddress = _allowedAddresses[i];\n\n require(!isAllowed[allowedAddress], \"Address already on allowlist\");\n\n isAllowed[allowedAddress] = true;\n allowedAddresses.push(allowedAddress);\n\n emit AddressAddedToAllowlist(allowedAddress);\n }\n }\n\n /**\n * @notice Removes passed addresses from an allow list. Addresses not on the allow list are unable to call\n * allow listed functions.\n *\n * @param _disallowedAddresses List of addresses being disallowed from calling allow listed functions\n */\n function removeAddressesFromAllowlist(address[] memory _disallowedAddresses) external onlyOwner {\n for(uint256 i = 0; i < _disallowedAddresses.length; i++) {\n address disallowedAddress = _disallowedAddresses[i];\n\n require(isAllowed[disallowedAddress], \"Address already disallowed\");\n\n isAllowed[disallowedAddress] = false;\n allowedAddresses.removeStorage(disallowedAddress);\n\n emit AddressRemovedFromAllowlist(disallowedAddress);\n }\n }\n\n /**\n * @notice Enable the allow list. When the allow list is enabled, only approved addresses are allowed to\n * functions with onlyAllowed modifier.\n */\n function enableAllowlist() external onlyOwner {\n require(!isEnabled, \"Allow list is already enabled\");\n\n isEnabled = true;\n emit AllowlistEnabled();\n }\n\n /**\n * @notice Disable the allow list. When the allow list is disabled, any address is allowed to call functions\n * with onlyAllowed modifier.\n */\n function disableAllowlist() external onlyOwner {\n require(isEnabled, \"Allow list is already disabled\");\n\n isEnabled = false;\n emit AllowlistDisabled();\n }\n\n /* ============ View Functions ============ */\n\n function _getAllowedAddresses() internal view returns (address[] memory) {\n return allowedAddresses;\n }\n}\n" }, + "contracts/external/ClaimVerifier.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { Claims } from \"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\";\n\npragma solidity ^0.8.18;\n\nlibrary ClaimVerifier {\n\n /**\n * Find the end index of target string in the data string. Returns the end index + 1 if\n * the target string in the data string if found. Returns type(uint256).max if:\n * - Target is longer than data\n * - Target is not found\n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\n */\n function findSubstringEndIndex(\n string memory data,\n string memory target\n ) public pure returns (uint256) {\n bytes memory dataBytes = bytes(data);\n bytes memory targetBytes = bytes(target);\n\n if (dataBytes.length < targetBytes.length) {\n return type(uint256).max;\n }\n\n // Find start of target\n for (uint i = 0; i <= dataBytes.length - targetBytes.length; i++) {\n bool isMatch = true;\n\n for (uint j = 0; j < targetBytes.length && isMatch; j++) {\n if (dataBytes[i + j] != targetBytes[j]) {\n isMatch = false;\n break;\n }\n }\n\n if (isMatch) {\n return i + targetBytes.length; // Return end index + 1\n }\n }\n\n return type(uint256).max;\n }\n\n /**\n * Extracts given target field value from context in claims. Extracts only ONE value.\n * Pass prefix formatted with quotes, for example '\"providerHash\\\":\\\"'\n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\n *\n * @param data Context string from which target value needs to be extracted\n * @param prefix Prefix of the target value that needs to be extracted \n */\n function extractFieldFromContext(\n string memory data,\n string memory prefix\n ) public pure returns (string memory) {\n // Find end index of prefix; which is the start index of the value\n uint256 start = findSubstringEndIndex(data, prefix);\n\n bytes memory dataBytes = bytes(data);\n if (start == dataBytes.length) {\n return \"\"; // Prefix not found. Malformed or missing message\n }\n \n // Find the end of the VALUE, assuming it ends with a quote not preceded by a backslash\n uint256 end = start;\n while (\n end < dataBytes.length &&\n !(dataBytes[end] == '\"' && dataBytes[end - 1] != \"\\\\\")\n ) {\n end++;\n }\n if (end <= start) {\n return \"\"; // Malformed or missing message\n }\n bytes memory contextMessage = new bytes(end - start);\n for (uint i = start; i < end; i++) {\n contextMessage[i - start] = dataBytes[i];\n }\n return string(contextMessage);\n }\n\n\n /**\n * Extracts ALL values from context in a single pass. Context is stored as serialized JSON string with \n * two keys: extractedParameters and providerHash. ExtractedParameters itself is a JSON string with \n * key-value pairs. This function returns extracted individual values from extractedParameters along \n * with providerHash (if extractProviderHash is true). Use maxValues to limit the number of expected values\n * to be extracted from extractedParameters. In most cases, one would need to extract all values from\n * extractedParameters and providerHash, hence use this function over calling extractFieldFromContext \n * multiple times.\n * \n * @param data Context string from which target value needs to be extracted\n * @param maxValues Maximum number of values to be extracted from extractedParameters\n * @param extractProviderHash Extracts and returns providerHash if true\n */\n function extractAllFromContext(\n string memory data,\n uint8 maxValues,\n bool extractProviderHash\n ) public pure returns (string[] memory) {\n \n require(maxValues > 0, \"Max values must be greater than 0\");\n\n bytes memory dataBytes = bytes(data);\n uint index = 0;\n\n bytes memory extractedParametersBytes = bytes('{\\\"extractedParameters\\\":{\\\"');\n for (uint i = 0; i < extractedParametersBytes.length; i++) {\n require(dataBytes[index + i] == extractedParametersBytes[i], \"Extraction failed. Malformed extractedParameters\");\n }\n index += extractedParametersBytes.length;\n\n bool isValue = false; // starts with a key right after '{\\\"extractedParameters\\\":{\\\"'\n uint valuesFound = 0;\n \n uint[] memory valueIndices = new uint[](extractProviderHash ? 2 * (maxValues + 1): 2 * maxValues);\n\n while (\n index < dataBytes.length\n ) {\n // Keep incrementing until '\"', escaped quotes are not considered\n if (!(dataBytes[index] == '\"' && dataBytes[index - 1] != \"\\\\\")) {\n index++;\n continue;\n }\n\n if (!isValue) {\n // \\\":\\\" (3 chars)\n require(dataBytes[index + 1] == \":\" && dataBytes[index + 2] == '\\\"', \"Extraction failed. Malformed data 1\");\n index += 3; // move it after \\\"\n isValue = true;\n valueIndices[2 * valuesFound] = index; // start index\n } else {\n // \\\",\\\" (3 chars) or \\\"}, (3 chars)\n // \\\"}} is not supported, there should always be a providerHash\n require(\n dataBytes[index + 1] == \",\" && dataBytes[index + 2] == '\\\"' || \n dataBytes[index + 1] == '}' && dataBytes[index + 2] == \",\",\n \"Extraction failed. Malformed data 2\"\n );\n valueIndices[2 * valuesFound + 1] = index; // end index\n valuesFound++;\n\n if (dataBytes[index + 1] == \",\") {\n // Revert if valuesFound == maxValues and next char is a comma as there will be more values\n require(valuesFound != maxValues, \"Extraction failed. Exceeded max values\");\n index += 3;\n isValue = false;\n } else { // index + 1 = \"}\"\n index += 3;\n break; // end of extractedParameters\n }\n }\n }\n\n if (extractProviderHash) {\n bytes memory providerHashParamBytes = bytes(\"\\\"providerHash\\\":\\\"\");\n for (uint i = 0; i < providerHashParamBytes.length; i++) {\n require(dataBytes[index + i] == providerHashParamBytes[i], \"Extraction failed. Malformed providerHash\");\n }\n index += providerHashParamBytes.length;\n \n // final indices tuple in valueIndices will be for star and end indices of provider hash\n valueIndices[2 * valuesFound] = index;\n // Keep incrementing until '\"'\n while (\n index < dataBytes.length && dataBytes[index] != '\"'\n ) {\n index++;\n }\n valueIndices[2 * valuesFound + 1] = index;\n valuesFound++;\n } \n \n string[] memory values = new string[](valuesFound);\n \n for (uint i = 0; i < valuesFound; i++) {\n uint startIndex = valueIndices[2 * i];\n uint endIndex = valueIndices[2 * i + 1];\n bytes memory contextValue = new bytes(endIndex - startIndex);\n for (uint j = startIndex; j < endIndex; j++) {\n contextValue[j - startIndex] = dataBytes[j];\n }\n values[i] = string(contextValue);\n }\n\n return values;\n }\n}\n" + }, "contracts/external/interfaces/IKeyHashAdapterV2.sol": { "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface IKeyHashAdapterV2 {\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external;\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external;\n function getMailServerKeyHashes() external view returns (bytes32[] memory);\n function isMailServerKeyHash(bytes32 _mailserverKeyHash) external view returns (bool);\n}\n" }, + "contracts/external/interfaces/INullifierRegistry.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\ninterface INullifierRegistry {\n function addNullifier(bytes32 _nullifier) external;\n function isNullified(bytes32 _nullifier) external view returns(bool);\n}\n" + }, "contracts/external/interfaces/IProxyBaseProcessor.sol": { "content": "//SPDX-License-Identifier: MIT\n\nimport { Claims } from \"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\";\n\npragma solidity ^0.8.18;\n\ninterface IProxyBaseProcessor {\n \n struct Proof {\n Claims.ClaimInfo claimInfo;\n Claims.SignedClaim signedClaim;\n }\n}\n" }, @@ -52,9 +70,33 @@ "contracts/external/lib/Bytes32ArrayUtils.sol": { "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.17;\n\n/**\n * @title Bytes32ArrayUtils\n * @author ZKP2P\n *\n * Fork of Set Protocol's AddressArrayUtils library adapted for usage with bytes32 arrays.\n */\nlibrary Bytes32ArrayUtils {\n\n uint256 constant internal MAX_INT = 2**256 - 1;\n\n /**\n * Finds the index of the first occurrence of the given element.\n * @param A The input array to search\n * @param a The value to find\n * @return Returns (index and isIn) for the first occurrence starting from index 0\n */\n function indexOf(bytes32[] memory A, bytes32 a) internal pure returns (uint256, bool) {\n uint256 length = A.length;\n for (uint256 i = 0; i < length; i++) {\n if (A[i] == a) {\n return (i, true);\n }\n }\n return (MAX_INT, false);\n }\n\n /**\n * Returns true if the value is present in the list. Uses indexOf internally.\n * @param A The input array to search\n * @param a The value to find\n * @return Returns isIn for the first occurrence starting from index 0\n */\n function contains(bytes32[] memory A, bytes32 a) internal pure returns (bool) {\n (, bool isIn) = indexOf(A, a);\n return isIn;\n }\n\n /**\n * Returns true if there are 2 elements that are the same in an array\n * @param A The input array to search\n * @return Returns boolean for the first occurrence of a duplicate\n */\n function hasDuplicate(bytes32[] memory A) internal pure returns(bool) {\n require(A.length > 0, \"A is empty\");\n\n for (uint256 i = 0; i < A.length - 1; i++) {\n bytes32 current = A[i];\n for (uint256 j = i + 1; j < A.length; j++) {\n if (current == A[j]) {\n return true;\n }\n }\n }\n return false;\n }\n\n /**\n * @param A The input array to search\n * @param a The bytes32 to remove\n * @return Returns the array with the object removed.\n */\n function remove(bytes32[] memory A, bytes32 a)\n internal\n pure\n returns (bytes32[] memory)\n {\n (uint256 index, bool isIn) = indexOf(A, a);\n if (!isIn) {\n revert(\"bytes32 not in array.\");\n } else {\n (bytes32[] memory _A,) = pop(A, index);\n return _A;\n }\n }\n\n /**\n * @param A The input array to search\n * @param a The bytes32 to remove\n */\n function removeStorage(bytes32[] storage A, bytes32 a)\n internal\n {\n (uint256 index, bool isIn) = indexOf(A, a);\n if (!isIn) {\n revert(\"bytes32 not in array.\");\n } else {\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\n if (index != lastIndex) { A[index] = A[lastIndex]; }\n A.pop();\n }\n }\n\n /**\n * Removes specified index from array\n * @param A The input array to search\n * @param index The index to remove\n * @return Returns the new array and the removed entry\n */\n function pop(bytes32[] memory A, uint256 index)\n internal\n pure\n returns (bytes32[] memory, bytes32)\n {\n uint256 length = A.length;\n require(index < A.length, \"Index must be < A length\");\n bytes32[] memory newBytes = new bytes32[](length - 1);\n for (uint256 i = 0; i < index; i++) {\n newBytes[i] = A[i];\n }\n for (uint256 j = index + 1; j < length; j++) {\n newBytes[j - 1] = A[j];\n }\n return (newBytes, A[index]);\n }\n}\n" }, + "contracts/external/lib/DateTime.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n// ----------------------------------------------------------------------------\n// DateTime Library v2.0\n//\n// A gas-efficient Solidity date and time library\n//\n// https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary\n//\n// Tested date range 1970/01/01 to 2345/12/31\n//\n// Conventions:\n// Unit | Range | Notes\n// :-------- |:-------------:|:-----\n// timestamp | >= 0 | Unix timestamp, number of seconds since 1970/01/01 00:00:00 UTC\n// year | 1970 ... 2345 |\n// month | 1 ... 12 |\n// day | 1 ... 31 |\n// hour | 0 ... 23 |\n// minute | 0 ... 59 |\n// second | 0 ... 59 |\n// dayOfWeek | 1 ... 7 | 1 = Monday, ..., 7 = Sunday\n//\n//\n// Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018-2019. The MIT Licence.\n//\n// NOTE: This library has been pruned to keep only functions needed by zkp2p\n// ----------------------------------------------------------------------------\n\nlibrary DateTime {\n uint256 constant SECONDS_PER_DAY = 24 * 60 * 60;\n uint256 constant SECONDS_PER_HOUR = 60 * 60;\n uint256 constant SECONDS_PER_MINUTE = 60;\n int256 constant OFFSET19700101 = 2440588;\n\n uint256 constant DOW_MON = 1;\n uint256 constant DOW_TUE = 2;\n uint256 constant DOW_WED = 3;\n uint256 constant DOW_THU = 4;\n uint256 constant DOW_FRI = 5;\n uint256 constant DOW_SAT = 6;\n uint256 constant DOW_SUN = 7;\n\n // ------------------------------------------------------------------------\n // Calculate the number of days from 1970/01/01 to year/month/day using\n // the date conversion algorithm from\n // http://aa.usno.navy.mil/faq/docs/JD_Formula.php\n // and subtracting the offset 2440588 so that 1970/01/01 is day 0\n //\n // days = day\n // - 32075\n // + 1461 * (year + 4800 + (month - 14) / 12) / 4\n // + 367 * (month - 2 - (month - 14) / 12 * 12) / 12\n // - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4\n // - offset\n // ------------------------------------------------------------------------\n function _daysFromDate(uint256 year, uint256 month, uint256 day) internal pure returns (uint256 _days) {\n require(year >= 1970);\n int256 _year = int256(year);\n int256 _month = int256(month);\n int256 _day = int256(day);\n\n int256 __days = _day - 32075 + (1461 * (_year + 4800 + (_month - 14) / 12)) / 4\n + (367 * (_month - 2 - ((_month - 14) / 12) * 12)) / 12\n - (3 * ((_year + 4900 + (_month - 14) / 12) / 100)) / 4 - OFFSET19700101;\n\n _days = uint256(__days);\n }\n\n function timestampFromDateTime(\n uint256 year,\n uint256 month,\n uint256 day,\n uint256 hour,\n uint256 minute,\n uint256 second\n )\n internal\n pure\n returns (uint256 timestamp)\n {\n timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + hour * SECONDS_PER_HOUR\n + minute * SECONDS_PER_MINUTE + second;\n }\n}\n" + }, + "contracts/external/lib/StringArrayUtils.sol": { + "content": "/*\n Copyright 2020 Set Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n SPDX-License-Identifier: Apache-2.0\n*/\n\npragma solidity ^0.8.18;\n\n/**\n * @title StringArrayUtils\n * @author Set Protocol\n *\n * Utility functions to handle String Arrays\n */\nlibrary StringArrayUtils {\n\n /**\n * Finds the index of the first occurrence of the given element.\n * @param A The input string to search\n * @param a The value to find\n * @return Returns (index and isIn) for the first occurrence starting from index 0\n */\n function indexOf(string[] memory A, string memory a) internal pure returns (uint256, bool) {\n uint256 length = A.length;\n for (uint256 i = 0; i < length; i++) {\n if (keccak256(bytes(A[i])) == keccak256(bytes(a))) {\n return (i, true);\n }\n }\n return (type(uint256).max, false);\n }\n\n /**\n * @param A The input array to search\n * @param a The string to remove\n */\n function removeStorage(string[] storage A, string memory a)\n internal\n {\n (uint256 index, bool isIn) = indexOf(A, a);\n if (!isIn) {\n revert(\"String not in array.\");\n } else {\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\n if (index != lastIndex) { A[index] = A[lastIndex]; }\n A.pop();\n }\n }\n}" + }, + "contracts/external/lib/StringConversionUtils.sol": { + "content": "//SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.18;\n\n// Building on zk-email's StringUtils library we add the ability to handle decimals when\n// converting from string to Uint\nlibrary StringConversionUtils {\n \n /**\n * @notice Function that parses numbers returned as strings including floating point numbers. Returned floating point\n * numbers are to have the desired amount of decimal specified. If the stringified version of the floating point\n * number has more decimal places than desired then the function will revert in order to be maximally safe. If\n * the returned number has multiple floating points then the function will revert.\n *\n * Examples: _s = \"12.34\", _expectedDecimals = 6 => 12340000\n * _s = \"12.34\", _expectedDecimals = 2 => 1234\n * _s = \"12.34\", _expectedDecimals = 1 => REVERT (we never want loss of precision only addition)\n * _s = \"12.34.56\", _expectedDecimals = 6 => REVERT (Invalid number)\n *\n * @param _s String being processed\n * @param _desiredDecimals Desired amount of decimal places\n */\n function stringToUint(string memory _s, uint256 _desiredDecimals) internal pure returns (uint256) {\n return stringToUint(_s, 0x2E, _desiredDecimals);\n }\n\n function stringToUint(\n string memory _s,\n bytes1 _decimalCharacter,\n uint256 _desiredDecimals\n )\n internal\n pure\n returns (uint256)\n {\n bytes memory b = bytes(_s);\n\n uint256 result = 0;\n uint256 decimalPlaces = 0;\n\n bool decimals = false;\n for (uint256 i = 0; i < b.length; i++) {\n if (b[i] >= 0x30 && b[i] <= 0x39) {\n result = result * 10 + (uint256(uint8(b[i])) - 48);\n }\n\n if (decimals) {\n decimalPlaces++;\n }\n\n if (b[i] == _decimalCharacter) {\n require(decimals == false, \"String has multiple decimals\");\n decimals = true;\n }\n }\n\n require(decimalPlaces <= _desiredDecimals, \"String has too many decimal places\");\n return result * (10 ** (_desiredDecimals - decimalPlaces));\n }\n\n /**\n * @notice Function that returns a substring from _startIndex to _endIndex (non-inclusive).\n *\n * @param _str String being processed\n * @param _startIndex Index to start parsing from\n * @param _endIndex Index to stop parsing at (index not included in result)\n */\n function substring(string memory _str, uint _startIndex, uint _endIndex) internal pure returns (string memory ) {\n bytes memory strBytes = bytes(_str);\n bytes memory result = new bytes(_endIndex-_startIndex);\n for(uint i = _startIndex; i < _endIndex; i++) {\n result[i-_startIndex] = strBytes[i];\n }\n return string(result);\n }\n\n function replaceString(\n string memory _str,\n string memory _lookupValue,\n string memory _replaceValue\n )\n internal\n pure\n returns (string memory)\n {\n bytes memory strBytes = bytes(_str);\n bytes memory lookupBytes = bytes(_lookupValue);\n\n uint256 lookupIndex = indexOf(_str, _lookupValue);\n if (lookupIndex == type(uint256).max) {\n return _str;\n }\n\n // Split the original string into two parts: before and after the keyword\n string memory beforeKeyword = substring(_str, 0, lookupIndex);\n string memory afterKeyword = substring(_str, lookupIndex + lookupBytes.length, strBytes.length);\n \n return string.concat(beforeKeyword, _replaceValue, afterKeyword);\n }\n\n function indexOf(string memory str, string memory substr) internal pure returns (uint) {\n bytes memory strBytes = bytes(str);\n bytes memory substrBytes = bytes(substr);\n \n if (strBytes.length < substrBytes.length) return type(uint256).max;\n \n for (uint i = 0; i <= strBytes.length - substrBytes.length; i++) {\n bool found = true;\n for (uint j = 0; j < substrBytes.length; j++) {\n if (strBytes[i + j] != substrBytes[j]) {\n found = false;\n break;\n }\n }\n if (found) return i;\n }\n \n return type(uint256).max;\n }\n\n function stringComparison(string memory _a, string memory _b) internal pure returns (bool) {\n return (keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b)));\n }\n}\n" + }, "contracts/external/lib/Uint256ArrayUtils.sol": { "content": "/*\n Copyright 2020 Set Labs Inc.\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n SPDX-License-Identifier: Apache-2.0\n*/\n\npragma solidity ^0.8.18;\n\n/**\n * @title Uint256ArrayUtils\n * @author Set Protocol\n *\n * Utility functions to handle Uint256 Arrays\n */\nlibrary Uint256ArrayUtils {\n\n uint256 constant internal MAX_INT = 2**256 - 1;\n\n /**\n * Finds the index of the first occurrence of the given element.\n * @param A The input array to search\n * @param a The value to find\n * @return Returns (index and isIn) for the first occurrence starting from index 0\n */\n function indexOf(uint256[] memory A, uint256 a) internal pure returns (uint256, bool) {\n uint256 length = A.length;\n for (uint256 i = 0; i < length; i++) {\n if (A[i] == a) {\n return (i, true);\n }\n }\n return (MAX_INT, false);\n }\n\n /**\n * Returns true if the value is present in the list. Uses indexOf internally.\n * @param A The input array to search\n * @param a The value to find\n * @return Returns isIn for the first occurrence starting from index 0\n */\n function contains(uint256[] memory A, uint256 a) internal pure returns (bool) {\n (, bool isIn) = indexOf(A, a);\n return isIn;\n }\n\n /**\n * Returns the combination of the two arrays\n * @param A The first array\n * @param B The second array\n * @return Returns A extended by B\n */\n function extend(uint256[] memory A, uint256[] memory B) internal pure returns (uint256[] memory) {\n uint256 aLength = A.length;\n uint256 bLength = B.length;\n uint256[] memory newUints = new uint256[](aLength + bLength);\n for (uint256 i = 0; i < aLength; i++) {\n newUints[i] = A[i];\n }\n for (uint256 j = 0; j < bLength; j++) {\n newUints[aLength + j] = B[j];\n }\n return newUints;\n }\n\n /**\n * @param A The input array to search\n * @param a The bytes32 to remove\n */\n function removeStorage(uint256[] storage A, uint256 a)\n internal\n {\n (uint256 index, bool isIn) = indexOf(A, a);\n if (!isIn) {\n revert(\"uint256 not in array.\");\n } else {\n uint256 lastIndex = A.length - 1; // If the array would be empty, the previous line would throw, so no underflow here\n if (index != lastIndex) { A[index] = A[lastIndex]; }\n A.pop();\n }\n }\n}\n" }, + "contracts/external/ManagedKeyHashAdapterV2.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { IKeyHashAdapterV2 } from \"./interfaces/IKeyHashAdapterV2.sol\";\nimport { Bytes32ArrayUtils } from \"./lib/Bytes32ArrayUtils.sol\";\n\npragma solidity ^0.8.18;\n\ncontract ManagedKeyHashAdapterV2 is Ownable, IKeyHashAdapterV2 {\n \n using Bytes32ArrayUtils for bytes32[];\n\n /* ============ Events ============ */\n event MailServerKeyHashAdded(bytes32 mailserverKeyHash);\n event MailServerKeyHashRemoved(bytes32 mailserverKeyHash);\n\n /* ============ State Variables ============ */\n\n mapping(bytes32 => bool) public isMailServerKeyHash;\n bytes32[] public mailServerKeyHashes;\n\n /* ============ Constructor ============ */\n\n constructor(\n bytes32[] memory _mailServerKeyHashes\n )\n Ownable()\n {\n for (uint256 i = 0; i < _mailServerKeyHashes.length; i++) {\n bytes32 mailserverKeyHash = _mailServerKeyHashes[i];\n require(!isMailServerKeyHash[mailserverKeyHash], \"Key hash already added\");\n \n isMailServerKeyHash[mailserverKeyHash] = true;\n mailServerKeyHashes.push(mailserverKeyHash);\n }\n }\n\n /* ============ External Functions ============ */\n\n function addMailServerKeyHash(bytes32 _mailserverKeyHash) external onlyOwner {\n require(!isMailServerKeyHash[_mailserverKeyHash], \"Key hash already added\");\n\n isMailServerKeyHash[_mailserverKeyHash] = true;\n mailServerKeyHashes.push(_mailserverKeyHash);\n\n emit MailServerKeyHashAdded(_mailserverKeyHash);\n }\n\n function removeMailServerKeyHash(bytes32 _mailserverKeyHash) external onlyOwner {\n require(isMailServerKeyHash[_mailserverKeyHash], \"Key hash not added\");\n\n isMailServerKeyHash[_mailserverKeyHash] = false;\n mailServerKeyHashes.removeStorage(_mailserverKeyHash);\n\n emit MailServerKeyHashRemoved(_mailserverKeyHash);\n }\n\n /* ============ External Getter Functions ============ */\n\n function getMailServerKeyHashes() external view override returns (bytes32[] memory) {\n return mailServerKeyHashes;\n }\n}\n" + }, + "contracts/external/NullifierRegistry.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { AddressArrayUtils } from \"./lib/AddressArrayUtils.sol\";\nimport { INullifierRegistry } from \"./interfaces/INullifierRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract NullifierRegistry is Ownable, INullifierRegistry {\n\n using AddressArrayUtils for address[];\n \n /* ============ Events ============ */\n event NullifierAdded(bytes32 nullifier, address indexed writer);\n event WriterAdded(address writer);\n event WriterRemoved(address writer);\n\n /* ============ Modifiers ============ */\n modifier onlyWriter() {\n require(isWriter[msg.sender], \"Only addresses with write permissions can call\");\n _;\n }\n\n /* ============ State Variables ============ */\n mapping(bytes32 => bool) public isNullified;\n mapping(address => bool) public isWriter;\n address[] public writers;\n\n /* ============ Constructor ============ */\n constructor() Ownable() {}\n \n /* ============ External Functions ============ */\n\n /**\n * ONLY WRITER: Only addresses with permission to write to this contract can call. Stores a nullifier for an email.\n *\n * @param _nullifier The nullifier to store\n */\n function addNullifier(bytes32 _nullifier) external onlyWriter {\n require(!isNullified[_nullifier], \"Nullifier already exists\");\n\n isNullified[_nullifier] = true;\n\n emit NullifierAdded(_nullifier, msg.sender);\n }\n\n /* ============ Admin Functions ============ */\n\n /**\n * ONLY OWNER: Add address that has write permissions to the registry. Writer must not have been previously added.\n *\n * @param _newWriter The nullifier to store\n */\n function addWritePermission(address _newWriter) external onlyOwner {\n require(!isWriter[_newWriter], \"Address is already a writer\");\n\n isWriter[_newWriter] = true;\n writers.push(_newWriter);\n\n emit WriterAdded(_newWriter);\n }\n\n /**\n * ONLY OWNER: Remove address that has write permissions to the registry. Writer must have been previously added.\n *\n * @param _removedWriter The nullifier to store\n */\n function removeWritePermission(address _removedWriter) external onlyOwner {\n require(isWriter[_removedWriter], \"Address is not a writer\");\n\n isWriter[_removedWriter] = false;\n writers.removeStorage(_removedWriter);\n\n emit WriterRemoved(_removedWriter);\n }\n\n /* ============ External View Functions ============ */\n\n function getWriters() external view returns(address[] memory) {\n return writers;\n }\n}\n" + }, + "contracts/external/processors/EmailBaseProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\nimport { IKeyHashAdapterV2 } from \"../interfaces/IKeyHashAdapterV2.sol\";\nimport { INullifierRegistry } from \"../interfaces/INullifierRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract EmailBaseProcessor is Ownable {\n\n /* ============ Modifiers ============ */\n modifier onlyExchange() {\n require(msg.sender == exchange, \"Only exchange can call this function\");\n _;\n }\n\n /* ============ State Variables ============ */\n address public immutable exchange;\n INullifierRegistry public nullifierRegistry;\n bytes public emailFromAddress;\n uint256 public timestampBuffer;\n\n /* ============ Constructor ============ */\n constructor(\n address _exchange,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Ownable()\n {\n exchange = _exchange;\n nullifierRegistry = _nullifierRegistry;\n emailFromAddress = bytes(_emailFromAddress);\n timestampBuffer = _timestampBuffer;\n }\n\n /* ============ External Functions ============ */\n\n /**\n * @notice ONLY OWNER: Sets the from email address for validated emails. Check that email address is properly\n * padded (if necessary). Padding will be dependent on if unpacking functions cut trailing 0s or not.\n *\n * @param _emailFromAddress The from email address for validated emails, MUST BE PROPERLY PADDED\n */\n function setEmailFromAddress(string memory _emailFromAddress) external onlyOwner {\n emailFromAddress = bytes(_emailFromAddress);\n }\n\n /**\n * @notice ONLY OWNER: Sets the timestamp buffer for validated emails. This is the amount of time in seconds\n * that the timestamp can be off by and still be considered valid. Necessary to build in flexibility with L2\n * timestamps.\n *\n * @param _timestampBuffer The timestamp buffer for validated emails\n */\n function setTimestampBuffer(uint256 _timestampBuffer) external onlyOwner {\n timestampBuffer = _timestampBuffer;\n }\n\n /* ============ External Getters ============ */\n\n function getEmailFromAddress() external view returns (bytes memory) {\n return emailFromAddress;\n }\n\n\n /* ============ Internal Functions ============ */\n\n function _validateAndAddNullifier(bytes32 _nullifier) internal {\n require(!nullifierRegistry.isNullified(_nullifier), \"Nullifier has already been used\");\n nullifierRegistry.addNullifier(_nullifier);\n }\n}\n" + }, + "contracts/external/processors/ProxyBaseProcessor.sol": { + "content": "//SPDX-License-Identifier: MIT\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport { Claims } from \"@reclaimprotocol/verifier-solidity-sdk/contracts/Claims.sol\";\n\nimport { AddressArrayUtils } from \"../lib/AddressArrayUtils.sol\";\nimport { StringArrayUtils } from \"../lib/StringArrayUtils.sol\";\nimport { INullifierRegistry } from \"../interfaces/INullifierRegistry.sol\";\nimport { IProxyBaseProcessor } from \"../interfaces/IProxyBaseProcessor.sol\";\nimport { ClaimVerifier } from \"../ClaimVerifier.sol\";\n\npragma solidity ^0.8.18;\n\ncontract ProxyBaseProcessor is IProxyBaseProcessor, Ownable {\n\n using AddressArrayUtils for address[];\n using StringArrayUtils for string[];\n\n /* ============ State Variables ============ */\n mapping(address => bool) public isWitness;\n address[] public witnesses;\n mapping(string => bool) public isProviderHash;\n string[] public providerHashes; // Set of provider hashes that these proofs should be for\n INullifierRegistry public immutable nullifierRegistry;\n\n /* ============ Events ============ */\n event WitnessAdded(address witness);\n event WitnessRemoved(address witness);\n event ProviderHashAdded(string providerHash);\n event ProviderHashRemoved(string providerHash);\n\n /* ============ Constructor ============ */\n constructor(\n INullifierRegistry _nulliferRegistry,\n string[] memory _providerHashes\n )\n Ownable()\n {\n nullifierRegistry = _nulliferRegistry;\n\n for (uint256 i = 0; i < _providerHashes.length; i++) {\n require(!isProviderHash[_providerHashes[i]], \"Provider hash already added\");\n isProviderHash[_providerHashes[i]] = true;\n providerHashes.push(_providerHashes[i]);\n\n emit ProviderHashAdded(_providerHashes[i]);\n }\n }\n\n /* ============ Admin Functions ============ */\n\n /**\n * ONLY OWNER: Add witness address. Witness must not have been previously added.\n *\n * @param _newWitness Address of the new witness\n */\n function addWitness(address _newWitness) external onlyOwner {\n require(!isWitness[_newWitness], \"Address is already a witness\");\n\n isWitness[_newWitness] = true;\n witnesses.push(_newWitness);\n\n emit WitnessAdded(_newWitness);\n }\n\n /**\n * ONLY OWNER: Remove witness address. Witness must have been previously added.\n *\n * @param _removeWitness Address of witness to be removed\n */\n function removeWitness(address _removeWitness) external onlyOwner {\n require(isWitness[_removeWitness], \"Address is not a witness\");\n\n delete isWitness[_removeWitness];\n witnesses.removeStorage(_removeWitness);\n\n emit WitnessRemoved(_removeWitness);\n }\n\n /**\n * ONLY OWNER: Add provider hash string. Provider hash must not have been previously added.\n *\n * @param _newProviderHash New provider hash to be added\n */\n function addProviderHash(string memory _newProviderHash) external onlyOwner {\n require(!isProviderHash[_newProviderHash], \"Provider hash already added\");\n\n isProviderHash[_newProviderHash] = true;\n providerHashes.push(_newProviderHash);\n\n emit ProviderHashAdded(_newProviderHash);\n }\n\n /**\n * ONLY OWNER: Remove provider hash string. Provider hash must have been previously added.\n *\n * @param _removeProviderHash Provider hash to be removed\n */\n function removeProviderHash(string memory _removeProviderHash) external onlyOwner {\n require(isProviderHash[_removeProviderHash], \"Provider hash not found\");\n\n delete isProviderHash[_removeProviderHash];\n providerHashes.removeStorage(_removeProviderHash);\n\n emit ProviderHashRemoved(_removeProviderHash);\n }\n\n /* ============ Public Functions ============ */\n \n /**\n * Verify proof generated by witnesses. Claim is constructed by hashing claimInfo (provider, context, parameters)\n * to get the identifier. And then signing on (identifier, owner, timestamp, epoch) to get claim signature. \n * This function verifies a claim by performing the following checks on the claim\n * - Calculates the hash of the claimInfo and checks if it matches the identifier in the claim\n * - Checks if the signatures are valid and from the witnesses\n * This function reverts if\n * - No signatures are found on the proof\n * - Number of signatures is not equal to the number of witnesses\n * - ClaimInfo hash does not match the identifier in the claim\n * - Signatures are invalid (not from the witnesses)\n * \n * DEV NOTE: This function does NOT validate that the claim provider hash is valid. That is the \n * responsibility of the caller.\n * \n * Parts of the code are adapted from: https://basescan.org/address/0x7281630e4346dd4c0b7ae3b4689c1d0102741410#code\n * \n * @param proof Proof to be verified\n */\n function verifyProofSignatures(Proof memory proof) public view returns (bool) {\n\n // create signed claim using claimData and signature.\n require(proof.signedClaim.signatures.length > 0, \"No signatures\");\n Claims.SignedClaim memory signed = Claims.SignedClaim(\n proof.signedClaim.claim,\n proof.signedClaim.signatures\n );\n\n // check if the hash from the claimInfo is equal to the infoHash in the claimData\n bytes32 hashed = Claims.hashClaimInfo(proof.claimInfo);\n require(proof.signedClaim.claim.identifier == hashed, \"ClaimInfo hash doesn't match\");\n\n // Recover signers of the signed claim\n address[] memory signedWitnesses = Claims.recoverSignersOfSignedClaim(signed);\n\n // check if the number of signatures is equal to the number of witnesses\n require(\n signedWitnesses.length == witnesses.length,\n \"Number of signatures not equal to number of witnesses\"\n );\n\n // Check signatures are from witnesses\n for (uint256 i = 0; i < signed.signatures.length; i++) {\n bool found = false;\n for (uint j = 0; j < witnesses.length; j++) {\n if (signedWitnesses[i] == witnesses[j]) {\n found = true;\n break;\n }\n }\n require(found, \"Signature not appropriate\");\n }\n\n return true;\n }\n\n\n /* ============ View Functions ============ */\n\n function getWitnesses() external view returns (address[] memory) {\n return witnesses;\n }\n\n function getProviderHashes() external view returns (string[] memory) {\n return providerHashes;\n }\n\n /* ============ Internal Functions ============ */\n\n function _validateProviderHash(string memory _providerHash) internal view returns (bool) {\n return isProviderHash[_providerHash];\n }\n \n function _validateAndAddNullifier(bytes[] memory _sigArray) internal {\n bytes32 nullifier = keccak256(abi.encode(_sigArray));\n require(!nullifierRegistry.isNullified(nullifier), \"Nullifier has already been used\");\n nullifierRegistry.addNullifier(nullifier);\n }\n}\n" + }, + "contracts/external/TicketmasterDataParsing.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { DateTime } from \"./lib/DateTime.sol\";\n\nimport { StringConversionUtils } from \"./lib/StringConversionUtils.sol\";\nimport { ClaimVerifier } from \"./ClaimVerifier.sol\";\n\npragma solidity ^0.8.18;\n\nlibrary TicketmasterDataParsing {\n \n using StringConversionUtils for string;\n\n /**\n * @notice Iterates through every character in the date string and splits the string at each dash, \"T\", or colon. Function will revert\n * if there are not 6 substrings formed from the split. The substrings are then converted to uints and passed to the DateTime lib\n * to get the unix timestamp. This function is SPECIFIC TO THE DATE FORMAT USED BY Ticketmaster, not suitable for use with other date\n * formats. Ticketmaster date format is: \"YYYY-MM-DDTHH:MM:SS\" and returns UTC timestamps.\n *\n * @param _dateString Date string to be converted to a UTC timestamp\n */\n function _dateStringToTimestamp(string memory _dateString) internal pure returns (uint256 utcTimestamp) {\n string[6] memory extractedStrings;\n uint256 breakCounter;\n uint256 lastBreak;\n for (uint256 i = 0; i < bytes(_dateString).length; i++) {\n if (bytes(_dateString)[i] == 0x2d || bytes(_dateString)[i] == 0x3a || bytes(_dateString)[i] == 0x54) {\n extractedStrings[breakCounter] = _dateString.substring(lastBreak, i);\n lastBreak = i + 1;\n breakCounter++;\n }\n }\n // Add last substring to array\n extractedStrings[breakCounter] = _dateString.substring(lastBreak, bytes(_dateString).length);\n\n // Check that exactly 6 substrings were found (string is split at 5 different places)\n require(breakCounter == 5, \"Invalid date string\");\n\n utcTimestamp = DateTime.timestampFromDateTime(\n extractedStrings[0].stringToUint(0), // year\n extractedStrings[1].stringToUint(0), // month\n extractedStrings[2].stringToUint(0), // day\n extractedStrings[3].stringToUint(0), // hour\n extractedStrings[4].stringToUint(0), // minute\n 0 // we don't need to the second granularity\n );\n }\n\n /**\n * Extract event ID from URL by finding the last slash and taking the substring after it. We assume the\n * URL is formulated something like: {domainRoot}/.../event/EVENT_ID\n *\n * @param _url URL to extract event ID from\n * @return Event ID extracted from URL\n */\n function _extractEventIdFromUrl(string memory _url) internal pure returns (string memory) {\n string memory prefix = \"event/\";\n bytes memory urlBytes = bytes(_url);\n uint256 urlLength = urlBytes.length;\n\n uint256 startIndex = ClaimVerifier.findSubstringEndIndex(_url, prefix);\n // If the start index is the max value or the URL length, then the event ID was not found\n if (startIndex == type(uint256).max || startIndex == urlLength) {\n revert(\"Event ID not found in URL\");\n }\n\n bytes memory contextMessage = new bytes(urlLength - startIndex);\n for (uint i = startIndex; i < urlLength; i++) {\n contextMessage[i - startIndex] = urlBytes[i];\n }\n return string(contextMessage);\n }\n\n /**\n * Parse tickets out of a ticket string of the format: '[\"ticket1\", \"ticket2\", \"ticket3\"]'.\n * We start by getting the number of tickets in a string by counting the number of commas and adding 1.\n * Then we iterate through the string and find the ticket IDs by looking for the quotes. We need to extract\n * from quote to quote so we look for all even-numbered quotes then extract the string between that and the\n * previous quote index.\n *\n * @param _ticketString Stringified array of tickets\n */\n function _parseTicketString(string memory _ticketString) internal pure returns (string[] memory ticketIds) {\n // Assume there is at least one ticket (which means array would not have a comma)\n // If there is no ticket then the transaction will end up reverting\n uint256 ticketCount = 1;\n for (uint256 i = 0; i < bytes(_ticketString).length; i++) {\n if (bytes(_ticketString)[i] == 0x2C) {\n ticketCount++;\n }\n }\n\n ticketIds = new string[](ticketCount);\n uint256 breakCounter;\n uint256 lastBreak;\n for (uint256 i = 0; i < bytes(_ticketString).length; i++) {\n if (bytes(_ticketString)[i] == 0x22) {\n breakCounter++;\n if (breakCounter % 2 == 0) {\n ticketIds[(breakCounter/2)-1] = _ticketString.substring(lastBreak, i-1);\n }\n lastBreak = i + 1;\n }\n }\n }\n}\n" + }, "contracts/interfaces/IDomainExchange.sol": { "content": "//SPDX-License-Identifier: MIT\npragma solidity ^0.8.18;\n\n\ninterface IDomainExchange {\n function registryRemoveListing(uint256 _listingId) external;\n}" }, @@ -67,8 +109,29 @@ "contracts/interfaces/IVerifyDomainProcessor.sol": { "content": "//SPDX-License-Identifier: MIT\nimport { IProxyBaseProcessor } from \"../external/interfaces/IProxyBaseProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ninterface IVerifyDomainProcessor is IProxyBaseProcessor {\n \n struct DomainRaw {\n string name;\n uint256 expiryTime;\n }\n\n function verifyProofs(\n Proof[] memory _proofs\n ) \n external \n returns (DomainRaw[] memory domains);\n}" }, + "contracts/mocks/DomainExchangeMock.sol": { + "content": "// SPDX-License-Identifier: MIT\nimport \"../interfaces/IDomainExchange.sol\";\nimport \"../interfaces/IVerifiedDomainRegistry.sol\";\n\npragma solidity ^0.8.18;\n\ncontract DomainExchangeMock is IDomainExchange {\n \n mapping(uint256 => bool) public listingActive;\n IVerifiedDomainRegistry public verifiedDomainRegistry;\n\n constructor(\n IVerifiedDomainRegistry _verifiedDomainRegistry\n ) {\n verifiedDomainRegistry = _verifiedDomainRegistry;\n }\n\n function createListing(bytes32 _domainId, uint256 _listingId) public {\n listingActive[_listingId] = true;\n verifiedDomainRegistry.setDomainListing(_domainId, _listingId);\n }\n\n function registryRemoveListing(uint256 _listingId) external override {\n listingActive[_listingId] = false;\n }\n}\n" + }, + "contracts/mocks/TransferDomainProcessorMock.sol": { + "content": "// SPDX-License-Identifier: MIT\n\nimport { ITransferDomainProcessor } from \"../interfaces/ITransferDomainProcessor.sol\";\nimport { StringUtils } from \"@zk-email/contracts/utils/StringUtils.sol\";\n\n\npragma solidity ^0.8.18;\n\ncontract TransferDomainProcessorMock is ITransferDomainProcessor {\n\n using StringUtils for uint256;\n\n /* ============ State Variables ============ */\n string storedDomainName;\n\n /* ============ Constructor ============ */\n constructor() {}\n\n /* ============ External Functions ============ */\n\n function setDomainName(string memory _domainName) external {\n storedDomainName = _domainName;\n }\n\n function processProof(TransferProof memory _proof)\n external\n view\n override\n returns (bytes32 dkimKeyHash, bytes32 hashedReceiverId, string memory domainName, uint256 bidId)\n {\n dkimKeyHash = bytes32(_proof.signals[0]);\n hashedReceiverId = bytes32(_proof.signals[1]);\n domainName = storedDomainName;\n bidId = _proof.signals[3];\n }\n}\n\n\n" + }, + "contracts/mocks/USDCMock.sol": { + "content": "//SPDX-License-Identifier: MIT\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\npragma solidity ^0.8.18;\n\ncontract USDCMock is ERC20 {\n\n constructor(\n uint256 _mintAmount,\n string memory name,\n string memory symbol\n )\n ERC20(name, symbol)\n {\n _mint(msg.sender, _mintAmount);\n }\n\n function decimals() public pure override returns (uint8) {\n return 6;\n }\n}\n" + }, + "contracts/mocks/VerifyDomainProcessorMock.sol": { + "content": "// SPDX-License-Identifier: MIT\n\nimport { ClaimVerifier } from \"../external/ClaimVerifier.sol\";\nimport { StringConversionUtils } from \"../external/lib/StringConversionUtils.sol\";\nimport { TicketmasterDataParsing } from \"../external/TicketmasterDataParsing.sol\";\n\nimport { IVerifyDomainProcessor } from \"../interfaces/IVerifyDomainProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract VerifyDomainProcessorMock is IVerifyDomainProcessor {\n\n using StringConversionUtils for string;\n\n uint8 constant MAX_EXTRACT_VALUES = 5;\n\n function verifyProofs(Proof[] memory _proofs)\n external\n pure\n returns (DomainRaw[] memory domains)\n {\n domains = new DomainRaw[](_proofs.length);\n\n for (uint256 i = 0; i < _proofs.length; i++) {\n domains[i] = DomainRaw({\n name: string(_proofs[i].signedClaim.signatures[0]),\n // The TicketmasterDataParsing library's date parsing logic is pretty generic, and works for domain \n // expiry dates as well. Similar to Ticketmaster dates, the expiry time is of the format \"YYYY-MM-DDTHH:MM:SS\"\n // and returns UTC timestamps.\n expiryTime: TicketmasterDataParsing._dateStringToTimestamp(string(_proofs[i].signedClaim.signatures[1]))\n });\n }\n\n return domains;\n }\n}\n" + }, + "contracts/TransferDomainProcessor.sol": { + "content": "// SPDX-License-Identifier: MIT\n\nimport { StringUtils } from \"@zk-email/contracts/utils/StringUtils.sol\";\n\nimport { EmailBaseProcessor } from \"./external/processors/EmailBaseProcessor.sol\";\nimport { INullifierRegistry } from \"./external/interfaces/INullifierRegistry.sol\";\nimport { StringConversionUtils } from \"./external/lib/StringConversionUtils.sol\";\n\nimport { Groth16Verifier } from \"./verifiers/namecheap_transfer_verifier.sol\";\nimport { ITransferDomainProcessor } from \"./interfaces/ITransferDomainProcessor.sol\";\n\npragma solidity ^0.8.18;\n\ncontract TransferDomainProcessor is Groth16Verifier, ITransferDomainProcessor, EmailBaseProcessor {\n \n using StringUtils for uint256[];\n using StringConversionUtils for string;\n\n /* ============ Constants ============ */\n uint256 constant PACK_SIZE = 31;\n\n /* ============ Constructor ============ */\n constructor(\n address _exchange,\n INullifierRegistry _nullifierRegistry,\n string memory _emailFromAddress,\n uint256 _timestampBuffer\n )\n Groth16Verifier()\n EmailBaseProcessor(\n _exchange,\n _nullifierRegistry,\n _emailFromAddress,\n _timestampBuffer\n )\n {}\n \n /* ============ External Functions ============ */\n\n function processProof(\n TransferProof calldata _proof\n )\n external\n override\n onlyExchange\n returns (\n bytes32 dkimKeyHash,\n bytes32 hashedReceiverId,\n string memory domainName, \n uint256 bidId\n )\n {\n require(this.verifyProof(_proof.a, _proof.b, _proof.c, _proof.signals), \"Invalid Proof\");\n\n // Signal [0] is the DKIM key hash\n dkimKeyHash = bytes32(_proof.signals[0]);\n\n // Signals [1:2] are the packed from email address\n string memory fromEmail = _parseSignalArray(_proof.signals, 1, 2);\n require(\n keccak256(abi.encodePacked(fromEmail)) == keccak256(emailFromAddress), \n \"Invalid email from address\"\n );\n \n // Signals [2:7] are packed domain name\n domainName = _parseSignalArray(_proof.signals, 2, 7);\n\n // Signal [7] is packed hashed namecheap id to which domain was transferred\n hashedReceiverId = bytes32(_proof.signals[7]);\n\n // Check if email has been used previously, if not nullify it so it can't be used again\n _validateAndAddNullifier(bytes32(_proof.signals[8]));\n\n // Signal [9] is bidId\n bidId = _proof.signals[9];\n }\n \n /* ============ Internal Functions ============ */\n\n function _parseSignalArray(uint256[10] calldata _signals, uint8 _from, uint8 _to) \n internal \n pure \n returns (string memory) \n {\n uint256[] memory signalArray = new uint256[](_to - _from);\n for (uint256 i = _from; i < _to; i++) {\n signalArray[i - _from] = _signals[i];\n }\n\n return signalArray.convertPackedBytesToString(signalArray.length * PACK_SIZE, PACK_SIZE);\n }\n}\n" + }, "contracts/VerifiedDomainRegistry.sol": { "content": "//SPDX-License-Identifier: MIT\n\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport { Bytes32ArrayUtils } from \"./external/lib/Bytes32ArrayUtils.sol\";\nimport { AddressArrayUtils } from \"./external/lib/AddressArrayUtils.sol\";\n\nimport { IDomainExchange } from \"./interfaces/IDomainExchange.sol\";\nimport { IVerifiedDomainRegistry } from \"./interfaces/IVerifiedDomainRegistry.sol\";\nimport { IVerifyDomainProcessor } from \"./interfaces/IVerifyDomainProcessor.sol\";\n\n\npragma solidity ^0.8.18;\n\ncontract VerifiedDomainRegistry is IVerifiedDomainRegistry, Ownable {\n\n using Bytes32ArrayUtils for bytes32[];\n using AddressArrayUtils for address[];\n\n /* ============ Events ============ */\n event DomainVerified(\n bytes32 indexed domainId,\n address indexed owner,\n string domainName,\n uint256 expiryTime\n );\n\n event DomainListed(\n bytes32 indexed domainId,\n address indexed exchange,\n uint256 indexed listingId\n );\n\n event DomainListingRemoved(\n bytes32 indexed domainId,\n address indexed exchange\n );\n\n event DomainTransferred(\n bytes32 indexed domainId,\n address indexed oldOwner,\n address indexed newOwner\n );\n\n\n event VerifyDomainProcessorUpdated(\n IVerifyDomainProcessor indexed newVerifyDomainProcessor\n );\n\n event ExchangeAdded(address indexed exchange);\n event ExchangeRemoved(address indexed exchange);\n\n /* ============ Modifiers ============ */\n modifier onlyExchange() {\n require(isExchange[msg.sender], \"Caller must be exchange\");\n _;\n }\n\n modifier onlyInitialized() {\n require(isInitialized, \"Contract must be initialized\");\n _;\n }\n\n /* ============ Public Variables ============ */\n IVerifyDomainProcessor public verifyDomainProcessor;\n address[] public exchanges;\n mapping(address=>bool) public isExchange;\n\n bool public isInitialized;\n\n mapping(bytes32 => Domain) public domains;\n mapping(address => bytes32[]) public userDomains;\n\n /* ============ Constructor ============ */\n \n constructor() Ownable() {}\n\n /* ============ Public Functions ============ */\n\n /**\n * @notice Verify domains and add them to the registry. If domain is transferred off-chain to another party \n * then they can re-verify the domain and claim ownership of the domain and previous ownership is removed.\n * The existing owner can re-verify the domain, say after the domain has expired to update the expiry time on\n * the domain. Function reverts if:\n * - Domain ownership TLS proofs are invalid\n * \n * @param _proofs Array of domain ownership TLS proofs\n */\n function verifyDomains(IVerifyDomainProcessor.Proof[] memory _proofs) external override\n onlyInitialized\n {\n IVerifyDomainProcessor.DomainRaw[] memory rawDomains = verifyDomainProcessor.verifyProofs(\n _proofs\n );\n\n for (uint256 i = 0; i < rawDomains.length; i++) {\n IVerifyDomainProcessor.DomainRaw memory rawDomain = rawDomains[i];\n bytes32 domainId = getDomainId(rawDomain.name);\n\n Domain storage domain = domains[domainId];\n if (domain.owner == address(0)) {\n // Case 1.1: Domain has no owner\n // Add caller as owner\n userDomains[msg.sender].push(domainId);\n\n // Set domain details\n domains[domainId] = Domain({\n owner: msg.sender,\n name: rawDomain.name,\n expiryTime: rawDomain.expiryTime,\n exchange: address(0),\n listingId: 0\n });\n } else {\n // Case 2: Domain has owner\n // Case 2.1: Caller is owner; skip\n if (domain.owner == msg.sender) {\n // No updates to userDomains\n\n // Update domain details; Only expiry time can change\n // Owner and domain name cannot change\n // Exchange and listingId are kept as is\n domain.expiryTime = rawDomain.expiryTime;\n }\n // Case 2.2: Caller is NOT owner\n if (domain.owner != msg.sender) {\n // Remove ownership from old owner\n userDomains[domain.owner].removeStorage(domainId);\n\n // Remove listing on exchange if it exists\n if (domain.exchange != address(0)) {\n IDomainExchange(domain.exchange).registryRemoveListing(domain.listingId);\n }\n\n // Add domain to new owner\n userDomains[msg.sender].push(domainId);\n\n // Set domain details except for domain name as it cannot change\n domain.owner = msg.sender;\n domain.expiryTime = rawDomain.expiryTime;\n domain.exchange = address(0);\n domain.listingId = 0;\n }\n }\n\n emit DomainVerified(domainId, msg.sender, rawDomain.name, rawDomain.expiryTime);\n }\n }\n\n // Todo: Add function for relinquishing ownership of domain\n\n /**\n * @notice ONLY EXCHANGE: Add a listing status to domain. We check that the domain has been verified and is\n * listed on the calling exchange. This sets the exchange and listingId of the domain.\n * \n * @param _domainId Domain to set listed status for\n * @param _listingId Listing Id of domain on calling exchange\n */\n function setDomainListing(bytes32 _domainId, uint256 _listingId)\n external\n override\n onlyInitialized\n onlyExchange\n {\n Domain storage domain = domains[_domainId];\n\n require(domain.owner != address(0), \"Domain must be verified\");\n require(domain.exchange == address(0), \"Domain already listed on another exchange\");\n\n domain.exchange = msg.sender;\n domain.listingId = _listingId;\n\n emit DomainListed(_domainId, msg.sender, _listingId);\n }\n\n /**\n * @notice ONLY EXCHANGE: Remove a listing status from domain. We check that the calling exchange is the one\n * that the domain is listed on. This removes the exchange and listingId from the domain.\n * \n * @param _domainId Domain ID to update listing status for\n */\n function removeDomainListing(bytes32 _domainId) external override onlyInitialized onlyExchange {\n Domain storage domain = domains[_domainId];\n require(domain.exchange == msg.sender, \"Domain not listed on calling exchange\");\n\n _removeDomainListing(domain);\n\n emit DomainListingRemoved(_domainId, msg.sender);\n }\n\n /**\n * @notice ONLY EXCHANGE: Update domain on sale. We check that the calling exchange is the one that the domain\n * is listed on. This updates the ownership of the domain to the new owner as well as removes the listing status\n * from the domain.\n * \n * @param _domainId Domain ID to update listing status for\n * @param _newOwner New owner of the domain\n */\n function updateDomainOnSale(bytes32 _domainId, address _newOwner) \n external \n override \n onlyInitialized \n onlyExchange \n {\n Domain storage domain = domains[_domainId];\n require(domain.exchange == msg.sender, \"Domain not listed on calling exchange\");\n\n _removeDomainListing(domain);\n\n // Update ownership\n address oldOwner = domain.owner;\n domain.owner = _newOwner;\n userDomains[oldOwner].removeStorage(_domainId);\n userDomains[_newOwner].push(_domainId);\n\n emit DomainTransferred(_domainId, oldOwner, _newOwner);\n }\n\n /* ============ Admin Functions ============ */\n\n /**\n * @notice ONLY OWNER: Initialize the contract with the VerifyDomainProcessor and exchange contracts.\n * This can only be called once.\n *\n * @param _verifyDomainProcessor Address of the VerifyDomainProcessor contract\n */\n function initialize(\n IVerifyDomainProcessor _verifyDomainProcessor\n )\n external\n onlyOwner\n {\n require(!isInitialized, \"Already initialized\");\n\n verifyDomainProcessor = _verifyDomainProcessor;\n\n isInitialized = true;\n\n emit VerifyDomainProcessorUpdated(_verifyDomainProcessor);\n }\n\n /**\n * @notice ONLY OWNER: Add an exchange to the registry. This can only be called after the contract has been initialized.\n * Exchange must not already exist in the registry.\n * \n * @param _exchange Address of the exchange contract\n */\n function addExchange(address _exchange) external onlyOwner onlyInitialized {\n require(!isExchange[_exchange], \"Duplicate exchange\");\n\n isExchange[_exchange] = true;\n exchanges.push(_exchange);\n\n emit ExchangeAdded(_exchange);\n }\n\n /**\n * @notice ONLY OWNER: Remove an exchange from the registry. Exchange must exist in the registry.\n * \n * @param _exchange Address of the exchange contract\n */\n function removeExchange(address _exchange) external onlyOwner onlyInitialized {\n require(isExchange[_exchange], \"Exchange does not exist\");\n\n isExchange[_exchange] = false;\n exchanges.removeStorage(_exchange);\n\n emit ExchangeRemoved(_exchange);\n }\n\n /**\n * @notice ONLY OWNER: Update the verify domain processor\n *\n * @param _verifyDomainProcessor Address of the new VerifyDomainProcessor contract\n */\n function updateVerifyDomainProcessor(IVerifyDomainProcessor _verifyDomainProcessor) external onlyOwner {\n require(address(_verifyDomainProcessor) != address(0), \"Invalid address\");\n\n verifyDomainProcessor = _verifyDomainProcessor;\n emit VerifyDomainProcessorUpdated(_verifyDomainProcessor);\n }\n\n /* ============ View Functions ============ */\n\n function getDomainId(string memory _domainName) public pure override returns (bytes32) {\n return keccak256(abi.encodePacked(_domainName));\n }\n\n function getDomainOwner(bytes32 _domainId) external view override returns (address) { \n return domains[_domainId].owner;\n }\n\n function getUserDomains(address _user) external view returns (DomainWithId[] memory domainInfo) {\n bytes32[] memory domainIds = userDomains[_user];\n \n domainInfo = new DomainWithId[](domainIds.length);\n for (uint256 i = 0; i < domainIds.length; i++) {\n bytes32 domainId = domainIds[i];\n domainInfo[i] = DomainWithId({\n domainId: domainId,\n domain: domains[domainId]\n });\n }\n }\n\n function getDomain(bytes32 _domainId) external view override returns (DomainWithId memory domainInfo) {\n return DomainWithId({\n domainId: _domainId,\n domain: domains[_domainId]\n });\n }\n\n function getDomains(bytes32[] memory _domains) external view returns (DomainWithId[] memory domainInfo) {\n domainInfo = new DomainWithId[](_domains.length);\n for (uint256 i = 0; i < _domains.length; i++) {\n bytes32 domainId = _domains[i];\n domainInfo[i] = DomainWithId({\n domainId: domainId,\n domain: domains[domainId]\n });\n }\n }\n\n function getExchanges() external view returns (address[] memory) {\n return exchanges;\n }\n\n /* ============ Internal Functions ============ */\n\n function _removeDomainListing(Domain storage _domain) internal {\n delete _domain.exchange;\n delete _domain.listingId;\n }\n}" + }, + "contracts/verifiers/namecheap_transfer_verifier.sol": { + "content": "// SPDX-License-Identifier: GPL-3.0\n/*\n Copyright 2021 0KIMS association.\n\n This file is generated with [snarkJS](https://github.com/iden3/snarkjs).\n\n snarkJS is a free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n\n snarkJS is distributed in the hope that it will be useful, but WITHOUT\n ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public\n License for more details.\n\n You should have received a copy of the GNU General Public License\n along with snarkJS. If not, see .\n*/\n\npragma solidity >=0.7.0 <0.9.0;\n\ncontract Groth16Verifier {\n // Scalar field size\n uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\n // Base field size\n uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;\n\n // Verification Key data\n uint256 constant alphax = 20491192805390485299153009773594534940189261866228447918068658471970481763042;\n uint256 constant alphay = 9383485363053290200918347156157836566562967994039712273449902621266178545958;\n uint256 constant betax1 = 4252822878758300859123897981450591353533073413197771768651442665752259397132;\n uint256 constant betax2 = 6375614351688725206403948262868962793625744043794305715222011528459656738731;\n uint256 constant betay1 = 21847035105528745403288232691147584728191162732299865338377159692350059136679;\n uint256 constant betay2 = 10505242626370262277552901082094356697409835680220590971873171140371331206856;\n uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\n uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\n uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\n uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\n uint256 constant deltax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634;\n uint256 constant deltax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781;\n uint256 constant deltay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531;\n uint256 constant deltay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930;\n\n\n uint256 constant IC0x = 12140764414809439171579073747096628005611143888739021778142114438725209856911;\n uint256 constant IC0y = 18380664008722994554410246598515713804368408809139402801410617352473294938101;\n\n uint256 constant IC1x = 16287270730688090110441256630912972881096977102957363147237538512209615075930;\n uint256 constant IC1y = 2449016754858987854593324887044687327196932594716827949199487058237499016691;\n\n uint256 constant IC2x = 12290000746054008145532172012836689239677528072347882111559847558608807494030;\n uint256 constant IC2y = 14308358318183304542626969831757608989020288980497492892592599563043422576641;\n\n uint256 constant IC3x = 17109205409157997740951972967816433882944148152574672952222919864324056429618;\n uint256 constant IC3y = 9961558237149244928391169779496769511791942854258198694890294984589871243856;\n\n uint256 constant IC4x = 12885622983359679040345794541760667584938087103345731492334670493606961282700;\n uint256 constant IC4y = 18397333374263242470546340955330845415543534978510188436756186606821028634481;\n\n uint256 constant IC5x = 8251971901226176941314060074725743834337466028961811325874949093602610929902;\n uint256 constant IC5y = 16257777857146800480589260332284762827173712873310789777823130626151679328406;\n\n uint256 constant IC6x = 7755902890727928430969631143079950108469618570373249456222008624592630122217;\n uint256 constant IC6y = 10757977250154075642155615103618917172698106635999924885067022788329148453826;\n\n uint256 constant IC7x = 9229565613389027758694089669374665969186485724568040364429447974425840672975;\n uint256 constant IC7y = 8522685561456236376873601057738356653321521861001626828091657280469196217906;\n\n uint256 constant IC8x = 21276732369738095771663301979590133243106197446584260397744418605720907267683;\n uint256 constant IC8y = 7293000518568388677473960035761983204180608786522452828815102825735261508468;\n\n uint256 constant IC9x = 9116173570523657214485637140779662063231707742648921986441734490858993965489;\n uint256 constant IC9y = 20125316561678768525824986864877835211109013619593406972323904438419789772526;\n\n uint256 constant IC10x = 14220475398513461434883329515056365002533036699993990374428625877488131891870;\n uint256 constant IC10y = 12173247053801606963174627761051371553685163525039542034195810636700588930659;\n\n\n // Memory data\n uint16 constant pVk = 0;\n uint16 constant pPairing = 128;\n\n uint16 constant pLastMem = 896;\n\n function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[10] calldata _pubSignals) public view returns (bool) {\n assembly {\n function checkField(v) {\n if iszero(lt(v, r)) {\n mstore(0, 0)\n return(0, 0x20)\n }\n }\n\n // G1 function to multiply a G1 value(x,y) to value in an address\n function g1_mulAccC(pR, x, y, s) {\n let success\n let mIn := mload(0x40)\n mstore(mIn, x)\n mstore(add(mIn, 32), y)\n mstore(add(mIn, 64), s)\n\n success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64)\n\n if iszero(success) {\n mstore(0, 0)\n return(0, 0x20)\n }\n\n mstore(add(mIn, 64), mload(pR))\n mstore(add(mIn, 96), mload(add(pR, 32)))\n\n success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64)\n\n if iszero(success) {\n mstore(0, 0)\n return(0, 0x20)\n }\n }\n\n function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk {\n let _pPairing := add(pMem, pPairing)\n let _pVk := add(pMem, pVk)\n\n mstore(_pVk, IC0x)\n mstore(add(_pVk, 32), IC0y)\n\n // Compute the linear combination vk_x\n\n g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0)))\n\n g1_mulAccC(_pVk, IC2x, IC2y, calldataload(add(pubSignals, 32)))\n\n g1_mulAccC(_pVk, IC3x, IC3y, calldataload(add(pubSignals, 64)))\n\n g1_mulAccC(_pVk, IC4x, IC4y, calldataload(add(pubSignals, 96)))\n\n g1_mulAccC(_pVk, IC5x, IC5y, calldataload(add(pubSignals, 128)))\n\n g1_mulAccC(_pVk, IC6x, IC6y, calldataload(add(pubSignals, 160)))\n\n g1_mulAccC(_pVk, IC7x, IC7y, calldataload(add(pubSignals, 192)))\n\n g1_mulAccC(_pVk, IC8x, IC8y, calldataload(add(pubSignals, 224)))\n\n g1_mulAccC(_pVk, IC9x, IC9y, calldataload(add(pubSignals, 256)))\n\n g1_mulAccC(_pVk, IC10x, IC10y, calldataload(add(pubSignals, 288)))\n\n\n // -A\n mstore(_pPairing, calldataload(pA))\n mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q))\n\n // B\n mstore(add(_pPairing, 64), calldataload(pB))\n mstore(add(_pPairing, 96), calldataload(add(pB, 32)))\n mstore(add(_pPairing, 128), calldataload(add(pB, 64)))\n mstore(add(_pPairing, 160), calldataload(add(pB, 96)))\n\n // alpha1\n mstore(add(_pPairing, 192), alphax)\n mstore(add(_pPairing, 224), alphay)\n\n // beta2\n mstore(add(_pPairing, 256), betax1)\n mstore(add(_pPairing, 288), betax2)\n mstore(add(_pPairing, 320), betay1)\n mstore(add(_pPairing, 352), betay2)\n\n // vk_x\n mstore(add(_pPairing, 384), mload(add(pMem, pVk)))\n mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32))))\n\n\n // gamma2\n mstore(add(_pPairing, 448), gammax1)\n mstore(add(_pPairing, 480), gammax2)\n mstore(add(_pPairing, 512), gammay1)\n mstore(add(_pPairing, 544), gammay2)\n\n // C\n mstore(add(_pPairing, 576), calldataload(pC))\n mstore(add(_pPairing, 608), calldataload(add(pC, 32)))\n\n // delta2\n mstore(add(_pPairing, 640), deltax1)\n mstore(add(_pPairing, 672), deltax2)\n mstore(add(_pPairing, 704), deltay1)\n mstore(add(_pPairing, 736), deltay2)\n\n\n let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20)\n\n isOk := and(success, mload(_pPairing))\n }\n\n let pMem := mload(0x40)\n mstore(0x40, add(pMem, pLastMem))\n\n // Validate that all evaluations ∈ F\n\n checkField(calldataload(add(_pubSignals, 0)))\n\n checkField(calldataload(add(_pubSignals, 32)))\n\n checkField(calldataload(add(_pubSignals, 64)))\n\n checkField(calldataload(add(_pubSignals, 96)))\n\n checkField(calldataload(add(_pubSignals, 128)))\n\n checkField(calldataload(add(_pubSignals, 160)))\n\n checkField(calldataload(add(_pubSignals, 192)))\n\n checkField(calldataload(add(_pubSignals, 224)))\n\n checkField(calldataload(add(_pubSignals, 256)))\n\n checkField(calldataload(add(_pubSignals, 288)))\n\n checkField(calldataload(add(_pubSignals, 320)))\n\n\n // Validate all evaluations\n let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem)\n\n mstore(0, isValid)\n return(0, 0x20)\n }\n }\n }" + }, + "contracts/VerifyDomainProcessor.sol": { + "content": "// SPDX-License-Identifier: MIT\n\nimport { ClaimVerifier } from \"./external/ClaimVerifier.sol\";\nimport { INullifierRegistry } from \"./external/interfaces/INullifierRegistry.sol\";\nimport { ProxyBaseProcessor } from \"./external/processors/ProxyBaseProcessor.sol\";\nimport { StringConversionUtils } from \"./external/lib/StringConversionUtils.sol\";\nimport { TicketmasterDataParsing } from \"./external/TicketmasterDataParsing.sol\";\n\nimport { IVerifyDomainProcessor } from \"./interfaces/IVerifyDomainProcessor.sol\";\n\npragma solidity ^0.8.18;\n\n\ncontract VerifyDomainProcessor is IVerifyDomainProcessor, ProxyBaseProcessor {\n\n using StringConversionUtils for string;\n\n /* ============ Constants ============ */\n uint8 constant MAX_EXTRACT_VALUES = 5;\n\n /* ============ State Variables ============ */\n address public immutable registry;\n\n /* ============ Constructor ============ */\n constructor(\n address _registry,\n INullifierRegistry _nullifierRegistry,\n string[] memory _providerHashes\n ) \n ProxyBaseProcessor(_nullifierRegistry, _providerHashes)\n {\n registry = _registry;\n }\n\n /* ============ External Functions ============ */\n\n /**\n * ONLY REGISTRY: Verifies proofs. Extracts values and formats them into Domain structs.\n *\n * @param _proofs Proofs to be verified\n * @return domains Array of Domain structs\n */\n function verifyProofs(\n Proof[] memory _proofs\n ) \n external \n override\n returns (DomainRaw[] memory domains)\n {\n require(msg.sender == registry, \"Only registry can call\");\n\n domains = new DomainRaw[](_proofs.length);\n\n for (uint256 i = 0; i < _proofs.length; i++) {\n Proof memory proof = _proofs[i];\n\n verifyProofSignatures(proof);\n\n (\n string memory domainName,\n string memory expiryTimeStr,\n string memory providerHash\n ) = _extractValues(proof);\n\n // Check provider hash\n require(_validateProviderHash(providerHash), \"No valid providerHash\");\n\n _validateAndAddNullifier(proof.signedClaim.signatures);\n\n domains[i] = DomainRaw({\n name: domainName,\n // The TicketmasterDataParsing library's date parsing logic is pretty generic, and works for domain \n // expiry dates as well. Similar to Ticketmaster dates, the expiry time is of the format \"YYYY-MM-DDTHH:MM:SS\"\n // and returns UTC timestamps.\n expiryTime: TicketmasterDataParsing._dateStringToTimestamp(expiryTimeStr)\n });\n }\n }\n\n /* ============ Internal Functions ============ */\n\n /**\n * Extracts all values from the proof context.\n *\n * @param _proof The proof containing the context to extract values from.\n */\n function _extractValues(Proof memory _proof) internal pure returns (\n string memory domainName,\n string memory expiryTime,\n string memory providerHash\n ) {\n string[] memory values = ClaimVerifier.extractAllFromContext(\n _proof.claimInfo.context, \n MAX_EXTRACT_VALUES, \n true\n );\n\n return (\n values[0], // domainName\n values[1], // expiryTime\n values[2] // providerHash\n );\n }\n}\n" } }, "settings": { diff --git a/contracts-domain/hardhat.config.ts b/contracts-domain/hardhat.config.ts index d87c22567..bf6651e47 100644 --- a/contracts-domain/hardhat.config.ts +++ b/contracts-domain/hardhat.config.ts @@ -81,19 +81,19 @@ const config: HardhatUserConfig = { // } // }, // }, - // base: { - // url: "https://developer-access-mainnet.base.org", - // // @ts-ignore - // accounts: [ - // `0x${process.env.BASE_DEPLOY_PRIVATE_KEY}`, - // ], - // verify: { - // etherscan: { - // apiUrl: "https://api.basescan.org/", - // apiKey: process.env.BASESCAN_API_KEY - // } - // }, - // }, + base: { + url: "https://developer-access-mainnet.base.org", + // @ts-ignore + accounts: [ + `0x${process.env.BASE_DEPLOY_PRIVATE_KEY}`, + ], + verify: { + etherscan: { + apiUrl: "https://api.basescan.org/", + apiKey: process.env.BASESCAN_API_KEY + } + }, + }, }, // @ts-ignore typechain: { diff --git a/contracts-domain/test/transferDomainProcessor.spec.ts b/contracts-domain/test/transferDomainProcessor.spec.ts index 194425084..f6c9e96c9 100644 --- a/contracts-domain/test/transferDomainProcessor.spec.ts +++ b/contracts-domain/test/transferDomainProcessor.spec.ts @@ -22,9 +22,9 @@ import { const expect = getWaffleExpect(); const PROOF = { - a: ["0x059c8c0e7670dc9f4a7d232ae626a0156465d18afb5b3e30568c45190e187b44", "0x13f9a331a715a0bdf3acbef2cfef112ef7c0bec2923cf6fbf1045b134fdc515c"], - b: [["0x1b7ee44e227b864324468b2fbaab14643e52fa9013f1aecd8785a942e64eaf2c", "0x2eeaf78f3e4d5e4ab4389b2b7abbbb5db25c2118565c4438d61f2ddf2479eaad"], ["0x1bcb86fc0c2d9349fc4f77ca4ecb543dca234726446534711089685158022c6c", "0x207a434b2b0065edb571d2e09bf71de158a7c325d4409b2159c7f4dd575de032"]], - c: ["0x0fb91dbfa8fdd5911eba579d168314d65c481507a351929d1f430189b9df0f39", "0x2645bdb20e59e39c409c739b898531611ce480159f7472a4fba62e073dcb0159"], + a: ["0x1da657c429291fec827f1d5aa527dd91d268eade14a392a967f878f32fd72706", "0x134c044c99a85819c9fec01077f249b38195234acbc36ebff3306643644b7871"], + b: [["0x285cab51d06c8c044aaeb93a23027853831b319b957e6ad117904859d5c3401a", "0x2fd0bf676a9fa482c9014051468ef924f679444a17b8593c10836d75ad7d5356"], ["0x2c5df164fd4f6c593dfc2c5fa4179bca6b660b1e60b19d075b47f5de941d6c97", "0x12e7f3e4017ba1c5eded4254b3e9f25be9457b13d5a25d351184b1f2e995f29a"]], + c: ["0x2b36e232f2b3f0aec36313f599225cbf80ead1e541be57e5aa0839884d37642f", "0x130cc647d0723eaef2c77418ece5b2316f180a212d39da74c11ed03cb28b137a"], signals: [ "0x0db7730bdd90c823601ed32395c8b2f3307fd4adc477ca22bf3ed406c1b3ae4a", "0x00000000000000000000006d6f632e7061656863656d616e4074726f70707573", @@ -33,8 +33,8 @@ const PROOF = { "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x18834c638fe786bb79a96feedbf6faecec5176c6114542fcd52001473c52c27f", - "0x0cdd1d748847e878785085983b90829ef652eaf3ce523f873984479cbb57c760", + "0x0eb1ad46280bbf5bd7a0d41063cbbb476793e04afac70d9ce2ee3f7c1b37a436", + "0x02fe53626e1f9442403f5863be3c41874b5edaa0a8752b86d700cf8f77083ed2", "0x0000000000000000000000000000000000000000000000000000000000003039" ] } @@ -124,7 +124,6 @@ describe("TransferDomainProcessor", () => { }); }); - describe("when the from email address is invalid", () => { beforeEach(async () => { await xferDomainProcessor.setEmailFromAddress("support@Namecheap.com"); // capital N