0 txs
50 calls
constructor
constructor()
functions
denylister
viewfunction denylister() view returns (address)
domain
viewfunction domain() view returns (uint32)
isAttestationSigner
viewfunction isAttestationSigner(address signer) view returns (bool)
isDenylisted
viewfunction isDenylisted(address addr) view returns (bool)
isTokenSupported
viewfunction isTokenSupported(address token) view returns (bool)
isTransferSpecHashUsed
viewfunction isTransferSpecHashUsed(bytes32 transferSpecHash) view returns (bool)
owner
viewfunction owner() view returns (address)
paused
viewfunction paused() view returns (bool)
pauser
viewfunction pauser() view returns (address)
pendingOwner
viewfunction pendingOwner() view returns (address)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
tokenMintAuthority
viewfunction tokenMintAuthority(address token) view returns (address)
UPGRADE_INTERFACE_VERSION
viewfunction UPGRADE_INTERFACE_VERSION() view returns (string)
acceptOwnership
nonpayablefunction acceptOwnership()
addAttestationSigner
nonpayablefunction addAttestationSigner(address signer)
addSupportedToken
nonpayablefunction addSupportedToken(address token)
denylist
nonpayablefunction denylist(address addr)
gatewayMint
nonpayablefunction gatewayMint(bytes attestationPayload, bytes signature)
initialize
nonpayablefunction initialize(address pauser_, address denylister_, address[] supportedTokens_, uint32 domain_, address attestationSigner_, address[] tokenMintAuthorities_)
pause
nonpayablefunction pause()
removeAttestationSigner
nonpayablefunction removeAttestationSigner(address signer)
renounceOwnership
nonpayablefunction renounceOwnership()
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
unDenylist
nonpayablefunction unDenylist(address addr)
unpause
nonpayablefunction unpause()
updateDenylister
nonpayablefunction updateDenylister(address newDenylister)
updateMintAuthority
nonpayablefunction updateMintAuthority(address token, address newMintAuthority)
updatePauser
nonpayablefunction updatePauser(address newPauser)
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
events
AttestationSignerAdded
event AttestationSignerAdded(address indexed signer)
AttestationSignerRemoved
event AttestationSignerRemoved(address indexed signer)
AttestationUsed
event AttestationUsed(address indexed token, address indexed recipient, bytes32 indexed transferSpecHash, uint32 sourceDomain, bytes32 sourceDepositor, bytes32 sourceSigner, uint256 value)
Denylisted
event Denylisted(address indexed addr)
DenylisterChanged
event DenylisterChanged(address indexed oldDenylister, address indexed newDenylister)
Initialized
event Initialized(uint64 version)
MintAuthorityChanged
event MintAuthorityChanged(address indexed token, address indexed oldMintAuthority, address indexed newMintAuthority)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
OwnershipTransferStarted
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner)
Paused
event Paused(address account)
PauserChanged
event PauserChanged(address indexed oldPauser, address indexed newPauser)
TokenSupported
event TokenSupported(address token)
UnDenylisted
event UnDenylisted(address indexed addr)
Unpaused
event Unpaused(address account)
Upgraded
event Upgraded(address indexed implementation)
errors
AccountDenylisted
error AccountDenylisted(address addr)
AddressEmptyCode
error AddressEmptyCode(address target)
AttestationExpiredAtIndex
error AttestationExpiredAtIndex(uint32 index, uint256 maxBlockHeight, uint256 currentBlock)
AttestationValueMustBePositiveAtIndex
error AttestationValueMustBePositiveAtIndex(uint32 index)
CursorOutOfBounds
error CursorOutOfBounds()
ECDSAInvalidSignature
error ECDSAInvalidSignature()
ECDSAInvalidSignatureLength
error ECDSAInvalidSignatureLength(uint256 length)
ECDSAInvalidSignatureS
error ECDSAInvalidSignatureS(bytes32 s)
EnforcedPause
error EnforcedPause()
ERC1967InvalidImplementation
error ERC1967InvalidImplementation(address implementation)
ERC1967NonPayable
error ERC1967NonPayable()
ExpectedPause
error ExpectedPause()
FailedCall
error FailedCall()
InvalidAddress
error InvalidAddress()
InvalidAttestationDestinationCallerAtIndex
error InvalidAttestationDestinationCallerAtIndex(uint32 index, address attestationCaller, address actualCaller)
InvalidAttestationDestinationContractAtIndex
error InvalidAttestationDestinationContractAtIndex(uint32 index, address attestationContract, address expectedContract)
InvalidAttestationDestinationDomainAtIndex
error InvalidAttestationDestinationDomainAtIndex(uint32 index, uint32 attestationDomain, uint32 expectedDomain)
InvalidAttestationSigner
error InvalidAttestationSigner()
InvalidAttestationTokenAtIndex
error InvalidAttestationTokenAtIndex(uint32 index, address sourceToken, address destinationToken)
InvalidInitialization
error InvalidInitialization()
InvalidTransferPayloadMagic
error InvalidTransferPayloadMagic(bytes4 actualMagic)
InvalidTransferSpecMagic
error InvalidTransferSpecMagic(bytes4 actualMagic)
InvalidTransferSpecVersion
error InvalidTransferSpecVersion(uint32 actualVersion)
MismatchedLengthTokenAndTokenMintAuthorities
error MismatchedLengthTokenAndTokenMintAuthorities()
MustHaveAtLeastOneAttestation
error MustHaveAtLeastOneAttestation()
NotInitializing
error NotInitializing()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
TransferPayloadDataTooShort
error TransferPayloadDataTooShort(uint256 expectedMinimumLength, uint256 actualLength)
TransferPayloadHeaderTooShort
error TransferPayloadHeaderTooShort(uint256 expectedMinimumLength, uint256 actualLength)
TransferPayloadOverallLengthMismatch
error TransferPayloadOverallLengthMismatch(uint256 expectedTotalLength, uint256 actualTotalLength)
TransferPayloadSetElementHeaderTooShort
error TransferPayloadSetElementHeaderTooShort(uint32 index, uint256 actualSetLength, uint256 requiredOffset)
TransferPayloadSetElementTooShort
error TransferPayloadSetElementTooShort(uint32 index, uint256 actualSetLength, uint256 requiredOffset)
TransferPayloadSetHeaderTooShort
error TransferPayloadSetHeaderTooShort(uint256 expectedMinimumLength, uint256 actualLength)
TransferPayloadSetInvalidElementMagic
error TransferPayloadSetInvalidElementMagic(uint32 index, bytes4 actualMagic)
TransferPayloadSetOverallLengthMismatch
error TransferPayloadSetOverallLengthMismatch(uint256 expectedTotalLength, uint256 actualTotalLength)
TransferSpecHashUsed
error TransferSpecHashUsed(bytes32 transferSpecHash)
TransferSpecHeaderTooShort
error TransferSpecHeaderTooShort(uint256 expectedMinimumLength, uint256 actualLength)
TransferSpecOverallLengthMismatch
error TransferSpecOverallLengthMismatch(uint256 expectedTotalLength, uint256 actualTotalLength)
UnauthorizedDenylister
error UnauthorizedDenylister(address addr)
UnauthorizedPauser
error UnauthorizedPauser(address caller)
UnsupportedToken
error UnsupportedToken(address token)
UnsupportedTokenAtIndex
error UnsupportedTokenAtIndex(uint32 index, address destinationToken)
UUPSUnauthorizedCallContext
error UUPSUnauthorizedCallContext()
UUPSUnsupportedProxiableUUID
error UUPSUnsupportedProxiableUUID(bytes32 slot)
creation bytecode
0x60a060405230608052348015610013575f5ffd5b5061001c610029565b610024610029565b6100db565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100795760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d85780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b608051612f456101015f395f8181610e3201528181610e5b0152610f800152612f455ff3fe60806040526004361061018d575f3560e01c806379ba5097116100e3578063a946de0411610092578063c418fac311610062578063c418fac3146104b4578063e30c3978146104d3578063e877a526146104e7578063f2fde38b14610506575f5ffd5b8063a946de0414610414578063ad3cb1cc14610433578063bcc76c6014610470578063c2fb26a614610484575f5ffd5b806379ba5097146103675780637a827f6b1461037b5780638456cb591461039a5780638da5cb5b146103ae5780639cab0c1c146103c25780639fb01cc5146103e15780639fd0506d14610400575f5ffd5b80634f1ef2861161013f5780634f1ef2861461029e57806352d1902d146102b1578063554bab3c146102d35780635c975abb146102f25780636d69fcaf14610315578063715018a61461033457806375151b6314610348575f5ffd5b806308307b781461019157806317580158146101b25780631ad20c51146102015780633371bfff146102205780633a57609e1461023f5780633e5de4df1461025e5780633f4ba83a1461028a575b5f5ffd5b34801561019c575f5ffd5b506101b06101ab366004612935565b610525565b005b3480156101bd575f5ffd5b506101ec6101cc36600461294e565b5f9081525f516020612e705f395f51905f52602052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561020c575f5ffd5b506101b061021b366004612965565b610592565b34801561022b575f5ffd5b506101b061023a366004612935565b61061b565b34801561024a575f5ffd5b506101b0610259366004612935565b61069b565b348015610269575f5ffd5b5061027d610278366004612935565b610707565b6040516101f89190612996565b348015610295575f5ffd5b506101b0610735565b6101b06102ac366004612a47565b610771565b3480156102bc575f5ffd5b506102c5610790565b6040519081526020016101f8565b3480156102de575f5ffd5b506101b06102ed366004612935565b6107ab565b3480156102fd575f5ffd5b505f516020612eb05f395f51905f525460ff166101ec565b348015610320575f5ffd5b506101b061032f366004612935565b6107bf565b34801561033f575f5ffd5b506101b0610843565b348015610353575f5ffd5b506101ec610362366004612935565b610854565b348015610372575f5ffd5b506101b0610898565b348015610386575f5ffd5b506101b0610395366004612ad8565b6108d4565b3480156103a5575f5ffd5b506101b06109e9565b3480156103b9575f5ffd5b5061027d610a23565b3480156103cd575f5ffd5b506101b06103dc366004612935565b610a57565b3480156103ec575f5ffd5b506101b06103fb366004612b90565b610acd565b34801561040b575f5ffd5b5061027d610b86565b34801561041f575f5ffd5b506101b061042e366004612935565b610bb8565b34801561043e575f5ffd5b50610463604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101f89190612bdd565b34801561047b575f5ffd5b5061027d610c25565b34801561048f575f5ffd5b505f516020612ed05f395f51905f525460405163ffffffff90911681526020016101f8565b3480156104bf575f5ffd5b506101ec6104ce366004612935565b610c40565b3480156104de575f5ffd5b5061027d610c49565b3480156104f2575f5ffd5b506101ec610501366004612935565b610c5e565b348015610511575f5ffd5b506101b0610520366004612935565b610c67565b61052d610cd9565b61053681610d0b565b6001610540610d32565b6001600160a01b0383165f8181526020929092526040808320805460ff19169415159490941790935591517f09b9e0aeb0d8dd390c8ab392ed51b6cbc0e6f3a2ddae0149cec4dd4acf13d7a99190a250565b61059a610cd9565b816105a481610d56565b6105ad82610d0b565b5f6105b6610d32565b6001600160a01b038086165f81815260018401602052604080822080548986166001600160a01b03198216811790925591519596509316938492917f5c3cb1b340c7f4e8dfc2058a7e8992362e063c9ded5e14aa21e23e8856ee183191a45050505050565b610623610d7e565b600101546001600160a01b0316331461065a5733604051637446939f60e11b81526004016106519190612996565b60405180910390fd5b610665816001610da2565b6040516001600160a01b038216907ffa4507bc1f9c730e6e95897024f1fe7d576cf2deb53579d55c14f1ac3439e114905f90a250565b6106a3610cd9565b6106ac81610d0b565b5f6106b5610d32565b6001600160a01b0383165f8181526020929092526040808320805460ff19169415159490941790935591517ffdf1ac7bfb61a45532dcc5b24ecc2b3373a97f45b89df6489ac493f873dd65489190a250565b5f610710610d32565b6001600160a01b039283165f9081526001919091016020526040902054909116919050565b3361073e610b86565b6001600160a01b031614610767573360405163ae3b56d560e01b81526004016106519190612996565b61076f610dd9565b565b610779610e27565b61078282610eb5565b61078c8282610ebd565b5050565b5f610799610f75565b505f516020612e905f395f51905f5290565b6107b3610cd9565b6107bc81610fbe565b50565b6107c7610cd9565b6001600160a01b0381165f9081527f3ba16516a08fb9c5c48fb6662657ad4ffe1c779829969b4c7abdb9287bbf8500602052604090819020805460ff19166001179055517fea3145306a87baeba6bb1a8b5c8d3744f840a81cb436b3509f64fc978600cdfb90610838908390612996565b60405180910390a150565b61084b610cd9565b61076f5f61102e565b5f7f3ba16516a08fb9c5c48fb6662657ad4ffe1c779829969b4c7abdb9287bbf85005b6001600160a01b039092165f90815260209290925250604090205460ff1690565b33806108a2610c49565b6001600160a01b0316146108cb578060405163118cdaa760e01b81526004016106519190612996565b6107bc8161102e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061091d575080546001600160401b03808416911610155b1561093b5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815586831461097c57604051630bcd357d60e11b815260040160405180910390fd5b6109898a8a8a8a8a611053565b6109968589898787611080565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050505050505050565b336109f2610b86565b6001600160a01b031614610a1b573360405163ae3b56d560e01b81526004016106519190612996565b61076f611136565b5f807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b610a5f610d7e565b600101546001600160a01b03163314610a8d5733604051637446939f60e11b81526004016106519190612996565b610a97815f610da2565b6040516001600160a01b038216907fc904e1b03de0c20d7fcf9dbd056daf1bd3815e93f251199de815fd0f0b96e166905f90a250565b610ad561117e565b33610adf816111ae565b610ae983836111d7565b5f610af38461123f565b9050806040015163ffffffff165f03610b1f57604051630b08586360e01b815260040160405180910390fd5b5f5b8160800151610b7f57610b33826112d6565b90505f60018360600151610b479190612c26565b9050610b5382826113ba565b5f610b6362ffffff198416611402565b9050610b6f8183611489565b610b78816116ce565b5050610b21565b5050505050565b5f7f7e0f0117f6f510f2a35b1c8185f303b28ba884334cd776f9d98e2abef24e2f005b546001600160a01b0316919050565b610bc0610cd9565b5f610bc9610d7e565b600101546001600160a01b03169050610be182611860565b816001600160a01b0316816001600160a01b03167fe144e84038182cefebda68c192c222085b2c12a85d135d3c938498c0165c01d360405160405180910390a35050565b5f610c2e610d7e565b600101546001600160a01b0316919050565b5f610877610d32565b5f805f516020612ef05f395f51905f52610a47565b5f610877610d7e565b610c6f610cd9565b5f516020612ef05f395f51905f5280546001600160a01b0319166001600160a01b0383169081178255610ca0610a23565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b33610ce2610a23565b6001600160a01b03161461076f573360405163118cdaa760e01b81526004016106519190612996565b6001600160a01b0381166107bc5760405163e6c4247b60e01b815260040160405180910390fd5b7fa13f18ce64168e6d2f5aa74009cc3360c0bed33f0845237965d1e1378d32aa0090565b610d5f81610854565b6107bc5780604051635f8b555b60e11b81526004016106519190612996565b7f77aee7014301166d8532df7f3d0b1c40d5b12f074d2d69255b43654e0419340090565b80610dab610d7e565b6001600160a01b03939093165f9081526020939093526040909220805460ff19169215159290921790915550565b610de161188d565b5f516020612eb05f395f51905f52805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516108389190612996565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610e9757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610e8b6118bc565b6001600160a01b031614155b1561076f5760405163703e46dd60e11b815260040160405180910390fd5b6107bc610cd9565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610f17575060408051601f3d908101601f19168201909252610f1491810190612c42565b60015b610f365781604051634c9c8ce360e01b81526004016106519190612996565b5f516020612e905f395f51905f528114610f6657604051632a87526960e21b815260048101829052602401610651565b610f7083836118d0565b505050565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461076f5760405163703e46dd60e11b815260040160405180910390fd5b7f7e0f0117f6f510f2a35b1c8185f303b28ba884334cd776f9d98e2abef24e2f0080546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f95bb211a5a393c4d30c3edc9a745825fba4e6ad3e3bb949e6bf8ccdfe431a811905f90a35050565b5f516020612ef05f395f51905f5280546001600160a01b031916815561078c82611925565b61105b611995565b611064856119de565b61106d846119ee565b61107783836119ff565b610b7f81611a43565b611088611995565b61109185610525565b5f5b8181101561112e575f8383838181106110ae576110ae612c59565b90506020020160208101906110c39190612935565b90506001600160a01b03811615611125576111258686848181106110e9576110e9612c59565b90506020020160208101906110fe9190612935565b85858581811061111057611110612c59565b905060200201602081019061021b9190612935565b50600101611093565b505050505050565b61113e61117e565b5f516020612eb05f395f51905f52805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610e1a565b5f516020612eb05f395f51905f525460ff161561076f5760405163d93c066560e01b815260040160405180910390fd5b6111b781610c5e565b156107bc57806040516313f7662b60e11b81526004016106519190612996565b815160208301207f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f908152601c91909152603c81206112179083611a73565b905061122281610c40565b610f705760405163127a982d60e01b815260040160405180910390fd5b6040805160a0810182525f8082526020820181905291810182905260608101829052608081018290529061127283611a9d565b62ffffff19811683525f6060840152905061128c81611ace565b6112aa57505f60208201819052600160408301526080820152919050565b5f6112b482611af0565b6008602085015263ffffffff1660408401819052156080840152509092915050565b5f8160800151156112fa57604051631365229760e31b815260040160405180910390fd5b5f611323602461ffff1684602001516113139190612c6d565b845162ffffff1916906004611aff565b90505f611331826028612c80565b6020850151855163ffffffff9290921692506113599162ffffff1916908363ff6fb334611b30565b9250808460200181815161136d9190612c6d565b9052506060840180519061138082612c9c565b63ffffffff1663ffffffff1681525050836040015163ffffffff16846060015163ffffffff16106113b357600160808501525b5050919050565b5f6113ca62ffffff198416611bab565b905043811015610f705760405163a31dc54b60e01b815263ffffffff8316600482015260248101829052436044820152606401610651565b5f5f61140d83611bbf565b90505f61142d62ffffff198516602863ffffffff851663ca85def7611b30565b90505f61144262ffffff198316826004611bd3565b90506001600160e01b0319811663ca85def760e01b1461148157604051633c2c863160e11b81526001600160e01b031982166004820152602401610651565b509392505050565b5f61149962ffffff198416611d29565b9050805f036114c357604051639965533d60e01b815263ffffffff83166004820152602401610651565b6114e06114db6114d862ffffff198616611d3e565b90565b6111ae565b5f6114f36114d862ffffff198616611d52565b90506001600160a01b0381161580159061151657506001600160a01b0381163314155b1561153a5782813360405163e379362b60e01b815260040161065193929190612cc0565b5f61154a62ffffff198616611d66565b5f516020612ed05f395f51905f525490915063ffffffff8083169116146115ba5783816115885f516020612ed05f395f51905f525463ffffffff1690565b604051635ddf7e5d60e01b815263ffffffff938416600482015291831660248301529091166044820152606401610651565b5f6115cd6114d862ffffff198816611d7a565b90506001600160a01b03811630146115fe57848130604051635009207360e11b815260040161065193929190612cc0565b5f6116116114d862ffffff198916611d8e565b905061161c81610854565b6116505760405163600a901b60e01b815263ffffffff871660048201526001600160a01b0382166024820152604401610651565b5f61166062ffffff198916611da2565b90508363ffffffff168163ffffffff16036116c4575f6116886114d862ffffff198b16611db6565b9050826001600160a01b0316816001600160a01b0316146116c257878184604051633798b0bd60e01b815260040161065193929190612cc0565b505b5050505050505050565b5f6116de62ffffff198316611dca565b90506116e981611dda565b5f6116fc6114d862ffffff198516611d3e565b90505f61170e62ffffff198516611d29565b90505f6117236114d862ffffff198716611d8e565b90505f61173562ffffff198716611da2565b90505f61174762ffffff198816611e0d565b90505f61175962ffffff198916611e21565b90505f61176585610707565b90505f6001600160a01b0382161561177d578161177f565b855b6040516340c10f1960e01b81526001600160a01b038a81166004830152602482018a9052919250908216906340c10f19906044016020604051808303815f875af11580156117cf573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f39190612ce7565b506040805163ffffffff87168152602081018690529081018490526060810188905289906001600160a01b03808b1691908916907fbb312ce0cc311b2cb0746e09ccd2f91fdb9e2ac755d2f11c65300eb0d0fffd639060800160405180910390a450505050505050505050565b80611869610d7e565b60010180546001600160a01b0319166001600160a01b039290921691909117905550565b5f516020612eb05f395f51905f525460ff1661076f57604051638dfc202b60e01b815260040160405180910390fd5b5f5f516020612e905f395f51905f52610ba9565b6118d982611e35565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561191d57610f708282611e8f565b61078c611f01565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661076f57604051631afcd79f60e31b815260040160405180910390fd5b6119e6611995565b6107b3611f20565b6119f6611995565b6107bc81610bb8565b611a07611995565b5f5b81811015610f7057611a3b838383818110611a2657611a26612c59565b905060200201602081019061032f9190612935565b600101611a09565b611a4b611995565b5f516020612ed05f395f51905f52805463ffffffff191663ffffffff92909216919091179055565b5f5f5f5f611a818686611f30565b925092509250611a918282611f79565b50909150505b92915050565b5f611aa782612031565b9050611ab281611ace565b15611ac557611ac08161210b565b919050565b611ac081612352565b5f631e12db7160e01b611ae962ffffff198416836004611bd3565b1492915050565b5f611a9762ffffff1983166004805b5f611b0b826020612d06565b611b16906008612d1f565b60ff16611b24858585611bd3565b901c90505b9392505050565b5f5f611b458660781c6001600160601b031690565b6001600160601b03169050611b5986612370565b84611b648784612c6d565b611b6e9190612c6d565b1115611b815762ffffff19915050611ba3565b611b8b8582612c6d565b9050611b9f8364ffffffffff1682866123a8565b9150505b949350505050565b5f611a9762ffffff19831660046020611aff565b5f611a9762ffffff19831660246004611aff565b5f8160ff165f03611be557505f611b29565b611bf88460181c6001600160601b031690565b6001600160601b0316611c0e60ff841685612c6d565b1115611c7257611c59611c2a8560781c6001600160601b031690565b6001600160601b0316611c468660181c6001600160601b031690565b6001600160601b0316858560ff166123ec565b60405162461bcd60e51b81526004016106519190612bdd565b60208260ff161115611cec5760405162461bcd60e51b815260206004820152603a60248201527f54797065644d656d566965772f696e646578202d20417474656d70746564207460448201527f6f20696e646578206d6f7265207468616e2033322062797465730000000000006064820152608401610651565b600882025f611d048660781c6001600160601b031690565b6001600160601b031690505f600160ff1b5f1984011d91909501511695945050505050565b5f611a9762ffffff1983166101106020611aff565b5f611a9762ffffff19831660b06020611bd3565b5f611a9762ffffff19831660f06020611bd3565b5f611a9762ffffff198316600c6004611aff565b5f611a9762ffffff19831660306020611bd3565b5f611a9762ffffff19831660706020611bd3565b5f611a9762ffffff19831660086004611aff565b5f611a9762ffffff19831660506020611bd3565b5f611a9762ffffff198316612456565b611de38161249d565b6107bc815f9081525f516020612e705f395f51905f5260205260409020805460ff19166001179055565b5f611a9762ffffff19831660906020611bd3565b5f611a9762ffffff19831660d06020611bd3565b806001600160a01b03163b5f03611e615780604051634c9c8ce360e01b81526004016106519190612996565b5f516020612e905f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b031684604051611eab9190612d42565b5f60405180830381855af49150503d805f8114611ee3576040519150601f19603f3d011682016040523d82523d5f602084013e611ee8565b606091505b5091509150611ef88583836124db565b95945050505050565b341561076f5760405163b398979f60e01b815260040160405180910390fd5b611f28611995565b61076f61252e565b5f5f5f8351604103611f67576020840151604085015160608601515f1a611f598882858561254e565b955095509550505050611f72565b505081515f91506002905b9250925092565b5f826003811115611f8c57611f8c612d58565b03611f95575050565b6001826003811115611fa957611fa9612d58565b03611fc75760405163f645eedf60e01b815260040160405180910390fd5b6002826003811115611fdb57611fdb612d58565b03611ffc5760405163fce698f760e01b815260048101829052602401610651565b600382600381111561201057612010612d58565b0361078c576040516335e2f38360e21b815260048101829052602401610651565b5f600460ff1682511015612064578151604051631743c8a560e31b81526004808201526024810191909152604401610651565b5f61206f838261260c565b90505f61208462ffffff198316826004611bd3565b90506224133360e21b6001600160e01b03198216016120c1576120ba63ff6fb3345b60d81b6301000000600160d81b0384161790565b92506113b3565b63e1ed248f60e01b6001600160e01b03198216016120e6576120ba631e12db716120a6565b60405163319b52eb60e11b81526001600160e01b031982166004820152602401610651565b6008601882901c6001600160601b0316101561215057604051637c087ac560e11b815260086004820152601882901c6001600160601b03166024820152604401610651565b5f61215a82611af0565b905060085f5b8263ffffffff168163ffffffff16101561230e575f612180602884612c6d565b9050601885901c6001600160601b03168111156121d257604051631f7a270f60e31b815263ffffffff83166004820152601886901c6001600160601b0316602482015260448101829052606401610651565b5f6121f06121e1602486612c6d565b62ffffff198816906004611aff565b90505f6121fe826028612c80565b63ffffffff1690505f6122118287612c6d565b9050601888901c6001600160601b031681111561226357604051631014f32560e31b815263ffffffff86166004820152601889901c6001600160601b0316602482015260448101829052606401610651565b5f6122806122718289612c6d565b62ffffff198b16906004611bd3565b90506001600160e01b0319811660016224133360e21b0319146122ce576040516312b22cbd60e01b815263ffffffff871660048201526001600160e01b031982166024820152604401610651565b5f6122e562ffffff198b16898663ff6fb334611b30565b90506122f081612352565b6122fa8489612c6d565b975050600190950194506121609350505050565b50601883901c6001600160601b03168114610f7057604051633c99ab2560e21b815260048101829052601884901c6001600160601b03166024820152604401610651565b61235b81612626565b5f61236582611402565b905061078c816126ce565b5f6123848260181c6001600160601b031690565b6123978360781c6001600160601b031690565b016001600160601b03169050919050565b5f806123b48385612c6d565b90506040518111156123c357505f5b805f036123d75762ffffff19915050611b29565b5050606092831b9190911790911b1760181b90565b60605f6123f8866127ba565b9150505f612405866127ba565b9150505f612412866127ba565b9150505f61241f866127ba565b915050838383836040516020016124399493929190612d6c565b604051602081830303815290604052945050505050949350505050565b5f5f61246b8360781c6001600160601b031690565b6001600160601b031690505f61248a8460181c6001600160601b031690565b6001600160601b03169091209392505050565b5f8181525f516020612e705f395f51905f52602052604090205460ff16156107bc57604051630b06514960e11b815260048101829052602401610651565b6060826124f0576124eb82612862565b611b29565b815115801561250757506001600160a01b0384163b155b156125275783604051639996b31560e01b81526004016106519190612996565b5080611b29565b612536611995565b5f516020612eb05f395f51905f52805460ff19169055565b5f80806fa2a8918ca85bafe22016d0b997e4df60600160ff1b0384111561257d57505f91506003905082612602565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa1580156125ce573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b0381166125f957505f925060019150829050612602565b92505f91508190505b9450945094915050565b81515f9060208401611ef864ffffffffff851682846123a8565b6028601882901c6001600160601b0316101561266b5760405163161e118160e31b815260286004820152601882901c6001600160601b03166024820152604401610651565b5f61267582611bbf565b90505f612683826028612c80565b63ffffffff169050601883901c6001600160601b03168114610f70576040516316279d8b60e21b815260048101829052601884901c6001600160601b03166024820152604401610651565b610154601882901c6001600160601b0316101561271557604051631cd8e33f60e11b81526101546004820152601882901c6001600160601b03166024820152604401610651565b5f61271f82611af0565b905063ffffffff811660011461275057604051633665681760e11b815263ffffffff82166004820152602401610651565b5f61275a8361288b565b90505f61276982610154612c80565b63ffffffff169050601884901c6001600160601b031681146127b457604051633df4634560e01b815260048101829052601885901c6001600160601b03166024820152604401610651565b50505050565b5f80601f5b600f8160ff16111561280c575f6127d7826008612d1f565b60ff1685901c90506127e8816128a0565b61ffff16841793508160ff1660101461280357601084901b93505b505f19016127bf565b50600f5b60ff8160ff16101561285c575f612828826008612d1f565b60ff1685901c9050612839816128a0565b61ffff16831792508160ff165f1461285357601083901b92505b505f1901612810565b50915091565b8051156128725780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b5f611a9762ffffff1983166101506004611aff565b5f6128b160048360ff16901c6128d1565b60ff1661ffff919091161760081b6128c8826128d1565b60ff1617919050565b6040805180820190915260108082526f181899199a1a9b1b9c1cb0b131b232b360811b60208301525f91600f8416918290811061291057612910612c59565b016020015160f81c9392505050565b80356001600160a01b0381168114611ac0575f5ffd5b5f60208284031215612945575f5ffd5b611b298261291f565b5f6020828403121561295e575f5ffd5b5035919050565b5f5f60408385031215612976575f5ffd5b61297f8361291f565b915061298d6020840161291f565b90509250929050565b6001600160a01b0391909116815260200190565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126129cd575f5ffd5b81356001600160401b038111156129e6576129e66129aa565b604051601f8201601f19908116603f011681016001600160401b0381118282101715612a1457612a146129aa565b604052818152838201602001851015612a2b575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f60408385031215612a58575f5ffd5b612a618361291f565b915060208301356001600160401b03811115612a7b575f5ffd5b612a87858286016129be565b9150509250929050565b5f5f83601f840112612aa1575f5ffd5b5081356001600160401b03811115612ab7575f5ffd5b6020830191508360208260051b8501011115612ad1575f5ffd5b9250929050565b5f5f5f5f5f5f5f5f60c0898b031215612aef575f5ffd5b612af88961291f565b9750612b0660208a0161291f565b965060408901356001600160401b03811115612b20575f5ffd5b612b2c8b828c01612a91565b909750955050606089013563ffffffff81168114612b48575f5ffd5b9350612b5660808a0161291f565b925060a08901356001600160401b03811115612b70575f5ffd5b612b7c8b828c01612a91565b999c989b5096995094979396929594505050565b5f5f60408385031215612ba1575f5ffd5b82356001600160401b03811115612bb6575f5ffd5b612bc2858286016129be565b92505060208301356001600160401b03811115612a7b575f5ffd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff8281168282160390811115611a9757611a97612c12565b5f60208284031215612c52575f5ffd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b80820180821115611a9757611a97612c12565b63ffffffff8181168382160190811115611a9757611a97612c12565b5f63ffffffff821663ffffffff8103612cb757612cb7612c12565b60010192915050565b63ffffffff9390931683526001600160a01b03918216602084015216604082015260600190565b5f60208284031215612cf7575f5ffd5b81518015158114611b29575f5ffd5b60ff8281168282160390811115611a9757611a97612c12565b60ff8181168382160290811690818114612d3b57612d3b612c12565b5092915050565b5f82518060208501845e5f920191825250919050565b634e487b7160e01b5f52602160045260245ffd5b7f54797065644d656d566965772f696e646578202d204f76657272616e20746865815274040ecd2caee5c40a6d8d2c6ca40d2e640c2e84060f605b1b602082015260d085811b6001600160d01b031990811660358401526e040eed2e8d040d8cadccee8d04060f608b1b603b84015285821b8116604a8401527f2e20417474656d7074656420746f20696e646578206174206f666673657420306050840152600f60fb1b60708401529084901b1660718201525f612e42607783016e040eed2e8d040d8cadccee8d04060f608b1b8152600f0190565b612e58818560d01b6001600160d01b0319169052565b601760f91b6006820152600701969550505050505056fe20b6f2ac2ef95221991caf3be38efadb0bb1d3093c65d3a8c962def8d652ee00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbccd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300fe4c86d7e89d95779292c8077b542f271e850fa895928d0b7b19a0ae50865c00237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c00a2646970667358221220a22698663fbb412bbcf08bb97bcb8db175587b4f060769e51329b77da758a0b364736f6c634300081d0033